< 추상 클래스 VS 인터페이스 >
추상 클래스 : 추상 메서드를 가진 일반 클래스 (생성자, iv ... 갖고 있음) / 상속(extends)을 통해 구현
인터페이스 : 추상 메서드 외에 아무것도 갖지 않음 (iv, im, 생성자 X) / implements 를 사용해 구현
인터페이스
- 추상 메서드의 집합
- 구현된 것이 전혀 없는 설계도 (모든 멤버가 public)
interface 인터페이스이름 {
pubilc ststic final 타입 상수이름 = 값;
public abstract 메서드이름 (매개변수목록);
}
인터페이스의 상수 : 항상 public static final ➔ 생략 가능
인터페이스의 추상메서드 : 항상 public static ➔ 생략 가능
인터페이스의 상속
- 인터페이스의 조상은 인터페이스만 가능 (Object가 최고 조상 아님)
- 다중 상속이 가능 (조상이 여러개) - 추상메서드는 충돌해도 문제 없음
인터페이스의 구현
인터페이스에 정의된 추상 메서드를 완성하는 것 (추상클래스 완성과 동일)
- 일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 함
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상메서드를 모두 구현해야 함
}
Ex)
interface Fightable {
void move(int x, int y);
void attack(Unit u);
}
< 경우 1 >
class Fighter implements Fightable {
public void move(int x, int y) { /* 내용 생략 */ }
public void attack(Unit u) { /* 내용 생략 */ }
}
➔ 'Fighter 클래스는 Fightable 인터페이스를 구현했다'
< 경우 2 >
abstract class Fighter implements Fightable {
public void move(int x, int y) { /* 내용 생략 */ }
}
➔ 추상메서드 2개중에 1개만 구현해서 abstract 붙여야 함
인터페이스를 이용한 다형성
- 인터페이스 타입 매개변수는 인터페이스를 구현한 클래스의 객체만 가능
- 인터페이스를 메서드의 리턴타입으로 지정 가능
interface Fightable {
void move(int x, int y);
void attack(Fightable f); // 인터페이스 타입 매개변수
}
class Fighter extends Unit implements Fightable {
public void move(int x, int y) { /* 내용 생략 */ }
public void attack(Fightable f) { /* 내용 생략 */ }
}
Unit u = new Fighter();
Fightable f = new Fighter(); // f는 Fightable 인터페이스에 선언된 추상메서드 2가지만 사용 가능
f.move(100, 200);
f.attack(new Fighter());
< 예제 >
< 예제 - 메서드 추가 >
'JAVA > 자바의 정석' 카테고리의 다른 글
[자바의 정석 - 기초편] 7. (12) 디폴트 메서드 / 내부 클래스 / 내부 클래스 제어자 / 익명 클래스 (0) | 2023.12.01 |
---|---|
[자바의 정석 - 기초편] 7. (11) 인터페이스 장점 (0) | 2023.12.01 |
[자바의정석 - 기초편] 7. (9) 추상 클래스 / 추상 메서드 / 디폴트 메서드 (0) | 2023.12.01 |
[자바의 정석 - 기초편] 7. (8) 매개변수의 다형성 / 여러 종류의 객체를 배열로 다루기 (0) | 2023.11.30 |
[자바의 정석 - 기초편] 7. (7) 다형성 ( 참조변수의 형변환 / instanceof 연산자 ) (0) | 2023.11.30 |