반응형

인터페이스 (interface)

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

 

인터페이스의 정의는, 일반적인 관점에서의 정의, 프로그래밍적 관점에서의 정의로 나눌 수 있는데,
이번시간에는 프로그래밍 관점에서의 인터페이스에 대해 생각해보자.

인터페이스는, 추상메서드의 집합이다.

사실은, 추상 메서드 외에도, static메서드, 상속, default메서드 인터페이스의 요소인데, 이것들은 부수적인 것이다.
핵심이 아니다.

추상 메서드가 인터페이스의 본질이자 핵심이다.

즉, 인터페이스는 추상메서드 집합이므로,
구현된 것이 전혀 없는 설계도이자 껍데기이다. 인터페이스의 모든 멤버는 public이다.

 

객체지향 개념 책들을 보면, 이런 그림이 많이 나온다.
각 집합이 객체이고,
그 안의 변수들이 iv이다.

어떤 객체에서 다른 객체의 변수에 접근하려면, 메서드를 통해서 접근해야한다. (t.getHour()이런 식으로)
이것을 캡슐화 라고 했다.
iv를 보호하기 위해 iv를 메서드가 감싸고 있는데, 이것을 인터페이스라고 한다.

인터페이스는 항상 밖에 노출되어 있다.
그래서 인터페이스의 모든 멤버는 public이다.

 


 

인터페이스도 구현된 것이 전혀 없는 설계도 이고, 추상클래스도 부족한 부분이 있는 설계도인데,
인터페이스와 추상클래스의 차이는?

추상클래스는 일반 클래스인데, 추상 메서드를 가지고 있는 것이다. (일반 메서드 + 추상 메서드)

인터페이스는, 추상메서드 외에는 완전히 아무것도 없는 것이다. (추상메서드외에는 가질 수 없음 위에서 언급한 부수적인 것은 신경X) 

 

추상 클래스는 멤버변수(iv)를 가질 수 있지만,  
인터페이스는 멤버변수를 가질 수 없다.

추상 클래스는 클래스인데, 일부가 미완성으로 추상 메서드를 가지고 있는 것이고,
인터페이스는 구현된 것이 아무것도 없이 추상메서드만을 가지고 있다.

인터페이스의 핵심은 "추상 메서드의 집합" 이라는 것이다.

 


 

인터페이스를 선언하는 방법은, 클래스를 선언하는 방법과 유사하다.
대신에 앞에 class라고 쓰지 않고, interface라고 쓴다.

위에서도 언급헀지만, 상수는 핵심이 아니다. 
추상 메서드가 핵심이다.

인터페이스의 모든 멤버는 Public이다. 

인터페이스를 정의한 예를 보면,

인터페이스 이름이 PlayingCard이다.
상수들이 있고, 추상 메서드가 있다. 

그런데, String getCardKing(); 에는 abstract가 안붙었는데도, 구현부{} 가 없다.  게다가 public도 없다.
public과 abstract를 생략한 것이다.

생략이 가능한 이유는, 인터페이스의 메서드는 항상 public이고 추상메서드이기 때문이다.

상수도 마찬가지로 항상 pulbic이고 항상 static이고, 항상 final이다. 그래서 일부 또는 전부를 생략 가능하다.

 

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

 

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

 

코드를 보면, Movable은 조상이 없다. 


만약에 클래스라면, extends Object가 생략되어 있어서 Object가 Movable의 조상이겠지만,
Movable은 인터페이스이므로, 인터페이스의 조상은 인터페이스만 가능하고, 현재 상속받은 것이 없으므로, 조상이 없다.

인터페이스는 다중 상속이 가능하다.

인터페이스는 조상이 여러개인 다중상속이 가능하다.
왜 인터페이스만 가능할까?

원래는, 메서드 충돌문제가 있다.
같은 이름의 메서드를 두개의 부모가 가지고 있는데, 내용이 다르면  어느것을 상속받을지 알 수 가없는 문제가 있었는데,
추상메서드는 충돌할게 없다. 선언부가 충돌해도, 둘다 똑같고, 구현부는 아예없어서 문제가 되지 않는다.
그런데, 인터페이스는 추상 메서드 집합이다.

