IT/Java

[Java] 접근 제한자

Huitopia 2024. 3. 5. 11:16
728x90

접근 제한자(Access Modifier)

경우에 따라 외부에서 객체의 필드를 변경하거나 메소드를 호출하지 못하게 막아야 할 때가 있다. 중요한 필드와 메소드가 외부로 노출되지 않아야 객체의 무결성을 유지한다. 그러기 위해 접근 제한자를 사용한다.

접근 제한자 제한 대상 제한 범위
public 클래스, 필드, 생성자, 메소드 없음
protected 필드, 생성자, 메소드 같은 패키지 또는 자식 객체만 사용 가능
(default) 클래스, 필드, 생성자, 메소드 같은 패키지
private 필드, 생성자, 메소드 객체 내부

 

접근 제한 강화 순서

public > protected > default > private

 

 

1. 클래스 접근 제한

클래스는 public, default 접근 제한을 가진다.

[public] class 클래스 { ... }

클래스 선언 시 public을 생략하면 default 접근 제한을 가진다. defult 제한을 가지면 같은 패키지에서 아무런 제한 없이 사용하지만 다른 패키지에서 사용할 수 없다. public 접근 제한자를 가지면 같은 패키지뿐만 아니라 다른 패키지에서도 사용 가능하다.

예제 코드

더보기
package ch06.sec13.exam01.package1;

class A { // default 접근 제한
}
package ch06.sec13.exam01.package1;

public class B {
    A a; // A 클래스 접근 가능
}
package ch06.sec13.exam01.package2;

import ch06.sec13.exam01.package1.*;

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

 

 

2. 생성자 접근 제한

생성자는 public, default, private 접근 제한을 가진다.

public class ClassName {
	[public | private] ClassName(...) {...}
}
접근 제한자 생성자 설명
public 클래스(...) 모든 패키지에서 생성자 호출 가능
= 모든 패키지에서 객체 생성 가능
  클래스(...) 같은 패키지에서 생성자 호출 가능
= 같은 패키지에서 객체 생성 가능
private 클래스(...) 클래스 내부에서 생성자 호출 가능
= 클래스 내부에서 객체 생성 가능

예제 코드

더보기
package ch06.sec13.exam02.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 ch06.sec13.exam02.package1;

public class B {
    A a1 = new A(true);
    A a2 = new A(1);
//    A a3 = new A("문자열"); // private라 생성자 접근 불가
}
package ch06.sec13.exam02.package2;

import ch06.sec13.exam02.package1.*;

public class C {
    A a1 = new A(true);
//    A a2 = new A(1); // default 생성자 접근 불가
//    A a3 = new A("문자열"); // pivate 생성자 접근 불가
}

 

 

3. 필드와 메소드 접근 제한

필드와 메소드는 public, default, private 접근 제한을 가진다.

접근 제한자 생성자 설명
public 필드
메소드(...)
모든 패키지에서 필드를 읽고 변경 가능하다.
모든 패키지에서 메소드 호출이 가능하다.
  필드
메소드(...)
같은 패키지에서 필드를 읽고 변경 가능하다.
같은 패키지에서 메소드 호출이 가능하다.
private 필드
메소드(...)
클래스 내부에서 필드를 읽고 변경 가능하다.
클래스 내부에서 메소드 호출이 가능하다.

예제 코드

더보기
package ch06.sec13.exam03.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 ch06.sec13.exam03.package1;

public class B {
    public void method() {
        A a = new A();

        a.field1 = 1;
        a.field2 = 1;
        // private 접근 불가
//        a.field3 = 1;

        a.method1();
        a.method2();
        // private 접근 불가
//        a.method3();
    }
}
package ch06.sec13.exam03.package2;

import ch06.sec13.exam03.package1.*;

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
    }
}

 

 

 

 

728x90