[Java] 추상 클래스와 인터페이스

조혜은·2025년 6월 27일

Java

목록 보기
2/10

추상 클래스

  • 미완성 설계도. 템플릿.
  • 자바는 변수 추상화 x.
  • 추상 메서드를 포함하고 있는!
  • 인스턴스 생성 불가.
abstract class 이름 {}
  • 추상메서드를 포함한다는 점 외에는 일반 클래스와 다름 없음.

추상 메서드

  • 선언부만 구현하고 몸통은 구현x.
  • 미완성.
abstract 리턴타입 이름();

추상

  1. 공통추출
  2. 덜 구체적. 디테일 버리기.

추상클래스 안에 추상 메서드 작성 이유

  • 자손 클래스에서 추상 메서드 구현을 강요하기 위해서.
    • 만약 추상메서드가 아닌 그저 {}비어있는 메서드를 구현하면 자손 클래스에서 해당 메서드를 구현하는 것이 필수가 아니기 때문.
  • 이미 구현됐다 치고 호출이 가능함.

인터페이스

  • 얼굴 사이. 두 대상 사이.
  • 기본 설계도.
  • 다중 상속 가능
  • 추상 메서드와 상수만을 멤버로 가질 수 있음.
  • 인스턴스 생성 불가.
interface 이름 {
	public static final 타입 상수이름 =; // 모든 멤버변수는 public static final. 생략 가능.
	public abstract 메서드이름(매개변수들); // 모든 메서드는 public abstract. 생략 가능.
}

인터페이스 구현

  • 인터페이스 구현은 implements
  • 구현할 때 메서드 전부 구현해야 함.
    • 만약 일부만 구현한다면, 해당 클래스에 abstract을 붙여 추상클래스로 만들어야 함.

인터페이스를 이용한 다형성

Fightable f = (Fightable)new Fighter();
or
Fightable f = new Fighter();
// 인터페이스가 조상임.

// 매개변수의 타입으로도 사용 가능
void attack(Fightable f){ ... }
*Fightable은 구현한 클래스의 인스턴스만 가능.
  • 인터페이스 타입의 매개변수 - 해당 인터페이스를 구한 클래스의 객체를 제공
  • 인터페이스 타입의 반환타입 - 해당 인터페이스를 구현한 클래스의 객체를 반환

인터페이스의 장점

  1. 표준화가 가능
  2. 서로 관계 없는 클래스들에게 관계를 맺어줄 수 있음.
  3. 독립적인 개발 가능
  4. 개발 시간 단축

두 클래스 사이에 인터페이스를 두면 변경에 영향을 받지 않는다.

  • 만약 A클래스가 B클래스의 인스턴스를 생성하고 호출한다면, 둘은 서로 직접적인 관계가 있음. A - B
  • 이 경우, A를 작성하려면 B가 이미 작성되어 있어야 함.
  • B가 변경되면 A도 영향을 받음.
  • → 인터페이스를 사용! A - I - B 간접적 관계.
  • 서로 영향을 받지 않음.

추상 클래스 vs 인터페이스

  • 인터페이스는 iv가 없음
  • 인터페이스가 추상화 정도가 더 높음

인터페이스 변경

  • 인터페이스는 추상메서드 집합. 따라서 인터페이스 변경은?
    • 선언부 변경
    • 새로운 추상 메서드 추가

디폴트 메서드와 static 메서드

인터페이스에 메서드를 추가하게 되면 해당 인터페이스를 구현한 자손들이 모두 그 메서드를 구현해야함,,

→ 몸통이 있는 디폴트 메서드 추가가 가능해짐.

interface hi{
	void method();
	default void newMethod(){} // 디폴트 메서드. 몸통이 있음.
}

문제) 기존의 메서드와 이름이 중복되어 충돌할 수 있음.

해결 규칙

  1. 여러 인터페이스의 디폴트 메서드 간의 충돌
    • 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩.
  2. 디폴트 메서드와 조상 클래스의 메서드 간의 출돌
    • 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시됨.

0개의 댓글