passion and relax

[JAVA] 07. 객체마을에서의 더 나은 삶 (미래를 준비합시다) 본문

프로그래밍

[JAVA] 07. 객체마을에서의 더 나은 삶 (미래를 준비합시다)

Grab Java 2024. 5. 21. 10:11

상속으로 해야하는지, 변수로 해야 하는지

A는 B다, B는 A다가 성립 된다면, (고양이는 동물이다)
    A는 B다 : B extends A
    B는 A다 : A extends B
A는 B다, B는 A다가 성립이 안된다면, (화장실에는 욕조가 있다)
    A에는 B가 있다 : A의 인스턴스 변수로 B를 선언
    B에는 A가 있다 : B의 인스턴스 변수로 A를 선언

 


상속의 장점

쉽게 확장할 수 있다. (적절한 디자인패턴이 동반된다면, 유지보수가 쉽고 기다려 진다)
코드 중복 방지
일련의 클래스를 위한 공통적인 규약을 정의 (abstract)
다형성을 이용하여 상위 객체에 하위 객체 담기
Animal[] animals = new Animal[5];
animals[0] = new Dog();
animals[1] = new Cat();
for (int i=0; i<animals.length; i++) {
    animals[i].eat();
}

//인자와 리턴 유형에 다형성 활용
class Vet {
    public void giveShot(Animal a) {
        a.makeNoise();
    }
}

Vet v = new Vet();
Dog d = new Dog();
Hippo h = new Hippo();
v.giveShot(d);   //Dog의 makeNoise() 실행
v.giveShot(h);    //Hippo의 makeNoise() 실행

 


기존 클래스의 확장

public으로 만들지 않았다면 상속이 불가능하다. (ex. inner class)
final 로 만들었다면 상속이 불가능하다. (ex. String)
생성자가 모두 private 이라면 상속이 불가능하다.
소스는 없어도, 상속 받아서 추가하거나 메소드명을 안다면 오버라이드 할 수 있다.