티스토리 뷰

Java/문법

10. 인터페이스 : interface

알 수 없는 사용자 2018. 10. 14. 01:41


이번 포스팅은 

추상화에 이어서 비슷한 기능과 목적을

가지고 있는 인터페이스에 대해서

알아보도록 하겠습니다.

인터페이스는 자바 API 문서를 보더라도

많이 사용되는 기능이기 때문에 

사용 목적과 역할을 알아두어야 합니다.


==========================================================


인터페이스 : interface




1. Interface : What?


 인터페이스도 추상화의 연속이라고 생각하면 됩니다. 추상화와 마찬가지로 추상 메소드를 가지지만 추상 클래스보다 추상도가 높다고 생각하시면 됩니다. 

추상 클래스는 부분적으로 완성되지 않은 클래스라고 했습니다. 이를 설계도로 비교한다면 미완성 설계도라고 할 수 있겠죠.

이에 비해 인터페이스는 아예 설계도의 밑바탕만 그려둔 기본 설계도라고 할 수 있습니다.

미완성 설계도와 기본 설계도라 하면 무슨 차이인지 감이 안 잡힐 수도 있지만 그림과 비교하자면 미완성 설계도는 색칠이 마무리 단계인 그림에서 어느 한 곳만 색칠하지 않은 것이라 할 수 있고 기본 설계도는 연필로 스케치만 해둔 상태라고 비유할 수 있을 것 같습니다.


그렇기 때문에 추상 클래스와 마찬가지로 다른 클래스에게 도움을 주기위한 목적으로 사용됩니다.

하지만 상속받는 클래스가 어떤 구조이냐에 따라 추상 클래스, 인터페이스의 사용이 나뉩니다. 





2. Interface : When, Why?


 사실 인터페이스와 추상 클래스는 사용하는 목적이 상당히 유사하기 때문에 언제 어떤 상황일 때 사용해야 할지 감이 안 옵니다.

이 둘의 사용 용도를 구분하기 위해서는 클래스 관점에서 보면 될 것 같습니다.

추상 클래스는 클래스를 추상화만 시켜 인스턴트만 생성할 수 없을 뿐이지 클래스와 같은 작동을 합니다.

하지만 인터페이스는 클래스와 다른 취급으로 분류됩니다. 바로 추상 클래스는 클래스이지만 인터페이스는 클래스가 아니다 라는 점에서 구분하면 될 것 같습니다.

추상 클래스는 상속(extends) 관계에서의 확장, 그리고 오버라이드를 위해 사용한다 했었습니다. 

하지만 인터페이스는 인터페이스를 상속(implements)받는 클래스에서 인터페이스에 선언된 기능을 구현하도록 정의해둔 것입니다.

즉, 클래스 상속(extends)은 부모 클래스의 확장을 위해 사용되는데 이때 특정 기능만 추상화시키기 위해 사용하는 것이 추상 클래스이고, 인터페이스는 확장의 개념이 아닌 다형성을 위해 추상 메소드로만 구현된 클래스(실제로 클래스라고 하면 안됩니다ㅎ)가 필요할 때 사용됩니다.






3. Interface : How?


인터페이스의 사용방법은 추상 클래스와 마찬가지로 매우 단순합니다. (외우기 어렵지 않다는 것입니다. ㅎㅎ)

하지만 자바 버전이 업그레이드되면서 추가된 것도 있고 몇 가지 조건은 꼭 알아두어야 하는데 일단 기본적인 사용법만 보고 뒤에서 다루겠습니다.


- 구현방법

interface 인터페이스 이름 {

public static final 타입 상수 이름 = 값;

public abstract 메서드이름(매개변수);

}


클래스와 이름만 다를 뿐 구성 틀은 똑같습니다. 하지만 안에 들어갈 변수와 메소드에 제약이 따릅니다.


밑에 코드는 고양이, 강아지, 물고기를 객체로 생성하기 위해 클래스를 만든 예제입니다.

고양이, 강아지, 물고기의 우는 방법, 걷는 방법, 자는 방법은 모두 다릅니다. 따라서 이러한 방법들을 기능(메소드)을 만든다면 각각 다른 정의를 해주어야 합니다.

이럴 때 인터페이스의 다형성을 이용하여 구현하는 것입니다.

인터페이스는 단순히 다형성을 위해 구현해야 할 기능을 클래스에 주입해준다(?)라고 하면 될 것 같습니다. 추상 클래스는 부모 클래스의 확장 시에 사용하는 방법이죠.


interface AnimalFunction {
public abstract String cry();
abstract String walk();
String sleep();
}

