java week 8


목차

0. 인터페이스란?

1. 인터페이스 정의하는 방법

2. 인터페이스 구현하는 방법

3. 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법

4. 인터페이스 상속

5. 인터페이스의 기본 메소드 (Default Method), 자바 8

6. 인터페이스의 static 메소드, 자바 8

7. 인터페이스의 private 메소드, 자바 9


인터페이스란?


사전적 의미

하나의 시스템을 구성하는 두개의 구성요소 혹은 시스템이 상호작용 할 수 있도록 접속되는 경계 이 경계에서 상호 접속하기 위한 조건, 규약 등을 의미한다.

그림 1

자바에서의 인터페이스

추상메서드와 상수만을 가지며, 기본적으로 추상메서드의 모음을 인터페이스라고 한다. 이 추상메서드는 인터페이스를 상속받은 class가 override 재정의하며, 새로 구축한다. 각 class마다 함수의 내용이 달라지지만 겉으로는 함수의 이름과 반환 타입, 파라미터가 동일하여 동일한 규격으로 보이게 된다. 

인터페이스 정의하는 방법


  1. interface 키워드를 이용하여 정의한다.
  2. 모든 변수는 상수만 가능하며, public static final 상수이름 = 값 으로 정의한다. (생략 가능)
  3. 모든 메서드는 public abstract를 붙여야하며(생략 가능), 몸통 부분은 작성하지 않는다. 이 부분은 인터페이스를 상속받는 class가 재정의 해서 사용한다.
    • 단 static 메서드는 붙여야한다.
public interface PlayingCard {
    public static final int SPADE = 4;
    final int DIMAOND = 3;  // public static final이 생략됨 (멤버변수)
    static int HEART = 2;   // public static final이 생략됨 (멤버변수)
    int CLOVER = 1;         // public static final이 생략됨 (멤버변수)
    
    public abstract String getCardNumber(); // 추상메서드 getCardNumber();
    String getCardKing();   // public abstract가 생략된 추상메서드
} 

인터페이스 구현하는 방법


인터페이스의 추상메서드는 구현부가 존재 하지 않는다. 그렇기에 이 추상메서드를 구현해주는 클래스가 필요하며 이를 구현 클래스라고한다.

구현 class, interface 상속받기

extends가 아닌 implements 키워드를 사용한다.
public interface Animal {
   public void cry();
}

public class Cat implements Animal {
   @Override
   public void cry() {
      System.out.println("야옹");
   }
}

인터페이스는 다중구현도 가능하다.

public interface bird{
   public void eat();
}
public interface fly{
   public void fly();
}
public class inplements bird, fly{
   @Override
   public void eat(){
      ....
   }

   @Override
   public void fly(){
      ....
   }
}

인터페이스 레퍼런스를 통해 구현체를 사용하는 방법


public interface animal{
   public void walk();
}
public interface plus{
   public void abc();
}
public class dog inplements animal, plus {
   @override
   public void walk(){
      dog version...
   }
   @override
   public void abc(){
      dog version...
   }

   public void bark(){...}
}
int main(){
   dog d = new dog();
   d.walk();
   d.bark();

   animal a= new dog();
   a.walk();

   plus b = new brown();
   b.abc();
}
  1. dog 클래스에 dog객채를 담기에 dog의 모든 메서드를 사용할 수 있다.
  2. dog 객체는 animal과 plus 인터페이스를 inplements 했음으로 각 인터페이스 레퍼런스에 담을 수 있다.
  3. 인터페이스 레퍼런스는 각자 가지고 있는 메서드만 사용할 수 있으며, 담겨진 객체에 따라서 내용이 달라진다. 이는 함수이름, 반환타입, 매개변수는 동일하지만 내용만 달라지는 다형성을 제공할 수 있는 여지가 된다.

인터페이스 상속


인터페이스는 인터페이스 끼리 상속받을 수 있으며, 클래스와 달리 다중상속이 가능하다.
interface Movable{
    void move(int x, int y);
}

interface Attackable{
    void attack(Unit u);
}

interface Fightable extends Movable, Attackable { }

Default Method 자바 8


인터페이스는 기능에 대한 선언만 가능하기 때문에, 실제 코드를 구현한 로직은 포함될 수 없다. 하지만 Default Method(디펄트 메소드)는 메소드 선언시에 default를 명시하게 되면 인터페이스 내부에서도 코드가 포함된 메소드를 선언 할 수 있다. 물론 기존 메소드와 동일하게 overriding이 가능하다.

interface MyInterface {
    default void printHello() {
        System.out.println("Hello World");
    }
}

