개발 한번 해블로그
[Java] 18. 상속관계에서 객체 생성 및 Override 본문
1. 동작측면에서 클래스 설계하기
클래스를 동작하는 측면에서 상속(수평적 구조를 수직적 구조로 만들기)
<수평적 구조>
public class Cat02 {
public void night(){
System.out.println("밤에 눈에서 빛이 난다");
}
public void eat() {
System.out.println("고양이처럼 먹다");
}
}
public class Dog02 {
public void eat(){
System.out.println("개처럼 먹다");
}
}
import fc.java.model.*;
public class DogCatTest02 {
public static void main(String[] args) {
//Dog 객체를 생성하고 eat()동작을 구동
Dog02 d=new Dog02();
d.eat();
//Cat 객체를 생성하고 eat(), night() 동작을 구동
Cat02 c=new Cat02();
c.eat();
c.night();
}
}
<수직적 구조>
public class Animal02 {
public void eat(){
System.out.println("동물처럼 먹다"); //추상적인 표현(개는 개처럼먹다, 고양이는 고양이처럼먹다가 나와야함)
}
}
public class Cat02 extends Animal02 {
public void night(){
System.out.println("밤에 눈에서 빛이 난다");
}
}
public class Dog02 extends Animal02 {
}
2. 상속관계에서 객체생성 방법
상속 구조를 왜 사용해야하는지?(동작 측면에서)
- Dog 클래스를 다른 사람이 만들고 나한테 쓰라고 줬음. 사용자 입장에서 Dog.java 소스코드는 주지않고 Dog.class 하나의 완성된 클래스파일만 받음(일반적으로)
- 그럼 d. 이후로 뭘 사용해야할지 모름
- 클래스(인터페이스)를 하나 더 만들어 Dog.class를 구동할 수 있도록 해야함
그게 바로 업캐스팅 : 부모가 자식을 가리키는 객체생성 방법
Dog x=new Dog();
x.eat();
-> 사실 이건 잘못된거임. 왜냐면 Dog 클래스에 어떤 코드가 있는지 모름
Animal x=new Dog();
x.eat();
Animal x=new Cat();
x.eat();
-> but, 원하는 결과는 얻을 수 없음(개는 개처럼 먹다, 고양이는 고양이처럼 먹다로 출력X)
3. 상속 체이닝과 super
- 상속 체이닝 : 맨 위 부모클래스부터 객체가 생성되어 자식까지 연결되는 구조
- object 클래스가 항상 상속
- object -> Animal(animal, object 데이터까지) -> Dog(dog, animal, object 데이터까지)
- super : 상위 클래스의 생성자를 호출하는 메서드,
- 생성자 메서드에서 가장 첫 문장에 사용해야함
- public Dog(){ ///// } ///처럼 여러 문장이 있을 때 가장 첫 문장에 와야함
- 상위 클래스의 기본 생성자를 호출하는 super()는 생략되어있음
4. 메서드의 재정의(override)란?
<Override가 필요한 이유?>
- Override(재정의) : 상속관계에서 하위클래스가 상위클래스의 동작을 재정의하는 행위(기능 추가, 변경)
- 예를 들어 위에서 동물처럼 먹다가 아닌 개/고양이처럼 먹다로 출력되게 하는 것
- 동적바인딩 : 실행시점에서 사용될 메서드가 결정되는 바인딩
- Animal은 ‘동물처럼 먹다’라고 했지만 Dog/Cat에서 ‘개/고양이처럼 먹다’라고 재정의하고 실행하면 사용될 메서드가 자식으로 출력
- 즉, 컴파일 시점에서는 animal이나 실행 시점에서는 Dog/Cat 재정의가 되어 있으면 자식으로 구동
- Animal은 ‘동물처럼 먹다’라고 했지만 Dog/Cat에서 ‘개/고양이처럼 먹다’라고 재정의하고 실행하면 사용될 메서드가 자식으로 출력
public class Animal02 {
public void eat(){
System.out.println("동물처럼 먹다"); //추상적인 표현(개는 개처럼먹다, 고양이는 고양이처럼먹다가 나와야함)
}
}
public class Cat02 extends Animal02 {
//재정의(override)
public void eat(){
System.out.println("고양이처럼 먹다");
}
public void night(){
System.out.println("밤에 눈에서 빛이 난다");
}
}
public class Dog02 extends Animal02 {
public Dog02(){
super(); // new Animal02()이 호출되기때문에 상위 클래스에 생성자가 호출되어 객체가 만들어짐
//즉 부모가 먼저 만들어지고 자식이 만들어져야함
int a=10; //수행문
}
//재정의(override)
public void eat(){
System.out.println("개처럼 먹다");
}
}
import fc.java.model.Animal02;
import fc.java.model.Cat02;
import fc.java.model.Dog02;
public class DogCatOverride02 {
public static void main(String[] args) {
//업캐스팅 : Dog.java(x), Dog.class(o)
Animal02 x=new Dog02();
x.eat();
x=new Cat02();
x.eat();
}
}
실습 따라하면서 cat하니까 울 시도가 자꾸 생각난다,, 보고싶은 울 아들램,,
'Java' 카테고리의 다른 글
[Java] 20. 다형성과 활용 (0) | 2023.12.20 |
---|---|
[Java] 19. 객체 형 변환(feat. 캐스팅) (2) | 2023.12.20 |
[Java] 17. 자바의 상속(Feat. 김탄&최영도) (0) | 2023.12.20 |
[Java] 16. static과 JVM 메모리 모델 이해하기 (0) | 2023.12.08 |
[Java] 15. 배열이랑 클래스의 관계 (1) | 2023.12.08 |