728x90
상속
- 부모 클래스(슈퍼 클래스)
- 자식 클래스(서브 클래스)
- 상속은 부모의 기능을 자식이 물려 받는 것이다.
- 부모 클래스는 자식 클래스에 접근할 수 없다.
- 단일 상속 !
- 자바는 다중 상속을 지원하지 않는다.
- 다중 부모에 같은 이름의 메서드가 있을 경우 어떤 메서드를 사용해야할지 결정할 수 없음 (다이아몬드 문제)
- 인터페이스를 통한 다중 구현을 이용해서 이런 문제를 피한다.
- 자바는 다중 상속을 지원하지 않는다.
상속과 메모리 구조
- 상속 관계의 객체를 생성하면, 그 내부에는 부모와 자식이 모두 생성된다.
- 상속 관계의 객체를 호출할 때, 대상 타입을 정해야 한다. 이 때 호출자의 타입을 통해 대상 타입을 차즌ㄴ다.
- 현재 타입에서 기능을 찾지 못하면 상위 부모 타입으로 기능을 찾아서 실행한다. 기능을 찾지 못하면 컴파일 오류가 발생한다.
상속과 메서드 오버라이딩
- 부모에게서 상속 받은 기능을 자식이 재정의 하는 것을 메서드 오버라이딩(Overriding)이라 한다.
- 메서드 윗줄에 @Override를 붙인다. (optional이지만 꼭 씀)
- @는 애노테이션이라 한다. 프로그램이 읽을 수 있는 특별한 주석이라 생각하면 된다.
- 오버라이딩과 메모리 구조
- electricar.move()를 호출하면 ElectricCar 인스턴스 내부에 메서드를 찾는다. 찾았으므로 부모 타입을 찾지 않는다.
오버로딩과 오버라이딩
- 메서드 오버로딩
- 메서드 이름이 같고 매개변수(파라미터)가 다른 메서드를 여러개 정의
- 과적
- 메서드 오버라이딩
- 하위 클래스에서 상위 클래스의 메서드를 재정의 하는ㄱ ㅘ정
- 무언가를 다시 재정의한다는 뜻
메서드 오버라이딩 조건
- 메서드 이름: 메서드 이름이 같아야 한다.
- 메서드 매개변수(파라미터): 매개변수 타입, 순서, 개수가 같아야 한다.
- 반환 타입: 반환 타입이 같아야 한다. 단, 반환 타입이 하위 클래스 타입일 수 있다.
- 접근 제어자: 오버라이딩 메서드의 접근 제어자는 상위 클래스의 메서드보다 더 제한적이어서는 안된다.
- 부모가 protected면 자식은 protected, public만 가능
- 예외: 오버라이딩 메서드는 상위 클래스의 메서드보다 더 많은 체크 예외를 throws로 선언할 수 없다.
- static, final, private: 키워드가 붙은 메서드는 오버라이딩 될 수 없다.
- static은 클래스 레벨에서 작동하므로 인스턴스 레벨에서 사용하는 오버라이딩이 의미가 없다.
- 생성자 오버라이딩: 생성자는 오버라이딩 할 수 없다.
클래스와 메서드에 사용되는 final
클래스에 final
- 상속 끝
- final로 선언된 클래스는 확장될 수 없다. 다른 클래스가 final로 선언된 클래스를 상속받을 수 없다.
- 예: public final class MyFinalCalss {...}
메서드에 final
- 오버라이딩 끝
- final로 선언된 메서드는 오버라이드 될 수 없다. 상속받은 서브 클래스에서 이 메서드를 변경할 수 없다.
- 예: public final void myFinalMethod() {...}
상속과 접근 제어
JAVA 접근 제어자 - UML 표기법
- +: public
- #: protected
- ~: default
- -: private
super
- super는 부모 참조
- 자식 클래스가 메서드 오버라이딩을 하고 있을 때 super를 이용해 부모 클래스 접근 가능
- 클래스에서 기본 생성자(파라미터가 없는 경우)는 super() 생략 가능
- 부모 클래스가 기본 생성자이면 자식 클래스에서 super() 생략 가능
- 자바가 super()를 자동으로 만들어 줌
- 부모 클래스가 기본 생성자이면 자식 클래스에서 super() 생략 가능
- super는 생성자 첫 줄에 작성
- this()를 사용하여 해당 클래스의 다른 생성자를 호출할 수 있으나 그 생성자의 첫줄에 또 super()가 있을 것임
- this는 해당 클래스 ()는 생성자를 의미
- this()를 사용하여 해당 클래스의 다른 생성자를 호출할 수 있으나 그 생성자의 첫줄에 또 super()가 있을 것임
- ClassA <- ClassB <- ClassC 순으로 상속 받는 경우(ClassC가 손자)
- ClassA - ClassB - ClassC 순으로 실행됨
- 자식 생성자의 첫줄에서 부모 생성자를 호출하기 때문
- ClassA - ClassB - ClassC 순으로 실행됨
728x90
'프로그래밍 > Java' 카테고리의 다른 글
[실전 자바-기본편] 다형성 활용 (0) | 2024.02.24 |
---|---|
[실전 자바-기본편] 다형성 (0) | 2024.02.21 |
[실전 자바-기본편] final (0) | 2024.02.14 |
[실전 자바-기본편] 자바 메모리 구조와 static (0) | 2024.02.14 |
[실전 자바-기본편] static 계속해서 (0) | 2024.02.13 |
댓글