[Java] 정보은닉과 getter/setter
정보은닉이란 데이터의 접근 제한을 두어 접근권한이 없는 사람이 데이터를 변경하는 것을 막는 것이라 생각하면 된다.
예를 들어 달력 프로그램을 만들었다고 생각해보자.
2월은 평년은 28일까지 윤년은 29일까지인데 누군가가 2월을 31일까지라고 데이터를 변경한다면 데이터의 무결성이 깨질 것이다.
정보은닉은 중요한 자료나 변경되면 안되는 자료의 접 근제 어을 통해 자료의 무결성을 지키는 것이다.
자바에서는 정보은닉을 '접근제어자(Access Modifier)' 를 통해 구현할 수 있다.
접근제어자란 멤버 변수, 메서드, 생성자등을 생성할 때 사용하는 예약어로 자료에 대한 접근 권한을 지정할 수 있다.
public int num = 100;
private 반환형 메서드이름() { }
위 코드에서 public과 private이 접근 제어 자이며 접근제어자는 이 외에도 여러 가지가 있다.
자바 접근 제어자의 종류
접근 제어자 | 설명 |
public | 외부 클래스 어디에서나 접근가능 |
protected | 같은 패키지나 상속 관계의 클래스에서만 접근 가능 |
아무것도 없는 경우 | default 접근제어자로 같은 패키지 내부에서만 접근 가능 |
private | 같은 클래스 내부에서만 접근가능 |
자바에서 정보은닉은 클래스 내부에서 사용할 변수나 메서드를 private으로 선언하여 외부에서 접근하지 못하도록 하는 것이다.
모든 변수를 private로 선언하는 것은 아니지만 필요한 경우에는 private으로 선언하여 정보의 무결성을 지키거나 오류를 막을 수 있다.
위 사진은 각각의 접근제어자로 멤버 변수를 선언한 예이다.
다른 클래스에 Person 클래스를 생성하고 멤버변수의 접근하려 하면 어떻게 되는지의 예제는 아래 사진이다.
Person 클래스를 생성하고 참조변수 person으로 멤버 변수에 접근하여 값을 지정해주고 있는 예제이다.
public으로 선언한 age는 어느 곳에서나 접근이 가능하기 때문에 오류가 없는 것을 볼 수 있다.
private으로 선언한 name은 같은 클래스 내부에서만 접근이 가능하기 때문에 값을 대입하려 하면 오류가 발생한다.
protected로 선언한 gender는 Person 클래스와 PersonExample 클래스가 같은 패키지의 속해 있으므로 오류가 발생하지 않는다.
접근제어자를 명시해주지 않은 job은 default 접근제어자로 각 각의 클래스가 같은 패키지안에 존재하므로 오류가 발생하지 않는다.
메서드도 마찬가지로 접근제어자를 private으로 선언하면 외부 클래스에서 접근하지 못한다.
위와 같이 private 접근 제어자로 변수나 메서드를 선언함으로써 외부 클래스에서 바로 접근하지 못하도록 막을 수 있다.
getter/setter 메서드
private으로 메서드나 변수를 선언하면 다른 클래스에서 바로 접근하지 못한다고 하였다.
하지만 필요에 따라 외부 클래스에서 해당 메서드나 변수에 접근할 수 있어야 한다.
이럴 때 사용하는 메서드가 getter와 setter 메서드이다.
getter/setter 메서드는 private으로 선언한 변수 등의 값을 가져오거나 지정할 때 사용하며 외부에서 접근할 수 있도록 public으로 지정한다.
getter/setter 메서드의 형식은 아래의 사진과 같다.
get메서드는 변수의 값을 가져오며 set메서드는 변수의 값을 지정한다.
이렇게 getter/setter를 만들어주면 외부 클래스에서도 get/set 메서드로 접근이 가능하다.
name 속성에 바로 접근하는 것이 아닌 setName( ) 메서드로 접근하고 불러올 때는 getName( ) 메서드로 불러온다.
위의 name 속성으로 바로 접근할 때 생긴 오류가 해결된 것을 볼 수 있다.
왜 정보은닉을 하면서 외부 클래스에서 접근할 수 있게 만들까?
getter/setter를 사용하면 다른 외부 클래스에서도 접근할 수 있는데 왜 귀찮게 private으로 선언할까?
그 이유는 setter메서드를 통해 무결성이 깨지지 않는 자료만을 지정할 수 있기 때문이다.
위의 사진은 날짜를 입력하여 그 날짜가 유효한 날인지 아닌지를 검사하는 setter메서드이다.
만약 입력한 날이 2월 달이며 날짜가 1보다 작거나 28보다 크다면 유효하지 않다는 로그를 콘솔에 띄운다.
위와 같이 getter/setter를 사용하면 무결성을 지켜면서도 값을 변경할 수 있다.
※ getter / setter 메서드 쉽게 추가하는 법
코드 편집창에서 마우스 오른 쪽 클릭 -> Source -> Generate Getters and Setters.. 클릭
본인이 원하는 멤버 변수를 선택하고 Generate를 클릭하면 쉽게 getter / setter 메서드를 만들 수 있다.
본 포스팅은 필자가 공부한 것을 정리해놓은 것으로 오류가 존재할 수 있습니다.
참고: Do it! 자바 프로그래밍 입문