출처 - Java의 정석 기초편 (남궁 성)
1. 추상 클래스
- 일반 클래스인데 미완성 메서드(추상 메서드) 포함
- 미완성 설계도: 인스턴스 생성 불가
- 상속을 통해 추상 메서드 구현(몸통 {} 작성)해야 인스턴스 생성 가능
abstract class 클래스 이름 {
... // 추상 메서드 포함
}
abstract class Player {
abstract void play(int pos);
abstract void stop();
}
2. 추상 메서드
- 미완성 메서드: 구현부(몸통) 없는 메서드
- 상속을 통해 자손 클래스가 조상의 추상 메서드를 구현해야 함
- 하나라도 미구현시 자손 클래스도 추상 클래스로 지정
abstract 리턴타입 메서드이름(); // 괄호 {} 대신 문장의 끝을 알리는 ; 적음
class AudioPlayer extends Player {
void play(int pos) { /* 구현 */ }
void stop() { /* 구현 */ }
}
3. 추상 클래스 작성
- 기존 클래스의 공통 부분을 뽑아내 추상 클래스로 만들어 상속
- 상속계층도 따라 올라갈수록 공통요소, 내려갈수록 세분화
- 추상화된 코드는 구체화된 코드보다 유연, 변경에 유리
4. 인터페이스
- 추상 메서드 집합
- 구현된 것이 아무 것도 없는 기본 설계도(메서드의 껍데기)
- 부수적: 상수, static메서드, 디폴트메서드
- 예외 없이 모든 멤버 변수는 public static final, 모든 메서드는 public abstract 이어야 하므로 제어자 생략 가능(일부 또는 전부)
- 추상 클래스와 공통점: 추상 메서드 가지고 있음
- 추상 클래스와 차이점: 인터페이스는 인스턴스 변수(iv) 가질 수 없음
interface 인터페이스이름 {
public static final 타입 상수이름 = 값; // 상수 부수적 (iv, im, 생성자 멤버로 허용 불가)
public abstract 메서드이름(매개변수목록); // 추상 메서드 핵심적
}
5. 인터페이스 상속
- 인터페이스는 인터페이스로부터만 상속 가능
- Object클래스와 같은 최고 조상 없음
- 다중상속
interface Fightable extends Movable, Attackable {} // 다중상속
6. 인터페이스 구현
- 기본 설계도: 인스턴스 생성 불가
- 인터페이스의 추상 메서드 몸통 {} 작성
- 추상 클래스 구현과 같은데 키워드 implements 사용
- 하나라도 미구현시 추상 클래스로 지정
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상 메서드를 모두 구현해야 함
}
// Fighter클래스는 Fightable인터페이스를 구현한다.
class Fighter implements Fightable {
public void move(int x, int y) { /* 구현 */ }
public void attact(Unit u) { /* 구현 */ }
}
class Fihter extends Unit implements Fightable { // 상속과 구현 동시에 가능
...
}
7. 인터페이스 이용한 다형성
- 인터페이스도 이를 구현한 클래스의 조상? Yes
- 인터페이스 타입의 참조변수로 이를 구현한 클래스의 인스턴스 참조 가능
- 메서드의 매개변수의 타입으로 사용 가능
- 메서드의 리턴타입으로 지정 가능
Fightable f = (Fightable)new Fighter(); // 인터페이스 타입으로의 형변환도 가능
또는
Fightable f = new Fighter();
// attack 메서드는 매개변수로 Fightable 인터페이스를 구현한 클래스의 객체만 받겠다는 의미
void attack(Fightable f) {
// ...
}
// 리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것 의미
Fightable method () {
Fighter f = new Fighter();
return f; // 두 문장을 한 문장으로 return new Fighter();
}
8. 인터페이스 장점
- 두 대상(객체) 간 연결, 대화, 소통을 돕는 중간역할
- 선언과 구현 분리: 변경에 유리한 코드
- 개발시간 단축: 선언과 구현 동시에 개발 진행
- 표준화: JDBC(인터페이스 집합)
- 관계없는 클래스 관계 맺어줌: 인터페이스 공통 구현
- 독립적인 프로그래밍 가능
9. 디폴트 메서드와 static메서드(부가적)
- 디폴트 메서드는 인터페이스에 추상 메서드 추가하기 어려운 부분 해결
- 키워드 default 붙이고 몸통 {} 있음, 접근 제어자 public 생략 가능
- 이름 중복 충돌: 조상 클래스 메서드 우선, 인터페이스 구현 클래스에서 오버라이딩
interface MyInterface {
void method();
default void newMethod(){} // 디폴트 메서드 추가
}
'Java' 카테고리의 다른 글
예외처리 (1) | 2022.10.05 |
---|---|
내부 클래스(inner class), 익명 클래스(anonymous class) (0) | 2022.10.04 |
다형성(polymorphism) (0) | 2022.10.03 |
제어자(modifier) (0) | 2022.09.30 |
super, super(), package, import문 (1) | 2022.09.30 |