언어/Java

접근 제한자

O_oz 2023. 8. 23. 19:21
반응형

접근 제한자

    - 라이브러리 클래스를 설계할 때, 외부 클래스에서 접근할 수 있는 멤버와 접근할 수 없는 멤버로 구분해서 필드, 생성자, 메소드를 설계해야 함

    - 생성자 호출 금지 > 객체 생성 막기 / 해당 필드에 접근 금지 > 객체의 특정 데이터 보호 가능 / 특정 메소드 호출 제한

접근 제한 적용 대상 접근할 수 없는 클래스
public 클래스, 필드, 생성자, 메소드 없음
protected 필드, 생성자, 메소드 자식 클래스가 아닌 다른 패키지에 소속된 클래스
default 클래스, 필드, 생성자, 메소드 다른 패키지에 소속된 클래스
private 필드, 생성자, 메소드 모든 외부 클래스

    - public : 외부 클래스가 자유롭게 사용할 수 있는 공개 멤버 생성

    - protected : 같은 패키지 또는 자식 클래스에서 사용할 수 있는 멤버 생성

    - private : 외부에 노출되지 않는 멤버 생성

    - default : 같은 패키지에 소속된 클래스에서만 사용 가능한 멤버 생성

 

클래스 접근 제한

    - default 접근 제한 : 같은 패키지에서는 아무런 제한 없이 사용 가능 하지만 다른 패키지에서는 사용 불가능

    - public 접근 제한 : 같은 패키지뿐만 아니라 다른 패키지에서도 제한 없이 사용 가능

package com.mycompany.package1;

class A {}		// default 접근 제한
package com.mycompany.package1;

public class B {
    A a;			// A 클래스 접근 가능
}
package com.mycompany.package2;

import com.mycompany.package1.*;

public class C {
    A a;		// A 클래스 접근 불가능 (컴파일 에러)
    B b;
}

 

생성자의 접근 제한

    - public, protected, default, private 네 개의 접근 제한자를 가질 수 있음

    - 클래스에 생성자를 선언하지 않으면 컴파일러에 의해 자동적으로 기본 생성자가 추가됨 / 자동으로 생성되는 기본 생성자의 접근 제한은 클래스의 접근 제한과 동일

package com.mycompany.package1;

public class A {
    // 필드
    A a1 = new A(true);
    A a2 = new A(1);
    A a3 = new A("문자열");
    
    // 생성자
    public A(boolean b) {}
    A(int b) {}
    private A(String s) {}
}
package com.mycompany.package1;

public class B {
    // 필드
    A a1 = new A(true);
    A a2 = new A(1);
    A a3 = new A("문자열");		// private 생성자 > 컴파일 에러
}
package com.mycompany.package2;		// 다른 패키지

import com.mycompany.package1.A;

public class C {
    // 필드
    A a1 = new A(true);
    A a2 = new A(1);			// default 생성자 > 컴파일 에러
    A a3 = new A("문자열");		// private 생성자 > 컴파일 에러
}

 

필드와 메소드 접근 제한

    - public, protected, default, private 네 개의 접근 제한자를 가질 수 있음

package com.mycompany.package1;

public class A {
    // 필드
    public int field1;
    int field2;
    private int field3;
    
    // 생성자
    public A() {
    	field1 = 1;
        field2 = 1;
        field3 = 1;
        
        method1();
        method2();
        method3();
    }			// 클래스 내부일 경우 접근 제한자의 영향을 받지 않음
    
    // 메소드
    public void method1() {}
    void method2() {}
    private void method3() {}
}
package com.mycompany.package1;

public class B {
    public B() {
    	A a = new A();
        
        a.field1 = 1;
        a.field2 = 1;
        a.field3 = 1;		// private 필드 접근 불가 > 컴파일 에러
        
        a.method1();
        a.method2();
        a.method3();		// private 메소드 접근 불가 > 컴파일 에러
    }
}
package com.mycompany.package2;	// 다른 패키지

import com.mycompany.package1.A;

public class C {
    public C() {
    	A a = new A();
        
        a.field1 = 1;
        a.field2 = 1;		// default 필드 접근 불가 > 컴파일 에러
        a.field3 = 1;		// private 필드 접근 불가 > 컴파일 에러
        
        a.method1();
        a.method2();		// default 메소드 접근 불가 > 컴파일 에러
        a.method3();		// private 메소드 접근 불가 > 컴파일 에러
    }
}
반응형

'언어 > Java' 카테고리의 다른 글

어노테이션  (0) 2023.08.24
Getter와 Setter  (0) 2023.08.23
클래스  (2) 2023.08.23
참조 타입  (0) 2023.08.21
조건문과 반복문  (0) 2023.08.20