1. 상속
1) 개념
상속은 다른 클래스가 가지고 있는 멤버(필드, 메소드)를 새로 작성할 클래스에서 직접 다시 만들지 않고 물려받아 자신의 것처럼 사용하는 기능이다.
즉, 기존 클래스의 내용을 재사용하면서 새로운 클래스에 필요한 기능만 추가하거나 수정할 수 있게 해준다.
예를 들어 Car 클래스가 있고, 이를 바탕으로 SUV 클래스를 만들고 싶다면 기존 Car의 속성과 기능을 그대로 물려받고, SUV에 필요한 부분만 추가하면 된다.
표현식은 다음과 같다.
public class SUV extends Car {}
여기서 Car는 부모 클래스, SUV는 자식 클래스라고 볼 수 있다.
2) 상속의 목적
- 클래스의 재사용. 이미 만들어 둔 클래스를 다시 활용할 수 있기 때문에 비슷한 구조의 클래스를 만들 때 효율적이다.
- 연관된 클래스들 사이의 공통적인 규약을 정의하는 것. 비슷한 객체들을 하나의 큰 틀 안에서 관리할 수 있게 된다.
3) 상속의 장점
- 보다 적은 양의 코드로 새로운 클래스 작성 가능
- 공통 코드를 한 곳에서 관리할 수 있어 수정과 확장이 쉬움
- 코드 중복을 줄여 생산성과 유지보수성이 높아짐
쉽게 말하면 기존 모델을 기반으로 다음 모델을 개발할 때 공통 기능은 그대로 두고 필요한 기능만 추가하는 것과 비슷하다.
갤럭시 22를 바탕으로 갤럭시 23을 만들거나, 아이폰 12를 기반으로 아이폰 13을 만드는 것처럼 이해할 수 있다.
4) 상속의 특징
- 모든 클래스는 Object 클래스의 후손이다. 즉, 자바의 모든 클래스는 결국 Object 클래스를 상속받고 있다고 볼 수 있다. 그래서 equals(), toString() 같은 메소드를 사용할 수 있고, 필요하면 재정의할 수도 있다.
- 부모 클래스의 생성자와 초기화 블럭은 상속되지 않는다. 다만 자식 객체가 생성될 때는 부모 생성자가 먼저 실행된다. 그래서 자식 클래스 생성자 안에는 부모 생성자를 호출하는 super()가 사용된다.
- 부모 클래스의 private 멤버는 상속은 되지만 자식 클래스에서 직접 접근할 수는 없다. 자식 클래스 안에서 부모의 private 필드를 바로 사용할 수 없고, 부모 생성자나 getter, setter 메소드를 통해 접근해야 한다.
5) 상속의 방법과 표현식
자바에서 클래스 상속은 extends 키워드를 사용한다.
표현식
[접근제한자] class 자식클래스명 extends 부모클래스명 {}
예를 들면 다음과 같다.
public class Academy extends Company {}
Academy 클래스가 Company 클래스를 상속받는다는 뜻이다.
6) 단일 상속과 다중 상속
- 단일 상속 : 한 클래스가 하나의 부모 클래스만 상속받는 방식이다. 자바는 단일 상속만 지원한다. 이 방식은 클래스 간의 관계가 비교적 명확하고, 코드의 신뢰성을 높일 수 있다는 장점이 있다.
- 다중 상속 : 한 클래스가 여러 부모 클래스를 동시에 상속받는 방식이다. C++에서는 가능하지만 자바에서는 지원하지 않는다. 그 이유는 서로 다른 부모 클래스로부터 같은 이름의 멤버를 물려받을 경우 충돌이 발생할 수 있기 때문이다.
자바는 복잡성을 줄이고 구조를 명확하게 하기 위해 단일 상속만 지원한다.
2. super()와 super.
super()와 super는 상속에서 자주 등장하지만 의미가 다르다.
super()는 부모 클래스의 생성자를 호출하는 문법이다. 자식 객체를 생성할 때는 부모 객체가 먼저 생성되어야 하므로, 자식 생성자 안에는 부모 생성자를 호출하는 코드가 필요하다. 이때 사용하는 것이 super()이다. 기본적으로 자식 생성자에는 super()가 자동으로 들어가며, 부모 생성자에 매개변수가 있다면 super(값) 형태로 직접 작성해 주어야 한다. 또한 super()는 반드시 생성자의 첫 줄에 작성해야 한다.
반면 super.은 부모 클래스의 필드나 메소드에 접근할 때 사용하는 참조 표현이다. 즉, 자식 클래스 안에서 부모의 멤버를 명확하게 구분해서 사용하고 싶을 때 super.필드명, super.메소드명() 형태로 작성한다.
정리하면 다음과 같다.
- super() : 부모 생성자 호출
- super. : 부모의 필드나 메소드 접근
3. 오버라이딩과 오버로딩
1) 오버라이딩
오버라이딩은 자식 클래스가 부모 클래스로부터 상속받은 메소드를 다시 작성하는 것이다. 즉, 부모가 제공한 기능을 자식 클래스에 맞게 고쳐서 사용하는 방식이다.
자식 객체를 통해 메소드를 실행하면 부모 메소드보다 자식 클래스에서 재정의한 메소드가 우선 실행된다.
오버라이딩의 특징은 다음과 같다.
- 메소드 위에 @Override를 붙여 명시할 수 있다.
- 접근제어자는 부모 메소드와 같거나 더 넓게만 설정할 수 있다.
- 예외 처리 범위는 부모보다 같거나 더 좁아야 한다.
오버라이딩이 성립하려면 다음 조건을 만족해야 한다.
- 메소드 이름이 같아야 한다.
- 매개변수의 개수와 타입이 같아야 한다.
- 리턴 타입이 같아야 한다.
- private 메소드는 오버라이딩할 수 없다.
2) 오버로딩
오버로딩은 한 클래스 안에서 같은 이름의 메소드를 여러 개 정의하는 것이다. 메소드의 이름은 같지만 매개변수는 달라야 한다.
오버로딩의 성립 조건은 다음과 같다.
- 메소드 이름이 같아야 한다.
- 매개변수의 타입, 개수, 순서가 달라야 한다.
리턴 타입은 오버로딩 조건과 관계가 없다. 즉, 이름만 같고 매개변수가 다르면 오버로딩이 가능하다.
3)오버라이딩(Overriding)과 오버로딩(Overloading)
| 오버라이딩(Overriding) | 오버로딩(Overloading) |
| 하위 클래스에서 메소드 정의 | 같은 클래스에서 메소드 정의 |
| 메소드 이름 동일 매개변수 동일(개수, 타입) 리턴 타입 동일 |
메소드 이름 동일 매개변수 다름(개수, 타입) 리턴 타입 상관 없음 |
| 자식 메소드의 접근 범위가 부모 메소드의 접근 범위보다 넓거나 같아야 함. | 접근 제어자와 상관 없음 |
| 자식 메소드의 예외 수가 부모 메소드의 예외 수보다 적거나 범위가 좁아야 함 | 예외처리와 상관 없음 |
4. final 예약어
final은 상속이나 재정의를 막을 때도 사용할 수 있다.
- final 클래스 : 상속이 불가능한 클래스이다.
public final class FinalClass {}
- final 메소드 : 자식 클래스에서 오버라이딩할 수 없는 메소드이다.
public final void method() {}
즉, final은 더 이상 변경하거나 확장하지 못하게 막는 예약어라고 이해하면 된다.
5. 대상에 따른 사용 가능한 제어자, 예약어
| 대상 | 사용 가능한 제어자/예약어 |
| 클래스 | public, (default), final, abstract |
| 메소드 | 모든 접근 제어자, final, abstract, static |
| 변수 | 모든 접근 제어자, final, static |
| 지역변수 | final |
유의사항
- 클래스에 abstract와 final 동시에 사용 불가능
- 메소드에 static과 abstract 동시에 사용 불가능
- abstract 메소드의 접근제어자로 private 불가능
'멀티캠퍼스' 카테고리의 다른 글
| [2026.04.27] TIL - 21일차 Java 주요 클래스와 예외처리 정리 (0) | 2026.04.27 |
|---|---|
| [2026.04.24] TIL - 20일차 Java 다형성 (0) | 2026.04.26 |
| [26.04.22] - TIL 18일차 Java 필드 - 객체배열 (0) | 2026.04.26 |
| [2026.04.21] TIL - 17일차 Java (배열 복사, 2차원 배열, 객체) (0) | 2026.04.22 |
| [2026.04.20] TIL - 16일차 반복문 활용과 배열 (1) | 2026.04.21 |