본문 바로가기

개발공부/JAVA

자바스터디 8주차 feat.백기선님 (인터페이스)

Interface란?

: 서로 다른 하드웨어 장치들이 상호 접속하여 데이터를 주고 받을 수 있는 규격을 의미( 밑그림만 그려져 있는 설계도 )

: 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다.

: 추상 메소드, 상수로만 구성 (메소드는 다 public선언(생략가능) / 상수는 다 public static final(생략가능))

: 다중상속 지원

: 객체 생성 안됨 (new 선언 불가능)

: 상속 될수 있다.

- extends(상속)

- implements(구현)

- 레퍼런스 변수로 사용가능

Interface 사용이유?

- 개발 시간을 단축 시킬 수 있다. (메서드 내용과 관계없이 선언부만 알면되며, 동시에 개발하기 쉽다)

- 표준화가 가능하다.(일관되고 정형화된 프로그램의 개발이 가능하다.)- 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다. (하나의 인터페이스를 공통적으로 구현하게 함으로써 관계 맺어 줄 수 있음)- 독립적인 프로그래밍이 가능하다. (선언과 구현을 분리시킬 수 있다.)

 

 

 

*****자바 버전에 따라 인터페이스에서 구현할 수 있는 것들이 다르다

java8 이전 java8 java9
- Constant variables (상수)
- Abstract methods (추상메소드)

- Constant variables
- Abstract methods
- Default methods (기본 메소드)
- Static methods (정적 메소드)
- Constant variables
- Abstract methods
- Default methods
- Static methods
- Private methods
- Private Static methdos 

인터페이스 정의하는 방법

interface 인터페이스이름{ 

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

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

}

 

인터페이스 예시

interface PlayingCard{

    public static final int SPADE = 4;
    final int DIAMOND = 3; //public static final int DIAMOND = 3;
    static int HEART = 2; //public static final int HEART = 2;
    int CLOBER = 1; // public static final int CLOBER = 1;
    
    public abstract String getCardNuber();
    String getCardKind(); //public abstract String getCardKind();와 동일
}

//자동 적용

: 추상 메소드, 상수로만 구성

메소드는 다 public선언(생략가능) 

상수는 다 public static final(생략가능)


인터페이스 구현하는 방법

 

- 그 자체로는 인스턴스를 생성할 수 없기 때문에 implements를 사용하여 구현해야한다.

 

class 클래스이름 implements 인터페이스이름{

      // 인터페이스에 정의된 추상메서드를 구현해야한다.

}

 

인터페이스 구현 예시

class Playcard implements PlayingCard{

    public String getCardNumber(){
    // 메소드 구현
    }
    
    public String getCardkind(){
    // 메소드 구현
    }
}

 

- 만약 구현하는 인터페이스의 메서드 중 일부만 구현한다면 추상클래스로 선언되어야한다.

abstract class Playcard implements PlayingCard{

    public String getCardNumber(){
    // 메소드 구현
    }

}

 

- 상속과 구현을 동시에 할 수 있다. (extends, implements 동시 사용 가능)


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

: 인터페이스를 구현한 클래스를 인스턴스화하여 사용할 수 있다.

public class Main(){
	public static void main(String[] args){
		Animal sheep = new Sheep();
		Animal dog = new Dog();
		
        // Animal 인터페이스에 있는 cry메소드 호출 가능 
		sheep.cry();
		dog.cry();
        
        //sheep()클래스에있는 run()메소드는
         sheep.run(); // X 안됨 
         ((Sheep)sheep).run(); // O 형변환 해줘야함

	}
}

 


인터페이스 상속

interface Movable {
	void move (int x, int y);
}

interface Attackable {
	void attack(Unit u) ;
}

interface Fightable extends Movable , Attackable { } //상속받기

- 클래스의 상속과 마찬가지로 자손 인터페이스는 조상 인터페이스에 정의된 멤버를 모두 상속받는다.

- 그래서 Fightable자체에는 정의된  멤버가 하나도 없지만 상속받은 메소드 2개를 멤버로 갖게된다.


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

: java 8에서는 인터페이스에 기본 구현을 정의할 수 있게되었다.

기본 구현이 제공되는 메서드는 구현 클래스에서 구현하지 않아도 컴파일이 가능하다.

기본 메서드는 기존의 인터페이스에 메서드를 추가해야하는 경우에 아주 유용하다. 인터페이스에 메서드를 추가하면 해당 인터페이스를 구현하는 모든 클래스에서 추가된 메서드를 구현해야하기 때문에 문제가 생긴다. 구현 클래스가 9개라면 인터페이스까지 10개의 파일을 수정해야 한다. 하지만 추가되는 메서드의 구현이 대부분 동일하다면 인터페이스에 기본적인 메서드 구현을 정의하고 유별난 클래스만 수정해주면 된다. 

 

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

: 자바8 부터 인터페이스에 정적 메소드를 추가할 수 있게 되었다.

 

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

: 자바9 부터 인터페이스에 private 메소드를 추가할 수 있게 되었다.


github.com/whiteship/live-study/issues/8

 

8주자 과제: 인터페이스 · Issue #8 · whiteship/live-study

목표 자바의 인터페이스에 대해 학습하세요. 학습할 것 (필수) 인터페이스 정의하는 방법 인터페이스 구현하는 방법 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법 인터페이스 상속 인터

github.com


참조: 자바의 정석
http://happinessoncode.com/2017/04/19/java8-changes-in-interface/
https://jamcode.tistory.com/66
https://dev-coco.tistory.com/13