[Java 무작정 따라하기] 6. 알기 쉽게 설명하는 Java 인터페이스 정리!

 Java 무작정 따라하기 

6. 알기 쉽게 설명하는 Java 인터페이스 정리!

 

  • 인터페이스의 선언 방법을 배워봅니다.
  • 인터페이스의 사용 방법을 배워봅니다.

 

1. Java 인터페이스

 

  • 완벽한 추상 클래스를 인터페이스라고 할 수 있다.
    • 일반 메소드를 포함하는 추상클래스와는 다르게 모든 메소드가 추상 메소드로 이루어져있다.
      • public abstract method
    • 데이터는 클래스 상수만 선언할 수 있다.
      • public static final 자료형 상수명
    • 객체 생성이 불가능하다.
    • 클래스와 마찬가지로 참조 자료형으로 인식된다.
    • 인터페이스의 이름을 지을때는 주로 형용사로 짓는다.
      • Runnable ,  Comparable , Actionable 등

 

2. Java 인터페이스의 정의

 

  • 구현 방법은 클래스 정의와 유사하다.
  • 정의할 때 키워드는 class 대신에 interface 키워드를 사용한다.
    • 완벽한 추상 클래스이긴 하지만 abstract는 생략하는 것이 보통이다.
  • 메소드는 자동으로 public abstract이 붙기 때문에 생략이 가능하다.
    • 수행할 수 있는 기능의 형식만 나열한 것이다.
  • default 메소드와 static 메소드도 선언 가능하다.
    • 선언할 경우 몸체를 구현해야 한다.
    • 자동으로 public이 붙는다.
  • 필드는 자동으로 public static final 이 된다.
    • 클래스 상수만 선언 가능하다.

 

3. Java 인터페이스의 사용

 

  • 추상 클래스와 마찬가지로 자식 클래스에서 상속하여 사용할 수 있다.
    • 인터페이스를 상속받는 자식 클래스는 모든 추상메소드를 구현해 주어야 한다.
  • 의미적으로는 관련이 없으나 기능적으로 유사한 클래스들을 묶어 사용할 때 이용한다.
    • 예시로 대소 비교가 가능한 객체들의 자료형을 묶을 떄 이용할 수 있다.
    • 사각형 클래스, 텔레비젼 클래스, 농구선수 클래스 등 세개의 다른 클래스의 경우
    • 사각형의 크기, 텔레비전의 크기, 농구선수의 키 크기 등 크기 를 비교하는것은 같음.
    • 이럴 경우 크기의 비교에 대한 기능을 인터페이스로 구현할 수 있다.
  • 인터페이스를 상속받아 자식 인터페이스를 정의할 수 있따.
    • 이 경우를 인터페이스의 확장 또는 인터페이스를 확장한다 라고 얘기한다.

 

4. Java 인터페이스 상속 및 구현

 

  • 인터페이스는 여러 인터페이스를 상속받는 다중 상속이 가능하다.
  • 추상클래스는 하나의 클래스를 상속받는 단일 상속만 가능하다.
  • 상속
    • 자식 인터페이스가 부모 인터페이스를 상속받을 경우에 extends 키워드를 사용한다.
    • 예) interface EX extends EXInterface {  }
  • 구현( 또는 상속이라고도 한다)
    • 자식 클래스가 부모 인터페이스를 상속 받는 경우에
    • 자식 클래스는 부모인터페이스가 나열한 모든 기능을 구현해야 하며 implements 키워드를 사용.
    • 예) class RunnableCar implements Runnable{  }
interface Movable{
	// 모든 메소드 앞에는
    // public abstract 가 자동할당.
    // 비어있어도 생략된 것이므로 알고있자
	void moveUp();
    void moveDown();
    void moveLeft();
    void moveRight();
}

public class MovableTest{
	public static void main(String[] args){
    	Movable m = new MovablePoint(5,5);
        System.out.print(m);
        // Point at (5,5)
        m.moveDown();
        System.out.print(m);
        // Point at (5,4)
        m.moveLeft();
        System.out.print(m);
        // Point at (4,4)
    }
}

class MovablePoint implements Movable{
	private int x,y;
    public MovablePoint(int x,int y){
    	this.x = x;
        this.y = y;
    }
    
    public String toString(){
    	return "point at (" + x + "," + Y + ")";
    }
    
    public void moveUp(){ y++; }
    public void moveDown(){ y--; }
    public void moveRight(){ x++; }
    public void moveLeft(){ x--; }
}

 

5. 인터페이스 디폴트 메소드

 

  • 인터페이스에서 선언되는 메소드에 기본 구현을 넣을 수는 있다.
    • 자식 클래스에서 그대로 사용하거나 몸체를 재정의 해 줄수도 있다.
  • default 키워드를 사용하여 몸체를 구현해 준다.
  • 인터페이스에 나열된 기능을 확장 할 때, 기존 코드의 수정을 피하고 싶을 떄 주로 이용된다.
    • 추상 메소드가 추가된다면 기존 인터페이스를 구현한 클래스를 수정해 줘야 하는데
    • 이를 방지하고자 할 때 주로 사용한다.
interface Dolt{
	void doSomething(); // public abstract 이 생략
    int doSomethingElse(Strings); // public abstract 이 생략
    
    // 이 메소드를 새로 추가하면
    // 원래는 몸체를 갖는 메소드를 구현하면 안되는데
    // 귀찮으면 하지 말라! 하는 식으로 메소드를 구현할 수 있는데
    // 그때는 무조건 default 라는 키워드를 이용한다.
    
    // 기존에 있던 인터페이스에서 추상메소드 하나를 추가하면
    // 상속받은 자식 클래스에서 전부 재정의를 해줘야하는 불필요성이 생기고
    // 이를 피하기 위해 최근에 나온 기술이 디폴트 메소드.
    default boolean didltWork(int i, String S){
    }
}

 

6. 추상클래스,인터페이스,클래스의 형변환

 

  • 인터페이스, 클래스 모두 사용자가 정의한 정의형태의 자료형이다.
  • extends 및 implements에 따라 상-하위 자료형 관계가 설정된다.
  • 상위 유형의 변수는 하위 객체의 참조값을 가질 수 있다.
  • 위 유형의 변수가 가리키는 객체의 실제 유형에 따라
  • 수행되는 메소드가 결정되는데 이를 동적 바인딩 이라고도 한다.
    • 변수의 선언 유형으로 지정하지 않는다.
    • SpuerClass super = new SubClass();
    • super.method(); // SubClass 에서 찾는다.

 

내용이 유익하셨다면 구독 및 좋아요 클릭 부탁드려요 :)

오늘 하루도 즐거운 하루 보내세요!