상속이란?
기존의 클래스(부모 클래스)가 가지고 있는 "속성과 기능(변수와 메서드)"을 새로운 클래스(자식 클래스)가 그대로 물려받는 것입니다.
마치 현실에서 부모가 자식에게 유산을 물려주듯, Java에서도 기능(변수/메서드)을 물려주는것 입니다!
즉, 부모 클래스의 코드를 새로 작성하지 않고 재사용해서 새로운 클래스를 만들 수 있게 해주는 기능입니다.
- 부모클래스
👉 자식에게 물려줄 기능을 가지고 있는 기존 클래스 - 자식클래스
👉 부모 클래스를 상속받아 기능을 이어받고, 여기에 새로운 기능을 추가하거나, 기존 기능을 재정의(Overriding) 할 수 있는 클래스
기본 문법
✅ 상속의 키워드는 바로 extends 입니다! 해당 키워드를 사용하여 물려 받을 부모클래스를 정의하면 됩니다.
상속의 필요성
Java로 프로그램을 만들다 보면, 비슷한 역할을 하는 클래스들이 자주 등장합니다.
예를 들어 게임을 만든다고 할 때, 아래와 같은 특징을 가지고 있습니다.
- 플레이어, 몬스터는 모두 “캐릭터”의 일종
- 공통적으로 이름, 체력, 이동 기능, 공격 기능 등이 필요
- 개인별 기능 필요
위 내용을 상속이 없는 코드와 상속이 있는 코드로 나눠서 확인해보겠습니다.
❌ 상속이 없는 코드
public class Player {
String name;
int hp;
public void move() { ... }
public void attack() { ... }
}
public class Monster {
String name;
int hp;
public void move() { ... }
public void attack() { ... }
}
👉 공통 코드가 중복되며 유지보수가 어렵고 비효율적입니다. 예를 들어 hp가 100씩 모두 증가시켜야 한다면, 각 클래스마다 전부 증가시켜줘야 합니다.
⭕ 상속이 있는 코드
public class Character {
String name;
int hp;
public void move() { ... }
public void attack() { ... }
}
public class Player extends Character {
int level;
}
public class Monster extends Character {
int damage;
}
- 공통된 부분은 부모 클래스인 Character에 작성합니다.
- Player, Monster는 각각 필요한 고유한 기능만 추가하면 됩니다.
이렇게 수정하게되면, hp가 100씩 모두 증가시켜야 한다면, 각 클래스마다 전부 증가시킬 필요 없이 부모 클래스인 Character 클래스만 수정하면 됩니다.
✅ 공통은 부모에게!, 개별 기능은 자식에게!
➡ 이게 바로 상속의 진짜 목적입니다.
이유 | 설명 |
코드 재사용 | 이미 만든 클래스를 다시 활용할 수 있습니다. |
유지보수 용이 | 공통된 기능을 부모 클래스 하나에서 관리하면 수정이 쉬워집니다. |
중복 제거 | 같은 코드 여러 번 작성하지 않아도 됩니다. |
확장성 ⬆ | 기본 기능을 기반으로 새로운 기능을 덧붙이기 쉽습니다. |
상속시 주의사항
- 단일 상속만 가능
👉 클래스는 하나의 부모만 상속받을 수 있습니다. - private 멤버(변수/메서드)는 접근 불가
👉 직접 접근 불가하고 간접 접근으로 허용됨 (public, protected은 직접 접근 허용됨) - 생성자는 상속되지 않음
👉 자식 클래스에서 super()로 호출해야 함
💡 super 및 접근제어자(private, protected, public) 은 추후에 자세히 배울 예정입니다. 지금은 개념만 간단히 정리해보겠습니다.
super 키워드란?
super는 부모 클래스를 가리키는 키워드입니다.
사용 예
- super() → 부모 생성자를 호출할 때 사용
- super.변수명, super.메서드() → 부모의 멤버를 명확히 호출할 때 사용
📌 현재는 "자식 클래스가 부모와 연결되어 있다"는 정도만 이해하면 충분합니다.
접근제어자란?
접근제어자는 클래스 멤버(변수/메서드)에 대한 접근 범위(권한)를 지정하는 키워드입니다.
접근제어자 | 설명 |
private | 클래스 내부에서만 접근 가능 (자식 클래스도 접근 불가) |
protected | 같은 패키지 + 자식 클래스에서 접근 가능 |
public | 어디서든 접근 가능 (전역 공개) |
📌 지금은 아래의 내용만 알고있어도 충분합니다.
- private은 외부에서 안 보이게 감춘다.
- protected는 자식 클래스에서 쓸 수 있다.
- public은 누구나 접근 가능하다.
사용 예시
* Parent 클래스 - 부모 클래스
// 부모 클래스
class Parent {
private int secret = 123;
public Parent(String msg) {
System.out.println("Parent 생성자: " + msg);
}
// private 멤버 간접 접근 메서드
protected int getSecret() {
return secret;
}
}
* Child 클래스 - 자식 클래스
// 자식 클래스
class Child extends Parent {
// Child 클래스 생성자
public Child() {
super("Hello"); // Parent 클래스(부모 클래스) 생성자 호출
System.out.println("Child 생성자");
}
public void printSecret() {
// System.out.println(secret); ❌ 직접 접근 불가
System.out.println(getSecret()); // ✅ 간접 접근
}
public static void main(String[] args) {
Child child = new Child();
child.printSecret();
}
}
- 출력 결과 -
Parent 생성자: Hello
Child 생성자
123
실습 예제 - Animal 클래스를 상속받은 Dog 클래스
* Animal 클래스 - 부모 클래스
// 부모 클래스
public class Animal {
String name;
public void eat() {
System.out.println("먹고 있어요.");
}
public void sleep() {
System.out.println("잠을 자요.");
}
}
* Dog 클래스 - 자식 클래스
// 자식 클래스 (서브클래스)
public class Dog extends Animal {
public void bark() {
System.out.println("멍멍!");
}
}
* 실행 클래스
// 실행 클래스
public class Main {
public static void main(String[] args) {
Dog dog = new Dog(); // Dog 객체 생성
dog.name = "바둑이"; // 부모 클래스의 변수 사용
System.out.println("이름: " + dog.name);
dog.eat(); // 부모 클래스의 메서드 사용
dog.sleep(); // 부모 클래스의 메서드 사용
dog.bark(); // 자식 클래스 고유 메서드 사용
}
}
- 출력 결과 -
이름: 바둑이
먹고 있어요.
잠을 자요.
멍멍!
이 예제를 통해 다음의 내용을 파악할 수 있습니다.
구분 | 설명 |
Dog extends Animal | Dog는 Animal의 자식 클래스 |
eat(), sleep() | 부모(Animal) 클래스의 기능을 상속받아서 사용 |
bark() | 자식(Dog) 클래스만의 고유 기능 |
dog.name | 부모 클래스의 필드도 사용 가능 (접근제한자에 따라) |
- 자식 클래스는 부모의 변수와 메서드를 물려받아 사용할 수 있습니다.
- 필요에 따라 자식 클래스는 자기만의 기능도 추가할 수 있습니다.
- 자바는 단일 상속만 허용합니다 (extends는 한 번만 사용 가능).
정리 요약
항목 | 설명 |
개념 | 기존 클래스(부모)의 기능을 물려받아 새 클래스(자식)를 만드는 것 |
키워드 | extends 사용 |
목적 | 코드 재사용, 중복 제거, 유지보수 편리 |
사용 예 | 공통 속성/기능을 가진 여러 클래스 만들 때 |
실전 활용 | 템플릿 패턴, 공통 유틸, 프레임워크 설계 등에서 자주 사용됨 |
읽어주셔서 감사합니다 😊
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 20. 오버라이딩과 오버로딩 차이 (0) | 2025.04.09 |
---|---|
[Java] 19. 오버라이딩 (0) | 2025.04.09 |
[Java] 17. this vs this() (0) | 2025.04.08 |
[Java] 16. 생성자와 오버로딩 (0) | 2025.04.08 |
[Java] 15. 오버로딩 (0) | 2025.04.07 |