인터페이스 interface
- 추상 메서드의 집합
- 구현된 것이 전혀 없는 설계도. 껍데기 (모든 멤버가 public)
- 기본 설계도
- 다른 클래스를 작성하는데 도움이 될 목적으로 작성
- 추상클래스와 인터페이스의 차이
- 추상클래스는 일부가 구현된 미완성 설계도
- 인터페이스는 아무것도 구현된 것도 없고 밑그림만 그려져있는 기본 설계도
interface 인터페이스이름 {
public static final 타입 상수이름 = 값; //상수
public abstract 메서드이름(매개변수목록); //추상메서드
}
//인터페이스의 모든 메소드는 public이고 final이고 abstract 여서 생략 가능
인터페이스의 상속
- 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상이 아님)
- 다중 상속이 가능 (추상메서드는 충돌해도 문제 없음)
interface Fightable extends Movable, Attackable {}
interface Movable {
/** 지정된 위치(x,y)로 이동하는 기능의 메서드 */
void move(int x, int y);
}
interface Attackable {
/** 지정된 대상(u)을 공격하는 기능의 메서드 */
void attack(Unit u);
}
인터페이스의 구현
- 인터페이스에 정의된 추상 메서드를 완성하는 것
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상메서드를 모두 구현해야 한다
}
- 구현한다는 의미의 키워드 'implements'를 사용함
class Fighter implements Fightable {
public void move(int x, int y) { /*내용 생략 */}
public void attack(Unit u) { /*내용 생략 */} // 몸통 완성
}
//Fighter 클래스는 Fightable 인터페이스를 구현했다.
- 추상클래스 완성과 동일; 키워드만 다름
- 일부만 구현하는 경우, 클래스 앞에 abstract를 붙어야 함
- 인터페이스란?
- 추상 메서드의 집합
- 인터페이스의 구현이란?
- 인터페이스의 추상메서드 몸통{} 만들기(미완성 설계도 완성하기)
- 추상 클래스와 인터페이스의 공통점은?
- 추상 메서드를 가지고 있다 (미완성 설계도)
- 추상 클래스와 인터페이스의 차이점은?
- 인터페이스는 iv를 가질 수 없다
인터페이스를 이용한 다형성
- 인터페이스도 구현클래스의 부모
- 인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능
- 인터페이스를 메서드를 리턴타입으로 지정할 수 있다
abstract class Unit2 {
int x, y;
abstract void move(int x, int y);
void stop() {
System.out.println("멈춥니다.");
}
}
interface Fightable { //인터페이스의 모든 메서드는 public abstract. 예외 없이
void move (int x, int y); // public abstract가 생략됨
void attack(Fightable f); // public abstract가 생략됨
}
class Fighter extends Unit2 implements Fightable{
//오버라이딩 규칙: 조상(public) 보다 접근제어자가 좁으면 안된다.
public void move (int x, int y) {
System.out.println("["+x+","+y+"]로 이동");
}
public void attack(Fightable f){
System.out.println(f+"를 공격");
}
}
public class FighterTest {
public static void main(String[] args) {
// Fighter f = new Fighter();
Unit2 u = new Fighter(); //Unit2에는 attack()이 없어서 호출불가
Fightable f = new Fighter();
u.move(100, 200);
// u.attack(new Fighter()); //Unit2에는 attack()이 없어서 호출불가
u.stop();
f.move(100, 200);
f.attack(new Fighter());
// f.stop(); //Fightable에는 stop()이 없어서 호출불가
}
}
인터페이스의 장점
- 두 대상(객체) 간의 '연결, 대화, 소통'을 돕는 '중간 역할'을 한다
- GUI - Graphic User Interface
- 선언(설계, 껍데기)와 구현(알맹이)을 분리시킬수 있게 함
- 변경에 유리하고 유연한 코드가 됨
- 인터페이스 덕분에 B가 변경되어도 A는 안바꿀 수 있게 됨 -> 느슨한 결합
- 의존도가 낮아짐
- 개발 시간 단축 가능
- 변경에 유리한 유연한 설계 가능
- 표준화가 가능
- 서로 관계없는 클래스들을 관계를 맺어줄 수 있음
- 다중상속 가능
class A{
public void method(I i) { //인터페이스 I를 구현한 넘들만 들어와라
i.method();
}
}
// B클래스의 선언과 구현을 분
interface I {
public void method();
}
class B implements I{
public void method(){
System.out.println("B클래스의 메서드");
}
}
class C implements I{
public void method(){
System.out.println("C클래스의 메서드");
}
}
public class InterfaceTest {
public static void main(String[] args) {
A a = new A();
a.method(new C()); // A가 B를 사용(의존)
}
}
'Java > 자바의 정석' 카테고리의 다른 글
남궁성 자바의 정석 기초편 ch11 컬렉션 프레임웍 collections framework (0) | 2022.12.21 |
---|---|
남궁성 자바의 정석 기초편 ch 7 디폴트 메서드 static 메서드 (0) | 2022.12.01 |
남궁성 자바의 정석 기초편 ch 7 추상클래스 추상메서드 (0) | 2022.11.30 |
남궁성 자바의 정석 기초편 ch 7 instance of 연산자 매개변수다형성 배열 (0) | 2022.11.30 |
남궁성 자바의 정석 기초편 ch 7 접근 제어자 캡슐화 다형성 참조변수의 형변환 (0) | 2022.11.26 |