class Cat implements AnimalFunction{
public String cry(){
return "Cat cry...";
}
public String walk(){
return "Cat walk...";
}
public String sleep(){
return "Cat sleep...";
}
}

class Dog implements AnimalFunction{
public String cry(){
return "Dog cry...";
}
public String walk(){
return "Dog walk...";
}
public String sleep(){
return "Dog sleep...";
}
}

class Fish implements AnimalFunction{
public String cry(){
return "Fish cry...";
}
public String walk(){
return "Fish walk...";
}
public String sleep(){
return "Fish sleep...";
}
}


위와 같이 AnimalFunction이라는 인터페이스를 정의하고 Cat, Dog, Fish 클래스가 구현했습니다.

그리고 각 클래스가 인터페이스에 선언된 메소드를 정의했습니다.

클래스 상속에서 사용한 방식과 다른 것은 단순히 키워드를 implements를 사용했다는 것입니다. 상속에서는 extends를 사용해 확장의 목적을 둔 반면 interface의 상속은 implements를 사용해 구현의 목적을 둔 것이죠. 


인터페이스는 클래스와 다르지만, 클래스 상속과 똑같이 인터페이스를 변수 타입으로 잡고 인터페이스를 상속한 자식 클래스 객체를 생성할 수 있습니다.

그렇기 때문에 인터페이스는 기능을 자식 클래스에 구현하도록 하여 다형성이 가능합니다.





4. Interface : Characters?


 - 인터페이스의 접근제어자는 public만 가능합니다. (생략 가능합니다.)

 - 인터페이스에는 추상 메소드와 상수만 올 수 있습니다.

 - 모든 멤버변수는 public static final이어야 하고, 생략해도 컴파일러가 자동 입력해줍니다.

 - 모든 추상 메소드는 public abstract이어야 하고, 생략해도 컴파일러가 자동 입력해줍니다.

 - 인터페이스를 상속하는 클래스는 인터페이스의 모든 추상 메소드를 구현해야 하는데 구현하지 않는다면 자식 클래스는 추상 클래스이어야 합니다.

 - static 메소드와 default 메소드는 JDK 1.8부터 사용할 수 있습니다.

 - 인터페이스는 extends와 달리 다중 상속이 가능합니다.

 - 인터페이스를 자료형과 참조 변수로 선언 가능합니다.

 - 클래스와 마찬가지로 인터페이스를 구현한 클래스를 객체로 생성할 수 있습니다.

 - 인터페이스를 상속받은 클래스가 인터페이스의 메소드를 구현하지 않을 것이라면 추상 클래스로 설계할 수 있다.


* default 메소드 :

설계 도중에 인터페이스에 추상 메소드를 추가한다면 그 인터페이스를 구현한 모든 클래스 또한 메소드를 추가해주어야 하는 불편함때문에 생긴 메소드입니다. 인터페이스를 구현한 클래스에서는 dafault 메소드를 정의해도 되고 정의하지 않아도 됩니다. 추상 메소드와 동일하게 접근 제어자는 public이며, 생략 가능합니다.

 


5. Interface : Advantages?


 - 인터페이스는 개발 시간을 단축시킬 수 있습니다. 메서드를 호출하는 쪽에서는 메서드 내용에 관계없이 선언부만 알면 되기 때문에 같은 인터페이스를 상속하는 클래스들을 양쪽에서 동시에 개발할 수 있습니다.

- 인터페이스는 선언부만 선언해두기 때문에 틀만 만들어놓고 일관되고 정형화된 프로그램의 개발이 가능합니다.

- 부모, 자식 관계의 클래스가 아님에도 불구하고 인터페이스를 사용한다면 각 클래스 사이에 관계를 맺어 줄 수 있습니다.

- 인터페이스를 상속한 자식 클래스의 선언과 정의를 분리할 수 있기 때문에 실제 구현에 독립적인 프로그래밍이 가능합니다.


======================================================================================================


## 추가

 인터페이스와 인터페이스의 상속에서는 extends를 사용합니다.

인터페이스를 상속할 때 implements를 무조건 사용하는 것이 아닙니다.

extends와 implements의 사용을 구분하는 것은 어떤 것을 상속하냐가 아니라 누가 상속받냐 입니다.

위의 예제는 클래스 기준으로 인터페이스를 상속받았기 때문에 implements를 사용한 것입니다.

하지만 인터페이스가 인터페이스를 상속받는다면 자식 인터페이스에서 부모 인터페이스의 기능을 정의할 수 없습니다.

인터페이스 자체가 기능을 선언하는 것이지 정의하는 것이 아니기 때문이죠.

즉, 인터페이스가 인터페이스를 상속받는다면 확장의 목적이기 때문에 extends 키워드를 사용해야합니다.








공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함