[Java] 상속(Inheritance)이란?
상속(Inheritance)
상속은 객체 지향 프로그래밍에서 기존 클래스의 필드(변수)와 메서드를 새로운 클래스가 물려받아 재사용할 수 있게 해주는 기능이다.
상속을 안하는 경우
코드를 보며 살펴봅시다.
Main
package Inheritance;
public class AnimalMain {
public static void main(String[] args) {
Dog dog = new Dog();
dog.move();
dog.bite();
Cat cat = new Cat();
cat.move();
cat.scratch();
}
}
Cat class
package Inheritance;
public class Cat {
public void move() {
System.out.println("움직입니다.");
}
public void scratch() {
System.out.println("할퀴기");
}
}
Dog class
package Inheritance;
public class Dog {
public void move() {
System.out.println("움직입니다.");
}
public void bite() {
System.out.println("물기");
}
}
위의 코드에서처럼 Dog와 Cat은 move라는 메서드를 둘 다 가지고 있다. 그랬을 때, 다음과 같은 불편함이 있다.
- Dog, Cat 클래스에서 move 메서드의 코드 중복이 생긴다.
- move 메서드를 변경하려면, 2개의 클래스에서 변경해줘야 한다.
- 새로운 동물 클래스를 만들면, move 메서드를 똑같이 넣어줘야 한다.
상속받는 방법
상속받고자 하는 클래스에 extends 키워드를 사용하면 된다.
public class Cat extends Animal {}
- 자바에서는 다이아몬드 상속으로 인해, 다중 상속(여러 클래스로부터 상속)을 받을 수 없다.
- 즉 하나의 클래스로부터 상속받을 수 있다.
상속이 필요한 이유
Main
package Inheritance;
public class AnimalMain {
public static void main(String[] args) {
Dog dog = new Dog();
dog.move();
dog.bite();
Cat cat = new Cat();
cat.move();
cat.scratch();
Pig pig = new Pig();
pig.move();
pig.eat();
}
}
Pig class
package Inheritance;
public class Pig extends Animal {
public void eat() {
System.out.println("먹기");
}
}
Cat class
package Inheritance;
public class Cat extends Animal {
public void scratch() {
System.out.println("할퀴기");
}
}
Dog class
package Inheritance;
public class Dog extends Animal {
public void bite() {
System.out.println("물기");
}
}
Animal class
package Inheritance;
public class Animal {
public void nove() {
System.out.println("움직입니다.");
}
}
위의 코드에서처럼 Animal class에 move 메서드를 정의한 후, 상속을 받으면 다음과 같은 좋은점이 있다.
- 상속받은 자식 클래스는 move 메서드를 재정의하지 않아도 사용할 수 있다.
- move 메서드의 변경이 필요할 때, 부모 메서드에서 한 번만 바꿔주면 된다.
- 새로운 동물 클래스를 생성하면, 상속만 시켜주면 move 메서드를 정의할 필요가 사라진다.
오버라이딩을 통해 부모로부터 상속받은 메서드를 재정의하여 사용할 수 있다.
상속과 메모리 구조
- 인스턴스가 생성될 때, Cat 뿐만 아니라 Cat이 상속받고 있는 Animal까지 포함해서 생성된다.
- 참조값은 하나이다. (cat 변수에 있는 X000)
- 하나의 인스턴스를 생성하는 것같지만 부모와 자식이 모두 생성되고 공간이 분리된다.
- cat.move() : 우선 Cat에서 move 메서드를 찾고 없으면, Animal(부모)에서 move 메서드를 찾는다.
- 추후에 다룰 추상화와 객체지향에서 가장 중요한 다형성을 구현할 때 꼭 필요한 개념이다.
https://kimyongjun0129.tistory.com/104
[Java] 오버라이딩(overriding)이란?
오버라이딩(overriding)객체 지향 프로그래밍(OOP)에서 자식 클래스가 부모 클래스의 메서드를 재정의하는 것을 의미한다. 오버라이딩 방법오버라이딩할 메서드의 이름과 매개변수 동일해야 한다.
kimyongjun0129.tistory.com
https://kimyongjun0129.tistory.com/114
[Java] 다이아몬드 상속
개요클래스는 단 하나의 클래스만 상속받을 수 있다. 왜 그럴까? 그 이유는 바로 다이아몬드 상속 때문이다. 다이아몬드 상속객체지향 프로그래밍(OOP)에서 다중 상속을 사용할 때 발생할 수 있
kimyongjun0129.tistory.com