객체지향언어의 4가지 특성 중 첫 번째인 캡슐화에 대해서 자세히 알아보자. 이제부터 객체지향에 대해서 깊게 들어가기 때문에 어려워질 수 있다.
우선 위에서 접근 제어자를 사용했는데, 위에 여러가지 예시를 보면서 느꼈겠지만 접근 제어자를 사용하는 이유는 외부로부터 데이터의 접근을 보호하기 위해서 사용하는 것이다. 개발은 혼자하는 것이 아니고 다 같이 하는 것인데, 어떠한 개발자가 실수로 접근하면 안되는 값에 대해서, 접근해서 실수로 값을 바꿔버리면 대참사가 발생한다. 이때, 클래스 내부에 있는 변수는 접근을 못하도록 제한하고, 실제로 메서드 내부에서 변수가 어떤 원리로 동작하는 지에 대해서 숨기는 것을 캡슐화 라고 한다. 종종 캡슐화와 정보 은닉에 대해서 헷갈리는 경우가 많은데, 여기서 정보은닉이 접근 제어자를 사용하는 이유로 봐야한다. 외부로부터 데이터의 접근을 못하도록 감추는 것이다. 다음과 같은 예시를 살펴보자.
class Time {
int hour;
int minute;
int second;
}
public class Main {
public static void main(String[] args){
Time t = new Time();
t.hour = 30;
t.minute = 100;
t.second = 4000;
// 시간이 24시간 이상이고, 분도 60분이상이고, 초도 4000초 이상..? 뭔가 잘못되었다.
}
}
위와 같은 상황을 막기 위해서 접근 제어자와 캡슐화가 필요한 것이다.
class Time {
private int hour;
private int minute;
private int second;
public void setHour(int hour) {
if(hour < 0 || hour > 23)
System.out.println("입력해주신 시간이 0 미만이거나 23을 초과하였습니다.");
this.hour = hour;
}
public int getHour() {
return hour;
}
}
public class Main {
public static void main(String[] args){
Time t = new Time();
t.hour = 30; // 이제 접근이 불가능하다.
t.minute = 100;
t.second = 4000;
t.setHour(100); // 범위에서 벗어났기 때문에 설정이 되지 않는다.
System.out.println(t.getHour()); // 0 출력
t.setHour(22); // 범위안에 있기 때문에 설정이 된다.
System.out.println(t.getHour()); // 22 출력
}
}
위에 예시를 자세히 살펴보자. 이제 Time 클래스의 hour, minute, second 변수에 대한 접근제어자를 private로 설정함으로써 다른 클래스에서는 해당 클래스의 변수에 접근을 할 수 없게 되었다. 대신 해당 클래스의 변수에 접근이 가능하도록 public 으로 메서드를 열어두었는데, 이때, 다른 클래스에 입장에서는 해당 pubilc 메서드의 내부 동작이 어떠한 방식으로 이루어지는지 알 수가 없다. 이렇게 다른 클래스의 입장에서 해당 메서드가 어떻게 동작하는지 모르게 하는 것을 캡슐화라고 한다. 우리는 정보은닉을 통해서 다른 클래스의 입장에서 해당 클래스에 변수가 무엇이 있는지 알지 못하게 막았다. 하지만 캡슐화와 접근제어자를 사용해서 어떠한 내부 검증을 통해 변수를 설정가능하도록 설정하였다.
'Language > Java' 카테고리의 다른 글
4-1 자바 조건문 (0) | 2023.03.23 |
---|---|
7-6 다형성 (0) | 2023.03.23 |
7-4 제어자 (0) | 2023.03.23 |
7-3 패키지 (0) | 2023.03.22 |
7-2 참조변수 super, 생성자 super() (0) | 2023.03.22 |