리스코프 치환 원칙 - Kotlin 예시

dev210·2023년 10월 9일
0

SOLID 원칙

목록 보기
3/5

리스코프 치환 원칙(LSP, Liskov Substitution Principle)

- 하위 타입 객체는 상위 타입 객체에서 가능한 행위를 수행할 수 있어야한다.
- 하위 타입의 객체를 상위 타입의 객체로 치환해도 정상적으로 동작해야한다.
다형성을 의미

예시

다음과 같이 부모 클래스 Database를 상속하는 자식 클래스 LocalDatabase에서 create 함수를 오버라이딩해서 다음과 같이 수정했다고 가정하자.
이때 Database에서 create한 데이터가 생성되었는지 확인하는 작업을 수행한다면 localDatabase만 null을 출력한다.
이 경우에 자식 클래스인 LocalDatabase가 부모 클래스 Database의 의도와 다르게 create 함수를 오버라이딩하여 부모 클래스의 행동 규칙을 위반하여 상위 타입인 Database 클래스에서 가능한 create를 제대로 수행하지 못하게된다.
또한 changeDatabase에서 하위 타입인 LocalDatabase를 상위 타입인 Database로 치환해도 null을 출력하므로 정상적으로 수행하지 못한다는 것을 알 수 있다.

open class Database {  
  
    lateinit var name: String  
    var dataList = mutableListOf<String>()  
  
    open fun create() {  
        var newData = "newData"  
        dataList.add(newData)  
    }  
	
	...
  
}

class LocalDatabase : Database(){  
  
	...

    override fun create(){  
        var newData = "newLocalData"  
        dataList.add(newData)  
    }  
}
  
fun main(args: Array<String>) {  
  
    val database = Database()  
    val localDatabase = LocalDatabase()  
    val remoteDatabase = RemoteDatabase()  
    val changeDatabase = localDatabase as Database  
  
    database.create()  
    localDatabase.create()  
    remoteDatabase.create()  
    changeDatabase.create()  
  
    println("database: ${isCompleteCreate(database)}")  
    println("localDatabase: ${isCompleteCreate(localDatabase)}")  
    println("remoteDatabase: ${isCompleteCreate(remoteDatabase)}")  
    println("changeDatabase: ${isCompleteCreate(changeDatabase)}")  
}  
  
fun isCompleteCreate(database: Database) : Boolean? {  
    return database.read("newData")?.isNotEmpty()  
}

<실행결과> 
database: true
localDatabase: null
remoteDatabase: true
changeDatabase: null
profile
안드로이드 개발자

0개의 댓글