티스토리 뷰

JAVA

SOLID(객체 설계의 5원칙)

kiwiiiv 2022. 3. 26. 20:53

 

SRP (Single Responsibility Principle)

 : 단 하나의 책임만을 가져야 한다. 수정이 필요한 이유는 하나여야 한다.

 작성된 클래스는 하나의 책임만을 가지며,

그 클래스가 제공하는 모든 서비스는 하나의 책임을 수행하는 데 집중되어야 함.

따라서 어떤 변화에 의해 클래스를 변경해야 하는 이유는 하나뿐이어야 함.

 

(+ 각 개체 간의 응집력이 있다면 병합이, 결합력이 있다면 분리가 좋음)

 

OCP (Open-Closed Principle)

 : 수정에는 닫히고, 확장에는 열어라

요구사항의 변경이 발생하더라도, 기존 구성요소에서 수정이 일어나지 않아야 하며,

기존 구성요소를 확장하여 재사용할 수 있어야 함을 의미함

 

-> 무엇이 변화하는 것인지, 변하지 않는 것인지를 구분

--> 변화하는 부분을 고려하여 추상화하여 쉽게 변화할 수 있게 함

 

중요 메커니즘 : 추상화, 다형성

 

LSP(리스코프 Substitution Principle)


 : 추상 객체(상위) 부분을 구상 객체(하위)로 치환하여도 정상적으로 동작되어야 한다.

 

이 때 LSP 원칙이 제대로 지켜지지 않으면, 다형성에 기반한 OCP 원칙 또한 위반하는 것이 됨

 

이에 대한 예시로

IF) 정사각형 - 직사각형 의 객체에 대하여 부모-자식 관계가 성립한다면

 

코드는 다음과 같다.

 

//Square

public class Square{
	private width;
    private height;
    
    //width==height 이므로 
	public void setWidth(int width){
    	this.width=width;
        this.height=width;
	}
    public void setHeight(int height){
    	this.width=height;
        this.height=height;
	}
}

 

 

//Rectangle

public class Rectangle extends Square{

	//width==height가 아니므로, 다음과 같이 재정의 되어야 함.
	@Override
    public void setWidth(int width){
    	this.width=width;
	}
    
    @Override
    public void setHeight(int height){
    	this.height=height;
	}
}

 

위의 Rectangle class 에서는, Square와 달리 모든 변의 길이가 같지 않으므로,

set 메소드는 위처럼 재정의 되어야 한다.

 

만약 위의 코드를 실행시키기 위해 다음과 같은 Main 클래스가 실행된다면,

public class Main{
	public static void main(String[] args){
    	Square square=new Rectangle();
        square.setHeight(5);
        System.out.println(square.getWidth);
}

Rectangle class의 setHeight 메소드를 이용하여는 width 값이 초기화될 수 없으므로, 

Exception이 발생하게 된다.

 

이 경우에서, 상위 타입의 객체가 하위 타입의 객체로 치환되었을 때 프로그램이 정상동작하지 않으므로, 

이는 LSP원칙을 위반한다고 할 수 있다.

 

-> 구상 객체는 추상 객체가 약속한 규약(어떻게 작동하는 지에 대한 구현 사항)을 지켜야 함(자식 클래스는 항상 부모 클래스의 역할을 충실히 수행해야 함)

(재정의 되지 않아야 함.. 이라고도 말할 수 있음)

 

 

ISP(Interface Segregation Principle)

: 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리되어야 한다.

 

클라이언트 기준으로 인터페이스(기능)를 분리함으로써, 

해당 클라이언트가 이용하지 않는 기능으로부터 영향을 받지 않을 수 있음

 

단일 책임을 주장하는 SRP 원칙을 준수하면, ISP 원칙 또한 만족될 수 있다.

(역방향은 성립하지 않음)

 

DIP(Dependency Inversion Principle)

: 의존 관계를 맺을 때, 변화하기 쉬운 것보다는 변화하기 어려운 것에 의존하라.

 

여기서 변화하기 어려운 것이란 추상적인 개념, 즉 인터페이스나 추상 클래스를 예로 들 수 있다.

 

따라서 의존성을 가질 때(한 클래스에서 다른 객체를 필드로 가질 때), 한 구상체에 의존하는 것 보다는 그 구상체를 추상화한 추상체에 의존하는 것이 좋음.

 

 

 

 

 

 

 

 

 

 

 

 


객체지향 SOLID 원칙 - SRP, OCP, LSP, ISP, DIP (tistory.com)

 

객체지향 SOLID 원칙 - SRP, OCP, LSP, ISP, DIP

오늘은 간단하게 객체지향 SOLID 5대 원칙에 대해 정리해두려고한다. 1.SRP (Single Responsibility Principle) - 단일 책임 원칙 한 클래스는 하나의 책임만 가져야 한다. SRP 원칙은 클래스가 하나의 기능만

devkingdom.tistory.com

 

 

'JAVA' 카테고리의 다른 글

함수형 인터페이스(Functional Interface)  (0) 2022.04.05
Collections.sort vs Arrays.sort  (0) 2021.12.07
BufferedReader, BufferedWriter  (0) 2021.11.24
[java] Map method  (0) 2021.11.06
Map 을 정렬된 ArrayList로 변환  (0) 2021.11.06
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함