Notice
Recent Posts
Recent Comments
Link
Tags
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

JongDDA의 한걸음 한걸음씩

[Java] 인터페이스(Interface) 본문

개발/Java

[Java] 인터페이스(Interface)

종따 2021. 8. 18. 21:16
728x90

인터페이스(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;
}

리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.

 

인터페이스의 장점을 정리해보자면

 

  1. 개발 시간을 단축시킬 수 있다.
  2. 표준화가 가능하다.
  3. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
  4. 독립적인 프로그래밍이 가능하다.

 

 

 

 

 

 

 

 

 

 

728x90
반응형

'개발 > 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
Comments