자바의 정석 기초편 - 객체지향개념 공부(7)

인영·2022년 11월 8일
0

자바의 정석

목록 보기
6/6

인터페이스 (interface)

추상 메서드의 집합
구현된 것이 전혀 없는 설계도. 껍데기(모든 멤버가 public)

추상클래스와 인터페이스의 차이
추상클래스 => 일반클래스인데 추상메서드를 가지고 있는 것 (abstract) (키워드:extends)
인터페이스 => 구현된 것은 아무 것도 없고 밑그림만 그려져 있는 기본 설계도 (키워드:implements)

인터페이스 선언

interface 인터페이스 이름 {
	public static final 타입 상수이름 =; // 상수 (변수, iv, cv X)
    public abstract 메서드이름(매개변수목록); // 추상 메서드
}
interface playingCard {
	public static final int SPADE = 4;
    final int DIAMOND = 3; // public static final int DIAMOND = 3; 
    static int HEART = 2; // public static final int HEART = 2;
    int CLOVER = 1; // public static final int CLOVER = 1;
    // 상수. 항상 public static final 이기에 생략 가능
    
    String getCardKind(); // public abstract String getCardKind();
    // 추상메서드. 항상 public abstract 이기에 생략 가능
}

인터페이스의 상속

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

interface fightable extends Movable, Attackable {} // 멤버 2
interface Movable { // 생략 } // 멤버 1
interfave Attackable { // 생략 } // 멤버 1

인터페이스의 구현

인터페이스에 정의된 추상 메서드를 완성하는 것

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

예시

interface Fightable{
	void move(int x, int y)
    void attack(Unit u);
}

class Fighter implements Fightalbe {
    public void move(int x, int y) { }
    public void attack(Unit u) { }
    // Fighter 클래스는 Fightable 인터페이스를 구현
}

일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 함
abstract class Fighter implements Fightable {
	public void move(int x, int y) { }
}
🔍 인터페이스란?
⭐️ 추상 메서드의 집합

🔍 인터페이스의 구현이란?
⭐️ 인터페이스의 추상메서드 몸통{} 만들기(미완성 설계도 완성하기, 키워드 implements)

🔍 추상 클래스와 인터페이스의 공통점?
⭐️ 추상 메서드를 가지고 있음(미완성 설계도)

🔍 추상 클래스와 인터페이스의 차이점?
⭐️ 인터페이스는 iv, 생성자, 인스턴스 메서드를 가질 수 없다. (추상메서드, 상수, static메서드, default메서드만 가능)

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

인터페이스도 구현 클래스의 부모? yes
인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능(중요. 다형성)

class Fighter extends Unit implements Fightable {
	public void move(int x, int y) { }
    public void attack(Fightable f) { }
    // attack 메서드는 매개변수로 Fightable 인터페이스를 구현한 클래스 객체만 받겠다
}
Unit u = new Fighter();
Fightable f = new Fighter();

인터페이스를 메서드의 리턴타입으로 지정할 수 있음(Fightable 인터페이스를 구현한 클래스의 인스턴스만 반환)

Fightable method() {
    ...
    Fighter f = new Fighter(); // Fighter를 생성해서 반환
    return f;
    // 이 두 문장을 한 문장으로 바꾸면 return new Fighter(); 과 같음
}

인터페이스의 장점

두 대상(객체)간의 '연결, 대화, 소통'을 돕는 '중간 역할'
선언(설계)와 구현을 분리시킬 수 있게 함
B가 변경되어도 A는 변경 안 해도 됨(느슨한 결합)
개발 시간 단축
변경에 유리한 유연한 설계가 가능
표준화 가능 (JDBC)
서로 관계없는 클래스들을 관계를 맺을 수 있음


디폴트 메서드와 static 메서드

인터페이스에 디폴트 메서드, static메서드 추가 가능 (JDK 1.8부터)
인터페이스에 새로운 메서드(추상메서드)를 추가하기 어려움.
= 해결책 : 디폴트 메서드(default method)
디폴트 메서드는 인스턴스 메서드(인터페이스 원칙 위반)

interface MyInterface {
	void method();
    // void newMethod(); // 추상 메서드 
    default void newMethod() {}
}

디폴트 메서드가 기존의 메서드와 충돌할 때의 해결책
(충돌났을 땐 직접 오버라이딩 하면 해결)

1. 여러 인터페이스의 디폴트 메서드 간의 충돌
 - 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩해야 한다.
2. 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
 - 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.

0개의 댓글