OOP/OOP Basic

[OOP] 캡슐화

IT록흐 2022. 10. 17. 21:17
반응형

 

캡슐화(Encapsulation)

 

캡슐화는 요구사항 변경을 유연하게 만든다. 그 이유는 높은 응집도와 낮은 결합도를 구현하기 때문이다. 응집도는 모듈 내부의 구성요소가 얼마나 통일성 있는지를 나타낸다. 모듈 내부의 변수나 메소드가 서로 다른 목적과 역할을 가진다면 모듈의 응집도는 떨어지고 여러 요소에 영향을 많이 받는다. 즉 유지보수가 어려워진다.

 

 

1) 응집도

 

public class Computer{

	private Mainboard mb;
	private CPU cpu;
	private Memory memory;
	private Phone phone; // 아무 관련 없는 객체
	
	public Computer(){
		this.mb = new MainBoard();
		this.cpu = new CPU();
		this.memory = new Memory();
		this.phone = new Phone();
	}
	
	
	public void turnOn(){
		mb.execute();
		cpu.execute();
		memory.execute();
		phone.execute(); // 아무 관련 없는 객체의 메소드
		phone.call(); // 아무 관련 없는 객체의 메소드
	}
}

 

 

Computer 클래스이면 컴퓨터와 관련된 기능을 해야한다. 하지만 컴퓨터와 관련없는 Phone 객체를 가지고 turnOn() 메소드는 컴퓨터와 관련 없는 기능까지 한다. 이처럼 모듈의 응집도가 떨어지면 유지보수가 어려워진다. 만약 Phone 객체에 문제가 생기거나 요구사항이 변경된다면 전혀 관련없는 컴퓨터 클래스까지 변경해야 한다. 

 

그러므로 모듈은 단일한 관심사로 응집되어야 유지보수가 용이해진다.

 

 

2) 결합도 

 

public class PrinterA{
	public String[] data;
	
	public void print(){
		// 프린트 로직....
	}

}


public class ComputerA{

	String[] data;

	public print(){
		PrinterA printerA = new PrinterA();
		printerA.data = data; // Printer 객체 변수에 직접 접근
		printerA.print();
	}
}

 

 

결합도는 모듈과 모듈 사이의 결합된 정도를 의미한다.  Computer 객체는 Printer 객체의 data 문자열 배열에 직접접근하였다. 이렇게 객체가 다른 객체의 변수에 직접 접근하는 경우 결합도가 올라간다. 결합도가 올라가면 유지보수가 어려워진다. 만약 기능개선을 위해 Printer 객체의 data 문자열 배열을 문자열 리스트로 바꾼다고 가정해보자.

 

그렇다면 Printer 객체 뿐만 아니라 Computer 객체의 코드도 바꾸어주어야 한다. 이처럼 변수에 집적 접근하는 방식보다는 메소드를 호출한 후 파라미터를 넘겨주는 방식이 결합도를 낮출 수 있다.

 

 

public class PrinterA{
	public List<String> data;
	
	public void print(String[] data){
		// 프린트 로직....
	}

}


public class ComputerA{
	String[] data;

	public print(){
		PrinterA printerA = new PrinterA();
		printerA.print(data); // 파라미터만 넘겨주면 되는 Computer 객체
	}
}

 

 

하지만 이 또한 결합도가 높다고 할 수 있다. ComputerA 객체는 오로지 PrinterA객체만 사용할 수 밖에 없다. 만약 인터페이스를 사용한다면 ComputerA 객체는 PrinterA가 오든 PrinterB가 오든 모든 사용 가능하다.

 

 

public interface Printer{
	public void print(String[] data);
}

public class Computer{

	String[] data;

	public print(Printer printer){
		printer.print(data);
	}
} 

public static void main(String[] args){

	ComputerA computerA = new ComputerA();
	Printer printer = new PrinterB(); // Printer 교체할 경우가 생기면 이 부분만 바꾸면 된다. 
	
	computerA.print(printer); // Printer를 교체할 경우가 생겨도 Computer 소스는 건들지 않아도 된다.
	
}

 

 

Computer와 Printer 사이의 결합도는 현저히 떨여졌다. Computer는 Printer의 내부구조를 몰라도 된다. 이와 같이, 내부구조를 숨기고 기능만 명시하여 낮은 결합도를 유지하는 것을 두고 '정보 은닉'이라한다. 그러므로 캡슐화(Encapsulation)란, 객체의 응집도를 높여 단일 목적을 갖고 객체 간 내부 로직을 숨겨 결합도를 낮추어 요구사항 변경에 유연하게 대처하는 객체지향 설계방식을 의미한다. 

 

 

 


 

 

참고자료

 

JAVA 객체지향 디자인 패턴 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 

 

 

반응형

'OOP > OOP Basic' 카테고리의 다른 글

[OOP] 특수화  (0) 2022.10.18
[OOP] 일반화(추상화)  (0) 2022.10.17
[OOP] 의존관계  (0) 2022.10.12
[OOP] 합성관계와 집합관계  (0) 2022.10.12
[OOP] 연관관계(2) - Vector의 사용  (0) 2022.01.30