캡슐화(Encapsulation)란?
객체(Instance), Class의 내부 변수와 메소드를 하나로 패키징하는 것입니다.
객체에 저장된 속성과 메소드를 아무곳에서나 사용할 수 있다면 정상적인 객체라고 볼 수 없습니다.
정보를 은닉하여 객체의 내부 구현을 숨기면서 객체가 반드시 정해진 메소드를 통해 상호작용하도록 유도합니다.
객체의 응집도와 독립성을 높임으로써 객체의 모듈화를 지향합니다. 객체의 모듈화가 잘 이루어 져있으면 모듈 단위의 재사용이 매우 용이하여, 여러 로직에서 중복되는 코드를 모듈로 대체하면 모듈 내부의 소스만 수정하는 것으로 수정사항을 반영할 수 있습니다.
특징
1. 정보 은닉화
2. 사용자 편의
3. 유지보수 편의
캡슐화의 예제
Java에서는 접근제어자를 통해 객체의 캡슐화, 은닉화를 구현합니다.
접근제어자
- public : 다른 객체에서 해당 객체의 인스턴스를 생성하여 접근할 수 있습니다.
- protected : 해당 객체를 상속받은 객체 내부에서 접근할 수 있지만, 단순 인스턴스에선 접근할 수 없습니다.
- default : 동일한 패키지 내의 객체에서 인스턴스를 생성하여 접근할 수 있습니다.
- private : 선언된 객체 내부에서만 사용 가능하며, 외부에선 어떠한 방법으로든 해당 지시자를 가진 변수 혹은 메소드를 사용할 수 없습니다.
예제를 보면서 이해해보면 좋겠습니다.
public 요소의 접근 방법
public 은 접근제어자 중 가장 개방적인 접근 제어자입니다.
별다른 조건 없이 객체 Sample에서 객체 HousePark의 새로운 인스턴스를 생성하면 Sample에서 HousePark의 public 요소에 접근할 수 있는 권한이 생깁니다.
package house;
public class HousePark {
protected String lastname = "park";
public String info = "this is public message.";
}
import house.HousePark;
public class Sample {
public static void main(String[] args) {
HousePark housePark = new HousePark();
System.out.println(housePark.info);
}
}
protected 요소의 접근 방법
접근제어자가 protected로 설정되었다면 protected가 붙은 변수, 메서드는 동일 패키지의 클래스 또는 해당 클래스를 상속받은 다른 패키지의 클래스에서만 접근이 가능합니다.
package house; // 패키지가 서로 다름
public class HousePark {
protected String lastname = "park";
}
package house.person; // 패키지가 서로 다
import house.HousePark;
public class EungYongPark extends HousePark { // HousePark을 상속
public static void main(String[] args) {
EungYongPark eyp = new EungYongPark();
System.out.println(eyp.lastname); // 상속한 클래스의 protected 변수는 접근이 가능
}
}
HousePark 클래스를 상속한 EungYongPark 클래스의 패키지는 house.person으로 HousePark의 패키지인 house와 다르지만 HousePark의 lastname 변수가 protected이기 때문에 eyp.lastname과 같은 접근이 가능합니다. 만약 lastname의 접근제어자가 protected 가 아닌 default 접근제어자였다면 eyp.lastname 문장은 컴파일 오류가 발생할 것입니다.
default 요소의 접근 방법
접근 제어자를 별도로 설정하지 않는다면 접근 제어자가 없는 변수, 메서드는 default 접근 제어자가 되어 해당 패키지 내에서만 접근이 가능합니다.
package house; // 패키지 동일
public class HouseKim {
String lastname = "kim"; // lastname은 default 접근제어자로 설정
}
package house; // 패키지가 동일하다.
public class HousePark {
String lastname = "park";
public static void main(String[] args) {
HouseKim kim = new HouseKim();
System.out.println(kim.lastname); // HouseKim 클래스의 lastname 변수를 사용할 수 있다.
}
}
HouseKim과 HousePark의 패키지는 house로 동일합니다. 따라서 HousePark 클래스에서 HouseKim의 lastname 변수에 접근이 가능합니다.
private 요소의 접근 방법
접근제어자가 private으로 설정되었다면 private 이 붙은 변수, 메서드는 해당 클래스에서만 접근이 가능합니다.
public class Sample {
private String secret;
private String getSecret() {
return this.secret;
}
}
위 예제의 secret 변수와 getSecret 메서드는 오직 Sample 클래스에서만 접근이 가능하고 다른 클래스에서는 접근이 불가능합니다.
소감
접근 제어자를 잘 이용하여 프로그래머의 코딩 실수 방지를 하고 기타 위험 요소를 제거해야겠습니다. 캡슐화를 잘 이용한다면 보안면에서도 뛰어나고 개발의 완성도가 뛰어나질 것이라고 생각이 됩니다. 직접 객체 지향형 프로그래밍을 해보지는 않았지만 해보게 된다면 데이터 구조화 부터 class 생성 구축이 아주 흥미롭고 복잡할 것 같습니다.
출처
https://blog.itcode.dev/posts/2021/08/08/encapulation
'코딩 개발 > Java' 카테고리의 다른 글
Java - Data Type (0) | 2023.04.05 |
---|---|
Java - this (0) | 2023.04.03 |
Java - Heap & Stack 메모리 (feat. 예제를 통한 이해) (0) | 2023.04.02 |
Java - Cohesion & Coupling(응집도, 결합도) (0) | 2023.04.02 |
Java - OOP(Object OrienTed Programming) (0) | 2023.04.02 |