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