추상클래스 vs 인터페이스

Updated:

추상클래스 (IS - A)

abstract class 클래스이름 {
	pulic abstract void 메서드이름();
}

미완성 설계도, 미완성 메서드(추상 메서드)를 갖고 있는 클래스
필드, 생성자, 추상메서드로 구성

  • 클래스 또는 메소드 앞에 abstract를 붙여 추상클래스, 추상메서드를 만듭니다.

  • abstract class는 인스턴스를 생성할 수 없습니다. 그래서 반드시 서브 클래스가 있어야 합니다.

  • abstract class를 상속하는 하위 클래스는 부모클래스의 abstract 메소드를 반드시 구현해야 합니다. (오버라이딩)
    단, 추상 클래스를 상속받은 자식 클래스도 추상 클래스라면 abstract 메소드를 오버라이딩 하지 않고 또는 일부만 오버라이딩하고 하위 클래스에게 오버라이딩을 위임 할 수 있습니다.

  • 추상클래스 내에서 추상메서드를 호출할 수 있습니다. 호출할 때는 선언부만 필요하기 때문입니다.

  • abstract 메소드가 하나 이상 존재하면 abstract class로 명시해야 하지만, abstract 클래스가 반드시 abstract 메소드를 가질 필요는 없습니다.

  • 대체로 abstract은 메소드와 연관이 크고 멤버 변수와는 상관이 없습니다.

  • final과는 반대의 개념으로 두가지를 동시에 사용할 수 없습니다. final은 아래 참고

인터페이스(HAS - A)

interface class 인터페이스이름 {
	public static final 상수이름 = ;
	pulic abstract void 메서드이름();
}

추상 메서드의 집합
구현된 것이 전혀 없는 설계도
상수, static 메서드, default 메서드, 추상 메서드로 구성

  • public static final 과 public abstract 생략 가능하다. 컴파일 시에 자동으로 생성됩니다.
  • 인터페이스는 다중상속을 지원하며, 구현체에 여러개의 인터페이스를 구현 가능합니다. (implements a, b, c,,,) 추상메서드가 선언부만 있기 때문에 충돌을 일으키지 않습니다.
  • 인터페이스의 조상은 인터페이스만 가능하며, 여러개의 인터페이스를 상속(extends) 받을 수 있습니다.
interface A extends B, C { }
interface B {
	void testB();
}
interface C {
	void testC();
}
  • 디폴트 메서드(default method)를 지원하며, 이를 통해 기존 인터페이스 기능을 확장하고, 구현체에 공통적으로 들어갈 기능(코드)를 디폴트 메서드 내부에 작성함으로써 반복되는 코드의 작성을 줄일 수 있습니다.

공통점

  1. 추상 메서드를 가지고 있습니다. (미완성 설계도)

  2. 상속을 이용하여 구현 가능합니다.

  3. 자식 클래스에서 추상 메서드를 완성하도록 유도합니다.

차이점

  1. 추상클래스는 인스턴스 변수 및 메서드, 생성자를 가질 수 있지만, 인터페이스는 추상메서드만 가질 수 있습니다.

  2. 모두 추상메서드를 사용할 수 있지만, 사용용도가 다릅니다.

보통 클래스의 구분은 추상클래스 상속을 통해 해결하며, 할 수 있는 기능들은 다중 상속이 가능한 인터페이스로 구현합니다.

final

final은 해당 entity가 오로지 한 번 할당될 수 있음을 의미

구체적으로 나눈다면

  • final 변수 -> 해당 변수가 생성자나 대입연산자를 통해 한 번만 초기화 가능

  • final 클래스 -> 상속 불가능 왜? 잘못 사용하면 절대 안 되는 경우를 막기 위함 예를 들면, String Class는 public final class String으로 정의 되어있으며, String으로 파생되는 클래스는 절대 만들 수 없습니다. private 메소드도 동일하게 동작합니다.

  • final 메소드 -> 오버라이딩(재정의) 불가능 왜? 고쳐서 사용하면 절대 안되는 경우를 막기 위함

final 멤버 변수에 static을 함께 사용하는 이유는?

static은 해당 데이터의 메모리 할당을 컴파일 시간에 할 것임을 의미

클래스에서 사용할 해당 멤버 변수의 데이터와 그 의미, 용도를 고정시키기 위함 모든 인스턴스에서 고정된 값을 동일하게 사용한다면 인스턴스가 생성될 때 마다 새로 메모리를 잡아서 초기화 시키지 않고 클래스 레벨에서 한 번만 잡아서 하나의 메모리 공간을 사용하면 되기 때문입니다.

Tags:

Categories:

Updated:

Leave a comment