반응형

캡슐화와 접근 제어자

 

접근 제어자를 사용하는 이유

  • 외부로부터 데이터를 보호하기 위해서
  • 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서

외부로부터 데이터를 보호하기위해 접근 제어자를 사용하는 것을 "캡슐화" 라고 한다.

Time클래스가 있을 때, iv들이 전부 public이라면,  이런식으로 iv에 직접 접근할 수 있다.
integer범위가 +-20억이므로 이 범위에 속하는 어떠한 값을 넣어도 에러가 나지 않는다.

하지만, 그러면 좋지 않은 상황이 발생할 수 있다.
hour같은 경우, 범위가 0~24, minute범위는 0~59, second의 범위도 0~59 
즉, 이 범위안의 값들로 변수가 유지되어야 하는데, 

t.hour = 25; 처럼 대입연산자로 직접 접근할 수 있게 해놓으면, 
이 값을 범위 외의 값이 대입되는 것을 막을 수가 없다. 즉, 데이터 보호를 할 수 없는 것이다.

그렇다면, t.hour라는 데이터 즉, iv값을 보호하려면 어떻게 해야할까?

이런식으로 iv(hour, minute, second)를 private 접근자를 이용해서, 외부 접근을 막아야 한다.
그리고, 메서드는 public으로 한다.

그래서 외부에서 직접 iv에 접근하는 것을 막고, 외부에서 메서드로 접근하는 것만 ok되도록 한다. 
메서드를 통해서  iv에 접근하도록 하는 것, 이런식으로 코딩을 해야한다.

직접 접근을 막고, 메서드를 통한 간접 접근을 허용한다.

이렇게 해 놓으면, t.hour = 25; 같이 직접접근하는 것이 안되고, 에러가난다.
접근하려는 iv의 접근 제어자가 private 즉, 외부에서 접근하지 못하도록 되어있기 때문이다.

그래서, 값을 바꾸려면, public메서드인 setHour메서드를 이용해야 한다.

결국, t.hour = 25; 코드를 → t.setHour(25); 이런식으로 바꿔서 접근해야한다.
그런데, 25가 setHour메서드에 들어가게 되면, 조건문에 의해서 범위를 벗어나므로 ture가 되어 return문을 만나서 밖으로 빠져나가게 되서, hour값이 25로 안바뀌게 된다.

이게 바로 데이터를 보호하는 것이다. 

이렇게 iv를 private 접근제어자를 통해 직접접근을 막고, 메서드를 통해 조건문을 통해 접근되도록 하는데,  이런식으로 데이터를 보호한다.

접근 제어자를 사용해서 직접 접근을 막고 메서드를 통한 간접 접근을 허용하는 것을 "캡슐화" 라고 한다.

접근제어자의 범위는 좁을 수록 좋다. 좁혀 놓았다가 필요하면 넓히는 방식을 지향하자.
(코드를 변경하고나면, 테스트를 봐야하는데, 만약에 public 메서드를 수정하면, 해당 클래스의 외부도 다 찾아봐야하지만,
private 접근제어자를 사용한 코드를 변경 하면,  해당 클래스 내부만 확인해 보면 된다. 확인해야할 범위가 훨씬 줄어든다.

 

반응형

'JAVA' 카테고리의 다른 글

참조변수의 형변환  (0) 2022.04.03
다형성  (0) 2022.04.02
접근 제어자  (0) 2022.04.01
제어자, static, final, abstract  (0) 2022.04.01
import문, static import문  (0) 2022.03.31