본문 바로가기
Java

자바 인터페이스

by 승환파크 2023. 6. 27.

인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다. 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출 시킨다. 그렇기 때문에 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 된다.

 

여기서 개발 코드가 직접 객체의 메소드를 호출하지 않고 인터페이스를 중간에 두는 이유는 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위해서이다. 인터페이스는 하나의 객체가 아니라 여러 객체들과 사용 가능하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴값이 다를 수 있다. 따라서 개발 코드 측면에서는 코드 변경 없이 실행 내용과 리턴값을 다양화할 수 있다는 장점을 가지게 된다.

 

 

인터페이스 선언

인터페이스는 '~.java' 형태의 소스 파일로 작성되고 컴파일러(javac)를 통해 '~.class'형태로 컴파일 되기 때문에 물리적 형태는 클래스와 동일하다. 그러나 소스를 작성할 때 선언하는 방법이 다르다.

 

인터페이스 선언은 class 키워드 대신 interface 키워드를 사용한다.

[public] interface 인터페이스이름{
	...
}

 

인터페이스 이름은 클래스 이름을 작성하는 방법과 동일하다. 영어 대소문자를 구분하며, 첫 글자를 대문자로 하고 나머지는 소문자로 작성하는 것이 관례이다.

 

클래스는 필드, 생성자, 메소들르 구성 멤버로 가지는데 비해, 인터페이스는 상수 필드와 추상 메소드만을 구상 멤버로 가진다. 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.

interface 인터페이스이름{
	// 상수
    타입 상수이름 = 값;
    
    // 추상 메소드
    타입 메소드이름(매개변수, ...);
}

 

상수 필드 선언

인터페이스는 객체 사용 방법을 정의한 것이므로 실행 시 데이터를 저장할 수 있는 인스턴스 또는 정적 필드를 선언할 수 없다. 그러나 상수 필드는 선언이 가능하다. 단, 상수는 인터페이스에 고정된 값으로 실행 시에 데이터를 바꿀 수 없다.

 

상수는 public static final로 선언하는데 인터페이스에서는 필드를 선언할 때 작성하지 않아도 모두 public static final 의 특성을 갖게 된다.

 

상수 이름은 대문자로 작성하되, 서로 다른 단어로 구성되어 있을 경우 언더바(_)로 연결하는 것이 관례이다. 인터페이스 상수는 반드시 선언과 동이세 초기값을 지정해야 한다.

 

추상 메소드 선언

인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행된다. 그렇기 때문에 인터페이스의 메소드는 실행 블록이 필요 없는 추상 메소드로 선언한다. 추상 메소드는 리턴 타입, 메소드 이름, 매개 변수만 기술 되고 중괄호를 붙이지 않는 메소드를 말한다. 인터페이스에 선언된 추상 메소드는 모두 public abstract의 특성을 갖기 때문에 생략하더라도 컴파일 과정에서 자동으로 붙게 된다.

 

 

인터페이스 구현

개발 코드가 인터페이스 메소드를 호출하면 인터페이스는 객체의 메소드를 호출한다. 객체는 인터페이스에서 정의된 추상 메소드와 동일한 메소드 이름, 매개 타입, 리턴 타입을 가진 실체 메소드를 가지고 있어야한다. 이러한 깨체를 인터페이스의 구현 객체 라고 하고, 구현 객체를 생성하는 클래스를 구현 클래스 라고 한다.

 

구현 클래스

구현 클래스는 보통의 클래스와 동일한데, 인터페이스 타입으로 사용할 수 있음을 알려주기 위해 클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름을 명시해야 한다. 그리고 이터페이스에 선언된 추상 메소드의 실체 메소드를 선언해야 한다.

