코린이의 소소한 공부노트

접근 제어자를 이용한 캡슐화 본문

Java

접근 제어자를 이용한 캡슐화

무지맘 2022. 4. 18. 17:19

접근 제어자는 해당 클래스/변수/메서드의 접근 범위를 정해준다. 이는 아래 글에 자세히 설명되어있다.

2022.04.16 - [Java] - 제어자

 

접근 범위를 설정해줘야 하는 것일까? 그 이유

1. 외부로부터 데이터를 보호하기 위해서

2. 내부적으로는 사용되지만 외부에는 불필요한 부분을 감추기 위해서다.

여기서 밑줄 친 부분을 캡슐화라고 한다.

예를 들어보자. 시간, 분, 초가 멤버 변수로 있는 Time 클래스를 만든 후, 시간 설정을 해보려 한다.

class Time{
    public int hour; // 0시 ~ 23시
    public int minute; // 0초 ~ 59분
    public int second; // 0초 ~ 59초
}

public class Test{
    public static void main(String[] args){
        Time t = new Time();
        t.hour = 30; // ??
    }
}

  - 접근 제어자가 public인 hour는 다른 클래스인 Test에서도 접근이 가능하다.

  - t 객체를 만든 후 hour에 직접 접근해 30을 대입한다.

  - 사람은 30시 = 6시인 것을 알지만 프로그램은 사용자가 지정한 대로만 작업을 수행하기 때문에 모른다.

    -> 이것을 달리 얘기해보자면, 데이터의 범위가 있는데 이것이 보호받지 못하는 상태라는 것이다.

그래서 어떻게 바꿀 거냐면,

1) 멤버 변수에 직접 접근을 막고, 메서드를 통해서만 변수에 접근 가능하게 할 것이다.

  -> 변수는 private로, 메서드는 public으로

2) 사용자들에게 변수의 범위를 굳이 알릴 필요는 없다. 하지만 프로그램에겐 범위를 알려줘 알맞은 값만 할당해줘야 한다.

  -> 메서드 내부에서 범위 설정

class Time{
    private int hour; // 0시 ~ 23시
    private int minute; // 0초 ~ 59분
    private int second; // 0초 ~ 59초
    
    public int getHour() { return hour; }
    public int getMinute() { return minute; }
    public int getSecond() { return second; }
    
    public void setHour(int hour){
        if ( hour < 0 || hour > 23) return;
        this.hour = hour;
    }
    public void setMinute(int minute){
        if ( minute < 0 || minute > 59) return;
        this.minute = minute;
    }
    public void setSecond(int second){
        if ( second < 0 || second > 59) return;
        this.second = second;
    }
}

public class Test{
    public static void main(String[] args){
        Time t = new Time();
        t.setHour(22); // 범위 내
        System.out.println(t.getHour()); // 22
        t.setHour(30); // 범위 밖
        System.out.println(t.getHour()); // 22
    }
}

22는 시간 범위 내여서 설정이 가능했지만, 30은 범위 밖이기 때문에 설정되지 않고 그대로 22가 출력된 것을 확인할 수 있다.

 

정리해보자면, 캡슐화는

1. 외부로부터 데이터를 보호하는 것을 말한다.

  - 내 노트북에는 2개의 계정이 있다. 손님용은 비번이 없지만 내가 쓰는 계정은 꼭 비밀번호를 건다.

  - 캡슐화를 통해 외부로부터의 직접 접근을 막아 검토된(범위 내의) 데이터만 이용한다.

2. 내부적으로는 사용되지만 외부에는 불필요한 부분을 감춘다.

  - 3사람이 만원씩 더치페이를 할 때, 돈만 내면 되지 내가 이 돈을 벌기 위해 어떤 일을 하는지까지 알릴 필요는 없다.

  - 캡슐화를 통해 내부에는 필요하지만 외부에는 TMI가 될 수 있는 정보를 가린다.

  - 한 패키지에 A, B, C 3개의 클래스가 있다. A에는 a1, a2 2개의 메서드가 있는데, 이중 a1은 A 클래스에서만 이용한다. 그럼 이 메서드는 private으로 선언한다.

    -> public메서드를 수정했을 때 에러가 발생하면 다른 클래스도 테스트를 해봐야 하지만, private메서드를 수정했을 때 에러가 발생하면 해당 클래스만 테스트를 해보면 된다. -> 테스트 범위가 줄어들어 디버깅이 수월해진다.

'Java' 카테고리의 다른 글

참조변수의 형변환  (0) 2022.04.20
다형성  (0) 2022.04.19
제어자  (0) 2022.04.16
임포트와 스태틱 임포트  (0) 2022.04.14
패키지와 클래스 경로  (0) 2022.04.13