Java

[Java, 객체지향] 인터페이스란? (Interface)

15호의 개발자 2021. 8. 17. 12:17
반응형

[Java, 객체지향] 인터페이스란? (Interface)

 

 

인터페이스란?

인터페이스는

클라이언트 프로그램에 어떤 메서드를 제공하는지 알려주는 명세(specification) 또는 약속이다.

 

'한 객체가 어떤 인터페이스의 타입이다'라는 것은,

그 인터페이스의 메서드를 구현했다는 의미이다.

 

클라이언트 프로그램은 실제 구현 내용을 모르더라도

인터페이스의 정의만 알면 그 객체를 사용할 수 있다.

 

 

 

쉽게 말하자면, 인터페이스는 추상 메서드의 집합이다.

 

즉, 구현된 것이 전혀 없는 껍데기와 같다. (jdk 1.8 이상을 제외하고선, 인터페이스의 모든 멤버는 public이다)

 

interface 인터페이스명 {
    public static final 타입 상수명 = 값;
    public abstract 메서드명();
}

이때, 위의 public, static, final, abstract 키워드는 모두 생략 가능하다.

 

 

 

인터페이스의 상속

인터페이스 간에도 상속이 가능하다.

 

또한, 인터페이스는 다중 상속이 가능하며,

구현이 없으므로 extends 뒤에 여러 인터페이스를 상속받을 수 있다.

구현 내용이 없으므로 타입 상속(type inheritance)이라고 한다.

 

인터페이스의 조상은 인터페이스만 가능하다.

 

 

 

인터페이스의 구현

인터페이스의 구현이란

인터페이스의 추상메서드 body( { }부분 )을 완성하는 것이다.

 

아래와 같이 implements 키워드를 이용하면 된다.

(상속할 때의 extends와 같은 방식이다.)

class 클래스명 implements 인터페이스명 {
       // 추상메서드를 완성(구현)해야 한다
}

상속과 인터페이스를 동시에 받을 수도 있다.

class 클래스명 extends 클래스명 implements 인터페이스명 {

}

 

 

 

여러 개의 인터페이스 구현

인터페이스는 구현 코드가 없으므로

하나의 클래스가 여러 인터페이스를 구현할 수 있다.

 

디폴트 메서드의 이름이 중복되는 경우에는 재정의한다.

 

(여러 개의 인터페이스 구현과 관련해서는, Diamond Problem in Java에 대해 알아보면 된다.)

 

 

 

추상클래스 vs 인터페이스

 

추상클래스: 클래스인데 추상메서드를 가지고 있는 클래스

인터페이스: 추상메서드만 가지고 있고 그 외에는 아무것도 가지고 있지 않음

 

즉, 추상클래스와 인터페이스의 차이점은

추상클래스는 인스턴스 변수를 가질 수 있지만,

인터페이스는 인스턴스 변수를 가질 수 없다는 점이다.

 

 

 

인터페이스 사용의 장점

처음에 말했듯 인터페이스는 껍데기라고 비유했다.

자판기를 조작할 때 우리는 자판기의 껍데기를 조작하는 것이지

자판기 내부를 직접 조작하는 것은 아니다.

 

이러한 것이 바로 인터페이스 사용의 장점이다.

 

1. 조작하기 쉽고,

2. 변경에 유리하다.

  (ex. 자판기 껍데기는 그대로 있지만, 자판기 내부의 조작 방식이나 부품은 얼마든지 바뀔 수 있다)

3. 개발 시간을 단축할 수 있다.

4. 표준화가 가능하다. (JDBC를 구현한 오라클, MSSQL 라이브러리 등)

5. 서로 관계없는 클래스들을 관계 맺어줄 수 있다.

 

class A {
    public void methodA(B b) {    b.methodB();    }
}

class B {
    public void methodB() { ...생략... }
}

위의 두 클래스는 직접적인 관계가 있는 클래스이다.

이를 아래처럼 인터페이스를 이용해 간접적인 관계를 가진 클래스로 만들 수 있다.

아래처럼 변경하면 변경에 유리해진다.

class A {
    public void methodA(I i) {    i.methodB();    }
}

interface I {    void methodB();    }

class B implements I {
    public void methodB() { ...생략... }
}

 

 

 

인터페이스의 요소

  • 상수: 선언된 모든 변수는 상수로 처리 된다.
  • 메서드: 모든 메서드는 추상 메서드이다.
  • 디폴트 메서드: 기본 구현을 가지는 메서드이다. 구현하는 클래스에서 재정의 할 수 있다. (java 8)
  • 정적 메서드: 인스턴스 생성과 관계없이 인터페이스 타입으로 호출하는 메서드이다. (java 8)
  • private 메서드: 인터페이스 내에서 사용하기 위해 구현한 메서드이다. 구현하는 클래스에서 재정의 할 수 없다. (java 9)

 

 

 

(출처: 유튜브 남궁성의 정석코딩)

반응형