본문 바로가기

참고자료

JAVA - 추상메소드와 추상클래스 그리고 인터페이스는 왜 쓰는걸까?

추상메소드

클래스 내에서 추상메소드가 있고 이 클래스를 상속할 때 추상메소드를 반드시 재정의 해서 쓴다.

 

추상클래스

abstract 키워드로 선언한 클래스이다. 

추상 메소드가 있는 경우와 없는 경우가 있다.

추상 클래스는 인스턴스를 생성할 수 없다. 추상클래스는 인스턴스 생성의 목적이 아니다. 상속이 목적이다.

상속할 때 추상클래스가 되지 않으려면 모든 추상 메소드를 전부 다 구현해야한다.

 

인터페이스

상수와 추상메소드의 집합이다. 객체화가 불가능하며 인터페이스 내의 메소드는 public abstract 상태이다.

컴파일시 자동으로 생성해준다.  default 키워드를 사용해 공통적인 코드를 정의할 수도 있다.

 

사용하는 이유

다형성과 다형성을 통한 낮은 결합도와 높은 응집도를 추구하는 것으로 귀결된다.

추상클래스는 설계와 구현을 분리할 수 있기 때문에 사용한다.

추상클래스는 팩토리 메소드 패턴과도 관련이 있다.

팩토리 메소드 패턴은 인스턴스 생성을 서브클래스에게 맡기는 형태이다.

때문에 실질적인 클래스 정의는 서브클래스가 하게 된다.

서브클래스에게 인스턴스 생성을 맡기기 때문에 상속을 강제한다고도 볼 수 있다.

이렇게 강제함으로써 표준화, 공통화 정도를 높인다.

또한 공통된 사항이 상위 클래스에 정의되어 있어 개발과 유지 보수가 좀 더 용이하다.

 

인터페이스를 사용하는 이유는 무엇일까

추상클래스는 확장에는 용이해도 필연적이 부모 - 자식 의 관계가 성립된다. 즉 결합도가 높아진다.

이 때 부모의 모든 메서드를 필요 여부와는 상관없이 상속되기 때문에 의도치 않은 버그도 생길수 있고

그로 인한 유지 보수에 대한 노력이 더 필요해진다.

인터페이스는 구체적인 클래스를 사용하지 않기 때문에 보다 유연하다. 여기서 말하는 유연함이란 

정의와 교체가 쉽다는 것이다. 또 한클래스가 다중의 인터페이스를 구현할 수도 있다.

 

스프링에서 인터페이스는 Open Closed Principal 에 기반한 패턴을 사용하기 위해서 사용된다.

스프링의 컨트롤러는 인터페이스만 바라보고 있는다. 실제 구현 클래스는 런타임 시점까지는 알지 못한다.

애당초 실체 클래스의 내용에 관심도 없다. 인터페이스 내부에 있는 메소드를 이용해 로직을 구성하기 때문이다.

즉, 스프링은 인터페이스만 보기 때문에 다형성을 이용해 개발자가 정의하면 된다. 그 이후에 객체에 대한 관리는 개발자가 아니라 스프링이 해준다. 어찌보면 이것이 제어의 역전의 요약이다. 개발자가 제어해야 할 객체를 스프링이 해주는 것이다.

 인터페이스의 사용은 최대한 기능별로 클래스를 분리시키기 위해서이다. 이렇게 분리될 경우 최소한의 수정으로 유지보수를 할 수 있다. 또 고객에게 서비스를 제공할 때 고객이 선택적으로 커스터마이징을 할 때도 유용하다. 본래의 비즈니스로직은 숨기고 그 외의 부분을 사용자가 선택적 확장을 할 수 있게 하는 것이다. 

 

 

 

 

 

 

 

 

'참고자료' 카테고리의 다른 글

쿠키, 세션, 캐시  (0) 2021.07.06
프로세스와 스레드란?  (0) 2021.07.03
객체와 클래스  (0) 2021.07.01
자바의 특징은 무엇일까  (0) 2021.06.30
aws 기초  (0) 2021.06.11