JAVA 8일차

Lucy in the Sky with Diamond·2023년 6월 23일

배열의 공변성

class Animal {
    public void makeSound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Dog barks");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog[] dogs = new Dog[3];
        dogs[0] = new Dog();
        dogs[1] = new Dog();
        dogs[2] = new Dog();
        
        Animal[] animals = dogs;  // 배열의 공변성
        
        animals[0].makeSound();  // Dog barks
        animals[1].makeSound();  // Dog barks
        animals[2].makeSound();  // Dog barks
    }
}

Dog라는 클래스를 통하여 dogs 배열이 생성이 되었으며
Animal이라는 클래스를 통하여 dogs 배열이 하위 타입으로 형변환될 수 있는 성질을 가리킨다.


List[] stringLists = new List[2];
List intList = List.of(1, 2, 3);
Object[] objArray = stringLists;
objArray[0] = intList;
String str = stringLists[0].get(0);

stringLists -> List[2] : element 2개
intList -> List[3] -> Integer

ObjArray[0] -> List[3] -> 1st Element
StringLists[0] -> List[3].get(0)

배열은 공변성을 지원한다.
Heap pollution을 야기함

반면 Generic은 공변성 그딴거 없음. 타입 안정성을 위해 만들어졌으니까
-> 배열을 그러면 못쓰잖아? -> ㅋㅋ 콜렉션을 쓰면 되지!

0개의 댓글