[CS - 자바] 인터페이스

Future·2023년 10월 22일
0

CS - 자바

목록 보기
3/6

인터페이스란? (실생활)

위키백과 왈,
"인터페이스(interface)는 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면이다. 즉, 사용자가 기기를 쉽게 동작시키는데 도움을 주는 시스템을 의미한다."
흔히 들어본 UI에서 UI(User Inteface)는 컴퓨터 기기와 사용자 사이의 경계면으로, 사용자가 마주하는 디자인을 뜻한다. 즉, 사용자가 컴퓨터 기기를 쉽게 사용할 수 있도록 해주는 시스템이다.

인터페이스란? (자바)

자바에서 인터페이스는 무엇일까..
인터페이스는 추상 메서드의 집합으로, 구체적인 구현을 숨기고 동작의 껍데기만 제공함으로써 객체간 결합도를 낮추고 확장성을 높여준다.

인터페이스의 필드

인터페이스의 필드는 변수가 아닌 상수이다.
인터페이스는 직접 new를 통해 객체로 생성할 수 없기 때문에 변수를 사용하지 못한다.
public static final 제어자를 사용하고, 생략 가능하다.

인터페이스의 추상 매서드

인터페이스는 추상 매서드를 갖고 있다. 추상 매서드란 선언만 하고 구현하지 않은 매서드를 의미한다.
public abstract 제어자를 사용하고, 생략 가능하다.

인터페이스 다중 구현(상속)

인터페이스는 클래스에서 구현(implements)하여 사용해야 한다. 이때, 다중 구현이 가능한데, 한 클래스에서 여러개의 인터페이스를 구현할 수 있다.

주의할 점

  • 자바에서 매서드를 오버라이딩할 때는 부모 매서드 이상의 넓은 범위를 사용해야 한다. 따라서, 인터페이스의 구현 클래스에서 추상 매서드를 오버라이딩하여 구현할 때, public 제어자를 사용해야 한다.
  • 인터페이스를 구현한 클래스가 인터페이스의 모든 추상 매서드를 구현하지 않았다면 해당 클래스는 추상클래스가 되어야 한다. -> 당연함. 왜냐면, 결국, 해당 클래스는 구현한 인터페이스의 추상 매서드를 갖고 있는 꼴이 되기 때문이다.

인터페이스끼리 상속


인터페이스가 인터페이스를 extends를 이용하여 상속받을 수 있다.
이것이 가능한 이유는 인터페이스의 매서드들은 매서드 구현부가 없기 때문에 충돌이 생길 일이 없기 때문이다. -> (밑에 설명하겠지만, 디폴트 매서드 때문에 이 사실은 유효하지 않게 된다. -> 추가적인 규칙이 생김)
따지고 보면, 상속은 아니다. 그냥 기능의 선언을 물려받는 것 뿐이다.

인터페이스의 디폴트 매서드

인터페이스 내에서 구현까지 한 매서드이다. 자식 클래스에서 오버라이딩하여 재정의할 수 있다.

목적

어떤 인터페이스를 만들고, 그 인터페이스를 구현한 여러 구현 클래스를 이미 만들어 놓았다고 가정해보자. 이때, 구현 클래스들에 공통의 기능을 하나 부여하고 싶다면 어떻게 할 수 있을까?
인터페이스에 추상 매서드를 추가하면 된다. -> 하지만, 이 방법을 사용하면 모든 구현 클래스에서 해당 매서드를 오버라이딩하여 구현해야하는 문제가 생긴다. (변경이 너무 많아짐)
이를 해결하기 위해 디폴트 매서드가 등장하였다. 디폴트 매서드를 인터페이스에 추가하면, 인터페이스 타입으로 생성한 구현 클래스는 디폴트 매서드를 사용할 수 있다.

다중 구현이 불가능해진거 아닌가?

위에서, 인터페이스가 다중 구현이 가능한 이유는 매서드 구현부가 없는 추상매서드들로 이루어졌기 때문이라고 했는데, 디폴트 매서드의 등장으로 이 사실이 거짓이 된거 아닌가? -> 이를 해결하기 위해 새로운 규칙이 추가되었다.
1. 여러개 인터페이스에서 같은 시그니처(이름,타입)의 디폴트 매서드를 만들었으면 구현체에서 이를 오버라이딩하여 재정의 해야 한다.
2. 어떤 자식 클래스가 어떤 부모 클래스와 인터페이스를 동시에 extends/implements 했을 떄, 부모 클래스의 매서드와 인터페이스 디폴트 매서드 간에 시그니처(이름,타입) 충돌이 일어나면 추상클래스의 매서드를 채택한다. 만약, 인터페이스의 디폴트 매서드를 사용하고 싶으면 오버라이딩하여 재정의하면 된다.

인터페이스의 static 매서드

인스턴스 생성과 상관 없이 인터페이스 타입으로 접근하여 사용할 수 있는 매서드이다.

인터페이스의 private 매서드

인터페이스 내부에서만 동작하는 함수이다. default 매서드에서 호출하여 사용한다.
만약, private static 매서드인 경우는 static 매서드에서 사용 가능하다.

그래서 왜 쓰는데

인터페이스를 통한 다형성 극대화

  • 인터페이스를 이용함으로써 클래스 간에 형제 관계를 만들어 줄 수 있다.

    Creature(생명체) 를 구현한 클래스들 중 땅에서 걸어다닐 수 있는 Monkey와 Human에게만 GroundMove 인터페이스를 implements 시킴으로써 형제 관계를 만들어주고, 추후에 이를 이용하여 타입을 제한할 수 있게 하였다.
  • 디커플링(decoupling)
    인터페이스 타입으로 객체를 생성하고 조회함으로써 객체간 의존도가 낮아져 변경에 자유로운 코드가 된다.
  • 동시 작업 가능
    만약, A 클래스와 B 클래스의 의존관계가 직접적으로 설정돼 있다고 가정하면, A를 모두 구현해야 B를 구현할 수 있겠지만,
    인터페이스를 활용하여 두 클래스의 의존관계를 간접적으로 설정해주면, A와 B는 서로의 구체적인 구현은 몰라도 인터페이스를 통해 독립적으로 개발이 가능하다.

인터페이스를 자료형처럼 사용하기


인터페이스 타입에 자식 타입을 넣어 사용하여 다형성을 이용할 수 있다.

**참고 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4Interface%EC%9D%98-%EC%A0%95%EC%84%9D-%ED%83%84%ED%83%84%ED%95%98%EA%B2%8C-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC#%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4_%EC%83%81%EC%88%98_%ED%95%84%EB%93%9C_%EC%83%81%EC%86%8D_%EA%B4%80%EA%B3%84

profile
Record What I Learned

0개의 댓글