Computer Science/Java
추상 클래스와 인터페이스
aktnfl
2020. 10. 23. 18:13
추상 클래스
- 클래스는 일반 클래스(concrete class)와 추상 클래스로 나뉘는데 추상 클래스는 클래스 구현부 내부에 추상 메서드가 하나 이상 포함되거나 abstract로 정의된 경우를 말합니다.
- 클래스를 설계도라고 한다면 추상 클래스는 미완성 설계도라고 할 수 있습니다. 미완성 설계도란 말 그대로 덜 만들어진 설계도입니다.
- 클래스가 미완성이라는 것은 단지 미완성 메서드(추상 메서드)를 포함하고 있다는 의미입니다.
- 미완성 설계도만으로 온전한 상품을 만들 수 없듯이 추상 클래스만으로 객체를 생성할 수 없습니다. 추상 클래스는 상속을 통해 자식 클래스에 의해서만 완성될 수 있습니다. (추상 클래스는 추상 메서드를 선언하여 상속을 통해 자식 클래스에서 완성하도록 유도하는 클래스입니다.)
- 추상 클래스 자체만으로는 클래스로서의 역할을 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 부모 클래스로서 중요한 의미를 갖습니다.
- 추상 클래스의 특징
- 추상 클래스는 필드(멤버 변수), 생성자, 추상 메서드를 가질 수 있습니다.
- 추상 클래스는 new 연산자를 사용하여 객체를 생성할 수 없습니다.(인스턴스화할 수 없습니다.)
- 추상 클래스(부모)와 일반 클래스(자식)는 상속의 관계에 놓여 있습니다.
- 추상 클래스는 새로운 일반 클래스를 위한 부모 클래스의 용도로만 사용됩니다.
- 일반 클래스들의 필드와 메서드를 통일하여 일반 클래스 작성 시 시간을 절약할 수 있습니다.
- 추상 클래스는 단일 상속만 가능하며 일반 변수를 가질 수 있습니다.
- 추상 클래스는 동일한 부모를 가지는 클래스를 묶는 개념으로
상속을 받아서 기능을 확장
시키는 것이 목적입니다. - 추상 클래스에는 일반 메서드를 구현할 수 있습니다.
인터페이스
- 인터페이스는 모든 메서드가 추상 메서드인 경우를 말합니다.
- 인터페이스도 일종의 추상 클래스입니다. 인터페이스는 추상 클래스보다 추상화 정도가 높아서 구현부를 지닌 일반 메서드 또는 필드(멤버 변수)를 가질 수 없습니다. 오직 추상 메서드와 상수만을 구성원으로 가질 수 있습니다.
- 추상 클래스가 '미완성된 설계도'라고 한다면, 인터페이스는 오직 밑그림만 있는 '기본 설계도'라고 할 수 있습니다.
- 인터페이스의 특징
- 인터페이스는 추상 클래스보다 한 단계 더 추상화된 클래스라고 볼 수 있습니다.
- 인터페이스에 적는 모든 메서드들은 추상 메서드로 간주되기 때문에
public abstract
는 생략 가능합니다. - 기존에는 인터페이스에 일반 메서드를 구현할 수 없었지만, 자바8 버전부터
default
예약어를 통해 일반 메서드 구현이 가능해졌습니다.
- 인터페이스에 적는 모든 메서드들은 추상 메서드로 간주되기 때문에
- 인터페이스는 static final 필드만 가질 수 있습니다. 필드를 선언할 때는
public static final
이 생략되어 있다고 생각하면 됩니다.public static final
을 사용하는 이유- 구현 객체의 같은 동작을 보장하기 위한 목적
- 인터페이스의 변수는 스스로 초기화될 권한이 없음(변수의 값은 static context 내에 할당되어야 하는데, 이때는 아무 인스턴스도 존재하지 않는 시점이기 때문에)
- 인터페이스도 추상 클래스와 마찬가지로 new 연산자를 사용하여 객체를 생성할 수 없습니다.(인스턴스화할 수 없습니다.)
- 인터페이스는 구현 객체가
같은 동작을 한다는 것을 보장
하는 것이 목적입니다. - 인터페이스는 추상 클래스와 반대로 다중 상속이 가능합니다.
- 클래스끼리, 인터페이스끼리 상속을 할 때에는
extends
, 클래스가 인터페이스를 상속받을 때에는implements
키워드를 사용합니다.
- 인터페이스는 추상 클래스보다 한 단계 더 추상화된 클래스라고 볼 수 있습니다.
- 인터페이스의 장점
- 개발 시간을 단축시킬 수 있습니다.
- 개발자들이 각각의 부분을 완성할 때까지 기다리지 않고 서로 규약만 정해두어 각자의 부분만 따로 나눠서 작성된 코드를 컴파일할 수 있습니다.
- 표준화가 가능합니다.
- 클래스의 기본 틀을 제공하여 개발자들에게 정형화된 개발을 강요할 수 있습니다.
- 서로 관계없는 클래스들에게 관계를 맺어줄 수 있습니다.
- 코드의 종속성을 줄이고 유지보수성을 높이도록 해줍니다. 즉, 클래스들끼리의 쓸데없는 상속을 줄일 수 있습니다.
- 독립적인 프로그래밍이 가능합니다.
- 클래스와 클래스 간의 직접적인 관계를 인터페이스를 통해 간접적인 방법으로 변경하면 한 클래스의 변경이 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능합니다.
- 개발 시간을 단축시킬 수 있습니다.
- 인터페이스 사용 이유
- 클래스 간의 결합도를 줄일 수 있고, 이를 통해 유지보수성을 향상시킬 수 있습니다.
- 추상 클래스는 필드(멤버 변수)를 가질 수 있어서 코드를 봤을 때 보아야할 것들이 많지만, 인터페이스는 어떤 기능을 하는지 간략하게 볼 수 있기 때문에
코드의 가독성
이 높다.
추상 클래스와 인터페이스의 공통점
- 추상 클래스와 인터페이스는 선언만 있고 구현 내용은 없는 클래스입니다.
- new 연산자를 이용하여 객체를 생성할 수 없습니다.(인스턴스화할 수 없습니다.)
- 추상 클래스를
extends
로 상속받은 자식들과 인터페이스를implements
하고 구현한 자식들만 객체를 생성할 수 있습니다.
(결국 자식 클래스가 무언가 반드시 구현하도록 위임해야할 때 사용합니다.)
추상 클래스와 인터페이스의 차이점
- 추상 클래스는 다중 상속이 불가능하지만, 인터페이스는 다중 상속이 가능합니다.
- 추상 클래스의 목적은
상속을 받아서 기능을 확장시키는 것(부모의 유전자를 물려받는 것)
입니다. - 인터페이스의 목적은
구현하는 모든 클래스에 대해 특정한 메서드가 반드시 존재하도록 강제하는 역할(부모로부터 유전자를 물려받는 것이 아니라 사교적으로 필요에 따라 결합하는 관계)
입니다.
즉,구현 객체가 같은 동작을 한다는 것을 보장하기 위함입니다.