JongDDA의 한걸음 한걸음씩
[Java] 인터페이스(Interface) 본문
인터페이스(Interface)
인터페이스는 일종의 추상클래스이다. 인터페이스는 추상클래스처럼 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높아서 추상 클래스와 달리 몸통을 같준 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용하지 않는다.
추상클래스를 부분적으로만 완성된 '미완성 설계도'라고 한다면, 인터페이스는 구현된 것은 아무 것도 없고 밑그림만 그려져 있는 '기본 설계도'라 할 수 있다.
인터페이스도 추상 클래스처럼 완성되지 않은 불완전한 것이기 때문에 그 자체만으로 사용되기 보다는 다른 클래스를 작성하는데 도움 줄 목적으로 작성된다.
인터페이스를 작성하는 것은 클래스를 작성하는 것과 같다. 다만, 키워드로 class 대신 interface를 사용한다는 것만 다르다. intercface에도 클래스처럼 접근제어자로 public 또는 default만 사용할 수 있다.
interface 인터페이스이름{
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수목록);
}
일반적인 클래스와 달리 인터페이스의 멤버들은 다음과 같은 제약사항이 있다.
- 모든 멤버변수는 public, static, final 이어야 하며, 이를 생략할 수 있다.
- 모든 메서드는 public, abstract 이어야 하며, 이를 생략할 수 있다.
단, static메서드와 디폴트 매서드는 에외
인터페이스에 정의된 모든 멤버에 예외없이 적용되는 사항이기 때문에 제어자를 생략할 수 있는 것이며, 편의상 생략하는 경우가 많다. 생략된 제어자는 컴파일 시에 컴파일러가 자동적으로 추가해 준다.
인터페이스 상속
인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와는 달리 다중상속, 즉 여러개의 인터페이스로부터 상속을 받는 것이 가능하다.
Interface Movable {
/* 지정된 위치(x,y)로 이동하는 기능의 메서드 */
void move(int x, int y);
}
Interface Attackable{
/* 지정된 대상을 공격하는 기능의 메서드 */
void attack(Unit u);
}
Interface Fightable extends Movable, Attackable { }
클래스의 상속과 마찬가지로 자손 인터페이스(Fightable)는 조상 인터페이스(Movable, Attackable)에 정의된 멤버를 모두 상속받는다. 그래서 FIghntable 자체에는 정의된 멤버가 하나도 없지만 조상 인터페이스로부터 상속받은 두 개의 추상메서드, move(int x, int y) 와 attack(Unit u)을 멤버로 갖게 된다.
인터페이스 구현
인터페이스도 추상 클래스처럼 그 자체로는 인스턴스를 생성할 수 없으며, 추상 클래스가 상속을 통해 추상 메서드를 완성하는 것처럼, 인터페이스도 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야 한다. 그 방법은 추상클래스의 상속과 방법이 다르지 않으며 단지, 상속에서는 'extends'를 사용하였지만 인터페이스의 경우 'implements' 키워드를 사용해 줘야 한다.
class 클래스 이름 implements 인터페이스 이름{
// 인터페이스에 정의된 추상 메서드를 모두 구현해야 한다.
}
class Gun implements Weapon{
public void fire(); // 발사
public void load(); // 장전
}
인터페이스를 이용한 다형성
클래스의 경우 자손클래스의 인스턴스를 조상타입의 참조변수로 참조하는 것이 가능하다. 인터페이스 역시 마찬가지로 해당 인터페이스 타입의 잠조변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있으며, 인터페이스 타입으로의 형변환도 가능하다.
Weapon w = (Weapon)new Gun();
따라서 인터페이스는 메서드의 매개변수의 타입으로도 사용될 수 있다.
void Attack(fire f){
// ...
}
인터페이스 타입의 매개변수가 갖는 의미는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 한다는 것이다.
Weapon method(){
...
Fire f = new Fire();
return f;
}
리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.
인터페이스의 장점을 정리해보자면
- 개발 시간을 단축시킬 수 있다.
- 표준화가 가능하다.
- 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
- 독립적인 프로그래밍이 가능하다.
'개발 > Java' 카테고리의 다른 글
[Java] 내부 클래스(Inner class) (0) | 2021.08.20 |
---|---|
[Java] 입출력(I/O) (0) | 2021.08.19 |
[Java] 추상 클래스(abstract class) (0) | 2021.08.18 |
[Java] 다형성(Polymorphism) (0) | 2021.08.17 |
[Java] 제어자(modifier) (0) | 2021.08.17 |