본문 바로가기
JAVA

인터페이스 (Interface)

by winteringg 2022. 9. 2.

1. 인터페이스 (Interface)
1) 추상 메서드의 집합.
2) 일종의 추상클래스이긴 하나 멤버가 모두 구현부가 없는 메서드임. 인터페이스는 추상 클래스보다 더 추상화의 정도가 높아 체계적인 프로그램 설계를 위해서 사용됨.
  - 모든 메서드가 추상 메서드로 선언됨. (public abstract)
  - 모든 변수는 상수로 선언됨. (public static final)
  - default 메서드, static 메서드, 상수, private 메서드 멤버도 추가되어 활용성이 더 높아짐. (JDK 1.8부터 추가됨)  

interface 인터페이스이름 {
	public static final 타입 상수이름 = 값;      //public static final 생략 가능.
        public abstract 메서드이름(매개변수목록);    //public abstract 생략 가능.
}

2. 추상 클래스와 인터페이스의 차이
1) 인터페이스는 구현부 없이 작성된 메서드를 모두 실체 클래스에서 구현해야 함. 하지만 추상 클래스는 클래스 내에서 정의된 메서드가 있을 수 있음.
  - 추상 클래스 : 일반 클래스에 추상 메서드를 가지고 있는 클래스. 멤버 변수나 생성자를 가질 수 있음.
  - 인터페이스 : 아무것도 없이 추상 메서드만 가지고 있는 클래스. 멤버 변수나 생성자를 가질 수 없음.
    => 생성자가 없음. => 인스턴스를 만들 수 없음.
2) 추상 클래스와 인터페이스의 공통점
  - 추상 메서드를 가지고 있음. (미완성 설계도)
3) 인터페이스의 조상은 인터페이스만 가능 (Object가 최고 조상이 아님)
4) 자바는 다중상속을 지원하지는 않지만, 다중 인터페이스를 통한 상속은 가능함. (구현부가 없기 때문에 추상 메서드가 충돌해도 문제 없음)

3. 인터페이스 구현
1) 인터페이스에 정의된 추상 메서드를 완성(구현)하는 것.
    class 클래스이름 implements 인터페이스 이름 { }
    => 실체 클래스는 반드시 인터페이스에 선언되어 있는 추상 메서드를 재정의(구현)해야 함.
2) extends를 사용하지 않고 implements 를 사용하여 구현함.
3) 형 변환
  - 인터페이스를 구현한 클래스는 인터페이스 타입으로 선언한 변수로 형변환이 이루어짐.
            Calc calc = new CompleteCalc();
  - 상속에서의 형변환과 동일한 의미
  - 형변환 되는 경우 인터페이스에 선언된 메서드만 사용 가능.

4. 인터페이스가 하는 역할
1) 개발 코드가 객체에 종속되지 않게 하여 객체를 교체할 수 있도록 하는 역할.
2) 일종의 클라이언트 코드와의 약속이며, 클래스나 프로그램이 제공하는 하나의 명세 (specification).
3) 클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있음.
4) 개발 코드 변경 없이 리턴값 또는 실행 내용이 다양해질 수 있음. (다형성)

5. 인터페이스의 다형성
1) 하나의 인터페이스를 여러 객체가 구현하게 되면 클라이언트 프로그램은 인터페이스의 메서드를 활용하여 여러 객체의 구현을 사용할 수 있음.
2) 매개변수의 타입이 인터페이스인 경우, 그 인터페이스를 구현한 클래스의 인스턴스만 가능함.
3) 인터페이스를 메서드의 리턴 타입으로 지정할 경우, 그 인터페이스를 구현한 클래스의 인스턴스만 반환함.

//다중상속에는 메서드 충돌이라는 문제가 있는데,
//인터페이스는 구현부{} 가 없기 때문에 선언부가 충돌해도 상관 없으므로 다중상속 가능.

class Fighter extends Unit implements Fightable {
	public void move(int x, int y)  { /*내용생략*/ }
        public void attack(Fightable f) { /*내용생략*/ }
}

Unit u = new Fighter();       //조상클래스
Fightable f = new Fighter();  //인터페이스. Fightable 인터페이스에 정의된 메서드만 사용가능함.


6. 인터페이스의 장점
1) 두 대상(객체) 간의 연결을 돕는 '중간 역할'을 함. 직접적인 연결보다는 중간에 인터페이스가 끼어있기 때문에 변경, 수정에 유리한 설계가 가능함.
2) 독립적인 프로그래밍 가능
  - 클래스와 클래스간의 직접적인 관계를 인터페이스를 이용하여 간접적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에 영향을 치치지 않는 독립적인 프로그래밍이 가능함.
3) 개발 시간을 단축할 수 있음.
  - 인터페이스가 작성이 되면 메서드의 리턴값, 매개변수, 함수이름을 알 수 있으므로 메서드를 호출하는 쪽과 메서드를 구현하는 쪽, 양쪽 동시에 작업이 가능함.
  - A 가 B를 사용하려면 B가 완성 될때까지 기다려야 함. 하지만 인터페이스가 있으면 그걸 기다릴 필요 없이 바로 인터페이스만 이용하여 코드 작성해도 됨.
4) 표준화가 가능
  - 프로젝트에서 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램 개발이 가능함.
5) 서로 관계없는 클래스들을 관계를 맺어줄 수 있음.
  - 상속관계 혹은 같은 조상클래스를 갖고 있지 않은 서로 아무런 관계없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺을 수 있음.

 

 

 

참고 : [한빛미디어] 이것이 자바다 (신용권의 Java 프로그래밍 정복) Chapter 8.인터페이스
참고 : [도우출판] JAVA의 정석(3ND EDITION)-자바의 정석 최신 Java 8.0 포함 Chapter 7.인터페이스

'JAVA' 카테고리의 다른 글

예외 처리 (Exception)  (1) 2022.09.10
오버로딩(Overloading), 오버라이딩(Overriding)  (0) 2022.09.09
Map 컬렉션 (HashMap, TreeMap)  (0) 2022.08.28
Set 컬렉션 (HashSet, TreeSet)  (0) 2022.08.28
List 컬렉션  (0) 2022.08.28

댓글