본문 바로가기
프로그램/JAVA, Spring

JAVA Interface란?

by 게맛쌀 2021. 6. 30.
728x90
반응형

기본적으로 추상 메서드의 모음이다.
인터페이스는 interface키워드를 통해 선언할 수 있으며 implements키워드를 통해 일반 클래스에서 구현할 수 있다. Java8 이전 버전에서는 상수, 추상 메서드만 선언이 가능하지만, 그 이후로 디폴트 메서드, 정적 메서드가 추가되었다.

개요
객체 지향 개발 5대 원칙 - SOLID를 만족 시켜 줄 수 있는 것이 자바 인터페이스이다.
그렇다면 왜 SOLID를 만족시켜야하는가에 대한 질문을 가질 수 있다.

서비스 애플리케이션의 라이프사이클을 설계/개발/유지보수 세 단계로 나누면 유지보수가 소프트웨어 라이프 사이클에서 가장 큰 부분을 차지하고 있다. 유지보수에서 interface는 SOLID를 구현하고, 객체 지향 개발을 하는데 큰 도움을 준다.

설계/개발/유지보수 관점에서 객체 지향을 설명하면, 다음과 같은 장점이 있습니다.
- 객체 지향 사용하여, 대상을 추상화를 하고, 추상화된 대상의 행동을 묘사하면서, 설계를 쉽게 할 수 있게 합니다.
- 설계가 끝나고, 개발하게 되는데 개발자는 설계된 추상화 객체 단위로 쉽게 대상을 이해할 수 있습니다. 
- 개발이 완료되고 유지보수를 하면, 기존 코드와 로직을 그대로 두고, 새로운 기능을 유연하게 추가할 수 있습니다.

역할
- 객체를 어떻게 구성해야 하는지 정리한 설계도.
극단적으로 동일한 목적 하에 동일한 기능을 보장하게 하기 위함(개발자 사이의 코드 규약)
- 객체의 교환성(또는 다형성)을 높여줌 
자바의 다형성을 개발코드 수정을 줄이고 유지보수성을 높임.(여러 구현체에서 공통적인 부분 추상화)
- 변수에 인터페이스가 구현된 서로 다른 구현 객체를 할당해서 사용이 가능
- 구현 객체를 직접 몰라도 인터페이스 메서드만 알아도 객체 호출이 가능
- 객체가 인터페이스를 사용하면 인터페이스 메서드를 반드시 구현해야 하는 제약을 함.
다형성은 상속받은 클래스 또는 인터페이스의 메서드를 재정의하여 서로 다른 행동을 만들 수 있다. 상속을 통해 상위 클래스의 타입으로 통일한 후 하위 클래스들을 하나의 타입으로 관리할 수 있다. 이를 사용해서 변경에 유연한 코드를 만들 수 있다.


특징
- 다중상속이 가능하다. 인터페이스 사이에서도, 구체 클래스에서도 여러 인터페이스를 구현 및 상속할 수 있다. 

인터페이스와 상속의 차이
다형성을 활용하기 위해서는 기본적으로 클래스 상속과 인터페이스 구현으로 나뉜다. 이를 선택하는 것은 전적으로 개발자의 몫이다. 이 판단을 도와주는 일반적인 기준은 다음과 같다.

- 상속보다는 위임을 사용해라
- 다형성을 위한 것이라면 클래스 상속보다는 인터페이스를 구현하라.

위를 보면 대부분 상속을 추천하지 않는다. 왜냐하면, 그 비용이 큰 작업이기 때문이다. 변하지 않는 구조에서 상속을 사용하면 중복 코드를 제거하고 깔끔하게 코드를 작성할 수 있지만, 변화가 발생하는 순간 상속 구조는 깨지기 쉽다. 상속은 기본적으로 Is-A관계가 확실하고, 설계 이후에 변화가 없는 곳에서 사용해야 한다. 하지만 현실은 설계 이후에도 기능 변화가 비일비재하다. 그래서 대부분 인터페이스를 사용한다.

인터페이스의 구현은 Can-Do 관계라고 말할 수 있다. 어떤 기능을 할 수 있다고 명세를 해주는 것이다. 위 상속 문제에서 일부 자식 클래스에서는 필요하고, 일부에서는 필요하지 않는 기능이 있다고 했다. 이러한 기능들은 설계 이후에 생기는 경우가 빈번하다. 이와 같은 구조를 쉽게 만들 수 있는 것이 인터페이스이다.


default접근 제어자
Java8 이상부터는 인터페이스에서 default 접근 제어자를 사용할 수 잇게 되었다. 이는 인터페이스 내에서 직접 메서드를 구현한다는 의미의 접근 제어자이다. 이를 구현한 구체 클래스는 오버라이딩없이 이 default 메서드를 사용할 수 있고, 오버라이딩 역시 할 수 있다. 

이로 인해 다중 상속일 떄 고려해야 할 사항이 많아지는 등 복잡했다. 하지만 이를 만든 주된 이유는 라이브러리 업데이트 때문이다. 인터페이스는 라이브러리나 프레임워크에서 매우 자주 사용된다.. 라이브러리를 업데이트할 때 인터페이스에 추가된 기능이 있다면 이를 구현한 클래스 역시 추가해주어야 한다. 하지만 이 라이브러리를 사용하는 사용자가 해당 인터페이스를 구현한 클래스가 있다면 이를 구현하지 않아 컴파일 에러가 발생할 것이다. 이러한 심각한 불편함을 해소하기 위해 default라는 키워드를 만들었다고 한다. 

예시
Public interface 인터페이스명 {
//상수 : 인터페이스에서 값을 정해줄테니 함부로 바꾸지 말고 제공해주는 값만 참조(절대적)
타입 상수명 = 값 ;

//추상 메소드 : 가이드만 줄 테니 추상 메서드를 오버라이팅해서 재구현(강제적)
타입 메소드명(매개변수, …) ;

//디폴트 메서드 ; 인터페이스에서 기본적으로 제공해주지만, 맘에 안 들면 각자 구현 (선택)
Default 타입 메소드명(매개변수, …){
//구현부
}

//정적 메소드 : 인터페이스에서 제공해주는 것으로 무조건 사용(절대적)
Static 타입 메서드명(매개변수)[
//구현부
}
}
절대적 : 아무것도 변경 불가능을 의미한다.
강제적 : 인터페이스를 implements하지 않으면 사용하지 않음을 의미한다.


정리
인터페이스는 추상메소드와 상수를 통해 강력한 강제성을 가지게 하며 인터페이스를 implements 한 클래스가 동일한 동작을 수행하도록 보장한다. java8부터 디폴트 메서드를 허용하면서 추가요건에 대한 대처를 할 수 있도록 유연성을 확보해줌

반응형

'프로그램 > JAVA, Spring' 카테고리의 다른 글

LOG4J란?  (0) 2021.07.09
Servlet란?  (0) 2021.07.07
PuTTY 한글깨짐 오류  (0) 2021.07.02
PuTTY란?  (0) 2021.07.01
WinSCP란?  (0) 2021.06.29

댓글