Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발 한번 해블로그

[Java] 18. 상속관계에서 객체 생성 및 Override 본문

Java

[Java] 18. 상속관계에서 객체 생성 및 Override

hide on bush 2023. 12. 20. 10:56

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 재정의가 되어 있으면 자식으로 구동
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하니까 울 시도가 자꾸 생각난다,, 보고싶은 울 아들램,,