본문 바로가기

[STUDY] 자바_whiteship :)

8주자 과제: 인터페이스

목표

자바의 인터페이스에 대해 학습하세요.

학습할 것 (필수)

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

 

 

인터페이스(Interface)?

추상클래스, 클래스처럼 메서드를 갖지만 추상클래스보다 훨씬 추상적이라서 추상메서드와 상수만을 멤버로 가질수 있다.

 

 

인터페이스 정의하는 방법

interface 인터페이스이름 {
	public static final 타입 상수이름 = 값; 		 //상수선언
    public abstract 메서드이름(매개변수목록);		  //메서드선언
}
1
2
3
4
5
6
7
8
9
10
11
package com.company;
 
public interface Seven {
    public static final String sevenStr = "7주차";
    public abstract void sevenMethod();
 
    //생략된 제어자는 컴파일시 컴파일러가 자동으로 추가해준다.
    String sevenStr2 = "";       //public static final 생략가능
    void sevenMethod2();    //public abstract 생략가능
}
 
cs

 

인터페이스 구현하는 방법 

인터페이스를 구현하기 위해선 class에서 implements 받아서 메서드를 구현해야 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.company;
 
public interface Seven {
    public static final String sevenStr = "7주차";
    public abstract void sevenMethod();
 
    //생략된 제어자는 컴파일시 컴파일러가 자동으로 추가해준다.
    String sevenStr2 = "";       //public static final 생략가능
    void sevenMethod2();    //public abstract 생략가능
}
 
 
public class javaStudy implements Seven {
 
    public void sevenMethod(){
        //메서드구현
    }
 
 
    public void sevenMethod2(){
        //메서드구현
    }
}
cs

 

 

 

 

 

인터페이스 상속

 

인터페이스는 인터페이스로부터만 상속받을수 있으며, 여러개의 인터페이스로부터 상속받는것이 가능하다(다중상속)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.company;
 
public interface Seven {
    public static final String sevenStr = "7주차";
    public abstract void sevenMethod();
 
    //생략된 제어자는 컴파일시 컴파일러가 자동으로 추가해준다.
    String sevenStr2 = "";       //public static final 생략가능
    void sevenMethod2();    //public abstract 생략가능
}
 
public interface Eight {
    void eightMethod();
}
 
public interface JavaStudy extends Seven, Eight{
    //명시되진 않지만 Seven, Eight 인터페이스의 멤버를 모두 상속받음
}
 
public class Main implements  JavaStudy{
 
    public static void main(String[] args) {
    // write your code here
        System.out.println("TEST MAIN");
    }
 
    @Override
    public void eightMethod() {
 
    }
 
    @Override
    public void sevenMethod() {
 
    }
 
    @Override
    public void sevenMethod2() {
 
    }
}
 
cs

 

 

 

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

 

인터페이스에선 메서드의 구현이불가능 하다고 했으니, java8부터 default 키워드로 메서드의 구현이 가능하다.

인터페이스를 구현한 모든 클래스에서 메서드를 정의해야하는 번거로움을 줄일 수 있다. 

위의 autoDrive 메서드는 클래스에섯 변경할 경우에만 구현하면 된다.

클래스에서 구현한 2개이상의 인터페이스에 동일한 메서드명으로 default메서드를 정의해놓은경우,

어느 인터페의 메서드를 실행해야 하는지 알수없으니까 충돌이 발생한다.

(default 메서드가 아니라도 동일한 메서드명이 있는경우는 충돌발생)

출동을 피하는 방법

1. 클래스에서 충돌되는 메서드 구현

2. 인터페이스상속을 통해서 인터페이스 기본메서드 구현

 

참고사이트: happinessoncode.com/2017/04/19/java8-changes-in-interface/


인터페이스의 static 메소드(정적메소드), 자바 8

 

자바8부터 인터페이스에 static메서드도 정의가 가능하다. static메서드는 인터페이스만으로도 호출이 가능하다.

ex) java8 Stream 인터페이스

 

Stream 인터페이스의 of 메서드

static메서드로 return값이 정의되어있다.

 

Stream.of 로 해당메서드 호출가능

 

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

자바9부터는 인터페이스에서 private메서드도 정의 가능하다.

private메서드는 메서드 body가 있고, 구현클래스와 인터페이스가 상속되지 않는다. 인터페이스에서 다른 메서드를 호출 할 수 있다.

private는 private, abstract,defualt,static메서드를 호출할수 있고, private static메서드는 ststic, static private메서드만 호출 할 수 있다. 

 

 

참고사이트:flyburi.com/605