상속
자바에서는 단일 상속만을 허용하는데,
하나의 클래스가 여러 조상 클래스를 상속받는 '다중 상속' 형태는 불가능하다.
Object 클래스
모든 클래스의 상속 계층도에서 가장 상위에 있는 클래스
class Tv {
// ...
}
이렇게 아무것도 상속하지 않는 클래스를 컴파일하면 자동으로 Object를 상속하도록 설정한다.
오버라이딩
조상 클래스에서 상속받은 메서드 내용을 변경하는 것을 말한다.
오버라이딩의 조건은 다음과 같다.
1) 조상 클래스의 메서드와 이름이 같다.
2) 조상 클래스의 메서드와 매개변수가 같다.
3) 조상 클래스의 메서드와 반환 타입이 같다.
다만 접근 제어자와 예외는 다르게 변경할 수 있는데,
- 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 있다.
super
자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수
this를 사용해서 상속받는 멤버를 표현할 수 있지만, 명확한 분리를 위해 super변수를 사용한다.
class SuperTest{
public static void main(String args[]) {
Child c = new Child();
c.method();
}
}
class Parent{
int x = 10;
}
class Child extends Parent{
void method(){
System.out.println("x = " + x);
System.out.println("this.x=" + this.x);
System.out.println("super.x=" + super.x);
}
}
super 사용의 예시
x와 this.x와 super.x는 모두 같은 변수를 가리킨다.
this()와 super()
this()는 같은 클래스의 다른 생성자를 호출하는 데 사용
super()은 조상 클래스의 생성자를 호출하는데 사용
조상 클래스의 생성자를 따로 호출하지 않으면, 컴파일러가 자동적으로 super()를 호출한다.
package & import
패키지란, 클래스의 묶음이다.
package 패키지명;
인터페이스나 클래스 상단에 위와 같이 패키지명을 지정할 수 있다.
패키지명을 따로 적지 않으면, unnamed pacakge로 지정되어 분류된다.
import를 사용해서 패키지명을 포함한 클래스 이름을 사용해 현재 클래스로 가져올 수 있다 .
static import 문을 사용하면 static 멤버를 호출할 때 클래스 이름을 생략할 수 있다.
abstract
미완성의 의미를 지닌다.
메서드 선언부만 작성하고 실제 수행 내용은 구현하지 않은 추상 메서드를 선언할 때 사용된다.
abstract class AbstractTest {
abstract void move();
}
인스턴스를 생성하지 못하는 쓸모없는 클래스이지만,
다른 클래스가 추상 클래스를 상속 받아 필요한 메서드만 오버라이딩하여 사용할 수 있다.
추상 클래스에 대해서 자세하게 알아보자.
추상 클래스는 새로운 클래스를 작성할 때 바탕이 되는 조상 클래스로서 의미를 가진다.
추상 메서드(abstract method)
선언부만 작성되어, 실제 내용은 상속받은 클래스에서 구현토록 한다.
abstract class Player{
abstract void play(int pos);
abstract void stop();
}
class AudioPlayer extends Player{
void play(int pos) {
//
}
void stop(){
}
}
다형성
조상클래스의 타입의 참조변수로 자손 클래스의 인스턴스를 참조할 수 있다
CaptionTv 클래스가 Tv클래스를 상속하고 있다는 가정하에,
Tv t = new CaptionTv();
CaptionTv c = new CaptionTv();
두 변수는 같은 타입의 인스턴스지만, 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 다르다.
변수 t는 CaptionTv 인스턴스에서 Tv와는 별개로 생성된 멤버를 사용할 수 없다.
+ 참조변수의 형변환
자손에서 부모로 Up-Casting하는 경우 따로 형변환이 필요 없지만,
부모에서 자손으로 Down-Casting하는 경우 캐스트 연산자를 이용해 형변환이 필수적이다.
'instanceof' 연산자로 인스턴스의 실제 타입을 알아볼 수 있다.
인터페이스
인터페이스는 일종의 추상 클래스이다.
추상 클래스와 다르게 일반 메서드 또는 일반 멤버 변수를 구성원으로 가질 수 있다.
제약사항을 정리하자면,
1) 모든 멤버변수는 public static final이어야 함
2) 모든 메서드는 public abstact 이다.
모두 생략시 자동으로 컴파일러가 지정한다.
class 클레스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상메서드 구현
}
인터페이스를 이용해 다중상속을 구현할 수 있다.
Fightable f = (Fightable) new Fighter();
Fightable f = new Fighter();
형변환을 이용해 구현 클래스로 바꿀 수 있으며
Fighter 인스턴스를 Fighterable타입의 참조변수로 참조하는 것이 가능하다.
다음은 인터페이스의 장점을 정리해보았다.
1. 개발시간 단축
2. 표준화 가능
3. 관계없는 클래스에게 관계성 부여
4. 독립적인 프로그래밍
JDK 1.8부터 인터페이스에 디폴트 메서드와 static 메서드를 추가할 수 있다.
디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드
새로 추가되어도 구현체들이 이 메소드를 따로 구현하지 않아도 된다.
내부 클래스
내부 클래스란,
클래스 내에 선언된 클래스이며 멤버들 간 쉽게 접근할 수 있고 외부에서 불필요한 클래스를 감추어
코드의 복잡성을 줄일 수 있다 .
익명 클래스는 클래스의 선언과 객체의 생성들 동시에 하기 때문에
단 한번만 사용될 수 있고, 하나의 객체만을 생성하는 일회용 클래스이다.
class InnerEx6{
Object iv = new Object() {
void method() {}
};
void myMethod(){
Object Iv = new Object() {
void method (){}
};
}
}
익명 클래스는 '외부 클래스명$숫자.class'의 형식으로 컴파일러에 저장된다.
'Langauge > Java' 카테고리의 다른 글
Java의 정석 Chapter8. 예외처리(Exception Handling) (0) | 2022.03.21 |
---|---|
Java InputStream에서 File 객체로 변환하기 (0) | 2022.03.21 |
Java의 정석 Chapter6. 객체지향 프로그래밍 (0) | 2022.03.13 |
Java의 정석 Chapter5. 배열 (0) | 2022.03.07 |
Java의 정석 Chapter3. 연산자 / Chapter4. 조건문과 반복문 (0) | 2022.03.07 |