목표
자바의 상속에 대해 학습하세요.
학습할 것 (필수)
- 자바 상속의 특징
- super 키워드
- 메소드 오버라이딩
- 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
- 추상 클래스
- final 키워드
- Object 클래스
자바 상속의 특징.
-
단일상속
- 클래스는 단일 상속만된다.
- 단 인터페이스는 다중상속이 가능하다.
-
모든 클래스는 동적으로 Object 클래스를 상속받거나 최상위 부모로 Object 클래스가 존재한다.
- 다른 클래스를 상속받지 않아도 컴파일러가 자동으로 Object 클래스를 상속시켜준다.
- 다른 클래스를 상속받는 경우는 결국 최상위 부모 클래스로 Object 클래스가 존재한다.
super 키워드
super
- 서브 클래스에서 슈퍼클래스로부터 상속받은 클래스를 참조하는데 사용되는 참조 변수.
- 서브클래스는 슈퍼클래스로 상속받으므로 this 로도 사용할수 있지만 구분을 위해 super로 사용한다.
- super는 static메서드에서 사용할수 없고 인스턴스에서만 사용할수 있다.
super()
-
키워드 뒤에 ()가 붙으면 슈퍼클래스의 생성자를 호출하는것을 의미한다.
-
Object클래스를 제외한 모든 클래스의 생성자 첫줄에 생성자 this() 또는 super()를 호출해야한다.
- 안하면 컴파일러가 자동적으로 super()를 서브클래스 생성자 첫줄에 삽입한다.
- 하지만 만약 슈퍼클래스의 생성자가 매개변수를 받고 기본생성자가 존재하지 않을 때
- super(매개변수) 키워드를 사용하지 않는다면 에러가 발생합니다.
메소드 오버라이딩
- 서브클래스에서 상속받은 슈퍼클래스의 메소드들을 재정의하는것.
- 메소드 위에 @Override를 붙여 명시적으로 오버라이딩 된 메소드란것을 알린다.
오버라이딩 조건
- 이름이 같아야 한다.
- 매개변수가 같아야 한다.
- 리턴타입이 같아야 한다.
- JDK 1.5부터 return 타입이 자손 클래스의 타입으로 사용가능하게 변경되었다.
- 슈퍼클래스의 메소드보다 접근제어자를 좁은 범위로 변경할 수 없다.
- 슈퍼클래스의 메소드보다 많은 수의 예외를 선언할 수 없다.
- 인스턴스메서드를 static메소드로 또는 그 반대로 변경할 수 없다.
다이나믹 메소드 디스패치
-
런타임시에 어떤 메소드를 실행할지 정하는 과정
-
java는 싱글 디스패치 언어.
- reciever parameter를 하나만 쓸수 있다.
-
스태틱 디스패치와 다이나믹 디스패치가 있다.
-
스태틱 디스패칭
- 컴파일 되는 시점에 어떤 메소드를 실행할지 정하는 과정
- 검증단계를 안거치기 때문에 다이나믹 디스패칭보다 빠르다.
-
다이나믹 디스패칭
- 런타임시에 어떤 메소드를 실행할지 정하는 과정
- 검증단계를 거치기 때문에 스태틱 디스패칭보다 느리다.
- 호출 과정에 첫번째로 receiver parameter 란것이 들어가는데
- 이 receiver parameter에 this에 해당하는 객체가 들어있다.
- name, parameter types 로 구성 되어있다.
- 위 두가지가 같으면 오버라이딩이 가능.
- 다르면 오버로딩이 가능.
- (return type, method type parameter, method argument types, exception ) 로 구성되어 있다.
- 이것이 같으면 method reference 를 쓸수 있다.
Double Dispatch
- 다이나믹 디스패처 과정이 두번 일어나는 과정
interface Post { void postOn(SNS sns); } static class Text implements Post { public void postOn(Sns sns) { sns.post(this); } } static class Picture implements Post { public void postOn(Sns sns) { sns.post(this); } } interface SNS { void post(Text post); void post(Picture Post); } static class Facebook implements SNS { public void post(Text post) { System.out.println("text-facebook"); } public void post(Picture post) { System.out.println("picture-facebook"); } } static class Twitter implements SNS { public void post(Text post) { System.out.println("text-twitter"); } public void post(Picture post) { System.out.println("picture-twitter"); } } public static void main(String[] args) { List<Post> posts = Arrays.asList(new Text() , new Picture()); List<SNS> sns = Arrays.asList(new Facebook() , new Twitter()); posts.forEach(p -> sns.forEach((SNS s) -> p.postOn(s))) }
출처: 토비의 봄 TV 1회 - 재사용성과 다이나믹 디스패치, 더블 디스패치 https://www.youtube.com/watch?v=s-tXAHub6vg&ab_channel=TobyLee
추상클래스
- 추상메서드를 포함하고 있는 클래스
- 추상클래스로는 인스턴스를 생성할 수 없다.
abstract class test { }
-
서브클래스가 상속을 통해 구현해주어야만 인스턴스를 생성할 수 있다.
-
일반 클래스 일지라도 abstract가 붙으면 인스턴스를 생성할수 없다.
-
상속의 계층이 점점 내려갈수록 구현도가 높아진다.
-
상속의 계층이 올라갈수록 점점 추상적이다.
추상메소드
- 선언부만 존재하는 메소드
- 구현부가 존재하지 않는다.
abstract 리턴타입 메소드이름();
final 키워드
-
const와 같은 의미인 키워드.
-
이 키워드가 붙은 변수는 변경될 수 없다. = 상수가 된다.
-
이 키워드가 메소드에 붙으면 이 메소드는 오버라이딩을 통해 재정의 할수 없다.
-
이 키워드가 클래스에 붙으면 확장이 불가능해진다. = 다른 클래스의 슈퍼 클래스가 될수 없다.
-
클래스 , 메소드, 멤버변수 , 지역변수 에만 사용 가능하다.
-
생성자를 통해 final 멤버 변수를 초기화 할수 있다.
-
일반적으로는 선언과 초기화를 동시에 하지만 인스턴스변수의 경우 생성자에서 초기화 되도록 할 수 있다.
Object 클래스
-
java.lang 패키지에 존재한다.
-
이 패키지들은 import가 생략 가능하다.
-
Object 클래스는 모든 클래스의 최고 조상
-
멤버변수는 없고 오직 11개의 메소드만 갖고 있다.
1. protected Object clone() - 객체 자신의 복사본을 반환 2. public boolean equals(Object obj) - 객체 자신과 매개변수로 받는 객체가 동일한지 체크 3. protected void finalize() - 객체가 소멸될때 gc에 의해 자동적으로 호출된다. 이때 객체가 수행되어야 코드가 있을때 오버라이딩 한다. java9 부터 deprecated 됨. 4. public Class getClass() - 객체 자신의 클래스 정보를 담고 있는 Class 객체를 반환한다. 5. public int hashCode() - 객체 자신의 해쉬코드를 반환한다. 6. public String toString() - 객체 자신의 정보를 문자열로 반환한다. 7. public void notify() - 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다. 8. public void notifyAll() - 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다. 9. public void wait() - 다른 쓰레드가 notify()나 notifyAll()을 호출할 때 까지 현재 쓰레드를 무한히 또는 지정된 시간 (timeout, nanos)동안 기다리게 한다. 10. public void wait(long timeout) 11. public void wait(long timeout, int nanos)
참조
토비의 봄 1화 https://www.youtube.com/watch?v=s-tXAHub6vg&ab_channel=TobyLee
자바의 정석 - 남궁성
'백선생님 온라인스터디' 카테고리의 다른 글
8주차 - 인터페이스 (0) | 2021.01.16 |
---|---|
7주차 - 패키지 (0) | 2021.01.12 |
4주차 - 제어문 (0) | 2021.01.09 |
3주차 연산자 (0) | 2021.01.07 |
연산자 (0) | 2020.11.28 |