자바

[Java] 추상 클래스와 인터페이스 (Abstract class, Imterface)

juhoyang 2024. 10. 10. 16:56

추상클래스

- 높은 단계의 알고리즘을 적용한 클래스로 세부 정보는 상속 받은 클래스에 정의한다.

- 구현할 대상이 정형화된 필수적인단계를 가질 경우 기본 알고리즘을 정의하는 역할을 한다.

- 인스턴스를 직접만들수 없는 클래스로 해당 클래스를 상속받아 상세 내용을 만든다.

 

선언예시

 

AbstractCar.java

- go, stop메소드를 만들었지만 구성 내용을 제공하지는 않음

- 해당 메소드의 상세화는 상속받은 자식 클래스가 필수적으로 해야 한다.

 

구성하기

- 상속 받은 클래스를 선언 하면 바로 추상메소드를 오버라이드 하도록 에러가 뜬다. 

 

ElectricCar.java

- 위와같이 상속 받은 클래스로 메소드를 구체화 한다.

 

특징

 - 아래와 같이 추상 메소드 뿐만 아니라 일반 변수, 메서드도 사용가능

 

인터페이스

- 공통적으로 사용 가능한 행동들을 대표하는 것 -> 해당 행동들을 여러 클래스에게 제공한다.

- 프로젝트 협업시 인터페이스를 먼저 정의해 놓으면 외주를 주면서도 자신의 코드에 적용하고 싶을때 임의로 만들어 사용 가능하고 외주가 완성되면 해당 소스로 대체할 수 있다. -> 외부 인터페이스가 실제로 사용가능하지 않아도 작업 가능하도록 함 (소통하는 클래스간에 통신 규약)

- 인터페이스를 구현 함으로써 특정 클래스가 구현할 메소드가 무엇인지 기대할 수 있다.

 

예시)

ConsoleGame 인터페이스

 

상속 받은 RacingGame, MarioGame

- 인터페이스 하나에 여러 적용 방식을 구현할 수 있다. -> 다형성

 

특징

- 인터페이스 끼리 상속 가능하다. -> 상속받은 클래스는 모든 인터페이스의 메서드를 구현해야한다.

- 인터페이스 메서드 중 일부는 구현하기 싫다면? -> 추상클래스를 만들면 된다. (일부 구현 허용)

- 일반 변수를 선언하지 못하고 불변하는 상수는 생성 가능하다.

- 일반 메서드는 java 8부터 생성가능하다. -> 해당 메서드는 오버라이딩이 필수가 아니다. (인터페이스를 내가 제공하는데 다른 3자도 해당 인터페이스를 구현을 할때 에러가 나지 않도록 해준다.)

 

추상클래스 vs 인터페이스

용도 차이

인터페이스 : 두 시스템 사이에서 소통할 때 소통의 방식을 정한다

추상클래스 : 구현의 세세한 부분을 하위 클래스에 맡기고 싶을 때 사용하고 (인터페이스 보다 높은 단계의 상세한 구조를 제공) 

 

문법적 차이

인터페이스 : private선언 불가, 값이 변하는 일반 변수 사용불가, 다중 상속 가능

추상클래스 : 말그대로 클래스이기 때문에 일반 변수 가능, 단순이 일반 메서드의 구현이 없을 수 있을 뿐, 1:1 상속만 가능

 

다형성

객체의 속성 또는 기능이 상황에 따라 여러가지 형태를 가질 수 있는 성질

- 인터페이스를 구현한 객체를 실행시점에서 유연하게 변경할수 있다.

- 역할은 고정되어 있으면 구현은 어떤게 되어도 크게 상관없음 (같은코드에서 다른 행동양식을 보여줄수 있음)

- 인터페이스, 클래스 상속의 개념 모두 적용됨

 

예시

위 인터페이스 예시와 소스가 동일할 때

- 같은 참조변수에 같은 메소드를 실행하지만 다른 행동방식 적용가능