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

이병수·2024년 1월 7일
0

Java

목록 보기
17/27
post-thumbnail
post-custom-banner

추상클래스와 인터페이스


추상클래스

추상클래스는 이름 그대로 추상적인 개념을 제공하는 클래스이다.

  • abstract 키워드를 사용하여 추상 클래스를 선언할 수 있다.
public abstract class 추상클래스명 {

}
  • 부모 클래스는 제공하지만, 실제 생성되면 안되는 클래스이며 따라서 실체인 인스턴스가 존재하지 않는다.

  • 추상 클래스는 추상 메서드를 포함할 수 있다.

  • 추상 클래스는 자식 클래스에 상속되어 자식 클래스에 의해서만 완성될 수 있다.

  • 추상 클래스는 여러개의 자식 클래스들에서 공통적인 필드나 메서드를 추출해서 만들 수 있다.

추상 메서드

부모 클래스를 상속 받는 자식 클래스가 반드시 오버라이딩 해야하는 메서드

  • 추상 메서드는 이름 그대로 추상적인 개념을 제공하는 메서드이다.

  • 따라서 실체가 존재하지 않고, 메서드 바디가 없다.

  • 추상 메서드는 선언할 때 메서드 앞에 추상이라는 의미인 abstract 키워드를 붙인다.

public abstract void sound();
  • 추상 메서드가 하나라도 있는 클래스는 추상 클래스로 선언해야한다.

    • 안그러면 컴파일 오류 발생

    • 추상 메서드는 메서드 바디가 없기에, 자식 클래스에서 직접 오버라이딩 하여 만들어야한다.

    • 그렇지 않으면 컴파일 오류가 발생한다.

추상 클래스 덕분에 자식 클래스를 만들 때, 실수로 오버라이딩 하지 않을 때의 문제를 근본적으로 방지할 수 있다.


순수 추상 클래스

모든 메서드가 추상 메서드인 추상 클래스

  • 상속 받은 자식들은 부모 클래스의 메서드를 다 오버라이딩 해야한다.

순수 추상 클래스의 특징

1. 인스턴스를 생성할 수 없다.

2. 상속시 자식은 모든 메서드를 오버라이딩 해야한다.

3. 주로 다형성을 위해 사용한다.

하지만 자바는 이런 순수 추상 클래스를 더 편리하게 사용할 수 있도록

인터페이스

라는 개념을 제공한다.



인터페이스

다른 클래스를 작성할 때, 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스

순수 추상 클래스

public abstract class Animal{
	public abstract void sound();
    public abstract void move();
}

인터페이스

public interface Animal{
	public abstract void sound(); // public abstract은 생략 권장
    public abstract void move();  // public abstract은 생략 권장
}

인터페이스 편의 기능

인터페이스는 순수 추상 클래스에서 편의 기능이 추가된다.

  • 인터페이스의 메서드는 모두 public, abstract이다.

  • 메서드에 public abstract을 생략할 수 있고 생략을 권장한다.

  • 인터페이스는 다중 구현(다중 상속)을 지원한다.

  • 인터페이스에서 멤버 변수는 public, static, final이 모두 포함되었다고 간주한다.

public interface Animal{
	public static final float MY_PI = 3.14; // public static final은 생략
}

인터페이스의 추상 메서드는 구현될 때 반드시 오버라이딩이 되어야 하고
만약 인터페이스의 추상 메서드를 일부만 구현해야 한다면 해당 클래스를 추상 클래스로 변경한다.


인터페이스 상속

인터페이스를 상속받을 경우 extends 대신 implements 라는 키워드를 사용해서 구현한다.

왜냐? -> 인터페이스는 말 그대로 메서드들이 모두 다 추상 메서드이기 때문에 자식 클래스에서 그 기능을 구현해야하므로

정리

클래스, 추상 클래스, 인터페이스는 모두 똑같다.

  • 클래스, 추상 클래스, 인터페이스는 프로그램 코드, 메모리 구조상 모두 똑같다.

  • 모두 자바에서 .class로 다루어진다.

  • 인터페이스를 작성할 때도 .java에 인터페이스를 정의한다.

  • 인터페이스는 순수 추상 클래스와 비슷하다고 생각하면 된다.


인터페이스를 사용해야 하는 이유

모든 메서드가 추상 메서드인 경우 순수 추상 클래스를 만들어도 되고, 인터페이스를 만들어도 되는데

왜 인터페이스를 사용해야할까?

  • 인터페이스를 만드는 이유는 인터페이스를 구현하는 곳에서 인터페이스의 메서드를 반드시 구현해라 라는 제약을 준다.

    • 인터페이스는 모든 메서드가 추상메서드로 무조건 기능을 구현해야하기 때문
  • 자바에서는 클래스 상속을 하나만 지정할 수 있다.

    • 인터페이스는 다중 상속이 가능하다.



참고 : 자바8에 default 메서드를 사용하면 인터페이스도 메서드를 구현할 수 있는데 권장 안함
(아주 예외적인 케이스에만 사용)


참고

profile
백엔드 개발자가 되고 싶어요
post-custom-banner

0개의 댓글