따라서 선언부가 똑같은데 구현부가 다른게 문제여서 원래는 다중상속이 안되지만,
인터페이스의 경우 추상메서드의 집합이므로 다중상속이 가능하다. 

 


 

인터페이스의 구현

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

 

인터페이스도 미완성 설계도다.
그러므로 객체를 생성하지 못한다.

마찬가지로 인터페이스는어떻게 쓰냐면,
추상 클래스처럼 상속을 통해서 완성해서 사용해야한다.
인터페이스에 정의된 추상메서드를 완성하는 것을 "인터페이스의 구현" 이라고 한다.

클래스에서 추상  클래스를 상속받을 때는, extends를 사용했는데,

클래스에서 인터페이스를 상속받을 때는, implements 키워드를 사용한다.
클래스 상속과 다른 키워드를 쓰는 것 뿐이지, 하는 방식은 같다.

예를 들어서 Fightable 인터페이스가 있을 때, 
이 Fightable인터페이스를 구현하는 클래스 Fighter가 있는데,
인터페이스를 구현한다는 말은, 인터페이스의 추상 메서드를 완성하는 것이다. 

즉, 이 Fightable인터페이스를 구현하려면, 
추상 메서드들을 구현해야 한다.

이때, "Fighter클래스는 Fightable 인터페이스를 구현했다" 라고 표현한다.

Fightable인터페이스의 추상 메서드의 몸통부분을 완성해주었으므로, Fighter클래스는 abstract를 붙이지 않아도 된다.(추상클래스가 아니다.)

추상클래스를 완성시키는 것과 완벽히 일치한다.

 

  • 일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 함.

 

Fighterable인터페이스의 추상 메서드 앞에도 publc abstract가 생략되어 있다.

Fightable 인터페이스의 추상메서드 2개중에 1개만 구현하면, Fighter클래스는 abstaract를 붙여서 추상 클래스임을 명시해 줘야 한다.

이내용들은, 인터페이스 내용을 제외하면, 추상클래스때의 내용과 정확히 일치하기 때문에, 쉽게 이해할 수 있을 것이다.

 


 

Q. 인터페이스란?

A. 추상메서드의 집합  +@JDK1.8에서 추가(상수, static메서드, default 메서드)

 

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

A. 인터페이스의 추상메서드 몸통{} 만들기 (미완성 설계도 완성하기)

위의 코드는, 추상클래스의 구현이고,

아래코드는 인터페이스의 구현이다.

구현이란, 몸통{}만들기 즉, 추상클래스에서 부족한 부분을 구현해서 설계도를 완성시키는 것이다.

추상메서드를 완성하는 것이 구현이고,
추상 클래스는, extends상속을 통해서 구현을 하고,
인터페이스는 Impements라는 키워드를 써서 구현한다.

 

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

A.  추상 메서드를 가지고 있다. (미완성 설계도)

 

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

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

 

 

[중요해서 위에 메모한 내용 다시한번 상기]

 

인터페이스도 구현된 것이 전혀 없는 설계도 이고, 추상클래스도 부족한 부분이 있는 설계도인데,
인터페이스와 추상클래스의 차이는?

추상클래스는 일반 클래스인데, 추상 메서드를 가지고 있는 것이다. (일반 메서드 + 추상 메서드)

인터페이스는, 추상메서드 외에는 완전히 아무것도 없는 것이다. (추상메서드외에는 가질 수 없음 위에서 언급한 부수적인 것은 신경X) 

 

추상 클래스는 멤버변수(iv)를 가질 수 있지만,  
인터페이스는 멤버변수를 가질 수 없다.

추상 클래스는 클래스인데, 일부가 미완성으로 추상 메서드를 가지고 있는 것이고,
인터페이스는 구현된 것이 아무것도 없이 추상메서드만을 가지고 있다.

인터페이스의 핵심은 "추상 메서드의 집합" 이라는 것이다.

반응형

'JAVA' 카테고리의 다른 글

인터페이스의 장점 (1)  (0) 2022.04.06
인터페이스와 다형성  (0) 2022.04.06
추상 클래스의 작성 (2)  (0) 2022.04.05
추상 클래스의 작성 (1)  (0) 2022.04.05
추상 클래스, 추상 메서드  (0) 2022.04.05