이전에는 데이터의 상태정보에 초점을 맞춰 DTO, VO 클래스 위주로 데이터를 다루었다면, 행위(동작) 정보를 초점에 맞춰서 클래스와 클래스를 설계(상속)하는 방법을 알아보겠습니다.
수평적 구조로 설계하다보면 Dog와 Cat의 공통적으로 할 수 있는 동작은 eat(먹다) 라는 같은 기능을 하는 동작의 중복이 발생합니다.
동물들에게는 eat라는 중복기능이 나올 확률이 높습니다.
class Animal {
// 부모 클래스 멤버
}
class Dog extends Animal {
// 자식 클래스 멤버
}
Dog dog = new Dog();
Animal animal = dog; // Upcasting
Animal animal = new Dog(); // Upcasting
if (animal instanceof Dog) {
Dog dog = (Dog) animal; // Downcasting
// dog 변수를 통해 animal이 Dog 클래스의 멤버에 접근
}
🎈 Upcasting(업캐스팅 / 자동형변환) 이란 ?
업캐스팅은 부모 클래스 타입으로 자식 클래스의 객체를 참조하는 것을 말합니다.
업캐스팅을 사용하는 이유는 다형성(Polymorphism)을 활용하기 위함입니다. 부모 클래스는 자식 클래스의 공통된 특징과
기능을 포함하고 있으므로, 업캐스팅을 통해 부모 클래스 타입으로 자식 클래스의 객체를 다룰 수 있게 됩니다.
이로써 코드의 유연성과 확장성을 높일 수 있습니다. 업캐스팅은 런타임에 동적으로 객체의 실제 타입을
결정할 수 있기 때문에 다양한 자식 클래스의 객체를 부모 클래스 타입으로 처리할 수 있습니다.
💡 업캐스팅 문법 → 상위 클래스타입 인스턴스 변수 = new 하위클래스();
Animal x = new Dog();
→ 객체로의 생성은 Dog()이지만 Animal의 타입으로 받습니다. 둘은 상속관계이기때문에 가능합니다. (하위가 상위로 들어가는 것은 자동!)
부모가 자식을 가리키는 객체 생성 방법 → 하위 클래스의 동작을 알 수 없을때는, 부모타입으로 객체를 생성할 수 밖에 없기때문에 자주 사용됩니다.
🎈 Downcasting(다운캐스팅 / 강제형변)이란 ?
다운캐스팅은 업캐스팅된 객체를 다시 원래의 자식 클래스 타입으로 변환하는 것을 말합니다.
다운캐스팅은 주로 다형성을 통해 업캐스팅된 객체가 실제로 어떤 자식 클래스의 객체인지 확인하고,자식 클래스에 고유한 메서드나 속성에 접근하기 위해 사용됩니다.
다운캐스팅은 정확한 타입의 메서드나 속성을 사용할 수 있도록 객체를 변환해주는 역할을 합니다.
다운캐스팅은 업캐스팅된 객체를 다시 자식 클래스 타입으로 형변환하여 사용하는 것이기 때문에
정확한 타입 체크가 필요하며, 올바른 타입이 아닌 경우에는 ClassCastException이 발생할 수 있습니다.
💡 다운캐스팅 문법 → 하위클래스의 타입 다운캐스팅된 객체를 저장할 변수 = (하위클래스의 타입) 상위클래스의 객체
다운캐스팅은 주의해야 할 점이 있습니다. 만약 다운캐스팅을 시도하는 객체가 실제로 해당 하위 클래스의 인스턴스가 아니라면,ClassCastException이 발생할 수 있습니다. 따라서 다운캐스팅을 수행하기 전에 항상 해당 객체가 정말로 하위 클래스의 인스턴스인지를 확인하는 것이 좋습니다.
이를 위해 instanceof 연산자를 사용할 수 있습니다.
instanceof 연산자 : instanceof 연산자는 객체의 타입을 확인하기 위해 사용되는 연산자 사용 문법 : [객체] instanceof [타입]
업캐스팅은 다양한 자식 클래스를 부모 클래스의 타입으로 다룰 수 있도록 하고, 다운캐스팅은 업캐스팅된 객체를 원래의 자식 클래스 타입으로 형변환하여 자식 클래스에 고유한 기능에 접근할 수 있도록 합니다.
'[ BACKEND] > JAVA_객체지향' 카테고리의 다른 글
[JAVA] 인터페이스의 등장 (1) | 2023.06.20 |
---|---|
[JAVA] 다형성 (Polymorphism)과 활용 (0) | 2023.06.19 |
[JAVA] 객체지향 프로그래밍 설계 (2) | 2023.06.17 |
[JAVA] 객체 생성 & Static 과의 관계 (0) | 2023.06.16 |
[JAVA] static과 JVM의 메모리 모델 (0) | 2023.06.15 |