인터페이스(interface)
[1] 인터페이스란?
인터페이스는 일종의 추상클래스이다. 추상클래스처럼 추상메서드를 갖지만 추상화 정도가 높아 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다.
다른 클래스를 작성하는데 도움을 줄 목적으로 사용한다.
[2] 인터페이스의 작성
클래스를 작성하는것과 같다. 키워드로 class 대신 interface를 사용하는 것만 다르다.
인터페이스에도 접근제어자로 public 또는 default를 사용할 수 있다.
interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수목록);
}
일반적인 클래스 멤버들과 달리 인터페이스의 멤버들은 제약사항이 있다.
- 모든 멤버변수는 public static final 이어야하며ㅡ 이를 생략할 수 있다.
- 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
단, static메서드와 디폴트 메서드는 예외(jdk 1.8부터)
인터페이스에 정의된 모든 멤버에 예외없이 적용되는 사항이기 때문에 제어자를 생략할 수 있는 것이며, 편의상 생략하는 경우가 많다. 생략된 제어자는 컴파일 시에 컴파일러가 자동적으로 추가해준다.
[3] 인터페이스의 상속
인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와는 달리 다중 상속(여러개의 인터페이스 상속)이 가능하다.
interface Movable{
void move(int x, int y);
}
interface Attackable{
void attack(Unit u));
}
interface Fightable extends Movable, Attackable {
}
[4] 인터페이스의 구현
구현한다는 의미의 키워드 'implements' 를 사용한다.
class 클래스이름 implements 인터페이스이름{
}
class Fighter implements Fightable{
public void move(int x, int y) {}
public void attack(Unit u) {}
}
만일 구현하는 인터페이스의 메서드 중 일부만 구현한다면, abstract를 붙여서 추상클래스로 선언해야한다.
그리고 상속과 구현을 동시에 할수도 있다.
abstract class Fighter implements Fightable{
public void move(int x, int y) {}
}
class Figther extends Unit implements Fightable{
public void move(int x, int y) {}
public void attack(Unit u) {}
}
[5] 인터페이스의 장점
1. 개발시간을 단축시킬 수 있다.
2. 표준화가 가능하다
3. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
4. 독립적인 프로그래밍이 가능하다.
[6] 디폴트 메서드와 static 메서드
디폴트 메서드(Default Method)
public interface User {
// 디폴트 메서드(Default Method)
[public] default 리턴타입 메서드이름(매개변수, ...) { ... }
// 예시
public default void setStatus(Status status) {
if(status == Status.ACTIVE) {
System.out.println("사용자가 활성화 되었습니다");
return;
}
System.out.println("사용자가 비활성화 되었습니다");
}
}
- Java 8에서 추가된 인터페이스의 멤버입니다.
- 클래스의 인스턴스 메서드와 동일합니다. 즉, 인스턴스 메서드입니다. 다만 인터페이스에서 선언할 때, 리턴 타입 앞에 default 키워드가 붙습니다.
- [public]은 명시적으로 사용하지 않아도, Compile Time에 자동 선언됩니다.
- 디폴트 메서드는 나중에 인터페이스를 구현한 구현 클래스에 인스턴스 메서드로 추가됩니다.
- 재정의(Override)를 통해서 구현 클래스에서 재정의된 인스턴스 메서드로 사용할 수 있습니다.
정적 메서드(Static Method)
public interface User {
// 정적 메서드(Static Method)
[public] static 리턴타입 메서드이름(매개변수, ...) { ... }
// 예시
public static void printFirstName() {
System.out.println("나의 이름은 " + firstName + "입니다.");
}
}
- Java 8에서 추가된 인터페이스의 멤버입니다.
- 선언 형식은 클래스 정적 메서드와 완전 동일합니다.
- [public]은 명시적으로 사용하지 않아도, Compile Time에 자동으로 선언됩니다.
- 인터페이스의 정적 메서드도 클래스의 정적 메서드와 똑같은 방식으로 사용이 가능합니다.
'JAVA > 자바의정석' 카테고리의 다른 글
자바(JAVA) - 지네릭스(Generics) (0) | 2022.01.15 |
---|---|
객체지향 프로그래밍 II (6) - 내부 클래스 (0) | 2022.01.11 |
객체지향 프로그래밍 II (4) - 다형성 (0) | 2022.01.11 |
자바(JAVA) : 객체지향 프로그래밍 II (3) - 패키지, 제어자 (0) | 2022.01.10 |
자바(JAVA) : 객체지향 프로그래밍 II (2) - 오버라이딩 (0) | 2022.01.10 |