Java의 객체지향(OOP)에서 가장 중요한 개념은
상속 + 오버라이딩 + 오버로딩입니다.상속은 “코드 재사용”,
오버라이딩은 “부모 기능 수정”,
오버로딩은 “같은 이름 여러 메서드”라는 핵심 개념을 기반으로 동작합니다.이 글 한 편으로 입문자가 반드시 이해해야 할 OOP 핵심을 모두 정리합니다.
📌 목차
- 상속(Inheritance)이란?
- 상속 구조 예제
- super 키워드
- 오버라이딩(Overriding)
- 오버로딩(Overloading)
- final 키워드
- 실전 예제: 동물 → 강아지/고양이
- 자주 하는 실수
- 마무리
- 대표 태그
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) 완전 정리
'개발(React | Java) > 자바 기초 | 문법' 카테고리의 다른 글
| 컬렉션 프레임워크(List, Set, Map) 기초 — 배열을 넘어선 자료구조 (0) | 2025.12.08 |
|---|---|
| 인터페이스(Interface) & 추상 클래스(Abstract Class) 완전 정리 — OOP 핵심 (0) | 2025.12.08 |
| 생성자(Constructor), this, 접근제어자 — 객체지향의 핵심 개념 정리 (0) | 2025.12.07 |
| 클래스(Class)와 객체(Object) 기초 — Java의 핵심 개념 (0) | 2025.12.06 |
| 메서드(함수) 개념과 사용법 — 재사용 가능한 코드 만들기 (0) | 2025.12.06 |