Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
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
관리 메뉴

나는개발자니까

[Java] Chapter 8.1 인터페이스 본문

Java

[Java] Chapter 8.1 인터페이스

된다고했잖아요 2023. 4. 17. 23:10

 

인터페이스의 개요

인터페이스 (interface)는 개발 코드와 객체가 서로 연결될 수 있는 중간다리 역할을 합니다.  개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출합니다. 

인터페이스는 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있습니다.  인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴값이 다를 수 있습니다.

 

그런데 인터페이스를 사용하면 구조가 복잡해지고 생각해야할 것이 많아질 것 같은데 왜 사용할까요?

 

"인터페이스는 서비스 로직에서 객체를 생성하고 메서드를 호출하는데 구조와 설계를 유지하기 위해서 사용합니다."

 

 

인터페이스 선언

interface 키워드를 사용해 선언합니다.

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

인터페이스의 구성 요소는 상수 필드와 추상 메소드를 구성 멤버로 가집니다.

 

1 ) 상수 필드 선언

인터페이스의 필드는 데이터의 값이 바뀔 수 없도록 고정된 값을 선언합니다.  따라서 인터페이스에 선어된 필드는 모두 public static final의 특성을 갖습니다.  java 8 버전 이후로는 컴파일할 경우에 public static final을 자동으로 붙이기 때문에 통상적으로 생략합니다.

 

2 ) 추상 메소드 선언

인터페이스를 호출된 메소드는 최종적으로 객체에서 실행됩니다.  따라서 인터페이스의 메소드는 실행 블록이 필요 없는 추상 메소드로 선언하고 public abstract의 특성을 갖습니다.  마찬가지로 생략하더라도 컴파일할 경우에 자동으로 특성이 부여됩니다.

package sec01.exam03;

public interface RemoteControl {
	// 상수
    public int MAX_VOLUME = 10;
    public int MIN_VOLUME = 0;
    
    // 추상 메소드
    public void turnOn();
    public void turnOff();
    public void setVolume(int volume);
}

 

인터페이스 구현

개발 코드가 인터페이스 메소드를 호출하면 인터페이스는 객체의 메소드를 호출합니다. 

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

 

구현 클래스

구현 클래스는 인터페이스 타입으로 사용할 수 있음을 알려주기 위해 클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름을 명시해야 합니다.

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

 

구현 클래스가 작성되면 new 연산자로 객체를 생성 할 수 있습니다.

* 구현 객체를 선언하는 방법

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

2 )
인터페이스 변수 = 구현객체;
package sec01.exam04;

public class RemoteControlExample {
	public static void main(String[] args) {
    	RemoteControl rc;
        rc = new Television();
        re = new Audio();
    }
}

 

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

객체는 다수의 인터페이스 타입으로 사용할 수 있습니다.  인터페이스 A와 인터페이스 B가 객체의 메소드를 호출할 수 있으려면 객체는 이 두 인터페이스를 모두 구현해야 합니다.  또한 다중 인터페이스를 구현할 경우, 구현 클래스는 모든 인터페이스의 추상 메소드에 대해 실체 메소드를 작성해야 합니다.

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

 

인터페이스 변수에 구현 객체 대입

package sec01.exam05;

public class SmartTelevisionExample {
	public static void main(String[] args) {
    	SmartTelevesion tv = new SmartTelevision();
        
        // 구현객체가 인터페이스 변수에 대입됩니다.
        RemoteControl rc = tv;
        Searchable searchable = tv;
    }
}

 

 

인터페이스 사용

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

public class MyClass {

	// 1. 필드 타입으로 사용되는 경우
	RemoteControl rc = new Television();
    
    // 2. 생성자의 매개 변수 타입으로 사용되는 경우
    MyClass(RemoteControl rc) {
    	this.rc = rc;
    }
    
    void methodA() {
    	// 3. 로컬 변수 타입으로 사용되는 경우
    	RemoteControl rc = new Audio();
    }
    
    void methodB(RemoteControl rc) {
    
    }
}

 

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

MyClass myClass = new MyClass();
myClass.rc.turnOn();
myClass.rc.setVolume(5);

 

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

MyClass(RemoteControl rc) {
	this.rc = rc;
    rc.turnOn();
    rc.setVolume(5);
}

 

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

void methodA() {
	RemoteControl rc = new Audio();
    rc.turnOn();
    rc.setVolume(5);
}

 

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

vodi methodB(RemoteControl rc) {
	rc.turnOn();
    rc.setVolume(5);
}

 

자바의 상속에서는 다중상속이 불가능하다 했는데 , 인터페이스는 왜 다중 인터페이스가 가능할까요?

 

자바에서의 상속은 관계성을 부여하는 것입니다. 자바에서 다중 상속을 하지 못하도록 막은 이유는 설계한 관계도가 무너지기 때문입니다. 자바에서의 상속은 관계성을 부여하고 부모 클래스의 정체성을 유지하기 위해 사용합니다. 근데 여러 자식 클래스가 상속 받으면 상속의 특징이 사라기 때문에 다중 상속을 사용하지 않습니다.

그럼 다중 인터페이스도 코드의 설계가 무너지는 것은 아닌지 의문이 들 수 있습니다. 인터페이스는 상속과 다르게 관계성을 부여하지 않고, able의 개념을 갖기 때문에 관계도에 영향을 주지 않습니다. 따라서 다중 인터페이스도 할 수 있는~ 이라는 의미를 가진 관계도의 연속이고 자바에서 사용할 수 있습니다.

 

 

출처 | 혼자 공부하는 자바, 신용권