목표
자바의 상속에 대해 학습하세요.
학습내용
자바 상속의 특징
상속(Inheritiance)
- 상속이란 기존의 클래스게 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미한다.
- 이러한 상속은 캡슐화, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나이다.
- 상속을 이용하면 기존에 정의되어있는 클래스의 모든 필드와 메소드를 물려받아, 새로운 클래스를 생성할 수 있다.
- 기존에 정의되어 있던 클래스를 부모/상위/기초 클래스라고 부른다.
- 상속을 통해 작성되는 클래스는 자식/하위/파생 클래스 라고 한다.
상속의 장점
- 기존의 클래스 재활용
- 클래스간 계층적 관계 구성으로 다형성의 문법 기반 생성
상속 방법
- 자식 클래스에서는 부모 클래스의 필드와 메소드만 상속도디며, 생성자와 초기화 블록은 상속되지 않는다.
- 부모클래스의 접근제어자가 private, default로 설정된 멤버는 자식클래스에서 상속 받지만 접근할 수 없다.
super 키워드
- super키워드는 부모 클래스로부터 상속 받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수이다.( this 변수와 같은 참조 변수~)
- 인스턴스 변수의 이름과 지역 변수의 이름이 같을 경우 인스턴스 변수 앞에 this 키워드를 사용하여 구분할 수 있다.
- super()클래스는 부모 글래스의 생성자를 호출할 때 사용한다.
- 생성자는 클래스의 객체가 선언되는 가장 처음 실행되는 것이기 때문에, super()사용 시점 이전에 해당 메소드의 작업이 있다면 오류가 발생한다.
메소드 오버라이딩
오버라이딩은 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것이라고 할 수 있다.
자식 클래스는 부모 클래스의 메소드를 상속받고, 필요에 따라 재정의 할 수 있다.
오버로딩과 차이
오버로딩과 오버라이딩은 유사한 단어로 자주 같이 언급이된다. 하지만 둘이 개념은 다르며 차이를 알아야한다.
오버로딩은 새로운 메소드를 정의하는 것이다.
동적 메소드 디스패치 (Dynamic Method Dispatch)
메소드 디스패치
어떤 메소드를 호출할지 결정하여 실제로 실행시키는 과정이다.
런타임시 객체를 생성하고, 컴파일 시에는 생성할 객체 타입에 대한 정보를 보유한다. 이에따라 정적/동적으로 나뉜다.
정적 메소드 디스패치
런타임 전에 클래스가 정의되어 있어있다. 이에 따라 정의된 메소드를 호출하는 경우를 말한다.
동적 메소드 디스패치
인터페이스, 추상 클래스에 정의된 추상 메소드를 호출하는 경우를 말한다. 런타임 전에는 객체가 생성되지 않는다.
추상 클래스
추상 클래스란 자식클래스에서 반드시 오버라이딩 해야만 사용할 수 있는 메소드를 가지고 있는 클래스이다. 즉, 추상 메소드를 가지고 있다.
모듈과 같이 중복되거나 공통적인 부분은 미리 만들어진 것을 사용하고, 필요에 따라 오버라이딩하여 재정의하여 사용하여 생산성/배포를 높인다.
final 키워드
final 변수
상수라고 불리며, 변수를 선언과 동시에 초기화하여 이후 값을 수정할 수 없다.
이후 값을 수정할 수 없는 변수를 정의하므로, 오버라이딩이 불가능하다.
final 클래스
final 키워드를 사용하여 변수 뿐만 아니라, 클래스를 정의할 수 있다.
이 또한 상속이 불가능하며, subclass를 만들 수 없다.
Object 클래스
java.lang 패키지
java.lang패키지는 자바의 기본 동작을 수행하는 클래스이다. Object클래스는 모든 자바 클래스의 최고 조상 클래스이며 java.lang패키지에 정의되어있다.
11개의 메소드로만 구성되어있다.
메소드 설명
protected Object clone() 해당 객체의 복제본을 생성하여 반환함.
boolean equals(Object obj) 해당 객체와 전달받은 객체가 같은지 여부를 반환함.
protected void finalize() 해당 객체를 더는 아무도 참조하지 않아 가비지 컬렉터가 객체의 리소스를 정리하기 위해 호출함.
Class<T> getClass() 해당 객체의 클래스 타입을 반환함.
int hashCode() 해당 객체의 해시 코드값을 반환함.
void notify() 해당 객체의 대기(wait)하고 있는 하나의 스레드를 다시 실행할 때 호출함.
void notifyAll() 해당 객체의 대기(wait)하고 있는 모든 스레드를 다시 실행할 때 호출함.
String toString() 해당 객체의 정보를 문자열로 반환함.
void wait() 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행할 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함.
void wait(long timeout)
해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행하거나 전달받은 시간이 지날 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함.
void wait(long timeout, int nanos) 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행하거나 전달받은 시간이 지나거나 다른 스레드가 현재 스레드를 인터럽트(interrupt) 할 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함.
참고
백기선의 자바 스터디 :https://github.com/whiteship/live-study
http://tcpschool.com/java/java_class_intro
'Programming Language > java' 카테고리의 다른 글
[whiteship_java_study]8주차. 인터페이스 (0) | 2021.08.05 |
---|---|
[whiteship_java_study]7주차. 패키지 (0) | 2021.07.29 |
[whiteship_java_study]5주차. 클래스(Class) (0) | 2021.07.22 |
[whiteship_java_study]4주차. 제어문 (0) | 2021.07.17 |
[whiteship_java_study]3주차. 연산자 (0) | 2021.06.26 |