6/8

ONLYS2545·2023년 6월 8일
0

오버라이딩 구현하기


package ex05.exam;

class Carnivore {
    void print() {
    }

}

class Tiger extends Carnivore {
    String name;

    public Tiger(String name) {
        this.name = name;
    }

    public void print() {
        System.out.println(name);
    }
}

class Lion extends Carnivore {
    String name;

    public Lion(String name) {
        this.name = name;
    }

    public void print() {
        System.out.println(name);
    }
}

public class ExtenExam {

    static void start(Carnivore v) {
        v.print();

    }

    public static void main(String[] args) {
        Lion lion = new Lion("사자1");
        Tiger tiger = new Tiger("호랑이1");
        start(lion);
        start(tiger);

    }
}


start는 메서드인데, lion과 tiger라는 참조변수를 인수로 받으려면 
매개변수의 타입이 lion과 tiger를 모두 포괄 할 수 있는 타입이어야 한다.
--> TigerLion 클래스의 공통적인 부모 클래스가 필요하다. 왜냐하면 
자식클래스는 상속한 부모의 타입으로 선언이 가능하기 때문

*추가학습*
만약 Carnivore v = new Lion("사자1"); 와 같이 선언된 경우에 Carnivore
클래스와 Lion 클래스에 동일한 이름의 변수 String name과 메서드 void print()
가 있다고 가정해보자.
System.out.print(v.name); 의 출력 값은 어떻게 될까?
-> 참조변수 v의 타입은 Carnivore로 선언되었으므로, v.name 호출시
Carnivore클래스의 name이 호출된다. 변수의 경우 정적 바인딩(컴파일시 결정)
을 따르므로, 변수 선언시에 지정된 Carnivore에서 name을 찾게 되는 것이다.
-> v.print();는 어떤 클래스의 메서드를 불러오는 것일까?
오버로딩은 동적 바인딩(실행 시점에 변수가 참조하는 실제 객체의 타입을 
참조)의 활용으로, 레퍼런스 변수 v의 타입으로 선언된
Carnivore가 아닌 실제 참조하는 객체인 Lion클래스를 기준으로 print()메서드를
호출하게 된다., 오버라이딩은 동적 바인딩의 자연스러운 결과인 것이다.
오버라이딩을 활용하면 오버로딩이 가지는 단점(매개 변수가 다양해지면 
코드의 길이가 증가 되고, 가독성이 저하된다.)
)을 보완해서 간결하고 명확한 코드를 작성할 수 있도록 도와준다.





profile
백엔드 교육과정 기록 velog입니다.

0개의 댓글