본문 바로가기
Java의 정석/객체지향 프로그래밍 II

인터페이스 (interface)

by Hwanii_ 2023. 7. 10.
728x90

1. 인터페이스 (interface).

 

프로그래밍 관점에서 봤을 때,

 

추상 메서드의 집합 이다.

 

즉, 인터페이스는 구현된 것이 전혀 없는 설계도 (껍데기) 이다.

 

(모든 멤버는 public으로 작성 한다.)

 

 

 

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

 

추상클래스는 일반 클래스 이고, 추상메서드를 가지고 있는 클래스를 의미 한다.

 

그렇지만, 추상메서드만 가지고 있는 클래스는 아니다.

 

멤버변수도 존재 하고, 생성자도 존재 한다.

 

또한, 추상메서드가 아닌 일반 메서드도 존재 한다.

 

하지만,

 

인터페이스는 오로지 추상메서드만 지니고 있다.

 

(final 키워드가 붙은, 상수를 지니고 있긴 하지만, 이것은 부수적인 개념 이다.)

 

 

 

3. 인터페이스를 구현 하기 위한 문법.

 

interface 인터페이스이름 {

	public static final 타입 상수이름 = 값;
    	public abstract 메서드이름(매개변수목록);
}

 

예외없이 인터페이스의 멤버는 public 키워드를 붙혀야 한다.

 

예외없이 인터페이스의 멤버인 메서드에 abstract 키워드를 붙혀야 한다.

(추상메서드는 메서드 바디가 없는 미완성 메서드를 의미 한다.)

 

인터페이스는 멤버변수, 클래스변수, 지역변수, .. 는 가질 수 없다.

 

항상 예외없이,

 

인터페이스의 메서드는 abstract 키워드가 붙은 추상메서드 이고,

 

final 키워드가 붙은 상수만 사용 가능 하기 때문에,

 

abstract와 final 키워드는 생략이 가능 하다.

 

또한,

 

모든 멤버는 public 으로 작성 하기 때문에,

public 키워드 조차도 생략이 가능 하다.

 

 

 

4. 예시

 

interface PlayingCard {
	
    public static final int SPADE = 4;
    //	public, static, final 이 모두 작성 되어 있는 모습.
		
    final int DIAMOND = 3;	
    //	public이 생략 되어 있는 상수 이다.
    
    static int HEART = 2;	
    //	언뜻 보면 클래스변수 처럼 보일 수 있지만,
    //	public 키워드와, final 키워드가 생략 되어 있다.
    
    int CLOVER = 1;	
    //	언뜻 보면 지역변수 처럼 보일 수 있지만,
    //	public, static, final 모두 생략 되어 있다.
	
    public abstract String getCardNumber();
		
    String getCardKind();
}

 

 

 

5. 인터페이스의 상속.

 

인터페이스의 조상은 인터페이스만 가능 하다.

 

(Object 가 최고 조상이 아니다.)

 

다중 상속이 가능하다는 특징을 가진다.

 

== 조상이 여러개 여도 전혀 상관이 없다.

 

why ?

 

추상 메서드는 미완성 메서드 이기에, 충돌이 일어나도 전혀 문제가 발생 하지 않는다.

 

>>

 

부모에게 서로 기능이 다르지만, 동일한 메서드 명을 가진 메서드가 존재 한다고 해보자.

 

어떤 자식이, 두 부모에게 상속을 받았을 때,

 

도대체 어떤 메서드를 상속 받아서, (오버라이딩) 

사용 해야 할지 자식 입장에서 알 수가 없다.

 

그러면, 기능이 서로 다르기에 충돌이 일어 날 수 밖에 없어서,

자바는 다중 상속을 허용 하지 않는다.

 

하지만, 추상메서드의 경우 메서드 바디가 없는 미완성 메서드 이다.

 

즉, 기능이 없는 메서드 이기 때문에, 충돌이 일어날 수가 없는 구조 이다.

 

따라서, 인터페이스는 다중 상속이 가능 하다.

 

예시)

 

interface Fightable extends Movable, Attackable { .. }
	
	interface Movable {	
	
		void move(int x, int y);
        //	(x, y) 로 이동하는 기능의 메서드.
	}
	
	interface Attackable {
		
		void attack(Unit u);
        //	지정된 대상(u) 을 공격하는 기능의 메서드.
	}

 

