영권's
JAVA - 업캐스팅과 다운캐스팅 (형변환) 본문
업 캐스팅과 다운 캐스팅에 대해서 알아보겠습니다.
먼저 업 캐스팅과 다운 캐스팅을 알기 위해서는 상속 관계를 알아야 합니다.
자바에서는 자식클래스를 new인스턴스를 이용하여 객체 생성하면 개발자가 명시를 해주지 않더라도 JVM에서 자동으로 자식 객체의 디폴트 생성 자안에 있는 super() 키워드로 상속받은 부모 클래스의 객체가 먼저 heap 메모리에 객체가 생성되고 나서 자식 클래스 객체가 생성이 됩니다.
위 사진을 보면
Cat cat = new Cat(); 으로 먼저 자식 객체를 생성해주고 부모 타입인 Animal 타입으로 객체를 받으려고 하는데 이때 Cat객체를 가리키는 참조 변수를 이용하여 Animal객체를 사용할 수 있게 됩니다.
결국 참조변수 cat과 animal은 같은 주소 값을 같게 되지만 animal은 Animal 타입에 해당하는 자원(필드, 메서드)만을 사용이 가능하고 Cat에서 메서드 오버라이딩을 해준것이 있다면 오버라이딩 된 메서드를 사용하게 되고 cat은 Cat 객체에서만 사용이 가능한 자원과 상속받은 자원을 모두 사용이 가능합니다.
Animal 객체를 생성할 때
Cat cat = new Cat();
Animal animal = cat; => Animal animal = new Cat(); 두 개의 코드가 같은 결과를 갖게 됩니다.
위 코드에서 보면 자식객체를 생성할 때 자식 생성자에서 따로 super키워드를 명시하지 않아도 jvm에서 생성하여서 parent 생성자가 호출된 후 children 생성자가 호출된 것을 볼 수 있습니다.
자식 객체를 이용하여 부모 클래스 타입으로 형 변환하는 것을 업 캐스팅이라고 하고 반대로 부모클래스 타입을 참조하고 있는 것을 자식클래스 타입으로 형 변환 하는 것을 다운캐스팅 이라 하는데 8번째 줄에서 명시적으로 업 캐스팅 한것을 볼 수 있고 work메서드를 사용하였습니다.
12번째 줄에서는 부모타입을 가리키는 참조변수를 다운캐스팅하여 자식타입 참조변수에 대입하였는데 다운캐스팅이 가능하려면 부모타입을 가리키는 참조변수는 먼저 업캐스팅이 선행(8번째줄) 되어야 하고 해당 참조변수를 이용해 자식객체의 play()메서드가 사용된것을 볼 수 있습니다.
또한 8번째줄의 업캐스팅을 할때에 코드에서는 형 변환을 명시적으로 해주었지만 따로 명시해주지 않아도 jvm에서 알아서 바꿔줍니다.
그럼 그냥 자식 타입으로 사용하면 될 것을 부모타입으로 변환해서 사용하는 이유가 무엇일까?
그것은 다형성을 구현하는 기술적 방법 때문이라고 합니다.
이 부분은 다음에 다시 포스팅 하겠습니다.
ps. 공부한것을 정리하려고 만든 블로그이며 내용이 틀리거나 부족할 수 있습니다. 언제든 지적해주시기 바랍니다.
'자바 > JAVA' 카테고리의 다른 글
Java - Stream (0) | 2021.09.19 |
---|---|
CompletableFuture (0) | 2021.08.09 |
자바 (Optional) (0) | 2021.08.01 |
JAVA 인터뷰 대비 (0) | 2020.10.25 |
JVM (0) | 2020.10.14 |