[컴퓨터공학]/[소프트웨어공학]

[소프트웨어공학] SOLID - 리스코프 치환 원칙(Liskov Suvstitution Principle)

딥러닝 도전기 2022. 5. 1. 22:15

[소프트웨어공학] SOLID - 리스코프 치환 원칙(Liskov Suvstitution Principle)

 

객체 지향 설계 5원칙 SOLID

SOLID란 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 의미합니다. 대규모 프로그램에서 프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 이 원칙들을 적용해야 합니다. 다섯 가지 기본 원칙은 다음과 같습니다.

 

1. Single Responsibility Principle, 단일 책임 원칙

2. Open-Closed Principle, 개방-폐쇄 원칙

3. Liskov Substitution Principle, 리스코프 치환 원칙

4. Interface Segregation Principle, 인터페이스 분리 원칙

5. Dependency Inversion Principle, 의존성 역전 원칙


객체 지향 설계 원칙은 위의 다섯 가지 원칙의 앞글자를 따서 SOLID라고 합니다. 

이번 포스팅에서는 세 번째 원칙인 리스코프 치환 원칙에 대해 다루도록 하겠습니다.

 


 서브 클래스는 기본 클래스를 대체할 수 있어야 한다.

리스코프 치환 원칙은 상속에 있어서 가장 중요한 기본 원칙을 제시하며 이는 개방-폐쇄 원칙을 가능하게 합니다.

리스코프 치환 원칙이 위배된 상속은 잘못된 상속입니다.

 

유명한 예시로 직사각형과 정사각형의 관계가 있는데, 이는 일반적인 관념으로는 정사각형이 직사각형을 상속받아야 하는 것이 맞습니다. 하지만 직사각형이 정사각형을 상속받는다면 리스코프 치환 원칙에 위배됩니다.

 

public class Rectangle{
	int width;
    int height;
    
    public int getWidth(){
    	return width;
    }
    
    public void setWidth(int width){
    	this.width = width;
    }
    
    public int getHeight(){
    	return height;
    }
    
    public int setHeight(int height){
    	this.height = height;
    }
    
    public int getArea(){
    	return width*height;
    }
}

위와 같이 직사각형 클래스를 정의하고, 이를 상속받는 정사각형 클래스를 만듭니다.

public class Square extends Rectangle{
	public void setWidth(int width){
    	this.height = width;
        this.width = width;
    }
    
    public void setHeight(int height){
    	this.height = height;
        this.width = width;
    }
}

 

getArea() 함수를 살펴보면 정사각형에서는 제대로 작동하지 않을 것을 확인할 수 있습니다.

서브 클래스인 정사각형이 직사각형을 대체할 수 없기 때문에 리스코프 치환 원칙에 위배됩니다.

 

또 다른 예시로, Animal이라는 클래스를 정의하고 "걷기", "뛰기", "울기" 행위를 추가하면 물고기는 이 행동들을 할 수 없기 때문에 리스코프 치환 원칙에 위배되기 때문에 동물의 상속구조에서 "걷기", "뛰기", "울기"의 행위는 상속 구조 자체에 넣을 수 없습니다. 이러한 행위는 상속과 별도로 존재해야 합니다.

 

 

반응형