Movable 이라는 이름을 가진 인터페이스와,

 

Attackable 이라는 이름을 가진 인터페이스를,

 

상속 받은 Fightable 이라는 이름을 가진 인터페이스 이다.

 

이처럼, 인터페이스는 인터페이스만 상속을 받을 수 있고, 다중 상속을 허용 한다.

 

키워드는 기존에 상속의 키워드인 extends 와 동일 하다.

 

 

 

6. 인터페이스의 구현.

 

인터페이스에 정의된 "추상메서드를 완성" 하는 것을 의미 한다.

 

즉, 미완성 설계도를 완성 시키는 것을 인터페이스를 구현 한다고 한다.

 

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

 

참고 : 

implement : 구현하다.

 

예시)

 

class Fighter implements Fightable {
		
		public void move(int x, int y) { /* 내용 생략 */ }
		public void attack(Unit u) { /* 내용 생략 */ }
}

 

Fighter 클래스는 Fightable 이라는 이름을 가진 인터페이스를 구현한 상황 이다.

 

==

 

Fightable 이라는 이름을 가진 인터페이스 내부에 있는 추상 메서드를,

구현한 상황 이다. ( { .. } 를 완성. )

 

인터페이스를 구현 하기 위해서, implements 키워드를 사용 했다.

 

예시 2)

 

Fightable 인터페이스를 구현할 때, 일부만 구현 하는 경우는 어떻게 해야 할까 ?

 

일부만 구현 한다 == 미완성 메서드가 존재 한다

 

>>

클래스 명 앞에 abstract 키워드를 붙혀서,

해당 클래스 내부에 추상메서드가 존재 하는 추상클래스 라는 것을 알 수 있게 해야 한다.

 

abstract class Fighter implements Fightable {	//	추상 클래스.
		
		public void move(int x, int y) { /* 내용 생략 */ }
}

 

public abstract void attack(Unit u); 가 생략 되어 있다.

 

메서드 바디가 없는 미완성 메서드를 가지고 있기에,

추상 클래스를 의미할 수 있게, 클래스 이름 앞에 abstract를 붙히기.

 

 

 

7. 정리 하기.

 

1) 인터페이스란 ?

 

추상 메서드의 집합.

 

기능을 보완 하기 위해, 상수, static 메서드, 디폴트 메서드 가 존재 할 수도 있긴 하지만,

 

이것은 부수적인 개념이고, 핵심은 추상 메서드의 집합을 의미 한다.

 

 

 

2) 인터페이스의 구현이란 ?

 

인터페이스 내부에 추상메서드의 메서드 바디 { } 만들기.

 

== 미완성 설계도 완성 하기.

 

implements 키워드를 사용 한다.

 

 

 

3) 추상 클래스와 인터페이스의 공통점은 ?

 

추상 메서드를 지니고 있다.

 

== 미완성 설계도를 지니고 있다.

 

 

 

4) 추상 클래스와 인터페이스의 차이점은 ?

 

인터페이스

 

멤버 변수, 클래스 변수, 지역 변수를 가질 수 없다.

 

멤버변수가 없기에, 생성자도 없고, 인스턴스 메서드도 없다.

 

오로지, 추상 메서드만 지닌다. 

 

(상수, static 메서드, 디폴트 메서드 는 기능에 보완을 위해 있을 수도 있다.)

 

 

 

추상 클래스

 

멤버 변수 등을 가질 수 있다.

 

멤버변수가 있기에, 생성자도 있을 수 있고, 인스턴스 메서드도 있을 수 있다.

 

추상 메서드도 있고, 그외에 다른 것들이 클래스의 멤버 일 수 있다.

 

 

반응형

'Java의 정석 > 객체지향 프로그래밍 II' 카테고리의 다른 글

인터페이스의 장점  (0) 2023.07.10
인터페이스와 다형성  (0) 2023.07.10
추상 클래스, 추상 메서드  (1) 2023.06.10
매개변수의 다형성  (0) 2023.06.09
instanceof 연산자  (0) 2023.06.06