강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

이석운님의 프로필 이미지
이석운

작성한 질문수

코틀린 고급편

4강. 선언 지점 변성 / 사용 지점 변성

반공변성 질문드립니다.

작성

·

51

1

Cage4 클래스로 반공변성 설명해주시는 부분에 실제 사용 예제가 없는 것 같습니다.

혹시 다른 곳처럼 예시코드 부탁드려도 될까요?

답변 3

0

최태현님의 프로필 이미지
최태현
지식공유자

아하~ Cage4를 이용한 예시가 궁금하셨군요! 🙂

class Cage4<T> {
  
  private val animals: MutableList<T> = mutableListOf()
  
  fun put(animal: T) {
    this.animals.add(animal)
  }
  
}

Cage3와 다르게 역으로 Cage4<GoldFish> 타입의 변수에 Cage4<Fish> 타입의 변수를 assign 할 수 있는지를 생각해보시면 좋을 것 같습니다.

현재 Cage4 <T> 에는 반공변성 지시어인 in 이 없기 때문에

val fishCage = Cage4<Fish>()
fishCage.put(Carp("잉어"))

val goldFishCage: Cage4<GoldFish> = fishCage

아래 코드는 당연히 에러가 날거에요! Cage4<Fish>Cage4<GoldFish> 는 다른 타입이니까요 🙂

 

하지만 만약 in 을 추가해주면~ Cage 입장에서는 내부 T 타입을 받기만하기 때문에 Fish Cage에 GoldFish가 들어와도 사실은 문제가 없고~ 따라서 위 코드의 에러가 사라지게 될거에요!

공변 / 반공변이 상당히 어려운 개념이라 이런게 있구나~ 정도로 이해하시고 실제 실무 환경에서 라이브러리나 프레임워크를 열어볼 때 어떤 코드에 어떻게 적용되어 있는지 관찰하시면 조금 더 이해도를 높이실 수 있을거에요!! 감사합니다~!!!

0

이석운님의 프로필 이미지
이석운
질문자

넵 해당 예시는 강의에서도 들어주셔서 이해했는데 실제로 Cage4 클래스를 이용해서 반공변 예시를 만드는게 어려워서요 ㅠㅠ..

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요! 🙂 데이터를 소비만 하는 반공변한 클래스의 대표적인 예시로는

Comparable이 있습니다. Comparable<in T> 처럼 in 지시어를 사용한 반공변 인터페이스이고요! 함수 역시 T 타입을 받기만 하고 있습니다. (반환 타입에 T가 있는게 아니라 매개변수 쪽에만 T가 있죠)

 

image.png

 

답변이 도움이 되었으면 좋겠습니다. 감사합니다. 🙇

이석운님의 프로필 이미지
이석운

작성한 질문수

질문하기