추상 클래스 및 인터페이스는 Java에서 추상화에 사용됩니다. 객체 지향 프로그래밍의 추상화는 최종 사용자로부터 구현 세부 사항을 숨기는 것을 말합니다.
추상화에서는 기능이 무엇인지 알 수 있지만 구현 방법은 알 수 없습니다.
각각을 살펴보고 왜 사용되는지 이해해 봅시다.
목차
추상 클래스
객체로 인스턴스화할 수 없고 추상 메서드가 있거나 없을 수 있는 클래스를 Java에서 추상 클래스라고 합니다. 추상 메서드는 선언할 때 구현 본문이 없는 메서드입니다.
추상 클래스 GraphicObject의 예 – 오라클
class 키워드 앞에 abstract 키워드를 지정하여 추상 클래스를 만들 수 있습니다.
abstract class abstractClass { void run() { System.out.println("ran"); } }
추상 클래스는 다른 클래스에 의해 확장될 수 있습니다. 즉, 하위 클래스로도 분류할 수 있습니다.
abstract class AbstractClass { void run() { System.out.println("ran"); } } class ExtendingAbstractClass extends AbstractClass { void newMethod() { System.out.println("new"); } @Override void run() { System.out.println("override"); } }
추상 클래스는 주어진 추상 클래스를 확장하는 여러 클래스 간에 공통 메서드를 구현하는 데 사용됩니다. 또한 추상 클래스 내에서 추상 메서드를 정의하는 기능은 메서드가 유사하지만 구현이 다른 클래스에 매우 유용합니다. 예를 들어 보겠습니다.
출발, 정지, 후진 등과 같은 몇 가지 기능이 있는 자동차를 생각해 보십시오. 이러한 기능은 모든 유형의 자동차에서 공통적입니다.
하지만 자율주행과 같은 자동화 기능은 어떨까요? 이러한 기능의 구현은 자동차 유형에 따라 다를 수 있습니다. 이와 관련된 개체 지향 프로그램을 만드는 방법을 살펴보겠습니다.
먼저 다양한 자동차 유형의 여러 클래스로 확장될 Car 클래스를 만듭니다.
abstract class Car { void start() { // implementation System.out.println("runs car"); } void stop() { // implementation System.out.println("engine stops"); } void reverse() { // implementation System.out.println("reverse mode enabled"); } abstract void selfDrive(); }
start(), stop() 및 reverse() 메서드는 모든 자동차에서 공통적으로 사용되는 메서드입니다. 따라서 그들의 구현은 이미 Car 클래스 자체에 정의되어 있습니다. 그러나 특정 유형의 자동차는 자율 주행 모드의 구현이 다를 수 있습니다. 따라서 selfDrive()를 추상 메서드로 정의하고 다양한 유형의 자동차 클래스에서 다양한 방식으로 구현할 수 있습니다.
class CarTypeA extends Car { @Override void start() { super.start(); } @Override void stop() { super.stop(); } @Override void reverse() { super.reverse(); } void selfDrive() { // custom implementation System.out.println("Type A self driving mode enabled"); } }
class CarTypeB extends Car { // ...all similar methods void selfDrive() { // custom implementation // different implementation than CarTypeB System.out.println("Type B self driving mode enabled"); } }
하위 클래스가 추상 클래스에 정의된 모든 추상 메서드를 구현하지 않는 경우 하위 클래스 자체를 추상 클래스로 선언해야 한다는 점에 유의하는 것이 중요합니다.
상호 작용
인터페이스는 구현해야 하는 메서드를 클래스에 알려주는 방법입니다. 예를 들어, 자동차를 예로 들면 몇 가지 기본 기능이 있습니다. 시작, 이동 및 중지할 수 있습니다. 이러한 기능은 모든 자동차에 공통적입니다.
따라서 클래스에서 자동차의 인터페이스를 구현하는 경우 자동차가 적절하고 안전하게 작동하려면 모든 메서드를 구현해야 합니다.
추상 클래스와 마찬가지로 인터페이스의 개체를 인스턴스화하거나 만들 수 없습니다. 추상 메서드, 즉 구현 본문이 없는 메서드만 포함하기 때문에 완전한 추상 클래스로 간주될 수 있습니다.
interface 키워드를 사용하여 인터페이스를 생성할 수 있습니다.
interface CAR { void start(); void stop(); void move(); }
클래스를 정의할 때 implements 키워드를 사용하여 인터페이스를 구현합니다.
class CarTypeB implements CAR { public void start() { System.out.println("started"); } public void stop() { System.out.println("stopped"); } public void move() { System.out.println("running"); } }
유사성
개체로 인스턴스화하지 않는 것은 추상 클래스와 인터페이스가 공통적으로 갖는 한 가지입니다.
차이점
추상 클래스 인터페이스 상속 및 구현 클래스는 하나의 추상 클래스만 상속할 수 있습니다. 클래스는 여러 인터페이스를 구현할 수 있습니다. 변수 유형최종 변수, 비최종 변수, 정적 변수, 비정적 변수를 가질 수 있습니다. 정적 변수와 최종 변수만 가질 수 있습니다. 메서드 유형추상 메서드와 비추상 메서드를 모두 포함할 수 있습니다.추상 메서드만 포함할 수 있지만 정적 메서드는 예외입니다.액세스 한정자추상 클래스에는 액세스 한정자가 있을 수 있습니다.인터페이스에 정의된 메서드 시그니처는 기본적으로 공개됩니다. 인터페이스에는 액세스 수정자가 없습니다.생성자 및 소멸자생성자 및 소멸자를 선언할 수 있습니다.생성자 또는 소멸자를 선언할 수 없습니다.SpeedFastSlow추상 클래스와 인터페이스의 차이점
추상 클래스와 인터페이스는 언제 사용합니까?
다음과 같은 경우 추상 클래스를 사용합니다.
- 여러 클래스 간에 몇 가지 일반적인 메서드와 필드를 공유하려고 합니다.
- 바인딩된 개체의 상태를 수정하기 위해 비정적 및 비최종 필드를 선언합니다.
다음과 같은 경우 인터페이스를 사용할 수 있습니다.
- 인터페이스를 구현하는 클래스의 동작을 정의하고 싶지만 구현 방식은 신경 쓰지 않습니다.
- 클래스가 제대로 작동하기 위해 모든 메서드를 구현하는지 확인하려고 합니다.
마지막 말
인터페이스는 실제 구현에 대한 걱정 없이 기능을 구현할 수 있는 구조를 제공할 수 있기 때문에 주로 API를 만드는 데 사용됩니다.
추상 클래스는 일반적으로 코드를 더 재사용할 수 있도록 추상 클래스를 확장하는 여러 클래스 간에 공통 추상 및 비추상 메서드를 공유하는 데 사용됩니다.
Java 온라인 과정을 통해 Java에 대해 자세히 알아보세요. Java에 대한 인터뷰를 준비하고 있습니까? 다음은 객체 지향 프로그래밍에 대한 몇 가지 인터뷰 질문입니다.