1. 인터페이스란?
인터페이스란 추상 메소드로만 구성되어있는 것.
동일한 목적으로 동일한 기능만을 수행하게끔 하는 기능이다.
이는 자바의 다형성을 극대화하여 개발코드의 수정을 줄이고 프로그램 유지 보수성을 높이는 방법이다.
기타를 만들어내는 프로그램을 제작하려 한다.
기타를 만들 때 사용되는 헤더, 넥, 바디에 대한 부분들은 전체적인 모양과 구성은 다르더라도 꼭 필요한 구성품이다.
만약 기타 제조사에 납품을 요청하는 업체가 펜더에서 스윙으로 바뀌었다고 해보자.
그리고 더 만약, 펜더와 스윙이 공통 규격의 헤더, 넥, 바디 사이즈를 사용한다고 가정해보자.
하지만 우리 프로그램은 펜더만을 위한 프로그램이기에 스윙을 만들기 위해선 프로그램을 싹 갈아엎어야한다.
만약 이 프로그램이 펜더만을 위한 프로그램이 아니라 기타 공통 규격에 맞춘 프로그램이었다면 문제될 것이 많지 않았을 것이다.
그래서 자바에서는 동일한 기능을 구현해내기 위한 인터페이스를 만들고 사용하는 것이다.
즉, 인터페이스는 동일한 기능을 가진 메서드, 또는 고정된 상수값을 제공해주는 기능 그 이상의 것을 하지 않는 극단적인 기능의 존재라고 이해하면 된다.
2. Interface의 문법
1) interface 문법
Interface도 class를 만드는 것과 같은 문법을 사용한다.
이클립스에서도 class 아래를 보면 interface를 만드는 옵션도 존재한다.
문법은 아래와 같다.
public interface 인터페이스명 {
//상수
타입 상수명 = 값;
//추상 메소드
타입 메소드명(매개변수, ... );
//디폴트 메소드
default 타입 메소드명(매개변수, ... ){
//구현부
}
//정적 메소드
static 타입 메소드명(매개변수) {
//구현부
}
}
상수 : 인터페이스에서 값을 정해줄테니 함부로 바꾸지 말고 제공해주는 값만 참조해서 사용하라. (절대적)
추상메소드 : 가이드만 줄테니 추상메소드를 오버라이팅해서 재구현해서 사용하라. (강제적)
디폴트메소드 : 인터페이스에서 기본적으로 제공해주지만, 맘에 안들면 각자 구현해서 쓰던지 말던지. (선택적)
정적메소드 : 인터페이스에서 제공해주는 것으로 무조건 사용하라. (절대적)
예시 코드도 살펴보자.
interface Creature {
// void disp() {} -> 에러, 일반 메소드는 사용 불가
abstract void kind(); // 추상 메소드만 가능하다
void breathe(); // abstract 생략 가능
} // interface end
interface를 만들면 그 안에는 일반 메소드는 사용이 불가능하다.
그리고 어차피 추상 메소드가 오기 때문에 abstract는 생략이 가능하다.
2) interface를 실체 메소드에 상속시키기
자바에서 상속에 대한 코드는 두 가지가 있다.
- extends : 클래스 입장에서 부모가 클래스일 때 사용한다(확장).
- implements : 클래스 입장에서 부모가 인터페이스일 때 사용한다(구현).
class Tiger implements Creature {
@Override
public void kind() {
System.out.println("포유류");
}
@Override
public void breathe() {
System.out.println("허파");
}
} // class end
class Salmon implements Creature {
@Override
public void kind() {
System.out.println("어류");
}
@Override
public void breathe() {
System.out.println("아가미");
}
} // class end
3) 출력하기
public class Test06_interface {
public static void main(String[] args) {
// 에러. 인터페이스는 new를 사용할 수 없다
// Creature creature = new Creature();
// 인터페이스에서의 다형성
Creature creature = null;
creature = new Tiger();
creature.kind();
creature.breathe();
creature = new Salmon();
creature.kind();
creature.breathe();
} // main() end
} // class end
'⁂ Java > : 기본 익히기' 카테고리의 다른 글
[JAVA] #8-6 이너 클래스(Inner Class) (0) | 2022.09.15 |
---|---|
[JAVA] #8-5 익명 내부 객체(Anonymous class) (0) | 2022.09.15 |
[JAVA] #8-3 추상(Abstract) (0) | 2022.09.15 |
[JAVA] #8-2 다형성(Polymorphism) (0) | 2022.09.15 |
[JAVA] #8-1 Super (0) | 2022.09.15 |