프로그래밍 언어/JAVA

[JAVA] 인터페이스와 구현클래스 - interface, implements

타밍 2023. 6. 30. 16:02

1. 인터페이스

 - 자바에서의 인터페이스는 객체의 사용 방법을 정의한 타입이다.

 - 인터페이스는 객체의 교환성을 높여주며 다형성을 구현하는 중요한 역할을 한다

다형성이란, 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 하는 성질이다.
인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로, 어떤 객체를 사용하느냐에 따라 실행 내용과 리턴값이 다를 수 있다.
하나의 타입에 대입되는 객체에 따라 실행결과가 다양한 형태로 나온다는 것이다.

 - 이 때문에 개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있으며, 코드 변경 없이 실행 내용과 리턴값을 다양화할 수 있다.

 

 

2. 인터페이스 선언

interface 인터페이스이름 {
...
}

 

 

3. 인터페이스의 구성

클래스는 필드, 생성자, 메소드를 구성 멤버로 가지지만, 인터페이스는 상수와 메소드만을 구성 멤버로 가진다.

또한, 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.

interface 인터페이스이름 {
	타입 상수명 = 값;
    타입 메소드명(···);
    default 타입 메소드명(···) { }
    static 타입 메소드명(···) { }
}

 

(1) 상수 필드 ( 타입 상수명 = 값; )

인터페이스는 런타임 시 데이터를 저장할 수 있는 필드를 선언할 수는 없지만 상수 필드는 선언이 가능하다.

또한, statc{} 블록으로 초기화할 수 없기 때문에 반드시 선언과 동시에 초기값을 가져야 한다.

public int MAX = 10;
public int MIN = 0;

 

(2) 추상 메소드 ( 타입 메소드명(); )

추상 메소드는 객체가 가지고 있는 메소드를 설명한 것이다. 실제 실행부는 구현 객체가 가지고 있으며, 인터페이스의 추상 메소드는 호출할 때 필요한 매개값과 리턴 타입만 선언하면 된다.

 

언터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행되기 때문에, 인터페이스의 메소드는 추상 메소드로 선언한다.

추상 메소드는 모두 public abstract 특성을 가지고 있어 생략해도 좋다.

public void turnOn();
public void turnOff();
public int setNum(int num);

 

(3) 디폴트 메소드 ( default ~ )

디폴트 메소드는 인터페이스에 선언되지만 사실은 구현 객체가 가지고 있는 인스턴스 메소드라고 생각하면 된다.

디폴트 메소드는 public 특성을 갖는다.

default void setNormal(boolean sets) {
	if(sets) {
    	System.out.println("종료합니다.");
    } else {
    	System.out.println("시작합니다.");
    }
}

 

(4) 정적 메소드 ( static ~ )

정적 메소드는 디폴트 메소드와 달리 객체가 없어도 인터페이스만으로도 호출이 가능하며, 클래스의 정적 메소드와 완전히 동일하다.

정적 메소드는 public 특성을 갖는다.

static void hello() {
	System.out.println("어서오세요.");
}

 

 

4. 인터페이스 구현

인터페이스 메소드를 호출하면, 인터페이스는 객체의 메소드를 호출하며, 객체는 인터페이스에서 정의된 추상 메소드와 동일한 메소드 이름, 매개타입, 리턴 타입을 가진 실체 메소드를 가지고 있어야한다.

public class 클래스명 implements 인터페이스이름 {
	...
}

 

구현 클래스는 인터페이스의 실체메소드를 가지고 있어야 하므로 위 예시의 인터페이스를 구현하려면 

turnOn(), turnOff(), setNum(int num) 을 모두 포함해주어야 한다.

public void turnOn() {
	...
}

public void turnOff(){
	...
}

public int setNum(int num){
	...
}

 

인터페이스의 모든 메소드는 기본적으로 public 접근 제한을 갖기 때문에 public보다 더 낮은 접근 제한으로 작성할 수는 없다.

 

 

5. 구현 객체 생성

구현 클래스가 작성되면 new 연산자로 객체를 생성할 수 있으며, 인터페이스로 구현 객체를 사용하려면 인터페이스 변수를 선언하고 구현 객체를 대입해야 한다.

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

//(2)
인터페이스 인터페이스변수 = 구현객체;

(1) 추상 메소드 사용

구현 객체가 인터페이스 타입에 대입되면, 인터페이스에 선언된 추상 메소드를 호출할 수 있다.

 

(2) 디폴트 메소드 사용

디폴트 메소드는 추상 메소드가 아닌 인스턴스 메소드이므로 구현 객체가 있어야 사용할 수 있다.

디폴트 메소드는 인터페이스의 모든 구현 객체가 가지고 있는 기본 메소드이고, 구현 클래스를 작성할 때 디폴트 메소드를 오버라이딩 해서 사용할 수도 있다.