개발(React | Java)/자바 기초 | 문법

상속(Inheritance), 오버라이딩(Overriding), 오버로딩(Overloading) 완전 정리

dev-parrot 2025. 12. 7. 17:52

Java의 객체지향(OOP)에서 가장 중요한 개념은
상속 + 오버라이딩 + 오버로딩입니다.

상속은 “코드 재사용”,
오버라이딩은 “부모 기능 수정”,
오버로딩은 “같은 이름 여러 메서드”라는 핵심 개념을 기반으로 동작합니다.

이 글 한 편으로 입문자가 반드시 이해해야 할 OOP 핵심을 모두 정리합니다.


📌 목차

  1. 상속(Inheritance)이란?
  2. 상속 구조 예제
  3. super 키워드
  4. 오버라이딩(Overriding)
  5. 오버로딩(Overloading)
  6. final 키워드
  7. 실전 예제: 동물 → 강아지/고양이
  8. 자주 하는 실수
  9. 마무리
  10. 대표 태그

1️⃣ 상속(Inheritance)이란?

상속은 부모 클래스(상위 클래스)의 필드와 메서드를 자식 클래스가 물려받는 기능입니다.

“코드 재사용성”을 극대화하고 유지보수를 쉽게 만듦.

예:

  • Animal → Dog, Cat
  • Car → Truck, Bus
  • Person → Student, Teacher

2️⃣ 상속 구조 예제

✔ 부모 클래스

public class Animal {
    String name;

    void eat() {
        System.out.println(name + "가 먹습니다.");
    }
}

 

✔ 자식 클래스 (extends 사용)

public class Dog extends Animal {
    void bark() {
        System.out.println("멍멍!");
    }
}

 

사용 예:

Dog d = new Dog();
d.name = "바둑이";
d.eat();   // 부모 메서드
d.bark();  // 자식 메서드

 

3️⃣ super 키워드

super는 부모 클래스를 의미합니다.

✔ 부모 생성자 호출

 
public class Dog extends Animal {
    public Dog() {
        super(); // 부모 생성자 호출
    }
}

✔ 부모 필드/메서드를 명확하게 호출

super.eat();

 

4️⃣ 오버라이딩(Overriding)

오버라이딩은 부모 클래스에 있는 메서드를 자식 클래스가 재정의하는 것입니다.

실행 시 다형성을 이루는 핵심 기능.

✔ 조건

  • 메서드 이름 동일
  • 매개변수 동일
  • 반환 타입 동일
  • 접근 제어자는 같거나 더 넓어야 함
  • @Override 사용 권장

✔ 예제

부모 클래스:

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

 

자식 클래스:

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

 

사용:

Animal a = new Dog();
a.sound();  // 멍멍!

 

동적 바인딩(런타임 실행)이 핵심


5️⃣ 오버로딩(Overloading)

오버로딩은 같은 이름의 메서드를 여러 개 만들 수 있게 하는 기능입니다.

조건:

  • 메서드 이름 동일
  • 매개변수 타입 / 개수 / 순서가 달라야 함
  • 반환타입은 상관없음

✔ 예제

int add(int a, int b) {
    return a + b;
}

double add(double a, double b) {
    return a + b;
}

int add(int a, int b, int c) {
    return a + b + c;
}

 

6️⃣ final 키워드 (오버라이딩 금지)

✔ final 메서드 → 오버라이딩 불가

 
final void run() { }

✔ final 클래스 → 상속 불가

final class Animal { }
// Dog extends Animal → 불가능

 

7️⃣ 실전 예제 — 동물 구조 정리

부모 클래스:

public class Animal {
    String name;

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

 

자식 클래스들:

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

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

 

사용:

Animal a1 = new Dog();
Animal a2 = new Cat();

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

➡ 같은 타입(Animal)인데 다른 결과 → 다형성(Polymorphism)


8️⃣ 자주 하는 실수

❌ 오버라이딩과 오버로딩 혼동

오버라이딩 오버로딩
부모 메서드 재정의 같은 이름, 다른 매개변수
상속 필요 상속 필요 없음
다형성 구현 사용 편의

❌ 부모 생성자 호출 누락

부모가 매개변수 생성자를 가진 경우 반드시 super() 필요.


❌ 접근제어자 좁히기

오버라이딩 시 부모보다 접근 범위를 좁히면 오류.


❌ @Override 안 붙임

컴파일러 체크가 안 되므로 실수 확률 증가 → 반드시 붙이기.


9️⃣ 마무리

이번 글에서는 Java OOP의 핵심 요소인

✔ 상속(Inheritance)
✔ super 키워드
✔ 오버라이딩(Overriding)
✔ 오버로딩(Overloading)
✔ final
✔ 다형성의 원리

를 모두 정리했습니다.

이제 다음 단계에서는 추상 클래스 & 인터페이스를 배우며
실무 수준의 객체지향 구조로 들어가게 됩니다.

 

📘 다음 글 예고

👉 Java 기초 (11) — 인터페이스(Interface) & 추상 클래스(Abstract Class) 완전 정리