public , default, protected, private

반응형
반응형

프로그래밍을 하다보면

이들의 범위에 대해 가끔 헷갈린다.

그래서 그것을 해결하고자 이렇게 작성한다.

 

흔히들 public과 private는 잘안다.

왜냐하면 당연시하게 명시되었기 때문이다.

public은 모두다 허용이고

private는 자기자신만 허용이다.

근데 default랑 protected가 헷갈린다.

분명히 2개다 같은 결과인것 같은데...

두개의 차이점은 패키지의 위치와 상속 관계로 해결할 수 있다.

다만, 같은 패키지에서 상속 관계는 의미가 없다.(그래서 같은걸로 생각하는 것 같다.)

간단하게 코드를 작성해 봤다.

public class O {
    static int i = 1;

    public static void main(String[] args) {
        System.out.println(i);
    }
}

현재 변수는 default로 설정되어있다.

그러면 이것을 프린트해보면 당연히 1이 출력된다.

그러면 같은 패키지, 다른 클래스에서도 확인해보자.

package o;

public class T {
    public static void main(String[] args) {
        System.out.println(O.i);
    }
}

당연한 말이지만 출력이 되었다.

그러면 protected로 출력해봤지만 결과가 똑같이 나온다.??? 

그래서 클래스를 하나더 만들었다.

package t;

import o.O;

public class T extends O {
    public static void main(String[] args) {
        System.out.println(O.i);
    }
}

이 코드는 정상적으로 출력될까? (참고로 현재 O.i는 default값이다.)

예상과달리 Error:(7, 29) java: i is not public in o.O; cannot be accessed from outside package라는 오류가 발생했다.

분명히 상속까지 사용했는데...

이제 default에서 protected로 수정해 보자.

오류가 사라지고 1이 출력된것을 확인 할 수 있다.

 

따라서

public 의 범위가 가장 넓고

그다음은 protected가 가 넓고

그 다음은 default(아무것도 없는 거) 가 넓고

private가 가장 좁다.

라는 것을 알 수 있다.!!

  다른 패키지 상속된 클래스 패키지 클래스
public O O O
protected X O O O
default X X O O
private X X X O

*주의 : 상속된 클래스는 무조건 다른 패키지에 있어야 의미 있다.

같은 패키지에 있어도 결과는 틀리지 않지만 default도 같은 결과를 도출한다.

 

반응형

'프로그래밍 언어 > 자바' 카테고리의 다른 글

JVM이란?  (0) 2020.11.13
서블릿과 JSP  (0) 2020.09.24
내가 쓰레드를 이해한 방법  (0) 2020.06.24
제네릭스 쉽게 이해 하기  (0) 2020.06.18
추상화란 무엇일까?  (0) 2020.06.17

댓글

Designed by JB FACTORY