정보은닉과 캡슐화는 객체지향 프로그래밍에서 중요한 개념 중 하나이다.
이 두 개념은 객체의 응집도와 독립성을 높임으로써 객체의 모듈화를 지향한다. 객체의 모듈화가 잘 이루어져있을 경우 모듈 단위의 재사용이 매우 용이하다.
자바에서는 정보은닉과 캡슐화를 위해 다음과 같은 방법을 사용한다.
캡슐화 (Encapsulation)
캡슐화는 클래스의 구현 세부 정보를 외부에서 숨기고, 오직 public
인터페이스만 노출하는 것을 말한다. 이렇게 함으로써, 클래스의 내부 구현을 변경하더라도 외부 코드에 영향을 미치지 않도록 할 수 있다.
public class BankAccount {
private int balance;
public void setBalance(int balance) {
if (balance >= 0) {
this.balance = balance;
}
}
public int getBalance() {
return balance;
}
}
위의 코드는 계좌 잔액을 캡슐화하기 위한 예시이다.
balance
필드는 private
으로 선언되어 있으며, 이를 직접적으로 접근할 수 없다. 대신, setBalance()
와 getBalance()
메서드를 통해 간접적으로 접근할 수 있다.
접근 제어자
접근 제어자는 클래스 내부의 멤버 변수나 메소드에 대한 접근 권한을 제한하는 역할을 한다. 자바에서는 다음과 같은 네 가지 접근 제어자를 제공한다.
private
: 같은 클래스 내부에서만 접근 가능default
: 같은 패키지 내부에서만 접근 가능protected
: 같은 패키지 내부와 자식 클래스에서 접근 가능public
: 모든 클래스에서 접근 가능
객체 내에서 멤버 변수나 메소드에 접근할 때, 해당 멤버의 접근제어자에 따라 접근 방법이 결정된다.
public
모든 클래스에서 자유롭게 접근할 수 있다.
public class MyClass {
public int myPublicVar;
public MyClass() {
myPublicVar = 0;
}
}
// 다른 클래스에서 접근하는 예제
MyClass myObject = new MyClass();
myObject.myPublicVar = 10;
protected
protected
접근제어자를 가진 멤버 변수나 메소드의 경우, 같은 패키지 내의 클래스와 해당 클래스를 상속받은 클래스에서 접근 가능하다.
public class MyClass {
protected int myProtectedVar;
public MyClass() {
myProtectedVar = 0;
}
}
// 같은 패키지에 있는 클래스에서 접근하는 예제
class MyOtherClass {
public MyOtherClass() {
MyClass myObject = new MyClass();
myObject.myProtectedVar = 10;
}
}
// MyClass를 상속받은 클래스에서 접근하는 예제
class MyChildClass extends MyClass {
public MyChildClass() {
myProtectedVar = 10;
}
}
default
default
접근제어자를 가진 멤버 변수의 경우, 같은 패키지 내에서만 접근이 가능하다.
package mypackage;
public class MyClass {
int myDefaultVar;
public MyClass() {
myDefaultVar = 0;
}
}
// 같은 패키지에 있는 클래스에서 접근하는 예제
class MyOtherClass {
public MyOtherClass() {
MyClass myObject = new MyClass();
myObject.myDefaultVar = 10;
}
}
private
private
접근제어자를 가진 멤버 변수의 경우, 해당 클래스 내부에서만 접근할 수 있다.
public class MyClass {
private int myPrivateVar;
public MyClass() {
myPrivateVar = 0;
}
public void setMyPrivateVar(int newValue) {
myPrivateVar = newValue;
}
public int getMyPrivateVar() {
return myPrivateVar;
}
}
// 다른 클래스에서 접근하는 예제
MyClass myObject = new MyClass();
// 아래 코드는 컴파일 에러가 발생합니다.
myObject.myPrivateVar = 10;
// setMyPrivateVar() 메소드를 호출하여 값을 설정할 수 있습니다.
myObject.setMyPrivateVar(10);
// getMyPrivateVar() 메소드를 호출하여 값을 가져올 수 있습니다.
int value = myObject.getMyPrivateVar();
Getter와 Setter 메소드
Getter
와 Setter
메소드는 멤버 변수에 접근하기 위한 메소드이다. Getter는 멤버 변수의 값을 반환하고, Setter는 멤버 변수의 값을 설정한다. 이를 통해 외부에서 멤버 변수에 직접 접근하지 않고 간접적으로 접근할 수 있으므로 정보은닉이 가능하다.
ClassName classObj = new ClassName();
class.memberVriable = 10; ( X ) 멤버 변수에 직접 접근하여 값 변경
class.setMemberVriable(10) ( O ) 멤버 변수에 Setter 메서드로 간접 접근
정보은닉과 캡슐화의 장점
정보은닉을 통해 멤버 변수나 메소드에 대한 접근을 제한함으로써, 클래스의 내부 구현을 숨기고 외부에 노출되는 인터페이스를 제공할 수 있다.
이를 통해 다음과 같은 장점을 얻을 수 있다.
- 코드의 안정성을 높일 수 있다.
- 클래스의 내부 구현을 변경해도 외부에서 영향을 받지 않는다.
- 코드의 가독성을 높일 수 있다.
'JAVA' 카테고리의 다른 글
[JAVA] 객체 간의 협력(Collaboration)과 인터페이스(Interface) (0) | 2023.03.22 |
---|---|
[JAVA] This (0) | 2023.03.21 |
[JAVA] 람다식 (lambda Expressions) (0) | 2023.03.21 |
[라이브러리] LomBok(롬복) (0) | 2023.03.03 |
[JAVA] 재귀함수 (Recursion) (0) | 2022.12.03 |