Java 인터페이스 #1

jjinny_0609·2023년 2월 20일
0

Java

목록 보기
25/31

인터페이스(interface)

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

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


인터페이스 선언

인터페이스는 '~.java' 형태의 소스파일로 작성되고 컴파일러(javac)를 통해 '~.class' 형태로 컴파일되기 때문에 물리적 형태는 클래스와 동일합니다.
그러나 소스를 작성할 때 선언하는 방법이 다릅니다.
인터페이스 선언은 class 키워드 대신에 interface 키워드를 사용합니다.

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

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

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

이클립스에서 인터페이스를 생성하는 방법

  1. Package Explorer 뷰에서 인터페이스를 포함할 패키지(sec01.exam01)를 생성한 후 선택하고, [File] - [New] - [Interface] 메뉴를 선택
  2. [New Java Interface] 대화상자가 나타나면 [name] 입력란에 'RemoteControl'을 입력한 후 [Finishi] 버튼을 클릭합니다.
  3. 그러면 이클립스는 다음과 같이 RemoteControl 인터페이스의 선언부를 자동적으로 만들어 줍니다.

상수 필드 선언

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

상수는 public static final로 선언한다는 것을 알고 있을텐데, 따라서 인터페이스에 선언된 필드는 모두 public static final의 특성을 갖는다.
public static final을 생략하더라도 컴파일 과정에서 자동으로 붙게 된다.

[pulbic static final] 타입 상수이름 = 값;

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

추상 메소드 선언

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


인터페이스 구현

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

구현 클래스

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

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

★ public 접근 제한
구현 클래스에서 인터페이스 추상 메서드에 대한 실체 메서드를 작성할 때 주의할 점은 인터페이스의 모든 메서드는 기본적으로 public 접근 제한을 갖기 때문에 public 보다 더 낮은 접근 제한으로 작성할 수 없다는 것입니다. public 을 생략하면 "Cannot reduce the visibility of the inherited method" 라는 컴파일 에러를 만나게 됩니다.

인터페이스로 구현 객체를 사용하려면 다음과 같이 인터페이스 변수를 선언하고 구현 객체를 대입해야한다. 인터페이스 변수는 참조 타입이기 때문에 구현 객체가 대입될 경우 구현 객체의 번지를 저장합니다.

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

class B implement A{
// 필드 ( 변수, 상수)

// 생성자

// 메서드

}

interface A{
//상수 필드

//생성자(X)

// 추상메서드
}

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

객체는 다음 그림과 같이 다수의 인터페이스 타입으로 사용할 수 있습니다.
인터페이스가 A,B가 객체의 메서드를 호출할수 있으려면 객체는 이 두 인터페이스를 모두 구현해야한다.
따라서 구현 클래스는 다음과 같이 작성되어야 한다.
public class 구현클래스이름 implements 인터페이스A, 인터페이스B{
//인터페이스 A에 선언된 추상 메서드의 실체 메서드 선언
//인터페이스 B에 선언된 추상 메서드의 실체 메서드 선언
}

인터페이스 연습문제

1. 인터페이스 사용에 대한 설명입니다. 맞는것에 O표, 틀린것에 X표 하세요.
① 인터페이스는 객체 사용 방법을 정의해놓은 타입이다. ( O )
② new 연산자를 이용해서 인터페이스 객체를 만들 수 있다. ( X )
③ 인터페이스는 상수 필드와 추상 메서드를 갖는다. ( O )
④ 구형 클래스는 implements 키워드로 인터페이스를 기술해야한다. ( O )

2. 인터페이스 사용에 대한 설명입니다. 맞는것에 O표, 틀린것에 X표 하세요.
① 클래스를 선언할 때 인터페이스 타입의 필드를 선언할 수 있다. ( O )
② 생성자의 매개 타입이 인터페이스일 경우, 매개값으로 구현 객체를 대입한다. ( O )
③ 인터페이스 타입의 로컬 변수는 선언할 수 없다. ( X )
④ 메서드의 매개 타입이 인터페이스일 경우, 매개값으로 구현 객체를 대입한다. ( O )

3. 다음은 Soundable 인터페이스입니다. sound()추상 메서드는 객체의 소리를 리턴합니다.

SoundableExample 클래스에서 printSound() 메서드는 Soundable 인터페이스 타입의 매개 변수를 가지고 있습니다. main() 메서드에서 printSound()를 호출할 때 Cat과 Dog 객체를 주고 실행하면 각가 "야옹"과 "멍멍"이 출력되도록 Cat과 Dog 클래스를 작성해보세요.

profile
뉴비 개발자 입니다. velog 주소 : https://velog.io/@jjinny_0609 Github 주소 :

0개의 댓글