어제 오늘 내일

[Java] 상속(Inheritance)과 오버라이딩(Overriding) 본문

IT/Java

[Java] 상속(Inheritance)과 오버라이딩(Overriding)

hi.anna 2025. 12. 21. 00:17

 

Java의 객체지향 프로그래밍(OOP) 핵심 개념 중 두 가지가 상속(Inheritance)오버라이딩(Overriding)입니다. 두 개념은 서로 밀접하게 연결되어 있으며, 클래스 설계와 확장성을 높이는 데 중요한 역할을 합니다. 이 글에서는 두 개념을 명확하게 구분하고 이해할 수 있도록 정리합니다.

 

1. 상속(Inheritance)이란?

상속은 부모클래스의 속성과 메서드를 자식클래스가 물려받는 것입니다.
이때 extends 키워드를 사용합니다.

예제

class Animal {
    void sound() {
        System.out.println("동물이 소리를 냅니다");
    }
}

class Dog extends Animal {
}

설명

  • Dog는 Animal을 상속
  • sound() 메서드를 그대로 사용 가능
  • 공통 기능을 재사용하여 중복을 줄임

 

2. 상속의 목적

  • 코드 재사용성 증가
  • 클래스 확장성 향상
  • 객체 간 계층 구조 형성
  • 유지보수성 향상

상속을 통해 부모클래스의 기능을 그대로 활용하거나 확장할 수 있습니다.

 

3. 오버라이딩(Overriding)이란?

오버라이딩은 부모클래스에서 정의된 메서드를 자식클래스에서 다시 정의(재정의) 하는 것입니다.
즉, 부모 메서드의 이름, 매개변수, 반환타입을 그대로 유지하면서 내용만 바꾸는 것입니다.

예제

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("멍멍");
    }
}

설명

  • 부모의 sound()를 자식이 자신의 방식에 맞게 재정의
  • @Override를 사용하면 오타나 잘못된 재정의를 컴파일러가 체크

 

4. 오버라이딩 조건

오버라이딩이 성립하려면 다음 조건을 반드시 만족해야 합니다:

  1. 메서드 이름 동일
  2. 매개변수(파라미터) 동일
  3. 반환 타입 동일
  4. 부모 메서드보다 더 좁은 접근 제어자 불가
    (예: 부모가 public이면 자식도 public이어야 함)
  5. static 메서드는 오버라이딩 불가 (숨김(Hiding)만 가능)

 

5. 오버라이딩이 필요한 이유

  • 부모의 기능을 상황에 맞게 수정하기 위해
  • 다형성(Polymorphism)을 구현하기 위해
  • 자식 클래스마다 다른 동작을 정의할 수 있음

예:

Animal a = new Dog();
a.sound(); // "멍멍" 출력 (다형성)

 

6. 상속 + 오버라이딩 전체 예제

class Animal {
    void sound() {
        System.out.println("동물 소리");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("멍멍");
    }
}

class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("야옹");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal a1 = new Dog();
        Animal a2 = new Cat();

        a1.sound(); // 멍멍
        a2.sound(); // 야옹
    }
}

설명

  • Animal 타입으로 묶였지만, 실제 객체(Dog, Cat)에 따라 동작이 달라짐
  • 이는 오버라이딩 + 상속의 조합으로 가능해진 다형성의 대표 예시

 

7. 정리

  • 상속(Inheritance): 부모클래스의 기능을 자식클래스가 물려받는 것
  • 오버라이딩(Overriding): 부모의 메서드를 자식이 다시 정의하는 것
  • 두 개념은 함께 사용되어 객체지향의 핵심인 코드 재사용, 확장성, 다형성을 실현

 

 

반응형
Comments