딩딩크롱 2022. 8. 11. 00:54
728x90

상속(Inheritance)이란?

자식 클래스가 부모 클래스의 기능을 그대로 물려받을 수 있는 기능이다.

class Animal {
    String name;

    void setName(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    void sleep() {	// 기능 확장
        System.out.println(this.name+" zzz");
    }
}

public class Sample {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("poppy");
        System.out.println(dog.name);  // poppy 출력
        dog.sleep();  // poppy zzz 출력
    }
}

 

IS-A 관계

"Dog is a Animal"과 같이 말할 수 있는 관계를 IS-A 관계라고 한다.

이렇게 IS-A 관계(상속 관계)에 있을 때 자식 클래스의 객체는 부모 클래스의 자료형인 것처럼 사용할 수 있다.

Animal dog = new Dog  // Dog is a Animal

※ 다만 여기서 주의해야 할 점은 자식 클래스 객체를 부모 클래스 자료형으로 사용할 경우에는 자식 클래스에만 존재하는 메소드를 사용할 수 없다는 점이다.

 

Object 클래스

자바에서 만드는 모든 클래스는 Object 클래스를 상속받는다.

따라서 모든 객체는 Object 자료형으로 사용할 수 있다.

Object animal = new Animal();  // Animal is a Object
Object dog = new Dog();  // Dog is a Object

 

메소드 오버라이딩(Method overriding)

부모 클래스의 메소드를 자식 클래스가 동일한 형태로 다시 구현하는 것을 의미한다.

class Animal {
    String name;

    void setName(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    void sleep() {
        System.out.println(this.name + " zzz");
    }
}

class HouseDog extends Dog {
    void sleep() {
        System.out.println(this.name + " zzz in house");
    }
}

public class Sample {
    public static void main(String[] args) {
        HouseDog houseDog = new HouseDog();
        houseDog.setName("happy");
        houseDog.sleep();  // happy zzz in house 출력
    }
}

 

메소드 오버로딩(Method overloading)

입력 항목이 다른 경우 동일한 이름의 메소드를 만들 수 있는 것을 의미한다.

class Animal {
    String name;

    void setName(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    void sleep() {
        System.out.println(this.name + " zzz");
    }
}

class HouseDog extends Dog {
    void sleep() {
        System.out.println(this.name + " zzz in house");
    }

    void sleep(int hour) {
        System.out.println(this.name + " zzz in house for " + hour + " hours");
    }
}

public class Sample {
    public static void main(String[] args) {
        HouseDog houseDog = new HouseDog();
        houseDog.setName("happy");
        houseDog.sleep();  // happy zzz in house 출력
        houseDog.sleep(3);  // happy zzz in house for 3 hours 출력
    }
}

 

다중 상속

자바에서는 다중 상속을 지원하지 않는다.

다중 상속을 지원하게 되면 상속받은 클래스들에 동일한 이름의 메소드가 있을 경우 어떠한 클래스의 메소드를 실행해야 할지 애매모호한 부분이 생기게 된다.

※ 다중 상속을 지원하는 다른 언어들은 이렇게 동일한 메소드를 상속받는 경우 우선 순위 등을 적용하여 해결한다.

 

부모 생성자 호출

자식 객체를 생성하면, 부모 객체를 먼저 생성한 후 자식 객체가 그 다음에 생성된다.

자식 클래스 생성자 첫 줄에 부모 클래스(객체)를 나타내는 super 키워드를 사용해 부모 클래스의 생성자를 선언한다.

class Animal {
    String name;

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

class Dog extends Animal {
	int age;
    
   	public Animal(String name, int age) {
        super(name);
        this.age = age;
	}
}
728x90