Day 25 - Inheritance
이 글은 2026년 4월 6일 작성된 글입니다.
오늘은 자바 객체지향 개념 중 상속, 오버라이딩, 추상 클래스, 형변환, 객체 상태 저장에 대해 학습했다. 특히 오리 시뮬레이션 예제를 통해 상속 구조의 장점과 한계, 그리고 추상 클래스의 역할을 이해할 수 있었다.
1. 상속과 코드 재사용
여러 클래스에서 같은 기능을 사용할 때 부모 클래스를 만들고 상속을 사용하면 코드 중복을 줄일 수 있다.
예를 들어 오리 클래스가 있을 때 기본 동작을 부모 클래스에 정의한다.
class 오리 {
void 날다() {
System.out.println("오리가 날개로 날아갑니다.");
}
}그리고 다른 오리들은 이를 상속받는다.
class 흰오리 extends 오리 { }
class 청둥오리 extends 오리 { }상속 구조
오리
├ 흰오리
└ 청둥오리
이렇게 하면 공통 기능을 부모에서 관리할 수 있다.
2. 메서드 오버라이딩
상속받은 클래스는 부모의 메서드를 재정의(Override) 할 수 있다.
예를 들어 고무오리는 날 수 없기 때문에 날다 메서드를 수정한다.
class 고무오리 extends 오리 {
void 날다() {
System.out.println("저는 날 수 없어요.");
}
}이렇게 하면 같은 메서드 이름이지만 각 객체에 맞는 동작을 수행하게 된다.
3. 상속 구조의 한계
상속만으로는 모든 문제를 해결할 수 없다.
예를 들어
- 일반 오리 → 날 수 있음
- 고무 오리 → 날 수 없음
- 로봇 오리 → 날 수 없음 + 수영 방식 다름
이처럼 다양한 동작이 섞이면 상속 구조가 복잡해지고 중복 코드가 생길 수 있다.
그래서 객체지향에서는 구성(Composition) 이라는 방식도 사용한다.
구성은
객체 안에 다른 객체를 포함하는 방식
으로 더 유연한 설계를 만들 수 있다.
4. 추상 클래스
추상 클래스는 공통 구조만 정의하고 구현은 자식 클래스에 맡기는 클래스이다.
예시
abstract class 무기 {
abstract void 공격();
}자식 클래스는 반드시 이 메서드를 구현해야 한다.
class 칼 extends 무기 {
void 공격() {
System.out.println("칼로 공격합니다.");
}
}추상 클래스는 리모콘의 버튼 설계도와 비슷하다.
버튼은 정의되어 있지만 실제 동작은 각 기기가 구현한다.
5. 형변환과 객체 타입
자바에서는 부모 타입으로 자식 객체를 참조할 수 있다.
사람 a사람 = new 홍길동();이것을 업캐스팅(자동 형변환) 이라고 한다.
반대로 자식 타입으로 바꾸는 경우에는 명시적 형변환이 필요하다.
홍길동 a홍길동 = (홍길동)a사람;이때 실제 객체가 해당 타입이 아니면 런타임 오류가 발생할 수 있다.
정리
오늘 학습한 핵심 개념
- 상속은 코드 재사용을 위한 중요한 기능이다
- 메서드 오버라이딩을 통해 클래스별 동작을 다르게 만들 수 있다
- 상속만으로는 구조가 복잡해질 수 있어 구성 방식도 함께 사용한다
- 추상 클래스는 공통 인터페이스 역할을 한다
- 자바의 형변환은 자동형변환과 명시적 형변환으로 나뉜다
객체지향 설계에서는 중복을 줄이고 확장 가능한 구조를 만드는 것이 중요하다.
오늘은 컨디션이 좋지 않아 집중을 하지 못했다. 컨디션 괜찮을 때 다시 복습을 해야 할 거 같다.