목표
자바의 인터페이스 학습하기
학습할 것
인터페이스 정의하는 방법
인터페이스 구현하는 방법
인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
인터페이스 상속
인터페이스의 기본 메소드 (Default Method), 자바 8
인터페이스의 static 메소드, 자바 8
인터페이스의 private 메소드, 자바 9
- 인터페이스 정의하는 방법
인터페이스를 작성하는 것은 클래스를 작성하는 것과 같다. 키워드로 interface를 사용한다.
interface 인터페이스_명 {
public static final 타입 상수명 = 값;
public abstract 메서드명(매개변수);
}
인터페이스 멤버들은 제약사항이 있다.
- 모든 멤버 변수는 public static final 이어야 하며, 이를 생략할 수 있다.
- 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
- 인터페이스 vs 추상 클래스
- 추상 클래스인터페이스
일반 메소드 포함 가능 모든 메서드는 추상 메서드 다중상속 불가능 다중상속 가능 상수, 변수 필드 포함가능 상수필드만 포함가능
- 인터페이스 구현하는 방법
인터페이스 그 자체로는 인스턴스를 생성할 수 없으며, 추상 클래스가 상속을 통해 추상메서드를 완성하는 것처럼 인터페이스를 구현해주는 클래스를 생성하여 추상 메소드를 구현하여 사용할 수 있다.
public class Hyundai implements Car {
@Override
public void move(){
// 구현코드
}
@Override
public void stop(){
// 구현코드
}
}
- 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
인터페이스 타입의 참조 변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있으며, 인터페이스 타입으로의 형변환도 가능하다.
interface Car {
// 소스코드
}
class Hyundai implements Car {
// 구현코드
}
class Kia implements Car {
// 구현코드
}
class Tesla implements Car {
// 구현코드
}
public class Main {
public static void main(String[] args) {
Car Hyundai = new Hyundai(); // 인터페이스 타입
Car Kia = new Kia();
Car Tesla = new Tesla();
Car[] cars = new Car[3];
cars[0] = hyundai;
cars[1] = kia;
cars[2] = tesla;
}
}
이를 이용하여 서버 쪽의 변경 가능성이 있는 코드가 있더라도 해당 코드를 인터페이스 타입으로 선언하면 클라이언트의 코드에는 영향을 주지 않고 서버 쪽에서 구현체만 바꿔주면 되기 때문에 효율적으로 프로그램을 작성할 수 있다.
- 인터페이스 상속 인터페이스 간의 상속 인터페이스끼리 상속을 받을 수 있다. 부모클래스와 자식클래스 간의 상속과 마찬가지로 extends키워드를 사용한다.
- 클래스 간의 상속 인터페이스를 상속한 클래스는 보통 "인터페이스를 구현한 클래스"라는 표현을 사용한다. implements키워드를 사용하며, 다중상속이 가능하다.
- 인터페이스의 기본 메소드, 자바8
- interface에서도 메서드 구현이 가능하다.
- 참조변수로 함수를 호출할 수 있다.
- implements한 클래스에서 재정의가 가능하다
- 인터페이스 내의 메서드는 반환형과 메서드 이름만 선언하고 바디부분에 기재하는 로직은 생략한다. 인터페이스를 구현할 클래스(구현체)에서 로직을 구현하기 때문이다. 하지만 인터페이스에 추가적으로 구현해야 할 메서드가 생기면, 이 인터페이스에 의존하고 있는 모든 구현체들을 변경해야 하는 문제점이 발생하게 된다. 이 것이 하위호환성 문제인데 이 것을 보완하기 위해 인터페이스 내에서도 로직을 만드는 default method가 자바 8부터 지원된다. 인터페이스의 default method는 default 라는 키워드를 명시해야 한다.
- 인터페이스의 static 메서드, 자바 8
- 자바 8 부터 인터페이스에 static메서드 추가가 가능하다.
- 클래스에서와 동일한 방법으로 사용 가능하며, 기본적으로 public으로 간주한다.
- Static 메서드 이므로 상속이 불가능하다.
- 인터페이스의 private 메서드, 자바 9
- 자바 8에서 인터페이스에서 default 메서드 사용이 가능해졌기 때문에 자바 9에서 로직 분리를 위한 private 메서드를 사용할 수 있다.
- Private 이기 때문에 인터페이스에서 구현이 되어 있어야하고 abstract 메서드 일 수 없다.
- private 이기 때문에 구현체에서 구현할 수 없고 자식 인터페이스에서도 상속이 불가능하다.
- Static 메서드도 private가 가능하다.
'Programming > Java' 카테고리의 다른 글
[JAVA STUDY] 9주차 : 예외처리 (0) | 2021.11.29 |
---|---|
[JAVA STUDY] 7주차 : 패키지 (0) | 2021.11.15 |
[JAVA] 매개변수의 다형성 (0) | 2021.11.09 |
[JAVA] 참조변수의 형변환, Instanceof 연산자 (0) | 2021.11.09 |
[JAVA] 캡슐화, 다형성 (0) | 2021.11.08 |