📚 참고
자바의 정석 기초편 (객체지향개념만)

 

 

 

 

 

 

 

 

 

 

인터페이스

 

  • 추상 메서드의 집합
  • 구현된 것이 전혀 없는 설계도, 껍데기
  • 모든 멤버가 public
  • 인터페이스 추상 클래스
    • 인터페이스 : 구현된 것이 전혀 없다. iv 존재할 수 없음
    • 추상 클래스 : 생성자, iv가 존재하는 일반 클래스인데 추상 메서드를 가지고 있음

 

interface 인터페이스명 {
    // 상수 (iv, cv는 가질 수 없음)
    public static final 타입 상수명 = 값;
    
    // 추상 메서드
    public abstract 메서드명(매개변수 목록);
}
interface Playing Card {
    // interface의 모든 상수는 항상 [ public, static, final ]이기 때문에 생략 가능
    public static final int SPADE = 4;
    final int DIAMOND = 3;
    static int HEART = 2;
    int CLOVER = 1;
    
    // interface의 모든 메서드는 항상 [ public, abstract ]이기 때문에 생략 가능
    public abstract String getCardNumber();
    String getCardKing();
}

 

 

 

 

 

  • 인터페이스의 조상은 인터페이스만 가능 (Object가 최고 조상이 아님)
  • 다중 상속이 가능 (추상 메서드는 충돌해도 문제 없음)
    • 메서드의 선언부가 같고 구현부가 다르면 어느 쪽을 상속 받을지 결정할 수 없다.
    • 하지만 인터페이스는 전부 추상 메서드이고 추상 메서드는 구현부가 존재하지 않기 때문에 충돌이 없다.

 

// 다중 상속 가능
interface Fightable extends Movable, Attackable { }

일반 클래스는 다중 상속 불가

 

 

 

 

 

 

 

인터페이스의 구현

 

  • 인터페이스는 미완성 설계도이므로 정의된 추상 메서드를 완성하는 것이 인터페이스의 구현이다.
  • 일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 한다. 

 

class 클래스명 implements 인터페이스명 {
    // 인터페이스에 정의된 추상 메서드를 모두 구현
}

 

 

 

 

 

 

 

정리

 

Q. 인터페이스란?

A. 추상 메서드의 집합 (기능적인 보완을 위해 상수, static 메서드, default 메서드가 들어감)

 

 

Q. 인터페이스의 구현이란?

A. 추상 메서드 완성 (추상 클래스는 상속을 통해 구현이 되고, 인터페이스는 implements 키워드를 통해 구현 됨)

 

 

Q. 추상 클래스와 인터페이스의 공통점

A. 추상 메서드를 가지고 있다.

 

 

Q. 추상 클래스와 인터페이스의 차이점

A. 인터페이스는 iv를 가질 수 없다.

 

 

 

 

 

 

 

인터페이스와 다형성

 

  • 인터페이스도 구현 클래스의 부모인가? Yes
  • 다중 상속의 문제는 '충돌'  인터페이스를 통해 다중 상속의 문제를 해결
  • 인터페이스 타입 매개변수는 인터페이스를 구현한 클래스의 객체만 가능

 

// 인터페이스
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();			// OK
Fightable f = new Fighter();	// OK

// 멤버 2개만 사용 가능
f.move(100, 200);
f.attack(new Fighter());

 

 

 

 

 

  • 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.

 

// Fightable 인터페이스를 구현한 클래스의 인스턴스를 반환
Fightable method() {
    Fighter f = new Fighter();
    return f;
    // return (Fightable) f
}
Fightable f = method();

 

 

 

 

 

 

 

인터페이스의 장점

 

  • 인터페이스는 두 대상(객체) 간의 연결, 대화, 소통을 돕는 중간 역할
    • 사람 윈도우(GUI) 컴퓨터
  • 선언(설계)와 구현을 분리 시킬 수 있다.
  • 인터페이스 덕분에 B 클래스가 변경되어도 A 클래스는 변경사항이 없다. (느슨한 결합)

 

 

 

 

 

강한 결합

 

class A {
    // method()의 매개변수 타입이 B에서 C로 변경되었다고 가정
    public void method(B b) {
    	b.method();
    }
    
    // 의존관계가 C 클래스로 변경되면 코드 변경이 발생 (B ➡ C)
    public void method(C b) {
    	b.method();
    }
}

class B {
    public void method() {};
}

class C {
    public void method() {};
}
class InterfaceTest {
    public static void main(String args[]) {
    	A a = new A();
        a.method(new B());		// A가 B를 사용(의존)
        a.method(new C());		// A가 C를 사용(의존)
    }
}

 

 

 

 

 

느슨한 결합

 

class A {
    // 매개변수 타입: 인터페이스 I를 구현한 객체의 참조변수
    // 코드가 변경되지 않는다.
    public void methodA(I i) {
    	i.method();
    }
}

// 클래스의 선언과 구현을 분리
interface I {
    void method();
}

class B implements I {
    public void method() {};
}

class C implements I {
    public void method() {};
}
class InterfaceTest {
    public static void main(String args[]) {
    	A a = new A();
        a.method(new B());		// A가 B를 사용(의존)
        a.method(new C());		// A가 C를 사용(의존)
    }
}

 

 

 

 

 

요약

 

A 클래스의 변경여부에 주목

 

  • 개발 시간 단축
    • 강한 결합 시, A 클래스는 B 클래스를 완성해야지만 작성할 수 있다.
    • 느슨한 결합(인터페이스 사용) 시, B 클래스의 완성을 기다리지 않고도 A 클래스를 작성할 수 있다.
  • 변경에 유리한 유연한 설계 가능
  • 표준화 가능
    • 예제

 

JDBC 표준

 

  • 서로 관계없는 클래스들을 관계 맺어줄 수 있다.
    • 공통의 인터페이스를 구현하게함으로써 서로 관계를 맺어줄 수 있다.

 

 

 

 

 

 

 

default 메서드, static 메서드

 

  • 인터페이스에 default 메서드, static 메서드 추가 가능 (JDK1.8부터)
  • 인터페이스에 새로운 메서드(추상 메서드)를 추가하기 어렵다.
    • 널리 쓰이는 인터페이스일수록 수정해야 하는 클래스가 많아지기 때문에
    • 해결책 default 메서드
    • default 메서드는 인스턴스 메서드이다. (인터페이스 원칙 위반)
  • 디폴트 메서드와 기존 메서드의 충돌 시, 해결책
    • 1. 여러 인터페이스의 디폴트 메서드 간의 충돌 시, 구현 클래스에서 디폴트 메서드를 오버라이딩
    • 2. 디폴트 메서드조상 클래스 메서드 간의 충돌 시, 조상 클래스 메서드가 상속되고 디폴트 메서드는 무시

 

 

 

 

 

 

 

 

 

 

 

'JAVA > 객체지향개념' 카테고리의 다른 글

추상 클래스 (Abstract Class), 추상 메서드 (Abstract Method)  (0) 2021.03.20
다형성 (Polymorphism)  (0) 2021.03.19
캡슐화💊  (0) 2021.03.19
접근 제어자 (Access Modifier)  (0) 2021.03.18
import문, static import문  (0) 2021.03.18