경주장

8주차 과제: 인터페이스 #8 (~03.04) 본문

JAVA/whiteship_live-study

8주차 과제: 인터페이스 #8 (~03.04)

달리는치타 2022. 2. 25. 14:47

✔️ 학습할 것 (필수)

  • 인터페이스 정의하는 방법
  • 인터페이스 구현하는 방법
  • 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
  • 인터페이스 상속
  • 인터페이스의 기본 메소드 (Default Method), 자바 8
  • 인터페이스의 static 메소드, 자바 8
  • 인터페이스의 private 메소드, 자바 9

인터페이스 정의하는 방법

이번 주차에도 오라클 도큐먼트를 참고(번역)하여 내용을 정리하겠습니다.


Interfaces

개발과정에서 여러 팀의 프로그래머가 그들의 소프트웨어가 상호작용하기 위한 "contract"을 정하고 동의하는 것은 흔한 일입니다. 각 팀은 다른 팀이 작성한 코드의 내부동작과 관계없이 자신의 코드를 작성 할 수 있어야합니다. 일반적으로 interface 란 그런 _contract_입니다.

Interfaces in Java

자바 프로그래밍 언어에서, interface는 참조 타입의 한 종류로서 Constant, Method Signatures, Default Method, Static Method와 Nested Type만을 가질 수 있습니다. _interface 는 인스턴스화 될 수 없으며 클래스로서 구현되거나 혹은 다른 인터페이스로부터 상속 될 수 있습니다.

인터페이스 정의하는 방법

interface를 정의하는 것은 class를 정의하는것과 유사합니다.

package week8_interface.study;

enum Direction {
    RIGHT, LEFT
}


public interface OperateCar {

    // constant declarations, if any

    // method signatures
    int turn(Direction direction, double radius, double startSpeed, double endSpeed);
    int changeLanes(Direction direction, double startSpeed, double endSpeed);
    int signalTurn(Direction direction, boolean signalOn);
    int getRadarFront(double distanceToCar, double speedOfCar);
    int getRadarRear(double distanceToCar, double speedOfCar);
    // more method signatures
}

인터페이스 구현하는 방법

인터페이스를 사용하기 위해서는 interface를 implements(구현) 하는 class를 작성해야합니다.

Instantiable class (추상 클래스가 아닌 클래스)가 interface를 구현하면, 그 클래스는 interface에 정의 된 method들에 대한 method body를 제공합니다.


위에서 정의한 OperateCar 인터페이스를 활용하기 위해 OperateBMW760i 클래스를 같은 패키지에 만들어 봅시다.

클래스 선언부에 추가한 implements OperateCar 을 통해 OperateBMW760i 클래스는 OperateCar의 구현체 임을 알렸습니다. 이때 IDE는 컴파일 에러를 알려주며 두가지 해결법을 알려줍니다.

두번째 방식인 abstract class로 만드는 방식은 이후에 알아보고 이번에는 Instantiable Class 즉 구체 클래스로 인터페이스를 구현하는 방식에 대해 알아보겠습니다. Implement methods를 선택하면 IDE는 아래와 같은 코드를 만들어줍니다.

OperateCar의 추상 메서드인 5가지 메서드를 override하고 기본적인 메소드 바디를 구현한 메서드선언이 추가되었습니다.

OperateCar를 활용하는 Class인 OperateCarService를 선언하고 메인메소드를 추가하여 정의한 인터페이스와 클래스를 활용해 보겠습니다.

'OperateCar' is abstract; cannot be instantiated !!!

인터페이스는 그 자체로 인스턴스 화 될 수 없고 이를 구현한 클래스로서 사용될 수 있습니다. (제가 아는한) 인터페이스를 구현한 클래스를 정의하는 방식으로는 총 세가지 방법이 있습니다.

  1. 위의 방식 - (Named class (?)) - 용어는 모르겠습니다. ㅜ.ㅜ
  2. 익명 클래스 - Anonymous class
  3. 람다 클래스 - Abstract Method가 하나만 정의된 인터페이스를 람다식으로 구현한 클래스

위의 코드를 살펴보면 컴파일 에러가 발생한 6번째 line 외에 특이한 부분이 하나 더 있습니다. 

8번째 line을 보면 new 연산자를 통해 생성한 클래스(OperateBMW760i)와 이를 받기 위해 선언한 변수의 타입(OperateCar)이 다릅니다. 이와 같이 인터페이스로 선언된 변수에 구체 클래스를 assign 하는 방식은 객체지향의 중요한 특징중 하나인 다형성을 가능하게 해줍니다.

 

@출처)

 

Lesson: Interfaces and Inheritance (The Java™ Tutorials > Learning the Java Language)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com