본문 바로가기

백엔드 기술/Java

접근 제어자

객체 지향에서 정보 은닉이란 사용자가 굳이 알 필요없는 정보는 사용자로부터 숨겨야 한다는 개념.
Java에서는 이러한 정보 은닉을 위해 접근 제어자라는 기능을 제공한다.
즉, 접근 제어자를 활용하면 외부에서의 직접적인 접근을 허용하지 않는 멤버를 설정할 수 있다.

접근 제어자 접근 제한 범위
public 제한 없음
protected 동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능
default 동일 패키지 내에서만 접근 가능
private 동일 클래스 내에서만 접근 가능

이를 간단하게 도식화하면 아래와 같다.

접근 제어자 클래스 내 동일 패키지 다른 패키지의 하위 클래스 패키지 외
public O O O O
protected O O O X
default O O X X
private O X X X

[접근 제어자 활용 예시]

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

1. Parent 클래스에서 4가지 접근 제어자를 적용한 필드 a, b, c, d를 생성.
2. 같은 패키지 내에서 Test 클래스를 생성하고 Parent 클래스의 객체 p를 생성.
3. 객체 p를 통해 Parent 클래스의 4가지 접근제어자를 적용한 필드를 출력.
4. private 을 적용한 a를 제외한 b, c, d 모두 출력 가능.
=> private 접근 제어자는 같은 클래스에서만 접근이 가능한 기능

[타 클래스에서 private 필드 사용법]

public class GetterSetterTest {
    public static void main(String[] args) {
        Worker w = new Worker();
        w.setName("김코딩");
        w.setAge(30);
        w.setId(5);

        String name = w.getName();
        System.out.println("근로자의 이름은 " + name);
        int age = w.getAge();
        System.out.println("근로자의 나이는 " + age);
        int id = w.getId();
        System.out.println("근로자의 ID는 " + id);
    }
}

class Worker {
    private String name; // 변수의 은닉화. 외부로부터 접근 불가
    private int age;
    private int id;

    public String getName() { // 멤버변수의 값 
        return name;
    }

    public void setName(String name) { // 멤버변수의 값 변경
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age < 1) return;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

1. private 접근 제어자 필드 생성
2. 각 필드에 getter/setter를 적용함.
3. 사용하고자 하는 클래스에서 private 필드를 가진 클래스 객체를 생성.
4. 해당 객체에 setter를 통해 원하는 값을 설정.
5. 임의의 필드를 생성해 담고자하는 데이터를 생성한 객체로부터 불러와 할당함.
6. 생성한 임의의 원하는 필드를 출력하도록 처리.

'백엔드 기술 > Java' 카테고리의 다른 글

생성자란 ?  (0) 2023.04.17
이너 클래스의 장점  (0) 2023.04.17
Static 키워드  (0) 2023.04.15
메서드 오버라이딩 VS 오버로딩  (0) 2023.04.15
OOP (객체지향 프로그래밍) 이란 ?  (0) 2023.04.15