본문 바로가기

개발(합니다)/Java&Spring

공변성, 무공변성, 반공변성이란?

반응형

  • 공변성, 무공변성, 반공변성이란
    1. 공변성(covariant) : T가 T의 서브타입이면, C<T>는 C의 서브 타입이다.
    2. 반공변성(contravariant) : T가 T의 서브타입이면, C<T>는 C<T>의 서브 타입이다.
    3. 무변성(invariant) : C와 C<T`>는 아무 관계가 없다.
    • 공변성(서브타입 와일드 카드) : 자기 자신과 자식 객체만, 타입 T를 확장한 타입에 대해서 허용
        // 공변성 : 자기 자신과 자식 객체만 허용함
          public static List<Character> firstChars(List<? extends CharSequence> list ) {
              return list.stream().map(cs -> cs.charAt(0)).collect(Collectors.toList());
          }
      
        // 반환 타입은 저장할 수 있지만, 파라미터에는 사용할 수 없다.
          List<? extends String> list = new ArrayList<String>();
          String first = list.get(0); // 반환 타입을 String 변수에 저장할 수 있다.
          list.add("abc"); // 컴파일 에러, String 변수를 인자로 넘길 수 없다. / 뭔지도 모르는 타입 변수를 만들 수 없다.
      
      • 서브 타입 와일드 카드는 메서드의 반환 타입에서는 사용할 수 있지만, 메서드의 파라미터에는 사용할 수 없다.
      • ? extends String 형태
    • 무공변성(불변성) : 자기 자신 타입 T만 허용
          static class Test {
              public void printCollectionGen(Collection<Object>collection) {
                  for (Object e : collection) {
                      System.out.println(e);
                  }
              }
      
                  public Test() {
                  }
              }
      
              public static void main(String[] args) {
                  Test t = new Test();
                  List<String> s = new ArrayList<>();
                  s.add("Test");
                  t.printCollectionGen(s); // 컴파일 오류
              }
      
    • 반공변성(슈퍼타입 와일드 카드) : 자기자신과 부모 객체만, 타입 T의 상위(부모) 타입에 대해서 허용
        public static void main(String[] args) {
          // 반공변성
          // 반환 타입에는 사용할 수 없다.
          List<? super String> list2 = new ArrayList<String>();
        String first2 = list2.get(0); // 컴파일 에러, String 반환 타입을 사용할 수 없다. / String을 Object를 할당 할 수 없는 것과 같다.
          list2.add("Test"); // String 변수를 인자로 넘길 수 있다.
        }
      
      • 슈퍼 타입 와일드 카드는 메서드의 파라미터 타입을 설정에 사용하지만, 반환 타입으로는 사용할 수 없다.
      • 반공변성은 주로 타입 파라미터로 결정되는 함수형 인터페이스에서 사용 된다.
      • ? super String 형태
반응형