티스토리 뷰
- 인터페이스 정의하는 방법
- 인터페이스 구현하는 방법
- 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
- 인터페이스 상속
- 인터페이스의 기본 메소드 (Default Method), 자바 8
- 인터페이스의 static 메소드, 자바 8
- 인터페이스의 private 메소드, 자바 9
인터페이스(interface)
: 인터페이스는 어떤 메소드를 제공하는지 미리 알려주어 해당 기능을 명시적으로 알려주는 역할을 한다.
(public, default) interface 인터페이스명 {
(public)(abstract) 메소드();
(public)(static)(final) 타입 상수명 : value;
}
인터페이스 구현 (간단하게 뒤에 더욱 자세하게 설명)
- 인터페이스를 구현하기 위해서는 class에 implements 키워드로 구현한다.
- 인터페이스는 다중 구현이 가능하다.
- 인터페이스를 추상클래스의 하나의 미완성된 집합으로 봤을 때, 완성을 시키는 과정을 구현으로 볼 수 있다.
class 클래스명 implements 인터페이스1, 인터페이스2 ... {
인터페이스 메소드 재정의
}
인터페이스의 특징
- 인터페이스는 추상화로 이루어져 만들어진다. -> 추상메소드, 상수로 이루어진다. (Java 8 이전)
(Java 8 이후로는 default method, static method 가 추가되었다. ==> 추가된 이유를 차차 알아가보자!)
public interface 인터페이스명 {
타입 상수명 = value; //상수 (절대적)
//구현하는 클래스에서 값을 바꿀 수 없고, 반드시 해당 상수의 value를 사용하라.
타입 메소드명(매개변수) {}; //추상 메소드(강제적)
//재정의하여 사용하라.
default 타입 메소드명(매개변수) {}; // 디폴트 메소드 (선택적)
//인터페이스에서 제공하지만, 기능이 원치 않는다면 재정의하여 사용하라.
static 타입 메소드명(매개변수) {}; // 정적 메소드 (절대적)
//인터페이스에서 제공하는 것을 반드시 사용하라!
}
- 인터페이스의 멤버는 public 으로 이루어져 있으며, public, static, final, abstract 는 생략이 가능하다.
(생략시, JVM이 컴파일 과정에서 생성하여 준다.)
public interface Ex {
int number1 = 1; // public static final 접근제어자 생략
public static final int number2 = 2;
void Method1(); //abstract, public 예약어 생략가능
public void Method2();
static void Method3() {} // 구현부 있어야함
default void Method4() {} // 구현부 있어야함
}
- 인터페이스는 인스턴스 생성이 안된다.
: 추상클래스와 같이 인터페이스또한 인스턴스를 생성할 수 없다. 상속과 구현을 통해서 인스턴스를 생성하여 해당 인터페이스의 상수, 추상메소드를 호출하여 사용할 수 있다.
public class ExTest implements Ex{
public static void main(String[] args) {
Ex ex = new Ex(); // 에러! 인스턴스화 할 수 없음!!
ExTest ex1 = new ExTest();
Ex ex2 = new ExTest(); // 업캐스팅하여 사용 가능.
ex1.run();
ex1.pass();
ex1.shoot();
}
@Override
public void run() {
System.out.println("뜀");
}
@Override
public void pass() {
System.out.println("패스");
}
@Override
public void shoot() {
System.out.println("슛");
}
}
인터페이스 vs 추상클래스
(참조. www.notion.so/Java-Study-1-d86030c0fbb946e3ad9764ab1bf15330)
인터페이스가 추상메소드와 상수로 이루어져 있다고 했다.(java 8 이후로는 default, static 이 있지만)
그렇다면 추상메소드를 갖는 추상클래스를 사용하지 왜? 인터페이스를 사용할까? 둘의 차이점을 알아보자.
#의미 :
추상클래스는 "is-a : ~는 ~이다" 의 개념이다.
인터페이스는 "has-a : ~는 ~를 할 수 있다." 의 개념이다.
ex. SSON은 사람 Person 이면서 코딩(Developable)을 할 수 있다.
-class SSON extends Person implements Developable
#특징
- 추상클래스는 추상메소드와 일반메소드 모두를 갖지만, 인터페이스는 상수와 추상메소드만을 갖는다.
(인터페이스는 메소드 기능을 구현할 수 없다.)
- 인터페이스의 상수는 "public static final"로 선언되고 메소드는 "public abstract" 로 선언된다. (둘 다 생략이 가능)
#결론
- 그렇다면 인터페이스를 사용하는 이유는 무엇일까?
- 개발 기간을 단축 시킬 수 있다.
- 클래스간 결합도를 낮출 수 있다.
- 표준화가 가능하다.인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
#인터페이스의 상속
- 서브 인터페이스는 슈퍼인터페이스의 메소드를 모두 구현해야 한다.
- 인터페이스 레퍼런스는 인터페이스를 구현한 클래스의 인스턴스를 가리킨다.
( 인터페이스에 선언된 메소드와 클래스의 메소드만 호출하여 사용할 수 있다.)
- 인터페이스는 다중 상속이 가능하다고 하였다. 하지만 안되는 경우를 살펴보자.
public interface Ex1 {
public void xxx();
}
public interface Ex2 {
public void xxx();
void yyy();
}
public interface Ex3 {
public int xxx(); // 리턴값이 다른 메소드
void yyy();
}
public interface Test1 extends Ex1, Ex2{
void zzz();
}
public interface Test2 extends Ex1, Ex3{ // ==> 에러!!
void zzz();
}
인터페이스 다중 상속시 상속하는 각각의 인터페이스에 리턴값만 다른 메소드가 있다면 상속받은 인터페이스에서 어떤 메소드를 사용받냐에 따라 달라지기에 해당의 경우 다중 상속을 받을 수 없다.
#두 인터페이스의 추상 메소드가 같은 경우.
- 중복되는 인터페이스의 추상메소드를 재정의 하여 사용한다.
public interface Join1 {
default void join() {
System.out.println("Join1");
};
}
public interface Join2 {
default void join() {
System.out.println("Join2");
};
}
public class Group implements Join1, Join2{
@Override
public void join() { //===> 두 인터페이스의 join 메소드를 재정의 하여야 한다.
Join1.super.join();
Join2.super.join();
}
}
위의 인터페이스의 메소드들이 default 메소드 이므로 super. 키워드로 접근하여 재정의 해야한다.
# static 메소드의 override?? ==> static 메소드는 재정의가 안된다.
public interface Static1 {
static void join() {
System.out.println("static 메소드");
}
}
public interface Static2 extends Static1 {
default void join() {
System.out.println("default 메소드 ==> 재정의 되지 않음");
}
default void exit() {
System.out.println("default exit 메소드");
}
}
'개인공부 > 백기선 선장 JAVA Study' 카테고리의 다른 글
class - 6 (상속) (0) | 2021.05.03 |
---|---|
class - 5 (클래스) (0) | 2021.04.27 |