Search
Duplicate

추상 클래스와 인터페이스

간단소개
자바에서 추상 클래스와 인터페이스는 무엇인지 간단하게 알아보자
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Java
Scrap
태그
객체지향 프로그래밍
9 more properties

추상 클래스와 인터페이스

추상 클래스
인터페이스

1. 추상 클래스(Abstract Class)

1) 추상 클래스(Abstract Class)

추상 클래스란 일반 클래스와 달리 인스턴스화가 불가능한 클래스이며, abstract 키워드를 붙여 선언한다. 문법적으로 이 키워드를 붙인 클래스는 하나 이상의 추상 메서드를 포함하고 있다고 설명할 수 있다.
추상 클래스를 사용하면 보다 구조적으로 객체를 설계하고, 프로그램의 유지보수성을 올려주며, 개방폐쇄원칙을 만족하도록 프로그래밍이 가능해진다.
추상화(abstraction)
추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다.
프로그래밍 언어에서 예를 들면, 우리는 기존 클래스들의 공통적인 요소들을 추출해 불필요한 부분들을 생략해 상위 클래스를 만들어 내는 것을 추상화라고 할 수 있다. 또한 우리가 어떤 클래스의 함수를 굳이 그 안의 동작을 이해하지 않더라도 호출해 사용하는 것도 추상화라고 볼 수 있다.
개방폐쇄원칙
객체의 확장은 개방적으로, 객체의 수정은 폐쇄적으로 대해야 한다는 원칙이다.
객체에 새로운 기능을 추가하거나 변하는 것은 가능하지만, 해당 기능의 코드를 건드리지 않도록 한다. 이를 통해 객체간의 의존성을 낮추어 코드 변경이 불러오는 영향력을 줄일 수 있다.
// 추상 클래스 public abstract class abstractClass { public int test1() { return 5; } // 추상 메서드 public abstract int test2(); }
Java
복사

2) 추상 메서드(Abstract Method)

추상 메서드는 abstract 키워드를 붙여 선언한 메서드를 말한다. 이 메서드는 구현부는 존재하지 않고, 이 추상 메서드를 포함한 클래스인 추상 클래스를 상속받는 자식 클래스가 상황에 맞게 적절히 재정의 하여 구현해 주어야함을 의미한다.
abstract 반환타입 메서드이름();
Java
복사

2) 훅 메서드(Hook Method)

추상 클래스를 사용하는 디자인 패턴인 템플릿 메서드 패턴에서는 훅 메서드라는 개념이 등장한다. 훅 메서드는 문법적으로만 보면 일반 메서드와 다르지 않다. 다만 기본적인 내용만 구현되어있거나, 아무 코드도 들어 있지 않은 메서드이다. 이 메서드는 자식 클래스에서 재정의 해서 사용할 수 있도록 의도한 있는 메서드 이지만 추상 메서드가 아니므로 필요하지 않다면 재정의 하지 않아도 된다.
개인적인 주관으로는 템플릿 메서드에서 개념적으로 메서드들을 구분하기 위해 들여온 개념으로 생각된다. 혹시 훅 메서드 개념이 등장한 배경에 대해 아시는 분은 댓글 등으로 알려주시길..

2. 인터페이스(Interface)

1) 인터페이스(Interface)

JAVA에서는 다중 상속을 지원하지 않는다. 하지만 다중 상속에도 다양한 동작을 수행할 수 있다는 장점이 있으므로 이를 위해 인터페이스를 제공하고 있다.
인터페이스의 모든 필드는 public static final이어야 하며, 모든 메소드는 public abstract이어야 한다. 접근자와 키워드들을 생략하면 자바 컴파일러가 자동으로 키워드들을 붙여 컴파일 하게 된다.
public interface ITest { public static final int value = 0; public abstract test1(); public abstract test2(); }
Java
복사

2) 디폴트 메서드(Default Method)

위에서 인터페이스의 모든 메서드는 추상 메소드여야 한다고 했지만, JAVA8에서부터 디폴트 메서드가 등장했다.
디폴트 메서드는 일반 메서드처럼 구현부를 작성할 수 있어 인터페이스를 구현하는 클래스가 이 메서드를 재정의하지 않아도 기본적인 동작을 수행할 수 있게 해준다.
디폴트 메서드가 아닌 A라는 인터페이스를 구현하는 클래스가 100개 있다고 했을 때, A 인터페이스에 새로운 추상 메서드가 생기면 100개의 클래스 모두에서 이를 구현해 주어야 한다. 하지만 디폴트 메서드로 새로운 메서드를 추가한다면 100개의 클래스 모두에서 새 메서드를 구현할 필요가 없어진다.
public interface ITest { public static final int value = 0; public abstract test1(); public abstract test2(); public default void defaultTest(boolean isSucceeded) { if(isSucceeded) { System.out.println("Test success"); return; } System.out.println("Test failed"); } }
Java
복사

2) 추상 클래스와 다른 점

인터페이스와 추상 클래스를 알게 되고, 가장 먼저 들었던 의문점은 ‘그러면 코드를 설계할 때 둘의 구분을 어떻게 해야할까?’ 였다. 인터페이스도 구현부의 작성이 가능하게 되었으므로 이 둘에대한 차이점이 뭘까를 더 고민하게 되었다.

- 기능의 차이

추상 클래스
인터페이스
사용 키워드
abstract
interface
사용 가능 변수
제한 없음
static final (상수)
사용 가능 접근 제어자
제한 없음 (public, private, protected, default)
public
사용 가능 메소드
제한 없음
abstract method, default method, static method, private method
상속 키워드
extends
implements
다중 상속 가능 여부
불가능
가능

- 사용의도의 차이

추상클래스는 IS - A "~이다".
인터페이스는 HAS - A "~을 할 수 있는".
이렇게 둘을 구별해 사용한다는 내용이다. 사람은 동물이다. 사람은 생각할 수 있다. 를 예로 들어보자.
public abstract class Animal { ... }
Java
복사
public interface IThinkable { ... }
Java
복사
public class Human extends Animal implements IThinkable { ... }
Java
복사
위와 같이 이들의 관계를 표현할 수 있는 것이다.
참고한 사이트