JAVA

[Java] 상속(Inheritance)이란?

kimyongjun0129 2025. 4. 15. 20:54

상속(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