* JAVA 의 접근 제어자 (Access Modifier)

- public : 

모든 클래스들이 접근 가능.

- protected : 

같은 패키지 내에 있거나 또는 상속받은 경우에만 접근 가능.

- package-private : 

아무런 접근 제어자를 명시해주지 않는 경우에 해당. 

같은 패키지 내에 있을 때만 접근 가능. (참고로 나는 default 제어자로 알고 있었다)

- private :

해당 클래스 내에서만 접근 가능.



* 클래스 접근 제어자 선언할 때 유의할 점

- 자바에서는 1개의 .java 파일 안에 여러 개의 클래스를 선언할 수 있다.

PublicClass.java

package test;
class PublicClass {
    public static void main(String[] args){
    }
}
class PublicSecondClass {
}

위의 코드 처럼 작성이 가능하고 컴파일도 정상적으로 된다.


package test;
public class PublicClass {
    public static void main(String[] args){
    }
}
class PublicSecondClass {
}

위 코드도 마찬가지이다.


하지만 아래의 경우 에러가 발생한다.

package test;
class PublicClass {
    public static void main(String[] args){
    }
}
public class PublicSecondClass {    // error
}


결국 3가지 코드를 통해 말하고자 하는 바는,

public 으로 선언된 클래스가 파일 내에 있다면

그 소스코드 파일의 이름은 public 인 클래스의 이름과 동일해야만 한다는 점이다.




* 오버라이딩 (Overriding) : 상속과 관련.

- 부모 클래스의 메소드를 자식인 자신의 클래스 내에서 재정의한다.

- 접근 제어자, 리턴 타입, 메소드 이름, 매개 변수 타입 및 갯수가 모두 동일.

- 단! 접근 제어자는 부모 클래스의 메소드와 반드시 동일할 필요는 없으나 접근 권한이 확장되는 경우만 가능하다.

(접근 권한 : public > protected > package-private > private)


예를 들어 부모 클래스의 메소드 접근 제어자가 public 일 때,

자식 클래스의 메소드 접근 제어자가 private 인 경우는 접근 권한이 축소된 경우라서 컴파일 에러.



* 오버로딩 (Overloading) : 한 클래스 내에서.

- 메소드 이름은 동일하되 매개 변수만 다르게 하는 것.

- 반환 타입은 상관 없다. 중요한 건 같은 메소드 이름, 매개 변수가 들어가는 '()' 안의 내용이다.


public int add(int x, int y) { }
public double add(double x, double y) { }
public void print(int intData, long longData, String strData) { }
public void print(int intData, String strData) { }
public void print(String strData, int intData) { }


위 코드 라인 4, 5와 같이 타입의 순서가 달라도 다른 메소드 처럼 인식된다는 점.


by kelicia 2014. 5. 21. 03:33