추상클래스(Abstract class)와 인터페이스(Interface)

지윤·2021년 1월 13일
0

Java

목록 보기
1/21

추상클래스 (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 생략 가능하다. 컴파일 시에 자동으로 생성된다.
  • 인터페이스 네이밍 규칙이 있는데 보통 'xxxable' 형식이다.
  • 인터페이스는 다중상속을 지원하며, 구현체에 여러개의 인터페이스를 구현 가능하다. (implements a, b, c,,,) 추상메서드가 선언부만 있기 때문에 충돌을 일으키지 않는다.
  • 인터페이스의 조상은 인터페이스만 가능하며, 여러개의 인터페이스를 상속(extends) 받을 수 있다.
interface A extends B, C { }
interface B {
	void testB();
}
interface C {
	void testC();
}
  • 인터페이스를 구현하는 클래스가 일부만 구현할 경우 해당 클래스는 abstract를 붙여 추상클래스가 되어야 한다.

  • 디폴트 메서드(default method)를 지원하며, 이를 통해 기존 인터페이스 기능을 확장하고, 구현체에 공통적으로 들어갈 기능(코드)를 디폴트 메서드 내부에 작성함으로써 반복되는 코드의 작성을 줄일 수 있다.

인터페이스의 장점

  • 두 객체 간의 연결, 대화, 소통을 돕는 중간 역학을 한다.
  • 유지보수, 변경에 유리한 설계가 가능하다. (유연성)
  • 선언과 구현을 분리시킬 수 있게 한다.
  • 의존하는 클래스의 변경에 대해 영향을 적게 받는다. (느슨한 결합)
  • 개발 시간을 단축할 수 있다. 인터페이스를 이용하면 의존하는 클래스가 다 작성될 때까지 기다리지 않고 개발할 수 있다.
  • 표준화가 가능하다. 대표적으로 JDBC가 있다.
    - JDBC: 자바 프로그램에서 다른 기종 간의 데이터베이스를 표준화된 방법으로 접속할 수 있도록 만든 API 규격 => 다양한 데이터베이스가 있고, 이로 인해 애플리케이션에서 데이터베이스에 접속/데이터를 처리하는 방법이 각기 다른 것을 표준화 한 것
  • 서로 관계없는 클래스들 간에 관계를 맺어줄 수 있다. 상속 계층도에서 공통점을 찾기 어려울 때는 특정 클래스들을 선별해서 내용이 없는 인터페이스를 구현하게 하면 된다. 예를 들어 매개변수 타입으로 인터페이스를 사용하면 해당 인터페이스를 구현한 클래스만 올 수 있다. (다형성)

공통점

  1. 추상 메서드를 가지고 있다. (미완성 설계도)
  2. 상속을 이용하여 구현 가능하다.
  3. 자식 클래스에서 추상 메서드를 완성하도록 유도한다.

차이점

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

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

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


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

  • 인터페이스도 구현클래스의 부모 클래스가 된다.
  • 인터페이스 타입 매개변수는 인터페이스를 구현한 클래스의 객체만 가능하다.
  • 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.

추상클래스, 인터페이스의 적절한 사용 케이스

추상메서드

  • 자식클래스마다 다르게 구현될 것으로 예상되는 경우

추상클래스

  • 관련성이 높은 클래스 간에 코드를 공유하고 싶은 경우
  • 추상클래스를 상속받은 클래스들이 공통으로 가지는 메소드와 필드가 많거나, public 이외의 접근제어자 사용이 필요한 경우
  • non-static, non-final 필드 선언이 필요한 경우. 즉, 각 인스턴스에서 state 변경을 위한 메소드를 선언할 수 있다.

인터페이스

  • 서로 관련성이 없는 클래스들이 인터페이스를 구현하게 되는 경우에 사용한다. 예를 들어, Comparable, Cloneable 인터페이스는 여러 클래스들에서 구현되는데, 구현클래스들 간에 관련성이 없는 경우가 대부분이다.
  • 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지는 신경쓰지 않는 경우.
  • 다중상속을 허용하고 싶은 경우

final

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

구체적으로 나눈다면

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

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

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

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

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

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


참고
https://myjamong.tistory.com/150
https://yaboong.github.io/java/2018/09/25/interface-vs-abstract-in-java8/
https://medium.com/webeveloper/%EC%9E%90%EB%B0%94-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%99%80-%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4-6eecbe5d6350
https://o-jing.tistory.com/28

profile
헬로🙋‍♀️

0개의 댓글