ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Camel][Java] 상속과 접근제어 지시자 (private, protected, public)
    Java/개념 정리 2020. 2. 20. 15:20

    이번 포스팅에서는 접근제어 지시자에 대한 포스팅입니다.

    접근제어 지시자

    접근제어 지시자란 말 그대로 접근의 허용범위를 제한하는 용도로 사용되는 지시자 입니다. Java에서 접근제어 지시자는 defualt를 포함해 private, protected, public 총 4가지가 있습니다. 설명에 앞서 접근지시자별 접근허용범위는 아래 표를 확인하시면 됩니다.

    접근제어지시자 Class 내부 동일 Package 상속받은 Class 이외의 나머지 영역
    private O X X X
    default O O X X
    protected O O O X
    public O O O O

    private

    접근제어 지시자 private는 위에서 확인할 수 있듯이 클래스 내부에서만 접근 가능하도록 하는 지시자 입니다. 동일 패키지에 있더라도 private로 선언이 되어있다면 접근이 불가능한 것입니다.  아래 예시를 통해 설명하겠습니다. 

    class Animal {
    	private String area;
          	public void setArea(String area) {
        		this.area = area;
        	}
       	 public String getArea() {
        		return area;
       	}
    }
    class Camel {
    	public void goToAnimal(Animal kind) {
        	kind.area = "Sea"; // (ERROR) Animal 클래스의 area 변수는 private로 선언되어 있기 때문에 직접접근이 불가능하다.
            kind.setArea("Sea");
            System.out.println(kind.getArea());
        }
    }

    Camel 클래스의 goToAnimal 메소드의 내부를 확인하면 kind.area를 통해 접근제어 지시자가 private인 Animal 클래스의 변수에 접근하려 하고 있습니다. 하지만 앞서 설명했다시피 private로 선언된 멤버는 클래스 밖에서 호출할 수 없습니다. 따라서 kind.area는 에러를 발생시키게 됩니다. 

     

    public

     그렇다면 위의 코드에서 setArea()와 getArea() 메소드는 어떻게 호출이 가능한 것일까? 이유는 간단합니다. Animal 클래스의 내부를 살펴보니  setArea()와 getArea() 메소드는 접근제어 지시자가 public입니다. 접근제어 지시자 public을 사용하게 되면 어디에서든 접근이 가능하게 되는 것입니다.   

     

    default (접근제어 지시자를 선언하지 않은 경우)

     만약 접근제어 지시자를 선언하지 않는다면 Java는 자동으로 접근의 허용범위를 설정해 주게 됩니다. 이 경우 private으로 선언된 멤버는 클래스 내부에서만 접근 가능했다면 default로 선언된 멤버는 클래스 내부뿐만아니라 동일 패키지에 있다면 접근이 허용됩니다.

    ( 여기서 잠깐! default로 선언을 하더라도 동일 패키지에 있다면 상속 받은 클래스라도 접근 가능합니다! )

    protected

     우선 접근제어 지시자 protected를 이해하기 위해서는 상속에 대한 개념을 알고있어야 합니다. 설명에 앞서 저는 상속에 대한 개념을 숙지하고 있다는 가정하에 접근제어지시자 protected에 대한 설명을 하겠습니다. 

     접근제어 지시자 protected의 접근허용 범위는 default의 접근허용범위보다는 넓고 public 보다는 좁다고 할 수 있습니다. protected를 사용하면 상속받은 클래스의 접근까지 허용하게 됩니다. 동일 패키지에서만 접근을 하는 경우라면 사용할 필요가 없지만(default로 선언해도 동일 패키지에 있다면 상속 받은 클래스라도 접근 가능), 다른 패키지의 클래스를 상속 받았다면 protected나 public을 사용해서 접근해야합니다. 

    댓글

Camel`s Tistory.