Java
[Java] 추상화 & 인터페이스
GenieLove!
2022. 9. 19. 00:26
728x90
반응형
추상화
클래스 정의 시, 불필요한 부분들을 생략하고 객체의 속성 중 중요한 것에만 중점을 두어 개략화 하는 것
공통된 특징을 묶어 하나의 클래스로 정의하는 것
특징
- 다중 상속이 불가능
- 추상클래스에서 일반 메소드도 같이 사용이 가능하다.
추상 메소드
자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드
추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위해 사용한다.
- 접근지정자 abstract 리턴타입 메소드명();
추상 클래스
하나 이상의 추상 메소드를 포함하는 클래스
- 추상 클래스에서 일반 메소드도 같이 사용이 가능
- 추상 클래스는 객체를 생성할 수 X
- 추상 클래스를 상속 받은 자식 클래스는 무조건 추상 메소드를 오버라이딩 해야 하는데 -> 안 하려면 자식 클래스도 추상 클래스로 선언하면 된다.
인터페이스
모든 기능을 추상화로 정의만 하고 구현은 하지 않는 것
인터페이스를 구현하는 클래스에서 인터페이스에서 본문을 구현하지 않은 추상 메소드는 반드시 오버라이딩이 필요
특징
- 실제 구현된 것이 전혀 없는 기본 설계도
- 인터페이스는 인터페이스끼리만 상속이 가능하다.
- 다중 구현이 가능하다.(implements interface1, interface2, ...)
- 일반 메소드 사용 X
필드 선언
컴파일 시 선언이 없어도 public, static, final 제어자가 컴파일 시 자동으로 추가된다.
public interface Phone {
int MIN_SIZE = 1;
int MAX_SIZE = 10;
}
⬇️
public interface Phone {
public static final int MIN_SIZE = 1;
public static final int MAX_SIZE = 10;
}
메소드 선언
- 본문 구현 X
- 컴파일 시 선언이 없어도 public abstract 제어자가 자동으로 추가
public interface Phone {
public String getName();
public void setName(string name);
}
⬇️
public interface Phone {
public abstract String getName();
public abstract void setName(string name);
}
default 메소드 선언
- 자바 8부터 본문을 가질 수 있는 메소드가 인터페이스에 존재할 수 있다.
- 인터페이스를 사용하는 모든 클래스에서 공통으로 갖는 기능을 구현할 목적으로 사용
- public 접근 제한자는 생략 시 자동으로 추가
- 상속은 단일 상속 밖에 되지 않지만, 인터페이스는 여러개 구현할 수 있기 때문에 default 메소드를 지원
public default void setLogin(boolean login) {
if (login) {
System.out.println("로그인이다");
else {
System.out.println("로그아웃이다");
}
}
static 메소드 선언
- 자바 8에서 추가
- 프로그램 시작 시 메모리에 사용될 준비 완료되어 인스턴스 생성과 상관없이 바로 사용 가능
- public 접근 제한자 생략 시 자동 추가
- 해당 인터페이스를 구현하고 있는 모든 객체에서 자주 사용하는 유용한 기능을 제공
- 인터페이스명.메소드명();
private 메소드 선언
- 자바 9에서 추가
- 동일한 인터페이스에서 선언된 default 메소드에서만 사용할 목적으로 본문을 구현하는 메소드
추상 클래스 VS 인터페이스
공통점
- 추상 메소드를 가지고 상속, 구현하는 클래스에서 추상 메소드를 구현하도록 강제한다.
- 인스턴스화가 불가능
차이점
추상클래스
- 추상 클래스를 상속할 각각의 객체들의 공통점을 찾아 추상화 시켜 놓은 것
- 부모 클래스가 가진 기능을 구현해야 할 경우 사용
- A는 B이다.
인터페이스
- 다른 부모 클래스를 상속하더라도, 같은 기능이 필요할 때 사용
- 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용
- 생성자가 없다.
- A는 B를 가지고 있다.
사용 케이스
추상클래스
- 관련성이 높은 클래스 간에 코드 공유를 하고 싶을 때
- 추상 클래스를 상속 받을 클래스들이 공통으로 가지는 메소드와 필드가 많거나, public 이외의 접근자인 protected, private 선언이 필요한 경우
- non-static, non-final 필드 선언이 필요한 경우(인터페이스는 자동으로 추가되기 때문에)
인터페이스
- 서로 관련성이 없는 클래스들이 인터페이스를 구현해야 되는 경우
ex)Runnable, Comparable - 특정 데이터 타입의 행동을 명시하고 싶지만 어디서 행동이 구현되는지는 상관없을 때
- 다중 상속을 허용하고 싶을 때
728x90
반응형