등장배경

만약 어떤 인터페이스를 inplements한 클래스가 많은 사용자에게 사랑을 받고있다고 한다. 하지만 이 인터페이스에 method를 추가해야할 상황이 온다면 인터페이스를 수정한 순간 하위 클래스 또한 수정을 해야한다. 이러한 문제점을 해결하기 위해 default method가 등장하였다.

다중상속 해결하기

인터페이스는 다중상속을 허락하고 있다. 그럼 A와 B 인터페이스에 이름이 동일한 default method가 등장한다면 어떻게 해결해야 할까?

public interface OperateCar {
    default public int startEngine(EncryptedKey key) {
        // Implementation
    }
}
public interface FlyCar {
    default public int startEngine(EncryptedKey key) {
        // Implementation
    }
}

// 직접 어떤 인터페이스의 메소드를 사용할지 기재해줌으로 써 모호성 해결
public class FlyingCar implements OperateCar, FlyCar {
    public int startEngine(EncryptedKey key) {
        FlyCar.super.startEngine(key);
        //OperateCar.super.startEngine(key);
    }
}

인터페이스 static method


상속이 되지 않기에 오버라이딩이 가능한 디펄트 메서드와는 다르게 오버라이딩이 불가능하다.

상속이 되지 않기에 class명.메소드명이 아닌 interface명.메소드명으로 호출한다.

상속이 되지 않기에 같은 이름의 static메소드를 가진 두 개의 메소드에 대한 다중상속 문제가 일어나지 않는다.

간단한 utility성 메소드에 많이 사용한다.

public interface Cal{
    public int Plus(int i,int j);
    //기존에 interface는 추상클래스만 가져서 메서드 구현을 하면 에러가 난다.
    public static int Static(int i,int j){
        return i*j;
    }
}

//구현클래스
public class MyCal implements Cal{
   @override
   public int Plus(int i,int j){
      return i+j;
   }

   //static method override 불가능
   // @override
   // public int Static(int i,int j){
   //    return i*j;
   // }
}

public class MyCalTest{
   public static void main(String[] args){
      Cal hoho = new MyCal();
      
      Cal.Static(3,4);
   }
}

인터페이스의 private 메소드


static, default 메소드를 통해 인터페이스의 내부 메소드지만 public으로 외부에 공개되어있다.

interface를 구현하는 구현 클래스 또는 상속하는 인터페이스는 해당 method를 상속받기 원하지 않지만 강제적으로 상속 받게 된다.

이러한 문제를 해결하기위해 private method 또는 private static method가 생겨났다.

코드의 중복을 피하고 interface의 캡슐화를 유지할 수 있게 되었다.

public interface Cal{
   public int Plus(int i,int j);
    //기존에 interface는 추상클래스만 가져서 메서드 구현을 하면 에러가 난다.

   public static int Static(int i,int j){
        return i*j;
   }

   private default int Default(int i,int j){
        return i*j;
   }
}

//구현클래스
public class MyCal implements Cal{
   @override
   public int Plus(int i,int j){
      return i+j;
   }
   //default 메소드 private이기에 override 불가능
}

public class MyCalTest{
   public static void main(String[] args){
      Cal hoho = new MyCal();
      
      Cal.Static(3,4);
      hoho.Default(5,3);
   }
}

참고


  1. 인터페이스란?
    1. https://velog.io/@foeverna/Java-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EB%9E%80
  2. 인터페이스 정의하는 방법
    1. https://joochang.tistory.com/76
    2. https://freestrokes.tistory.com/77
  3. 인터페이스 구현하는 방법
    1. https://joochang.tistory.com/76
    2. https://freestrokes.tistory.com/77
  4. 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법]
    1. https://wookcode.tistory.com/19?category=979588
    2. https://leegicheol.github.io/whiteship-live-study/whiteship-live-study-08-interface/
  5. 인터페이스 상속
    1. https://debugdaldal.tistory.com/171
  6. Default Method 자바 8
    1. https://siyoon210.tistory.com/95
  7. 인터페이스의 static 메소드, 자바 8
    1. https://dahyeee.tistory.com/entry/JAVA-interface-default-static%EB%A9%94%EC%86%8C%EB%93%9C
    2. https://atoz-develop.tistory.com/entry/JAVA-8-interface-default-%ED%82%A4%EC%9B%8C%EB%93%9C%EC%99%80-static-%EB%A9%94%EC%86%8C%EB%93%9C
  8. 인터페이스의 private 메소드, 자바 9
    1. https://flyburi.com/605





© 2019.04. by salmon2

Powered by theorydb