상속
- 기존(상위) 클래스의 특성(멤버)을 새로운 (하위) 클래스가 물려받는 것
- 단, private변수, 메서드와 생성자, 초기화 블록은 상속되지 않음
- 부모 클래스(parent Class) = 상위 클래스(Super Class) = 기반 클래스(Base Class)
- 자식 클래스(Child Class) = 하위 클래스(Sub Class) = 파생 클래스(Derived Class)
extends 키워드 사용
접근제어자 class 자식클래스명 extends 부모클래스명 {
//클래스 내용
}
특징
단일 상속(Single Inheritance)
- 하나의 클래스는 하나의 부모 클래스만 가짐
- 클래스의 다중 상속은 불가능하나, 계층적 상속은 가능
- 인터페이스를 통한 다중 구현은 가능
모든 클래스는 Object 클래스를 상속
- Object클래스: 모든 클래스의 최상의 클래스
- toString(), equals(), hashCode() 등 기본 메소드 제공 -> 대부분 override해 사용
생성자는 상속되지 않음
- 각 클래스는 자신만의 생성자 필요
super()키워드로 부모 생성자 호출
상속의 필요성
코드 재사용성(Code Reusability)
- 공통 기능을 부모 클래스에 한 번만 정의
- 중복 코드 제거로 개발 효율성 증대
확장성(Extensibility)
- 기존 코드 수정 없이 새로운 기능 추가
- 개방-폐쇄 원칙(OCP) 구현
유지보수성(Maintainability)
- 공통 기능 수정 시 부모 클래스만 변경
- 버그 수정과 기능 개선의 효율성
다형성 구현(Polymorphism)
- 하나의 인터페이스로 여러 객체 처리
- 유연하고 확장 가능한 설계
상속 VS구성
상속(Inheritance)
- IS-A: "~은 ~이다"의 관계 -> 상속 관계
- 부모 클래스의 모든 기능이 필요할 때
- 다형성이 필요할 때
- ex)
- SportCar IS-A Car
- SUV IS-A Car
- ElectricCar IS-A Car
구성(Composition)
- HAS-A:"~은 ~을 가지고 있다"의 관계 -> 포함 관계
- 부분적인 기능만 필요할 때
- 런타임에 객체 변경이 필요할 때
- ex)
- Car HAS-A Engine (상속X, 멤버 변수로 구현)
- Car HAS-A Wheel (상속X, 멤버 변수로 구현)
상속 장단점
장점
- 코드 재사용성 - 중복 코드 제거
- 유지보수성 - 공통 기능 일괄 수정
- 확장성 - 기존 코드 수정 없이 기능 확장
- 다형성 구현 - 유연한 프로그래밍
단점
- 강한 결합 - 부모 변경이 자식에 영향
- 복잡성 증가 - 상속 계층이 깊어질수록 발달
- 캡슐화 약화 - protected 멤버로 인한 노출
- 유연성 제한 - 컴파일 타임에 관계 고정
메서드 재정의(Method Overriding)
메서드 재정의
method overriding 이란
- 부모 클래스에 정의된 메서드를 자식 클래스에서 적합하게 수정 (재정의)하는 것
- 자식 클래스에서 메서드 오버라이딩을 할 경우, 부모 클래스 메서드는 숨겨지고 오버라이딩된 자식 메소드만 호출됨
overriding의 조건
- 메서드의 이름은 같아야 함
- 매개 변수의 개수, 타입, 순서가 같아야 함
- 리턴 타입 같아야 함
- 메서드이 접근 제어자는 부모보다 범위가 넓거나 같아야 함
- 부모클래스의 예외보다 더 넓은 (상위) 예외를 던질 수 없음
super, super()
super 키워드이 역할
- 부모 클래스의 생성자 호출: super(매개변수)
- 부모 클래스의 메소도 호출: super.메소드명()
- 부모 클래스의 필드 접근: super.필드명
super()생성자 호출 규칙
- 자식 클래스 생성자의 첫 번째 줄에 위치
- 명시적으로 작성하지 않으면 super()가 자동 삽입
- 부모 클래스에 기본 생성작 없으면 컴파일 에러
super와 this의 차이점
- super:부모 클래스 참조
- this:현재 클래스 참조
Annotation
Annotation
- 주석
- 컴파일러, JVM, 프레임워크 등이 보는 주석
- 소소크드에 메타 데이터를 삽입하는 형태
- 소스 코드에 붙여 놓은 라벨
- 코드에 대한 정보 추가 -> 소스 코드의 구조 변경 , 환경 설정 정보 추가 등의 작업 진행
기본 Annotation
@Deprecated
- 컴파일러에게 해당 메서드가 deprecated 되었다고 알려줌
@Override
- 컴파일러에게 해당 메서드는 override한 메서드 임을 알려줌
- 오타나 실수 방지, 가독성 향상
@SuppressWarnings
- 컴파일러에게 사소한 warning의 경우 신경 쓰지 말라고 알려줌
접근 제어자(Access Modifier)
접근제어자
- 멤버 등에 사용되며 해당 요소를 외부에서 사용할 수 있는지 설정
| 접근제어자 | 선언 | | | | 접근 가능한 범위 | | |
| :-----------------: | :-: | :-: | :-: | :----: | :-------: | :-----------: | :-: |
| | 클래스 | 생성자 | 멤버 | 같은 클래스 | 같은 패키지 | 다른 패키지의자식 클래스 | 전체 |
| public | o | o | o | o | o | o | o |
| protected | | o | o | o | o | o | |
| package(default,생략) | o | o | o | o | o | | |
| private | | o | o | o | o | | |