안녕하세요!!
이번 포스팅은 자바의 상속 개념과 오버라이딩, 그리고 오버라이딩과 오버로딩의 차이까지 살펴보겠습니다.

1. 상속 개념
- OOP(Object-Oriented Programming)의 핵심 중 하나인 상속은 부모 클래스의 속성과 기능을 자식 클래스가 물려받는 것을 말함.
- 상속이 필요한 이유는 중복 코드를 줄이고, 확장성을 좋게 만들기 위함.
(확장하기 때문에 자식 클래스는 대체로 부모 클래스보다 속성이나 동작이 더 많음)
* 용어 정의
- 부모 클래스(= 슈퍼 클래스 = 기본 클래스)
- 자식 클래스(= 서브 클래스 = 파생 클래스 = 확장 클래스)
(1) 코드 재사용
자식 클래스는 부모 클래스에서 물려받은 멤버를 그대로 사용하거나 변경할 수 있고, 새로운 멤버도 추가할 수 있음.
(2) 유지보수 용이
부모 클래스만 수정해도 자식이 모두 영향을 받기 때문에 유지보수가 쉬움.
(3) 오버라이딩(Overriding)
부모 기능을 자식이 재정의해서 다른 동작 가능.
부모 클래스의 메서드를 자식 클래스에서 @Override 하여 사용

(4) 상속의 선언
extends 키워드 사용
class [자식 클래스 이름] extends [부모 클래스 이름] { }
(5) 부모와 자식 클래스 관계 : is - a 관계
- 상속 관계(is - a)란 "A는 B이다" 관계일 때 상속을 사용함.
즉, 자식 클래스는 부모 클래스의 한 종류
ex. 원은 도형이다. 사과는 과일이다.
cf. 소유관계(has - a)란 "A는 B를 가지고 있다" 관계일 때 사용함.
즉, 클래스 안에 다른 객체를 멤버 변수로 포함하는 것.
class Engine{ }
class Car{
Engine engine; // Car 클래스가 Engine 객체를 포함
}
(6) 주의
- 다중 상속 불가
class SubClass extends SuperClass1, SuperClass2 { } (X)
- 자식이 부모의 필드 접근 시, super.필드 로 접근 < - > 자식 클래스 본인의 필드의 경우에는 this로 접근
하지만 자식이라도 부모의 멤버변수가 private으로 지정되어 있다면, 접근불가하므로 부모 클래스에서 정의한 setter 나 getter를 통해 접근 => super.부모메서드() 와 같이 사용 가능 (ex. super.getId())
- 자식 클래스에서 부모의 생성자 호출은 super()
- main에서 자식클래스의 인스턴스를 생성하여 메서드 호출 시, 자식 클래스에서 재정의된 info() 메서드가 실행
main 또한 마찬가지로 외부 클래스이기 때문에 private으로 지정한 부모, 자식 클래스의 필드를
[객체 참조변수.필드] 와 같은 방식으로 접근 불가. getter 사용해야 함.
- 자식 클래스의 객체를 생성하여 부모 메서드 호출 가능
=> 자식 타입이자 부모타입이기도 하기 때문


2. 오버라이딩 VS 오버로딩
1) 메서드 오버라이딩(Method Overriding)
- 물려받은 메서드를 자식 클래스에게 맞도록 수정하는 것
- 자식 클래스가 메서드를 오버라이딩하면 자식 객체는 부모 클래스의 오버라이딩된 메서드를 숨김
- 숨겨진 부모 클래스의 메서드를 호출하려면 super 키워드 사용
* 규칙
- 부모 클래스의 메서드와 동일한 시그니처 사용. 반환 타입도 동일해야 함.
- 부모 클래스의 메서드보다 접근 범위를 더 좁게 수정할 수 없음.
부모 : public
자식 : private (X) / public(O)

- 추가적인 예외가 발생할 수 있음을 나타낼 수 없음.
=> 자식 클래스는 부모 메서드보다 더 많은(더 넓은) 예외를 throws 할 수 없다는 의미
=> 만약 부모 클래스에서 Exception을 아예 던지지 않았다면, 자식에서는 설정할 수 없음.
부모 : IOException
자식 : Exception 상위 익셉션 (X) / FileNotFoundException 등의 하위 익셉션 (O)


* 오버라이딩 불가 경우
1> private 메서드 : 부모 클래스 전용이므로 자식 클래스에 상속되지 않음
2> 정적(static) 메서드 : 클래스 소속이므로 자식 클래스에 상속되지 않음
static의 경우, 컴파일 시점에 어떤 클래스의 static 메서드를 부를지 이미 결정됨(정적 바인딩(static binding))
부모 클래스 로딩하는 순간 이미 결정됨.
<예시>
Parent p = new Child();
p.hello();
instance 메서드라면 → Child의 메서드 실행됨
static 메서드라면 → Parent의 메서드 실행됨


3> final 메서드 : final 메서드는 더 이상 수정할 수 없으므로 자식 클래스가 오버라이딩 할 수 없음.
- final의 경우 한 번 초기화 시 변경이 불가능하기 때문에, final 변수도 마찬가지로 수정 불가
- final 클래스는 상속도 받을 수 없음.
2) 메서드 오버로딩
- 같은 이름의 메서드를 여러 개 정의하는 것을 의미
- 매개변수의 개수나 타입이 달라야 함.
- 반환 타입만 다른 것은 오버로딩이 아님.

'JAVA' 카테고리의 다른 글
| 자바 JAVA 클래스(class) 선언과 객체 생성 (0) | 2025.11.23 |
|---|---|
| 자바 JAVA 열거 타입 (enum) (0) | 2025.11.23 |
| 자바 JAVA 문자열 String 함수 & 사용법 총 정리 (0) | 2025.11.23 |
| 자바 JAVA 연산자와 자동 형변환 & 오버플로우 / 언더플로우 (1) | 2025.11.23 |
| 자바 JAVA 변수의 타입 정리 (int, long, double, String 등) + 스택과 힙 메모리 (0) | 2025.11.20 |