본문 바로가기
JAVA

11. 인터페이스

by 김마리님 2020. 3. 31.

추상 클래스와 함께 등장하는 것이 인터페이스이다.

추상 클래스는 자식 클래스를 만들고, 여기서 규칙을 찾아 추상화 하지만 인터페이스는 선으로 규칙을 만들고 자식 클래스를 만든다.

인터페이스와 프로토콜은 약속이라는 점에서 비슷하지만 다른 역할을 한다.

프로토콜은 협약에 가깝지만

인터페이스는 클래스와 클래스 내에 추상 클래스를 통해 강제성을 부여하기 때문이다. 이러한 성격으로 인해 인터페이스는 규칙을 설정한다고 생각해도 무방하다.

 

인터페이스의 역할은 두 가지이다.

1. 개발자는 규칙이 설정된 상태로 개발을 하기 때문에 개발이 편리하다.

2. 사용자는 보이는 인터페이스대로만 조작하면 되기 때문에 사용이 용이하다.

 

인터페이스의 특징은 다음과 같다.

1. 인터페이스 내에 변수가 선언된 경우 앞에 public static final이 생략되어 있다.

2. 인터페이스 내에 매서드가 선언된 경우 앞에 public abstract가 생략되어 있다.

3. 인터페이스는 동적 바인딩용 통로 역할이다.

4. 인터페이스는 추상 클래스와 다르게 추상 메서드만 존재할 수 있다. 따라서 강제성을 부여할 수 있다(추상 메서드는 오버라이딩으로 선언해야만 하니까!)

5. 인터페이스는 new로 인스턴스화 할 수 없다.

 

따라서 인터페이스 내부에 변수를 호출하는 방식은 new로 부를 수 없고, 인터페이스명.변수명 으로만 호출할 수 있다.

interface Cal{
	int num=10;
}
public class InterfaceEx01 {
	public static void main(String[] args) {
		System.out.println(Cal.num);
	}
}

다음과 같이 Cal.num으로만 호출이 가능하다.

 

앞서 이야기 했다시피 인터페이스는 규칙을 지정한다.

예를 들어 동물 게임이 있다. 동물 게임의 규칙을 인터페이스로 설정한다.

interface Animal{
	void run();
	void sound();
	
}

이 게임의 동물은 달리거나, 짖는다

 

이제 이 게임 속 동물의 설계도(클래스)를 만들어보자.

class Dog implements Animal{

	@Override
	public void run() {
		System.out.println("강아지가 달린다");
		
	}

	@Override
	public void sound() {
		System.out.println("멍멍");
		
	}
	
}

다음과 같이 인터페이스의 강제성으로 인해 두 가지의 매서드가 반드시 선언되어야만 한다.

다음, 다른 동물도 만들어 보자. 새를 만들어볼 것이다.

그러나 새의 문제점이 있다. 새는 날 수도 있는데, 인터페이스에서는 난다는 매서드를 호출할 수 있는 방법이 없다.

class Bird implements Animal{

	@Override
	public void run() {
		System.out.println("새도 걷는다.");
		
	}

	@Override
	public void sound() {
		System.out.println("짹짹");
		
	}
	public void fly() {
		System.out.println("새는 난다.");
	}

}

다음과 같이 오류가 나면서 호출할 수 없는 모습이 보인다.

날다의 매서드를 출현시키려면 어떻게 하면 좋을까?

 

	static void start(Animal a) {
		a.run();
		a.sound();
		if(a instanceof Bird) {
			((Bird)a).fly();
		}
	}

다음과 같은 인터페이스를 출력하는 매서드를 작성한다.

이 때, if문이 보이는데, 이 if문은 Bird에 의해 열리는 인스턴스의 데이터 타입을 확인하고, 데이터 타입이 일치하면 true가 되면서 실행문이 실행된다. 이 때, Animal을 가리키던 주소를 강제로 Bird로 다운 캐스팅을 시도해서 fly문을 유도하는 구문이다.

 

또한 인터페이스는 공통코드를 만들 수 있다.

interface company{
	int 총무과=10;
	int 생산팀=20;
	int 인사과=30;
	int 행정과=40;

}

public class InterfaceTestEx01 {

	public static void main(String[] args) {
		System.out.println(company.생산팀);

	}

}

다음과 같이 생산팀, 이라는 이름만 넣어도 부서번호가 출력된다.

이렇게 공통코드를 제공하는 것은 "도메인을 준다" 라는 표현을 쓴다.

반응형