① 인터페이스 : 구현된 것이 전혀 없는 설계도, 껍데기 ↔ 추상클래스 : 일반클래스, 추상메서드
- 인터페이스 선언
interface 인터페이스이름 {
public static final 타입 상수이름=값; //상수만 가능. 변수, iv, cv 불가능
public abstract 메서드이름(매개변수목록); //추상메서드
}
interface PlayingCard {
public static final int SPADE=4;
final int DIAMOND=3; //public static final 생략가능.
static int HEART=2; //public static final 생략가능.
int CLOVER=1; //public static final 생략가능.
public abstract String getCardNumber();
String getCardKind(); //public abstract 생략가능.
}
→ 모든 멤버변수는 public static final이어야 하며, 생략할 수 있다.
모든 메서드는 public abstract이어야 하며, 생략할 수 있다.
- 인터페이스의 상속
: 인터페이스는 인터페이스로부터만 상속받을 수 있고, 다중상속(=조상이 여러개)이 가능하다.
interface Movable {
void move(int x, int y);
}
interface Attackable {
void attack(Unit u);
}
interface Fightable extends Movable, Attackable{} //다중 상속
→ Fightable에는 정의된 멤버가 하나도 없지만 조상 인터페이스로부터 상속받은 move(), attack()메서드를 멤버로 갖게 된다.
- 인터페이스의 구현
: 인터페이스도 추상클래스처럼 그 자체로는 인스턴스를 생성할 수 없어서 인터페이스도 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야 한다. 인터페이스는 구현한다는 의미의 키워드 'implements'를 사용한다.
class 클래스이름 implements 인터페이스이름 {
//인터페이스에 정의된 추상메서드를 모두 구현해야 한다.
}
class Fighter implements Fightable {
public void move(int x, int y) {/*내용생략*/}
public void attack(Unit u) {/*내용생략*/} // {}안 구현부(몸통) 완성.
}
//만일 인터페이스 메서드 중 일부만 구현한다면, abstract를 붙여서 추상클래스로 선언한다.
abstract class Fighter implements Fightable {
public void move(int x, int y) {/*내용생략*/}
}
//상속과 구현을 동시에 할 경우.
class Fighter extends Unit implements Fightable {
public void move(int x, int y) {/*내용생략*/}
public void attack(Unit u) {/*내용생략*/}
}
→ interface + interface => extends
class + interface => implements
- 인터페이스를 이용한 다형성
Fightable f=(Fightable)new Fighter();
또는
Fightable f=new Fighter();
→ 인터페이스 Fightable을 클래스 Fighter가 구현했을 때, Fighter인스턴스를 Fightable타입의 참조변수로 참조하는 것이 가능하다. 따라서 인터페이스는 메서드의 매개변수의 타입으로도 사용될 수 있다.
class Fighter extends Unit implements Fightable {
public void move(int x, int y) {/*내용생략*/}
public void attack(Fightable f) {/*내용생략*/} //Fightable 인터페이스를 구현한 클래스의 인스턴스만 가능.
}
→ 인터페이스 타입의 매개변수가 갖는 의미는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 한다는 것이다. Fighter가 Fightable을 구현했으니 Fighter의 인스턴스를 매개변수로 제공해야 한다.
Fightable method() { //Fightable 인터페이스를 구현한 클래스의 인스턴스만 반환.
...
Fighter f=new Fighter();
return f; //인터페이스를 구현한 객체를 반환.
}
→ 리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것이다.
- 인터페이스의 장점 : 두 대상(객체)간의 연결을 돕는 중간 역할을 함.
1. 개발시간 단축.
2. 표준화 가능.
3. 관계없는 클래스들간의 관계를 맺어줌.
4. 독립적인 프로그래밍.
class B {
public void method() {
System.out.println("method In B");
}
}
→ 유연하지 않음, 변경에 불리.
interface I {
public void method(); //I전체
}
class B implements I {
public void method() {
System.out.println("method In B"); //B를 제외한 I의 전체
}
}
→ 유연, 변경에 유리.
<인터페이스 정리>
Q. 인터페이스란?
A. 추상메서드의 집합. (+상수, static메서드, 디폴트 메서드)
Q. 인터페이스의 구현이란?
A. 인터페이스의 추상 메서드 몸통 {} 만들기. (미완성 설계도 완성하기.)
Q. 추상 클래스와 인터페이스의 공통점?
A. 추상메서드를 가지고 있다.
Q. 추상클래스와 인터페이스의 차이점?
A. 인터페이스는 인스턴스변수를 가질 수 없다.
'프로그래밍 > Java' 카테고리의 다른 글
Java_예외처리(2)_멀티 catch블럭, 예외 발생시키기, 체크드예외와 언체크드예외, 메서드에 예외 선언하기, finally블럭 (0) | 2022.11.30 |
---|---|
Java_예외처리(1)_try-catch문 (0) | 2022.11.27 |
Java_객체지향언어(8)_추상 클래스, 추상 메서드 (0) | 2022.11.20 |
Java_객체지향언어(7)_instanceof연산자, 매개변수의 다형성, 객체배열 (0) | 2022.11.17 |
Java_객체지향언어(6)_다형성, 참조변수의 형변환 (0) | 2022.11.15 |