개발 일지/Java

[Java] 인터페이스(Interface)

미숫가루설탕많이 2023. 1. 2. 15:59

 컴퓨터 프로그래밍에서 사용하는 인터페이스는 '서로 다른 두 시스템, 장치, 소프트웨어 따위를 서로 이어주는 부분 또는 그런 접속 장치'라고 정의할 수 있다.

 

 하위 클래스가 여러 상위 클래스를 상속받을 수 있다면 다양한 동작을 수행할 수 있지만, 이러한 경우 메서드 출처의 모호성 등 여러 문제가 발생할 수 있기에 자바 프로그래밍에서는 클래스를 통한 다중 상속을 지원하지 않는다. 하지만 다중 상속의 이점을 살리기 위해 자바는 인터페이스라는 것을 통해 다중 상속을 지원한다.

 

 기본적으로 인터페이스도 추상 클래스처럼 자바에서 추상화를 구현하는 데 사용되는 점은 동일하지만, 추상 클래스에 비해 더 높은 추상성을 가진다는 점에서 큰 차이가 있다.

 

 추상 클래스를 설계가 모두 끝나지 않은 '미완성 설계도'에 비유한다면 인터페이스는 그보다 더 높은 추상성을 갖는 가장 기초적인 '밑그림'에 비유할 수 있다. 추상 클래스는 메서드 바디가 없는 추상 메서드를 하나 이상 포함한다는 점 외에는 기본적으로 일반 클래스와 동일하지만 인터페이스는 추상 메서드와 상수만을 멤버로 가질 수 있기 때문이다.

 

 

 

 

인터페이스의 기본 구조


 자바에서 인터페이스를 선언하는 방법은 클래스를 작성하는 방법과 같다. 하지만 클래스와는 달리 인터페이스의 모든 필드는 public static final로 정의되고 static과 default 메서드 이외는 모든 메서드는 public abstract로 정의된다.

 

 이 부분은 모든 인터페이스에 공통으로 적용되는 부분이기 때문에 제어자가 생략되어도 컴파일 시 자바 컴파일러가 자동으로 추가해준다.

 

접근제어자 interface 인터페이스명 {
    public static final 타입 상수명 = 값;
    ...
    public abstract 메서드명(매개변수목록);
    ...
}

 

 

 

 

인터페이스의 구현


 인터페이스는 추상 클래스와 마찬가지로 자신이 직접 인스턴스를 생성할 수 없기 때문에 인터페이스가 포함하고 있는 추상 메서드를 구현해 줄 클래스를 따로 작성해야 한다.

 

 이 과정은 extends 키워드를 사용하는 클래스의 상속과 기본적으로 동일하지만, '구현하다'라는 의미를 가진 implements 키워드를 사용한다는 점에서 차이가 있다.

 

class 클래스명 implements 인터페이스명 {
    ... // 인터페이스에 정의된 모든 추상 메서드 구현
}

 

 특정 인터페이스를 구현한 클래스는 해당 인터페이스에 정의된 모든 추상 메서드를 구현해야 한다.

 

 반대로, 어떤 클래스가 어떤 인터페이스를 구현한다는 것은 그 인터페이스가 가진 '모든 추상 메서드들을 해당 클래스 내에서 오버라이딩하여 바디를 완성한다'라는 의미를 가진다. 

 

 

 

 

인터페이스의 다중 구현


  하위 클래스는 단 하나의 상위 클래스만 상속받을 수 있지만 인터페이스는 다중적 구현이 가능하다. 즉, 하나의 클래스가 여러 개의 인터페이스를 구현할 수 있다. 다만 인터페이스는 인터페이스로부터만 상속이 가능하고 클래스와 달리 Object 클래스와 같은 최고 조상이 존재하지 않는다.

 

class ExampleClass implements ExampleInterface1, ExampleInterface2, ExampleInterface3 {
	...
}

 

 클래스에서 다중 상속이 불가능한 핵심적인 이유는 만약 부모 클래스에 동일한 이름의 필드 또는 메서드가 존재하는 경우에 충돌이 발생하기 때문이다. 반면 인터페이스는 애초에 미완성된 멤버를 갖고 있기 때문에 충돌이 발생할 여지가 없어서 안전하게 다중 구현이 가능하다.

 

 

 

 

인터페이스의 장점


 

  1.  기능이 가지는 역할과 구현을 분리시켜 사용자로 복잡한 기능의 구현이나 교체, 변경을 신경쓰지 않고도 코드 변경의 번거로움을 최소화하고 손쉽게 해당 기능을 사용할 수 있도록 한다.

  2. 클래스의 작성과 인터페이스의 구현을 동시에 진행할 수 있으므로, 개발시간을 단축할 수 있다.

  3. 독립적인 프로그래밍을 통해 한 클래스의 변경이 다른 클래스에 미치는 영향을 최소화할 수 있다.

  4. 대규모 프로젝트 개발 시 일관되고 정형화된 개발을 위한 표준화가 가능하다.

'개발 일지 > Java' 카테고리의 다른 글

[Java] 제네릭(Generic)  (0) 2023.01.04
[Java] 열거형(enumerated type, enum)  (0) 2023.01.04
[Java] final 키워드  (0) 2023.01.02
[Java] 추상화(Abstraction)  (0) 2022.12.30
[Java] instanceof 연산자  (0) 2022.12.30