Java/[국비] JAVA

[국비][JAVA] 상속과 다형성 이해 예시

줌인. 2024. 6. 2. 00:03

▶ 다형성 사용 이유 및 순수 추상클래스

https://zoooom-in.tistory.com/62

 

[김영한_자바기본][11. 다형성2] 다형성 사용 이유 및, 순수 추상 클래스(p.1-20)

1. 다형적 참조 / 메서드 오버라이딩을 통해 각자 다른 타입을 모두 동일화하여 중복을 제거할 수 있다. 2. 추상 클래스 : 상속을 목적으로 사용되고, 부모 클래스 역할을 담당, 인스턴스 존재X 3.

zoooom-in.tistory.com

 

▶ 상속과 메모리 구조

https://zoooom-in.tistory.com/61

 

[김영한_자바기본][10. 다형성1] 상속과 메모리 구조(p.1-23)

1. 자식 객체를 부모 참조 변수에 할당하면 부모 메서드에 접근이 가능하다. 2. 다운캐스팅은 '일시적으로' 부모 타입의 참조 변수를 자식 타입으로 형변환하는 것이다. 3. 다운 캐스팅 수행 전 ins

zoooom-in.tistory.com

 

 

추상 클래스/메서드는 불완전한 코드로 상속받아 완성해 사용해야 함
또한, 클래스 생성은 불가한 것이 특징
부모는 자식을 담을 수 있지만, 자식은 부모는 담을 수 없는 다형성 존재

 

상속(Inheritance) 부모 클래스의 속성과 메서드를 자식 클래스가 상속받아 사용
다형성(Polymorphism) 부모 타입의 참조 변수가 자식 클래스 객체를 참조할 수 있으며, 
메서드 오버라이딩을 통해 다형성을 구현
추상 클래스(Abstract Class) 하나 이상의 추상 메서드를 포함하는 클래스. 인스턴스 생성 불가, 상속을 통해 사용
다운캐스팅(Downcasting) 상위 클래스 타입의 참조 변수를 하위 클래스 타입으로 변환. 
변환하려는 객체가 실제로 해당 하위 클래스의 인스턴스여야 함
인터페이스(Inteface) 메서드만 모아놓은 공간

 

[예시 코드_Animal]

//클래스 생성 불가, 클래스 선언은 가능
public abstract class Animal { //완전하지 않은 클래스, 상속받아 사용해라
    int age;
    String name;

    //추상 메서드 -> 동일하게 상속받아 사용해라
    public abstract void sleep(); //불완전 메서드
}

 

[예시 코드_Bird]

public abstract class Bird extends Animal {//상속
    public Bird() {
        super(); //부모에게 상속받은 경우 생성자는 대부분 super()가 있다.
        //이는 첫줄에 작성되어 있어야 함
    }
    int wing;
    public abstract void fly(); //abstract class가 선언되어야 abstract 메서드 사용 가능
    //불완전한 메서드가 있기 때문에 해당 메서드를 완성해서 사용해야 함
    @Override
    public void sleep() {
        System.out.println("서서 잡니다.");
    }
}

 

[예시 코드_Eagle]

public class Eagle extends Bird{
    @Override
    public void fly() {
        System.out.println("Eagle은 납니다.");

    }
    @Override
    public void sleep() {
        System.out.println("Eagle은 서서 잡니다.");
    }
}

 

[예시 코드_Penguin]

public class Penguin extends Bird{
    @Override
    public void fly() {
        System.out.println("Penguin은 납니다.");

    }
    @Override
    public void sleep() {
        // TODO Auto-generated method stub
        System.out.println("Penguin은 서서 잡니다.");
    }
}

 

[예시 코드_Tiger]

public class Tiger extends Animal {
    int power;

    @Override
    public void sleep() { //추상메서드는 메서드를 완성 시켜줘야 한다.
        System.out.println("Tiger는 잡니다.");
    }
}

 

[예시 코드_S3Main]

public class S3Main {
    //Animal은 추상클래스이기 때문에 선언은 가능하다.(객체 생성 불가)
    public static void main(String[] args) {
        Tiger tiger = new Tiger();
        tiger.age = 5;
        tiger.name = "호돌이";
        tiger.power = 500; //객체에 데이터 모두 넣음

        Penguin penguin = new Penguin();
        penguin.age = 3;
        penguin.name = "펭수";
        penguin.wing = 2;

        Animal animal = tiger; //부모는 자식을 담을 수 있음 (주소값 전달)
        animal = penguin;
        //penguin = animal; -> 부모는 자식을 담을 수 있지만, 자식은 부모를 담을 수 없다. (디형성)
        animal.sleep();
        //animal.fly(); -> penguin타입을 담았지만 Type자체가 Animal이기 때문에 penguin type의 fly 접근 불가
        //즉 부모가 가지고 있는 것만 접근 가능
        //메모리 자체에 fly는 만들어져 있으나 타입 때문에 접근 불가

        //다만 Animal이라는 부모가 존재함에 따라 다양한 자식들을 담을 수 있음
        Animal[] dropShip = new Animal[8];
        dropShip[0] = tiger;
        dropShip[1] = penguin;
        Tiger animal3 = (Tiger) dropShip[0]; //Tiger type 형변환 가능
    }
}

 

 

[형변환이 아닌 다운캐스팅이 안되는 이유] 

public class S3Main {
    public static void main(String[] args) {
        Tiger tiger = new Tiger();
        tiger.age = 5;
        tiger.name = "호돌이";
        tiger.power = 500; //객체에 데이터 모두 넣음

        Penguin penguin = new Penguin();
        penguin.age = 3;
        penguin.name = "펭수";
        penguin.wing = 2;

        Animal animal = new Animal();
        //tiger = (Tiger) animal;
        //Animal이라는 객체에 Tiger를 담는게 아니라 Aniaml 자체를 다운캐스팅하려고 함
        //상기에서 언급했듯 Tiger에 접근할 수 있는 객체나 메서드가 없기 떄문에 다운 캐스팅 불가
    }
}

- Tiger에 접근할 수 있는 객체/메서드 존재 자체가 없기 때문에 Tiger type이 될 수 없음

728x90