※ 업캐스팅(Upcasting)
업캐스팅은 객체 지향 프로그래밍에서 객체의 형식을 변환하는 것.
하위 클래스 객체를 상위 클래스 타입으로 변환하는 것
즉, 자식 클래스의 객체를 부모 클래스의 객체로 변환하는 것입니다.
업캐스팅은 상속 관계에서 발생하며, 부모 클래스의 참조 변수로 자식 클래스의 객체를 다루는 것을 의미합니다.
이렇게 업캐스팅된 객체는 부모 클래스의 타입으로 사용될 수 있으며, 부모 클래스에 정의된 멤버들만 접근할 수 있습니다.
업캐스팅을 통해 부모 클래스로부터 상속된 기능들만 접근 가능하게 됩니다.
업캐스팅은 묵시적으로 수행됩니다. 즉, 자식 클래스 객체를 부모 클래스 참조 변수로 할당할 때 별도의 캐스팅 작업이 필요하지 않습니다.
업캐스팅은 객체지향 프로그래밍에서 다형성을 구현하는데 도움을 줍니다.
// "Vehicle"이라는 부모 클래스와 "Car"라는 자식 클래스
Vehicle vehicle = new Car(); // Car 객체를 Vehicle 타입으로 업캐스팅
class Animal {
void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Cat extends Animal {
void makeSound() {
System.out.println("Cat meows");
}
void scratch() {
System.out.println("Cat scratches");
}
}
Animal animal = new Cat(); // Cat 객체를 Animal 타입으로 업캐스팅
- Cat 클래스의 객체를 Animal 클래스의 참조 변수로 다루게 되면, Cat 클래스의 scratch() 메서드는 접근할 수 없습니다. 하지만 makeSound() 메서드는 업캐스팅 후에도 호출될 수 있으며, 이때는 Cat 클래스의 오버라이딩된 버전이 실행.
※ 다운캐스팅(Downcasting)
Downcasting은 상위 클래스의 인스턴스를 하위 클래스의 인스턴스로 캐스팅하는 것을 말합니다. 즉, 업캐스팅된 객체를 원래의 자식 클래스 타입으로 다시 되돌리는 것입니다. 이때 다운캐스팅은 명시적으로 타입을 지정해야 합니다.
public class UpCasting {
static void m(Object o1, Object o2){
System.out.println(o1.toString());
System.out.println(o1.equals(o2)); //false
}
public static void main(String[] args){
Object obj1, obj2;
obj1 = new Object();
obj2 = new Object();
m(obj1, obj2); // java.lang.Object@123772c4
// false
String s1, s2;
s1 = new String("Hi");
s2 = new String("Hi");
m(s1, s2); // Hi
// true
}
}
※ main 메서드 먼저 실행된다. HEAP영역에 부모부터 먼저 만들어짐
obj1과 obj2 변수는 스택에 들어가고, new Object()로 생성된 객체는 힙에 들어간다.
지역변수는 자동초기화 안됨. stack 영역에 아래부터 차례차례 쌓임, 참조형들임.
- public boolean equals(Object obj)
: this method returns true if and only if x and y refer to the same object (x == y has the value true).
여기선 x = o1, y= o2
object의 대표메서드 equals, toString()
그 다음 자식인 string클래스에는 equals() 메서드가 재정의가 되어있음
hi는 2개의 문자 배열, string 변수 value가 참조 중
h | i |
m(s1, s2);
대입되는 서로 자료형이 string과 object로 일치하지 않음
s1이 o1에 복붙되는게 맞는데, 자료형이 다르니까 s1의 string 전체가 아니라 그 안의 object 메모리 영역만 참조가능(
부모영역만 참조 가능)
→ upcasting 자식타입이 부모타입으로 형변환, 부모 영역만 사용 but 오버라이딩된 메서드가 있는 경우, 오버라이딩된 메서드만 사용
Object equals(), toString() 부모영역이 가지고 있는 메서드
String value 참조형변수, equals() 자식에도 equals있으니까 부모의 메서드 가려지고(덮어씌워지고, 오버라이딩되고)
자식 쪽 equals만 사용됨/활성화됨, 스트링은 문자열이 같으면 true를 반영.
sop(o1.equals(o2));
→ object의 equals가 호출되기도 하고 string의 equals가 호출되기도 한다. 다형성.
'언어 > Java' 카테고리의 다른 글
상속과 생성자 (0) | 2023.08.01 |
---|---|
메서드 오버라이딩 (0) | 2023.08.01 |
오버라이딩(Overriding)과 다형성(Polymorphism) (0) | 2023.07.31 |
상속 예제 (0) | 2023.07.31 |
상속(Inheritance) (0) | 2023.07.31 |