티스토리 뷰

728x90
반응형

자바 프로그래밍에서 제어자(Modifier) 클래스, 필드, 메서드, 생성자 등에 부가적인 의미를 부여하는 키워드를 말한다.

 

'파란 하늘', '붉은 노을'에서 '파란'과 '붉은' 처럼 명사를 꾸며주는 형용사와 같다고 생각하면 편하다.

 

자바 프로그래밍에서 제어자는 크게 두 종류로 나뉘는데, 각각은 다음과 같다.

 

하나의 대상(클래스, 필드, 메서드 생성자)에는 여러 가지 제어자가 사용될 수 있으나,

 

접근 제어자는 하나밖에 사용할 수 없다는 것이 특징이다.

 

주로 static, final, abstract등을 사용하는 기타 제어자에 관해선 나중 글에 보기로 하고,

 

여기서는 접근 제어자에 대해서 알아보도록 하자.

 

접근 제어자(Access Modifier)는 자바 객체지향 프로그래밍의 캡슐화 구현을 위한 핵심적인 키워드이다.

 

이전 글에 설명한 대로 캡슐화의 목적인 데이터 은닉(data hiding) 외부로부터의 데이터 변경을 막는 것

 

바로 이 접근 제어자를 통해 이룰 수 있기 때문이다.

 

위에 적은 대로 접근 제어자는 총 네 가지가 있고, 각각의 접근 제한 범위는 다음과 같은데

 

위에서 아래로 갈 수록 접근 제한 범위가 넓다고 보면 된다.

 

이중 default의 경우 접근 제어자가 붙지 않았을 경우의 기본값인데,

 

변수명 앞에 접근 제어자가 생략되었을 경우 자동으로 이 dafault가 접근 제어자가 된다.

 

예시를 통해 조금 더 알아보기로 하자.

package package1; // 패키지명 package1 

//파일명: Parent.java
class Test { // Test 클래스의 접근 제어자는 default
    public static void main(String[] args) {
        Parent p = new Parent();

//        System.out.println(p.a); // 동일 클래스가 아니기 때문에 에러발생!
        System.out.println(p.b);
        System.out.println(p.c);
        System.out.println(p.d);
    }
}

public class Parent { // Parent 클래스의 접근 제어자는 public
    private int a = 1; // a,b,c,d에 각각 private, default, protected, public 접근제어자 지정
    int b = 2;
    protected int c = 3;
    public int d = 4;

    public void printEach() { // 동일 클래스이기 때문에 에러발생하지 않음
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
    }
}

// 출력값
2
3
4

먼저 아래에 정의된 Parent 클래스를 보자.

 

필드가 각각의 접근제어자를 이용해 선언되었으며, b의 경우 default로 지정됨을 알 수 있다.

 

이어서 printEach() 메서드를 이용해 각각의 필드를 프린트해 보았는데,

 

같은 클래스 안에서 정의되었기 때문에 가장 엄격한 a부터 d까지 에러 없이 접근이 가능한 것을 알 수 있다.

 

반면 위의 Test 클래스에서 Parent 타입의 객체를 생성했을 경우,

 

같은 클래스 안이 아니기 때문에 private 접근 제어자를 사용하는 a에 접근이 불가능하여

 

에러가 나는 것을 볼 수 있다.

 

계속해서 다른 패키지의 경우에 대해 보자.

package package2; // package2 

//파일명 Test2.java
import package1.Parent;

class Child extends package1.Parent {  // package1으로부터 Parent 클래스를 상속
    public void printEach() {
        // System.out.println(a); // 에러 발생!
        // System.out.println(b);
        System.out.println(c); // 다른 패키지의 하위 클래스
        System.out.println(d);
    }
}

public class Test2 {
    public static void main(String[] args) {
        Parent p = new Parent();

//        System.out.println(p.a); // public을 제외한 모든 호출 에러!
//        System.out.println(p.b);
//        System.out.println(p.c);
        System.out.println(p.d);
    }
}

먼저 package1 패키지의 Parent 클래스로부터 상속을 받아 만들어진 Child 클래스의 경우,

 

private a와 default b로의 접근이 제한됨을 알 수 있다.

 

protected c 의 경우 패키지는 다르지만 하위 클래스 안에 들어있기 때문에 접근이 허용된다.

 

마지막으로 패키지도 다르고 하위 클래스도 아닌 Test2 클래스의 경우를 보면

 

public d를 제외한 모든 필드에 접근이 불가능한 것을 볼 수 있다.

 

위의 예제들에서 본 바와 같이 접근 제어자를 적절히 이용하면 캡슐화의 목적을 쉽게 달성할 수 있음을 알 수 있다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함