Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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
Archives
Today
Total
관리 메뉴

Code Habit

[Go언어] 리스코프 치환 원칙 본문

카테고리 없음

[Go언어] 리스코프 치환 원칙

코드베어 2022. 11. 22. 19:33

해당 원칙은 상위 타입의 객체를 하위 타입의 객체로 치환해도 동작에 문제가 없어야 한다는 것을 정의한다. 자식 클래스 언제나 자신의 부모클래스를 교체할 수 있어야 하고 한 객체를 다른 객체가 파생하더라도 그 기본 로직은 변경 되어서는 안된다. 

 

리스포크 치환 원칙은 부모 객체와 이를 상속한 자식 객체가 있을 때 부모 객체를 호출하는 동작에서 자식 객체가 부모 객체를 완전히 대체할 수 있다는 원칙이다.

 

type T interface {
	SomeThing()
}

type S struct {
}

func (s *S) SomeThing() {
	fmt.Println("type S의 Something")
}

type U struct {
}

func (u *U) SomeThing() {
	fmt.Println("type U의 Something")
}

func q(t T) {
	t.SomeThing()
}

func main() {
	var y = &S{}
	var u = &U{}
	q(y)
	q(u)
}

인터페이스 T 정의하고 이 인터페이스를 구현한 struct 타입 S, U객체를 부모 인터페이스인 T 타입으로 인수로 받아 사용한다. 이때 함수 q()는 S 객체 인스턴스인 y와 U 객체 인스턴스인 u 모두에 대해서 잘 동작해야 한다는 얘기이다..

 

이전에 소개했던 덕타이핑과 유사점이 있다..

 

사실 이는 Go 언어보단 클래스나 다른 상속을 지원하는 언어에서 더 중요하게 다뤄진다. 필자가 C++개발할때도 공통되는 특성을 지닌 부모 interface를 정의하고 아래 자식 class에서 이를 상속받아 정의하여 dynamic_casting을 통해 편리하게 치환하며 사용했던 경험이 있다.