본문 바로가기

Java

추상 클래스(abstract class), 인터페이스(interface)

출처 - 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