public class 구현클래스이름 implements 인터페이스이름{
	// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}

 

구현 클래스가 작덩되면 new 연산자로 객체를 생성할 수 있다. 인터페이스로 구현 객체를 사용하려면 아래와 같이 인터페이스 변수를 선언하고 구현 객체를 대입해야 한다. 인터페이스 변수는 참조 타입이기 때문에 구현 객체가 대입될 경우 구현 객체의 번지를 저장한다.

인터페이스 변수;
변수 = 구현 객체;

// 혹은 아래의 방식으로 한번에 선언할 수 있다.
인터페이스 변수 = 구현 객체;

 

다중 인터페이스 구현 클래스

객체는 아래와 같이 다수의 인터페이스 타입으로 사용할 수 있다.

인터페이스 A와 인터페이스 B가 객체의 메소드를 호출할 수 있으려면 객체는 이 두 인터페이스를 모두 구현해야 한다.

public class 클래스이름 implements 인터페이스A, 인터페이스B{
	// 인터페이스 A에 선언된 추상 메소드 실체 메소드 선언
    // 인터페이스 B에 선언된 추상 메소드 실체 메소드 선언
}

 

다중 인터페이스를 구현할 경우, 구현 클래스는 모든 인터페이스의 추상 메소드에 대해 실체 메소드를 작성해야 한다.

 

 

인터페이스 사용

클래스를 선언할 때 인터페이스는 필드, 생성자 또는 메소드의 매개 변수, 생성자 또는 메소드의 로컬 변수로 선언될 수 있다.

예를 들어 아래는 InterFaceA 인터페이스를 필드, 생성자 또는 메소드의 매개 변수 그리고 메소드의 로컬 변수로 선언했다.

public class MyClass{
	// 필드(1)
    InterFaceA ifa = new InterFaceClassA();
    
    // 생성자(2)
    MyClass(InterFaceA ifa){
    	this.ifa = ifa;
    }
    
    // 메소드(3)
    void methodA(){
    	// 로컬 변수
        InterFaceA ifa = new InterFaceClassB();
    }
    
    // 매개 변수 타입(4)
    void methodB(InterFaceA ifa){
    	...
    }
}

1. 인터페이스가 필드 타입으로 사용될 경우, 필드에 구현 객체를 대입할 수 있다.

2. 인터페이스가 생성자의 매개 변수 타입으로 사용될 경우, new 연산자로 객체를 생성할 때 구현 객체를 생성자의 매개값으로 대입할 수 있다.

3. 인터페이스가 로컬 변수 타입으로 사용될 경우, 변수에 구현 객체를 대입할 수 있다.

4. 인터페이스가 메소드의 매개 변수 타입으로 사용될 경우, 메소드 호출 시 구현 객체를 매개값으로 대입할 수 있다.

 

구현 객체가 인터페이스 타입에 대입되면 인터페이스에 선언된 추상 메소드를 개발 코드에서 사용할 수 있게 된다. 개발 코드에서 InterFaceA의 변수 ifa 로 methodX() 또는 methodY() 메소드를 호출하면 구현 객체의 methodX() 과 methodY() 메소드가 자동 실행 된다.

 

1. 필드로 선언된 ifa는 아래와 같이 사용될 수 있다.

MyClass myClass = new MyClass();
myClass.ifa.methodX(); // InterFaceClassA 의 methodX() 가 실행된다.
myClass.ifa.methodY(5); // InterFaceClassA 의 methodY(5) 가 실행된다.

 

2. 생성자의 매개 변수 타입으로 선언된 ifa는 아래와 같이 사용될 수 있다.

MyClass(InterFaceA ifa){
	this.ifa = ifa;
    ifa.methodX();
    ifa.methodY(5):
}

3. 로컬 변수로 선언된 ifa는 아래와 같이 사용될 수 있다.

void methodA(){
	InterFaceA ifa = new InterFaceClassA();
    ifa.methodX(); // InterFaceClassA의 methodX()가 실행
    ifa.methodY(5); // InterFaceClassA의 methodY(5)가 실행
}

4. 메소드의 매개 변수 타이브로 선언된 ifa는 아래와 같이 사용될 수 있다.

void methodB(InterFaceA ifa){
	ifa.methodX();
    ifa.methodY(5);
}

'Java' 카테고리의 다른 글

자바 중첩 클래스와 중첩 인터페이스  (0) 2023.06.27
자바 인터페이스 타입 변환과 다형성  (2) 2023.06.27
자바 추상 클래스  (0) 2023.06.27
자바 클래스 타입 변환과 다형성  (0) 2023.06.26
자바 상속  (0) 2023.06.26