새발블로그
[JAVA] 상속 본문
1. 상속의 개념
상속은 "IS-A 관계" 또는 "Kind-Of 관계"라고도 불린다.
예를 들어, Employee 클래스는 Person 클래스를 상속받으면, Employee는 "Person"이라는 특성을 지닌 "Employee IS A Person"이 된다.
상속 예시
class Person {
String name;
}
class Employee extends Person { // Employee IS A Person
String employeeId;
}
class Student extends Person { // Student IS A Person
String studentId;
String major;
}
2. 상속의 특징
- 자식 클래스는 부모 클래스의 모든 멤버 변수와 메서드를 상속받음
- 자식 클래스는 부모 클래스의 public 또는 protected 접근 제어자를 가진 멤버에 접근할 수 있다. private 멤버는 상속되지만 직접적으로 접근할 수는 없다.
- 업캐스팅 (Upcasting)
- 자식 객체를 부모 타입으로 변환하는 것을 업캐스팅이라고 한다. 이는 자식 클래스의 인스턴스를 부모 클래스 타입으로 다룰 때 사용된다.
class Parent { } class Child extends Parent { } Parent p = new Child(); // Upcasting - 다운캐스팅 (Downcasting)
- 부모 객체를 자식 타입으로 강제 형변환하는 것을 다운캐스팅이라고 한다. 다만, 다운캐스팅은 타입 오류를 방지하기 위해 주의해야 하며, 항상 instanceof 연산자로 타입을 확인한 후에 해야 안전하다.
Parent p = new Child(); Child c = (Child) p; // Downcasting
3. 상속과 super 키워드
- super 키워드는 부모 클래스의 생성자나 메서드에 접근할 때 사용된다. 자식 클래스에서 부모 클래스의 생성자를 호출하거나, 부모 클래스의 메서드를 오버라이딩했을 때 부모 클래스의 메서드를 호출하는 데 사용된다.
class Parent {
Parent() {
System.out.println("Parent constructor");
}
void display() {
System.out.println("Parent display");
}
}
class Child extends Parent {
Child() {
super(); // 부모 클래스의 생성자 호출
System.out.println("Child constructor");
}
void display() {
super.display(); // 부모 클래스의 메서드 호출
System.out.println("Child display");
}
}
public class Test {
public static void main(String[] args) {
Child child = new Child();
child.display();
}
}
4. 상속과 다형성 (Polymorphism)
상속은 다형성(Polymorphism)과 밀접한 관계가 있다. 다형성은 하나의 메서드가 여러 방식으로 동작할 수 있게 해주는 특성이다. 이를 위해 메서드 오버로딩(Overloading)과 메서드 오버라이딩(Overriding)을 활용할 수 있다.
1. 메서드 오버라이딩 (Method Overriding)
- 부모 클래스의 메서드를 자식 클래스에서 재정의하는 방법.
- 오버라이딩된 메서드는 자식 클래스의 객체를 통해 호출된다.
class Parent {
void display() {
System.out.println("Parent display");
}
}
class Child extends Parent {
@Override
void display() {
System.out.println("Child display");
}
}
public class Test {
public static void main(String[] args) {
Parent p = new Child();
p.display(); // "Child display" 출력
}
}
2. 업캐스팅과 다형성
- 업캐스팅을 통해 부모 클래스 타입의 변수로 자식 클래스의 객체를 참조할 수 있고, 이때 호출되는 메서드는 실제 객체의 클래스에 따라 결정된다.
class Parent {
void display() {
System.out.println("Parent display");
}
}
class Child extends Parent {
@Override
void display() {
System.out.println("Child display");
}
}
public class Test {
public static void main(String[] args) {
Parent p = new Child();
p.display(); // "Child display" 출력
}
}
5. 상속 vs 컴포지션
상속은 "IS-A" 관계를 표현하며, 자식 클래스가 부모 클래스의 특성을 물려받는 방식이다.
자식 클래스가 부모 클래스의 구현을 그대로 물려받는 방식이라 코드 간 결합도가 높아지며, 코드 수정 시 문제가 발생할 수 있다.
반면, 컴포지션(Composition)은 "HAS-A" 관계를 표현하며, 클래스가 다른 객체를 포함하여 기능을 확장하는 방식이다. 컴포지션은 유연성과 확장성을 제공하지만, 구조적으로 복잡할 수 있다.
상속 예시
class Animal {
void eat() {
System.out.println("Eating...");
}
}
class Dog extends Animal {
void bark() {
System.out.println("Barking...");
}
}
Dog dog = new Dog();
dog.eat(); // Animal 기능 사용
dog.bark(); // Dog 고유 기능
"Dog is an Animal" 이 성립
컴포지션 예시
class Engine {
void start() {
System.out.println("Engine starts...");
}
}
class Car {
private Engine engine = new Engine();
void drive() {
engine.start();
System.out.println("Car is moving...");
}
}
Car car = new Car();
car.drive(); // Engine의 기능을 포함하여 사용
"Car has an Engine" 이 성립
6. 상속의 장단점
장점:
- 코드 재사용성: 부모 클래스에서 정의한 메서드나 변수를 자식 클래스가 그대로 사용할 수 있어 코드의 중복을 줄일 수 있다.
- 계층 구조화: 클래스 간 계층을 구성하여 코드 구조를 더 명확하게 만들 수 있다.
단점:
- 강한 결합: 자식 클래스가 부모 클래스에 의존하므로, 부모 클래스의 변경이 자식 클래스에 영향을 미칠 수 있다.
- 다중 상속 문제: 자바는 다중 상속을 허용하지 않지만, 복잡한 상속 구조에서는 문제를 일으킬 수 있다.
'Language > Java' 카테고리의 다른 글
| [JAVA] 멀티스레드 (1) | 2025.05.04 |
|---|---|
| [JAVA] SOLID 원칙 (0) | 2025.05.04 |
| [JAVA] 클래스 (0) | 2025.05.04 |
| [JAVA] 변수 위치 및 메모리 구조 (0) | 2025.05.04 |
| [JAVA] JVM (0) | 2025.05.04 |