티스토리 뷰

Programming Language/Go

[Go] 다형성

SdardewValley 2021. 12. 9. 18:00
반응형

다형성

 

다형성

다양한 타입의 객체가 같은 메시지를 통해 다양한 방식으로 동작하는 것

다른 언어에서는 메서드 오버로딩, 서브타이핑 등으로 다형성을 지원한다. Go에는 서브타이핑, 오버로딩이 없다. 대신 Go에서는 인터페이스를 통하여 다형성을 지원한다.

 

오버로딩

같은 이름의 함수이지만 매개 변수 등의 signature를 다르게 하여 정의한 것

 

서브타이핑

상위 타입을 하위 타입으로 대체할 수 있는 것

 

인터페이스는 메서드 signature의 묶음이다. Go는 이런 메서드에 따른 동작에 따라서 인터페이스와 is-a 관계를 형성한다.

 

is-a

상속 관계이다. "그랜저는 자동차이다"는 is-a 관계이다. 그랜저는 자동차의 속성을 모두 가지고 있다.

 

has-a

소유 관계이다. "자동차는 바퀴를 가지고 있다"는 is-a 관계이다. 자동차는 바퀴를 가지고 있다.

 

 

인터페이스 다형성

 

  Coster 인터페이스는 Cost() 메서드를 가진다. displayCost는 이 Coster 인터페이스를 받아 Cost() 함수를 실행하여 출력한다.

 

구조체 Item, DiscountItem, Rental 모두 Cost 메서드를 사용할 수 있다. 따라서 이 세 struct는 Coster 인터페이스로 사용할 수 있고, Coster 인터페이스를 파라미터로 받는 displayCost 함수를 실행할 수 있다.

 

 

displayCost를 사용하여 출력한 모습이다.

 

 

제너릭 컬렉션

배열, 슬라이스, 맵은 정해진 타입만 정해져있다. 하지만 타입을 인터페이스로 지정하면 인터페이스의 조건을 만족하는 타입이면 배열, 슬라이스, 맵에 담을 수 있다.

 

Coster 인터페이스의 배열 Items이다. 이런 Items의 배열 items를 만들어 Coster 인터페이스에 해당하는 값들을 넣어주었다.

 

 

인터페이스의 장점

  인터페이스나 클래스를 상속 받으면 연결 고리가 생겨버리기 때문에 확장성이 떨어지게 된다. Go의 인터페이스는 모듈간의 연계를 쉽게 해준다. 이런 인터페이스의 특징으로 Go는 컴파일러의 보장을 받으며 동적인 프로그래밍이 가능해진다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함