인터페이스란?

김운채·2023년 5월 4일
1

Java

목록 보기
7/11

저번에는 추상클래스에 대해 작성했었다. 이어서 인터페이스를 알아보려 한다!
추상클래스 글 : https://velog.io/@kimunche/추상클래스

1. 인터페이스란?

일단 한마디로 추상메서드의 집합 이다.
추상클래스가 미완성 설계도 였다면, 구현된 것이 전혀 없는 설계도라고 할 수 있다.(모든 멤버가 public, 모든 메서드가 추상메서드)

추상클래스는 추상메서드를 가지고 있고, 멤버변수를 가지고 있지만,
인터페이스는 오직 추상메서드와 상수만을 멤버로 가질 수 있다.

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

인터페이스는 항상 abstract, public statc final 이기 때문에 선언시에 생량이 가능하다.

interface PlayingCard{
	//상수
	public static final int SPADE = 4;
	final int DIAMOND = 3; => 항상 public static final 이기 때문에 생략가능
	static int HEART =2;
	int CLOVER = 1;
	
	//추상메서드
	public abstract String getCardNumber();
	String getCardKind(); //public abstract String getCardKind()=> 어차피 추상메서드 이기 때문에 생략이 가능하다.
}

1-1. 인터페이스의 상속

인터페이스의 상속의 특징은
1. 인터페이스의 조상은 인터페이스만 가능하다.(Object가 최고 조상이 아니다.)
다른 클래스들의 최고 조상은 object 지만, 인터페이스는 인터페이스만 상속이 가능하다.
2. 클래스와는 달리 다중상속(조상이 여러개)이 가능하다. => 선언부가 같아서 충돌해도 몸통(내용)이 없으니 상관없이 충돌을 피할 수 있다.

interface Movable{
void move(int x, int y);
}
interface Attackable {
void attack(Unit u)
}
interface Fightable extends Movable, Attackable{ //다중상속
// 조상 인터페이스로부터 상속받은 두개의 추상메서드 move(int x, int y),attack(Unit u) 를 멤버로 갖게 된다.
}

1-2. 인터페이스의 구현

인터페이스도 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야 하는데, 인터페이스는 구현한다는 의미의 'implements'를 사용한다.
인터페이스에 정의된 추상메서드를 완성하는 것을 구현이라고 한다.

class 클래스이름 implements 인터페이스이름{
//인터페이스에 정의된 추상메서드를 모두 구현해야 한다.
}
class Fighter implements Fightable{ //class Fighter 가 인터페이스 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){
    };
}

1-3. 인터페이스를 이용한 다형성

다형성은 조상 참조변수로 자속객체를 가르키는 것이다.(여러가지 형태를 가질 수 있는 능력)

class Fighter extends Unit implements Fightable{ 
	public void move(int x, int y){
    };
    public void attack(Fightable f){
    };
}

Unit u = new Fighter(); //조상클래스 Unit, 자손객체 Fighter
Fightable f = new Fighter(); //인터페이스 Fightable

Fighter 클래스가 Fightable 인터페이스를 구현했으니, Fightable 의 참조변수로 Fighter 클래스를 참조하는게 가능하다.

interface Fightable{
	public void move(int x, int y){
    };
    public void attack(Fightable f){
    };
}

하지만 위 코드처럼 Fightable 에 정의된 (추상)메서드 2개만 사용이 가능하다.
Fighter 에 아무리 멤버가 많아도 move, attack 만 쓸 수 있는 것이다.

위 코드를 보면 attack 메소드는 매개변수타입이 인터페이스(Fightable)다. 즉, 이 attack의 매개변수 타입에는 Fightable 인터페이스를 구현한 클래스의 인스턴스만 가능하다는 뜻이다.

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

Fightable method(){
	return new Fighter();
}

리턴타입이 Fightable이기 때문에 메서드의 return 문에서 Fightable 인터페이스를 구현한 Fighter 클래스의 인스턴스를 반환한다.

생활코딩 님이 좀 더 쉽게 설명한 내용도 있으니 참고 바람! https://youtu.be/4IlT6p_H-ss
https://youtu.be/wxthfU10x2U

1-4. 인터페이스의 장점

* 개발시간 단축

메서드를 호출하는 쪽에서는 메서드의 내용에 관계없이 선언부만 알면 되기 때문에 개발시간을 단축시킨다.
동시에 다른 한쪽에서는 인터페이스를 구현하는 클래스를 작성하게 되면, 인터페이스를 구현하는 클래스가 작성될 때까지 기다리지 않고도 양쪽에서 동시에 개발을 진행할 수 있다.

* 표준화 가능

프로젝트에 사용되는 기본 툴을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여 개발하게 함으로써 보다 일관되고 정형화된 프로그램의 개발이 가능하다.

* 서로 관계없는 클래스들에게 관계 맺어 줄 수 있음

서로 아무런 관계도 없는 클래스들에게 하나의 인터페이스를 구현하도록 함으로써 관계를 맺어 줄 수 있다

* 독립적인 프로그래밍 가능

클래스와 클래스간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.

0개의 댓글