반응형
안녕하세요. 스코리아입니다.
오늘은 자바의 접근 제어 지시자와 정보은닉을 활용한 캡슐화에 대해서 알아보겠습니다.
자바의 객체지향에서 매우 중요한 부분 중 하나가 바로 '정보은닉'입니다.
접근 제어 지시자 (Access Modifier)
- 클래스 외부에서 클래스의 멤버 변수, 메소드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드
- 이 키워드는 멤버 변수, 메소드, 생성자의 타입값 (void, int, float..) 앞에 옴. 예를 들면 public int month;
- public : 클래스의 외부 어디에서나 접근 가능
- private: 같은 클래스 내부에서만 접근 가능 (외부 클래스, 상속 관계의 클래스 접근 불가)
- protected: 같은 패키지나 상속 관계의 클래스에서 접근 가능 (그 외 외부에서는 접근 불가)
- default (아무것도 없을 때) : 같은 패키지 내부에서만 접근 가능 (상속 관계라도 패키지가 다르면 접근 불가)
Getter / Setter
- get(), set() 메소드라고도 합니다. 멤버변수의 값을 접근, 수정하는 메소드
- 메소드의 이름을 지을 때는 get + 멤버 변수, set + 멤버 변수로 짓습니다.
- 예를 들어, 아래 코드와 같이 멤버변수 month를 접근하는 메소드의 이름을 getMonth()로 만들고, 멤버변수 month를 수정하는 메소드의 이름을 setMonth()로 만들 수 있습니다.
private int month;
private boolean isValid;
public int getMonth(){
return this.month;
}
public void setMonth(int month) {
if (month < 1 || month > 12) {
isValid = false;
}else {
this.month = month;
}
}
- private으로 선언한 멤버 변수(month)에 대해서 접근(getMonth)하고 수정(setMonth)할 수 있는 메소드를 public으로 제공하였습니다.
- set() 메소드 없이 get() 메소드만 제공하는 경우를 read-only 필드(매개변수)라고 합니다.
- 인텔리제이에서는 Mac 단축키 Ctrl+N 을 누르면 Getter, Setter, 생성자 등을 자동으로 생성할 수 있습니다.
정보 은닉 (Information Hiding)
- 위의 예제에서 멤버 변수 month를 아래와 같이 public으로 선언하면 어떨까요?
public int month; // 정보 은닉 위반
- 이렇게 설정한다면, getMonth(), setMonth() 메소드를 호출하지 않아도 멤버변수에 직접적으로 접근, 수정이 가능해집니다.
- setMonth() 메소드는 month의 값이 1~12까지만 오도록 제한하고 있지만, 여기서 누군가가 멤버변수 month를 '15'와 같은 값으로 직접적으로 수정을 한다면 큰 문제가 발생합니다.
- 때문에 외부에서 누군가가 접근하지 못하도록 정보 은닉이 필요합니다.
- 다시 말하면, 클래스 내부에서 사용할 변수나 메소드를 private로 선언하여 외부에서 접근하지 못하도록 하는 것을 자바 객체지향에서 '정보은닉'이라고 명합니다.
객체 지향 프로그래밍에서 정보 은닉은 외부에서 접근 가능한 최소한의 정보를 오픈함으로써 객체의 오류를 방지하고 클라이언트가 객체를 더 효율적으로 활용할 수 있도록 도와줍니다.
정보은닉을 활용한 캡슐화 (Encapsulation)
- 꼭 필요한 정보와 기능만 외부에 오픈합니다.
- 정보를 클래스화 해서 멤버 변수와 메소드를 감추고 (private), 외부에 통합된 인터페이스만을 제공하여 일관된 기능을 구현하게 합니다.
- 각각의 메소드나 멤버 변수를 접근함으로써 발생하는 오류를 최소화합니다.
지금까지 자바(Java) 객체지향의 특징 하나로서, 접근제어 지시자와 정보은닉을 활용한 캡슐화에 대해서 알아보았습니다.
읽어주셔서, 감사합니다.
반응형
'JAVA > 객체지향' 카테고리의 다른 글
자바 static 변수 뜻, 의미, 사용방법 그리고 유효범위 (3) | 2023.08.17 |
---|---|
자바 this / this() 뜻, 의미, 사용방법에 대해서 (1) | 2023.08.15 |
자바 참조 자료형 변수 정의하기, 사용 방법 (feat. 객체) (2) | 2023.08.12 |
자바 생성자 의미와 구현, 그리고 생성자 오버로딩 뜻? (1) | 2023.08.10 |
자바 메소드 의미, 인스턴스 생성과 힙메모리란? (feat. 객체) (1) | 2023.08.09 |