🌱 오늘의 주제 : 인터페이스(interface)
🌱 인터페이스(interface)
- 인터페이스는 일종의 추상클래스이다.
- 추상메서드와 상수만을 멤버로 가질 수 있다.
일반 메서드, 멤버변수는 가질 수 없다. - 인터페이스는
구현{ }된 것은 아무것도 없고, 밑그림만 그려져 있는 '기본 설계도'이다. - 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다.
- 접근제어자는 public, default만 사용할 수 있다.
interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수 목록);
}
- 모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.
- 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
단. static메서드와 디폴트 메서드는 예외(JDK 1.8부터)
interface PlayingCard {
public static final int SPADE = 4;
final int DIAMOND = 3;
static int HEART = 2;
int CLOVER = 1;
public abstract String getCardNumber( );
String getCardKind( );
}
🌱 인터페이스의 상속
- 인터페이스는 인터페이스로부터만 상속받을 수 있다.
- 다중상속 가능.
- Object 클래스와 같은
최고 조상이 없다.
interface Movable {
void move(int x ,int y);
}
interface Attackable {
void attack (Unit u);
}
interface Fightable extends Movable, Attackable { }. // 다중 상속 가능.
🌱 인터페이스 구현
- 인터페이스는
인스턴스를 생성할 수 없다. - 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해서 구현해야 한다.
- 인터페이스 구현은 implements를 사용한다.
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상메서드를 모두 구현해야 한다.
}
class Fighter immplements Fightable { //Fighter는 Fightable를 모두 구현해야 한다..
public void move(int x, int y) { // 내용 생략 }
public void attack(Unit u) { // 내용 생략}
}
// 만약 인터페이스의 메스드 중 일부만 구현한다면 abstract를 붙여서 추상클래스로 선언해야한다.
abstract class Fighter immplements Fightable { //Fighter는 Fightable를 구현한다.
public void attack(Unit u) { // 내용 생략}
}
// 상속과 구현을 동시에 할 수도 있다.
class Fighter extends Unit immplements Fightable { //Fighter는 Fightable를 구현한다.
public void move(int x, int y) { // 내용 생략 }
public void attack(Unit u) { // 내용 생략}
}
🌱인터페이스를 이용한 다형성
- 해당 인터페이스의 타입의 참조변수로 이를 구현한 클래스의 객체를 참조 할 수 있으며, 인터페이스 타입으로의 형변환도 가능하다.
Fightable f = (Fightable)new Fighter();
또는
FIghtable f = new Fighter( );
void attack (Fightable F) { // 메서드의 매개변수의 타입으로도 사용됨.
}
🌱 메서드의 매개변수의 타입으로도 사용 될 수 있다.
- 인터페이스 타입의 매개변수가 갖는 의미는 메서드 호출 시, 해당 인터페이스를 구현한 클래스(자손)의 인스턴스를 매개변수로 제공해야 한다는 것이다.
- attack 메서드의 매개변수로 Fighter 인스턴스를 넘겨 줄 수 있다. 즉, attack(new Fighter())와 같이 할 수 있다.
void attack(Fightable f) {
}
class Fighter extends Unit implements Fightable {
public void move(int x, int y) { //내용 생략 }
public void attack(Fightable f) { //내용 생략 }
}
🌱 메서드의 리턴타입으로 인터페이스를 지정하는 것도 가능하다.
Fightable method () { // 리턴타입 : Fightable
Fighter f = new Fighter( ) ; // 두 문장을 한 문장으로 바꾸면 return new Fighter( );
return f;
}
- 리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스(자손)의 인스턴스를 반환하다는 것이다. ** 외우세요!
- 즉, 위에 코드에서는, method( ) 의 리턴타입이 Fightable 인터페이스이기 때문에 메서드의 return문에서 Fightable 인터페이스를 구현한 Fighter 클래스의 인스턴스 주소를 반환한다.
🌱 인터페이스의 장점
- 개발시간을 단축시킬 수 있다. : 메서드의 선언부만 알면 되기 때문이다.
- 표준화가 가능하다, : 기본 틀을 인터페이스로 작성한 다음, 프로그램으로 작성하면 정형화된 프로그램의 개발 가능.
- 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다. : 상속관계에 있지도 않고, 같은 조상클래스를 가지고 있지도 않은 서로 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.
- 독립적인 프로그래밍이 가능하다.
'Java' 카테고리의 다른 글
Java - ArrayList (0) | 2023.02.03 |
---|---|
Java - 컬렉션 프레임웍의 핵심 인터페이스 (0) | 2023.02.03 |
Java - 추상 클래스(abstract class), 추상메서드(abstract method) (0) | 2023.01.29 |
Java - 참조변수의 형변환 (0) | 2023.01.28 |
Java - 다형성(polymorphism) (0) | 2023.01.28 |