♨학습내용
☞ 인터페이스 구현하는 방법
☞ 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
☞ 인터페이스 상속
☞ 인터페이스의 기본 메서드 (Default Method), 자바 8
☞ 인터페이스의 static 메서드, 자바 8
☞ 인터페이스의 private 메서드, 자바 9
- 인터페이스 구현하는 방법
- 인터페이스란?
- 자바에서 인터페이스는 객체의 사용 방법을 정의한 타입이다.
- 인터페이스는 객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다.
- 인터페이스의 역할
- 인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다.
- 개발 코드가 인터페이스의 메서드를 호출하면 인터페이스는 객체의 메서드를 호출시킨다.
- 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메서드만 알고 있으면 된다.
- 인터페이스를 정의하는 방법
- 인터페이스는 "~java" 형태의 소스 파일로 작성되고 컴파일러를 통해 "~.class" 형태로 컴파일되기 때문에 물리적 형태는 클래스와 동일하다.
- 그렇지만 소스를 작성할 때 선언하는 방법이 다르다.
인터페이스 선언
- 인터페이스의 선언은 class 대신 interface를 사용한다.
[public] interface 인터페이스명 {...}
- 인터페이스 이름은 클래스 이름을 작성하는 방법과 동일하다.
- public 접근제한자는 다른 패키지에서도 인터페이스를 사용할 수 있도록 해준다.
- 클래스는 필드, 생성자, 메서드를 구성 멤버로 가지는데 비해, 인터페이스는 상수와 메서드만을 구성 멤버로 가진다.
- 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.
- 상수 필드 선언
- 인터페이스는 객체 사용 설명서 이므로 런타임 시 데이터를 저장할 수 있는 필드를 선언할 수 없다.
- 대신 상수 필드만 선언할 수 있다.
- 상수는 public static final로 선언합니다.
- 인터페이스는 선언된 필드는 모두 public static final의 특성을 갖는다.
- public, static, final을 생략하더라도 자동적으로 컴파일 과정에서 붙게된다.
- 상수는 대문자로 작성하되, 서로 다른 단어로 구성되어 있을 경우 언더바(_)로 연결하는 것이 관례이다.
- 추상 메서드 선언
- 인터페이스를 통해 호출된 메서드는 최종적으로 객체에서 실행된다.
- 그렇기 때문에 메서드는 실행 블록이 필요없는 추상 메서드로 선언한다.
- 디폴트 메서드 선언
- 디폴트 메서드는 자바8에서 추가된 인터페이스의 새로운 멤버이다.
- 형태는 클래스의 인스턴스 메서드와 동일한데, default 키워드가 리턴 타입 앞에 붙는다.
- 디폴트 메서드는 public 특성을 갖기 때문에 생략하더라도 자동적으로 컴파일 과정에서 붙게된다.
- 정적 메서드 선언
- 정적 메서드는 자바8에서 추가된 인터페이스의 새로운 멤버이다.
- 형태는 클래스의 정적 메서드와 완전 동일하다.
- 정적 메서드는 public 특성을 갖기 때문에 생략하더라도 자동적으로 컴파일 과정에서 붙게된다.
- 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
- 자바는 인터페이스를 통해 다형성을 이용할 수 있다.
- A라는 클래스에서 B라는 인터페이스를 구현화한 객체라면, B 타입의 참조변수에 A 클래스의 객체를 참조할 수 있다.
interface B {
void run();
}
class A implements B {
@Override
public void run() {
System.out.println("running..");
}
}
class Main {
public static void main(String[] args) {
B parent = new A(); // B 라는 인터페이스 타입에 A 객체를 삽입
parent.run();
}
}
- 인터페이스 상속
- 인터페이스는 인터페이스로부터만 상속을 받을 수 있다.
- 인터페이스는 추상화 클래스와 다르게 다중 상속이 가능하다.
public class Car implements Sedan, SUV, SmallCar {
@Override
public void ride() { // call method in Sedan interface
}
@Override
public void ride1() { // call method in SUV interface
}
@Override
public void ride2() { // call method in SmallCar interface
}
}
- 하위 인터페이스를 구현을 한다면, 해당 클래스는 상위 인터페이스 메서드까지 모두 구현해야한다.
- 인터페이스의 기본 메서드 (Default Method), 자바 8
- 자바 8부터 interface에 Default Method를 선언할 수 있게 되었다.
- Default Method는 클래스 상속 설계 중 비효율적이었던 부분을 고칠 수 있게 되었다.
- defalut 키워드를 앞에 붙여서 선언하며, 일반 메서드처럼 구현부가 있어야 한다.
public interface A {
default void print() {
System.out.println("default method!");
}
}
- 인터페이스의 static 메서드, 자바 8
- private 접근 지시자를 반드시 사용해야 한다.
- private 과 abstract 키워드를 동시에 사용할 수 없다.
- 동시에 사용 시 컴파일 에러가 발생한다.
- private methods
- private method는 해당 클래스에서만 사용 가능하다.
- 결국 하위 클래스가 상속할 수 없고, 이 메서드를 재정의(오버라이딩) 할 수 없다는 의미이기 때문에 추상 메서드가 될 수 없다.
- 즉, 구현이 되어 있어야만 한다.
- abstract methods
- 추상 메서드는 구현부가 없는 메서드라는 의미이다.
- 즉, 하위 클래스가 상속해서 이 추상 메서드를 구현해야한다.
private [static] 리턴타입 메서드명(매개변수, ...) { ... }
- private method는 interface 내에서만 사용할 수 있다.
- private static method는 static & non-static 인터페이스 메서드 안에서 사용할 수 있다.
- private non-static method는 private static method 내에서 사용할 수 없다.
- 인터페이스의 private 메서드, 자바 9
- 자바9 부터 인터페이스에 private 메서드와 private static 메서드가 추가되었다.
- 추가된 배경
- 여전히 자바8 에서의 기본 메서드와 static 메서드가 있음에도 불편한 점이 있었고,
- 특정 기능만 수행하는 내부 메서드인데, 외부에 공개되는 public method로 만들어야 했기 때문이다.
- 코드의 중복을 줄이고 interface에 대한 캡슐화를 유지하는 것이 가능해졌다.
- private 메서드 규칙
- private 메서드는 구현부를 가져야만 한다.
- 오직 인터페이스 내부에서만 사용할 수 있다.
- private static 메서드는 다른 static메서드 와 static이 아닌 메서드에서도 사용이 가능하다.
- static이 아닌 private 메서드는 다른 private static에서는 사용될 수 없다.
'Study > Java_study' 카테고리의 다른 글
Java_study_10 (멀티쓰레드 프로그래밍) (0) | 2021.08.30 |
---|---|
Java_study_9 (예외처리) (0) | 2021.08.23 |
Java_study_7 (패키지) (0) | 2021.08.11 |
Java_study_6 (상속) (0) | 2021.08.09 |
Java_study_5 (클래스) (0) | 2021.08.04 |