[개인공부] 인터페이스(interface)

Walter Mitty·2022년 12월 4일
0

개인공부

목록 보기
18/40
post-thumbnail

인터페이스(interface)

  • 결론적으로는, 인터페이스는 추상메서드의 집합이다.
  • 구현된 것이 전혀 없는 설계도. 껍데기(모든 멤버가 public)
    • 추상클래스는 추상메서드, 생성자, iv를 다 가질 수 있다.(일부 미완성)
    • 그러나 인터페이스는 멤버변수를 가질 수 없다.(아예 미완성)

interface 인터페이스 이름 {
	public static final 타입 상수이름 =; //상수
    public abstract 메서드이름(매개변수목록); //추상메서드
}

- 변수를 가질 수 없다!!
- 메서드는 모두 추상메서드(abstract)이다.
- 접근제어자는 public 이다. (public abstract는 생략가능)

인터페이스의 상속

  • 인터페이스의 조상은 인터페이스만 가능하다(Object가 최고 조상 아님)
  • 다중 상속이 가능하다(=조상이 여러개 가능)
    • 추상메서드는 충돌해도 문제가 없다.

인터페이스의 구현

  • 인터페이스에 정의된 추상 메서드를 완성하는 것(=구현)이다.
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) { /* 구현 내용 */}
}

Q&A

Q. 인터페이스란?
A. 추상메서드의 집합 (JDK 1.8 이후 상수, static 메서드, default 메서드가 추가됨)

Q. 인터페이스의 구현이란?
A. 인터페이스의 추상메서드 {몸통} 만들기 = 미완성 설계도 완성하기

// 추상 클래스 구현
class AudioPlayer extends Player {
	void play(int pos) {/* 구현 내용*/} //추상메서드를 구현
	void stop() {/* 구현 내용*/}		//추상메서드를 구현
}

//인터페이스
interface Fighter {
	void move(int x, int y);
    void attact(Unit u);
}

//인터페이스 구현
class Fighter implements Fightable {
	public void move(int x, int y) { /* 구현 내용 */}
    public void attack(unit u) { /* 구현 내용 */}
}

Q. 추상 클래스와 인터페이스의 공통점은?
A. 추상메서드를 가지고 있다. = 미완성 설계도

Q. 추상 클래스와 인터페이스의 차이점은?
A. iv를 가질 수 있냐 없냐 차이.(인터페이스는 못 갖는다!)

abstract class Player {
	boolean pause;		//일시정지 상태를 저장하기 위한 변수
    int currentPos;		//현재 play되고 있는 위치를 저장함
    
    Player() {
    	pause = false;
		currentPos = 0;
    }
    
    /** 지정된 위치(pos)에서 재생을 시작하는 기능이 수행되도록 작성되어야 한다. */
    abstract void play(int pos); //추상메서드
    /** 재생을 즉시 멈추는 기능을 수행하도록 작성되어야 한다. */
    abstract void stop().;		//추상메서드
    
    void play() {
    	play(currentPos); 		//추상메서드를 사용할 수 있다.
    }
}

인터페이스를 이용한 다형성

  • 인터페이스도 구현 클래스의 부모? YES
    • 엄밀히 따져봤을 때 클래스만 부모가 될 수 있지만 인터페이스도 기능면에서 부모가 될 수 있다.
class Fighter extends Unit implements Fightable {
	public void move(int x, int y) { /* 내용 생략 */ }
    public void attack(Fightable f) { /* 내용 생략 */}
}
  • Unit을 상속 받은 Fighter 클래스.
  • Fightable 인터페이스를 구현하고 있는 Fighter 클래스.
    • 원래 이렇게 되면 부모가 둘이니까 다중상속이 되어버리고,
      다중상속이 문제가 되는 이유는 바로 "충돌" 때문이다.
      • 예시) 만약 Unit에도 attack() 메서드가 있고, Fightable에도 attack() 메서드가 있다면 어떤걸 불러올거야?
    • 그러나 인터페이스인 Fightable에는 attack()이 구현되어있지 않으므로 Unit의 attack() 불러지게 되면서 충돌하지 않는다!
      • 인터페이스가 다형성이 되는 이유.
        따라서 아래와 같은 것도 가능하다.
(조상클래스) Unit u = new Fighter(); < 자손객체 
(인터페이스) Fightable f = new Fighter(); < 자손 객체

  • 인터페이스 타입 매개변수는 인터페이스를 구현한 클래스의 객체만 가능

  • 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
    • 리턴 타입이 Fightable로 인터페이스지만, return 된 타입이 Fightable을 구현한 Fighter 클래스여도 여도 된다는 뜻! = 다형성 덕분에 가능

예제)이것도됨.


인터페이스의 장점

  • 두 대상(객체) 간의 '연결, 대화, 소통'을 돕는 '중간 역할'을 한다.
  • 선언(설계)와 구현을 분리시킬 수 있게 한다.
    • 설계: 껍데기, 구현: 알맹이
  • 인터페이스 덕분에 B가 변경되어도 A는 안바꿀 수 있게 된다.(느슨한 결합)
    • 나중에 B를 C로 변경하고 싶을 때 더 쉬워진다!

⇩ A가 B를 의존하는 코드
⇩ 만약 A 메서드에서 C를 받을 때, A를 건드려줘야한다.
⇩ 인터페이스 사용시
⇩ C로 바꾸고 싶을 때 - A를 안건드려도됨

  • 개발 시간을 단축할 수 있다.
  • 변경에 유리한 유연한 설계가 가능하다.
  • 표준화가 가능하다
    • JDBC(인터페이스의 집합) 표준화된 인터페이스로 만들어서 그거에 맞춰 개발한다면 데이터 베이스가 바뀌어도 JDBC가 바뀌지 않는 한 자바 어플리케이션을 바꿀 필요가 없어진다.
  • 서로 관계없는 클래스들을 관계를 맺어줄 수 있다.7-39 15분대 다시 보기

0개의 댓글