캡슐화(Encapsulation)
🤔 캡슐화란?
- 캡슐화는 하나의 목적을 이루기 위해 관련 있는 모든 것을 논리적으로 하나의 캡슐에 담아 두는 것을 의미합니다.
-> 객체 지향의 관점에서 캡슐은 클래스에 해당합니다.
-> 즉, 클래스를 적절히 캡슐화시키면 프로그램이 간결해집니다.
- 아래의 세가지 코 감기약이 있고 아래와 같은 기능들이 있다고 가정하겠습니다.
1. 흐르는 ‘콧물’을 멎게하는 기능을 가진 캡슐 약
2. 멈추지 않는 ‘재채기’를 가라앉혀 주는 기능을 가진 캡슐 약
3. 답답한 ‘코막힘’ 상태를 완화시켜 주는기능을 가진 캡슐 약
- 위의 기능들을 모아 하나의 코 감기약으로 캡슐화를 하면 복용하면 보다 약 사용에 간편합니다.
- 아래의 코드를 통해 캡슐화가 되지 않은코드와 캡슐화 된 코드 두 가지를 살펴봅시다.
캡슐화가 되지 않은 상태
💻 예시 코드
class SinivelCap{ //콧물 처치용 캡슐
void take(){
System.out.println("콧물이 싹~ 납니다.");
}
}
class SneezeCap{ //재채기 처치용 캡슐
void take(){
System.out.println("재채기가 맺습니다.");
}
}
class SnuffleCap{ //코막힘 처치용 캡슐
void take(){
System.out.println("커기 빵 뚫립니다.");
}
}
class ColdPatinet{
void takeSinivelCap(SinivelCap cap){
cap.take();
}
void takeSneezeCap(SneezeCap cap){
cap.take();
}
void takeSnffleCap(SnuffleCap cap){
cap.take();
}
}
public class BadEnxapsulatin {
public static void main(String[]args){
ColdPatinet suf = new ColdPatinet();
//콧물 캡슐 구매 후 복용
suf.takeSinivelCap(new SinivelCap());
//재채기 캡슐 구매 후 복용
suf.takeSneezeCap(new SneezeCap());
//코막힘 캡슐 구매 후 복용
suf.takeSnffleCap(new SnuffleCap());
}
}
📸 출력 결과
콧물이 싹~ 납니다.
재채기가 맺습니다.
커기 빵 뚫립니다.
이 경우 코감기 약을 SinivelCap,SneezeCap,SnuffleCap의 순으로 복용해야 하는 불편함이 존재합니다.
- 만약 이 세가지 코감기 약을 하나의 약으로 캡슐화 한다면 어떻게 될까요?
- 아래의 두가지의 코드를 살펴봅시다.
첫번째 캡슐화 하여 하나의 클래스로 만드는 예
- 한 캡슐에 3가지의 약의 기능을 모아 캡슐화하는 방법
💻 예시 코드
class SinusCap{
void sniTake(){
System.out.println("콧물이 싹~ 납니다.");
}
void sneTake(){
System.out.println("재채기가 멎습니다.");
}
void snuTake(){
System.out.println("코가 뻥 뚫립니다.");
}
void take(){ //약의 복용 방법 및 순서가 담긴 메소드
sniTake();
sneTake();
snuTake();
}
}
class ColdPatinet2{
void takeSinus(SinusCap cap){
cap.take();
}
}
public class OneClassEncapulation {
public static void main(String[]args){
ColdPatinet2 suf = new ColdPatinet2();
suf.takeSinus(new SinusCap());
}
}
📸 출력 결과
콧물이 싹~ 납니다.
재채기가 맺습니다.
커기 빵 뚫립니다.
- 코드를 살펴보면 다음과 같습니다.
-> SinusCap 클래스 안에 코감기와 관련된 모든 내용이 캡슐화되었습니다.
-> 이에 ColdPaint2 클래스와 main메소스가 이전 캡슐화 되지 않았던 코드보다 간결해졌음을 알 수 있습니다.
두번째 캡슐화 하여 하나의 클래스로 만드는 예
- 세가지 약들의 기능을 모아 하나의 캡슐로 다시 캡슐화하는 방법
💻 예시 코드
class SinivelCap2{ //콧물 처치용 캡슐
void take(){
System.out.println("콧물이 싹 ~ 납니다.");
}
}
class SneezeCap2{ //재채기 처리용 캡슐
void take(){
System.out.println("재채기가 맺습니다.");
}
}
class SnuffleCap2{ //코막힘 처치용 캡슐
void take(){
System.out.println("코가 뻥 뚫립니다.");
}
}
class SinusCap2{
SinivelCap2 siCap = new SinivelCap2();
SneezeCap2 szCap = new SneezeCap2();
SnuffleCap2 sfCap = new SnuffleCap2();
void take() {
siCap.take();
szCap.take();
sfCap.take();
}
}
class ColdPatient3{
void takeSinus(SinusCap2 cap){
cap.take();
}
}
public class CompEncapsulation {
public static void main(String[]args){
ColdPatient3 suf = new ColdPatient3();
suf.takeSinus(new SinusCap2());
}
}
📸 출력 결과
콧물이 싹~ 납니다.
재채기가 맺습니다.
커기 빵 뚫립니다.
- 코드를 살펴보면 다음과 같은 사실을 알 수 있습니다.
-> SinusCap2 클래스가 세가지 클래스(SinivelCap2,SneezeCap2,SnuffleCap2)의 인스턴스를 멤버 변수로 가질 수 있는데 이러한 과정을 가리켜 포함 관계 라고 합니다. 이러한 포함관계는 캡슐화하는데 사용되어 코드를 간편하게 만들 수 있습니다.
📒 Reference (참고 자료)
- 윤성우의 열혈 자바
'프로그래밍 언어 > Java문법 - 객체지향' 카테고리의 다른 글
6. Java 객체지향 문법(6) - 메소드 오버로딩 (0) | 2022.10.28 |
---|---|
5. Java 객체지향 문법(5) - 클래스 변수와 클래스 메소드 (0) | 2022.10.26 |
3. Java 객체지향 문법(3) - 정보은닉 (0) | 2022.10.24 |
2. Java 객체지향 문법(2) - 패키지 (0) | 2022.10.21 |
1. Java 객체지향 문법(1) - 클래스와 객체 (0) | 2022.10.21 |