GitHub 자세히보기

Programming/JAVA

[JAVA] 추상클래스, 추상메소드, 인터페이스의 개념과 연관성 알아보기!

devdange 2022. 1. 12. 00:09

안녕하세요! 데브당에입니다.

오늘은 JAVA에서 중요한 개념인 추상클래스, 추상메소드와 인터페이스에 대해 알아보려합니다.

들어가며

추상클래스, 인터페이스라는 개념이 낯설 수 있습니다.

각 각의 사전적 정의에 대해 먼저 알아보겠습니다.

 

추상이란?
사물을 정확하게 이해하기 위해서는 사물이 지니고 있는 여러 가지 측면 가운데서 특정한 측면만을 가려내어 포착하는 것이다. 어떤 일면만을 추상하는 것은 다른 측면을 버린다는 것과 같다. 

 

인터페이스란?
서로 다른 두 개 이상의 독립된 컴퓨터 시스템 구성 요소 간에 정보를 교환하는 공유 경계(shared boundary)

 

 

추상클래스(Abstract Class) 및 추상메소드(Abstract Method)

쉽게 생각하자면, 추상클래스는 구현부가 작성되지 않은 메서드(추상 메소드)를 갖는 완성되지 않은 클래스라고 볼 수 있습니다. 자식클래스에서 추상메소드를 구현하도록 유도하여 클래스별로 메서드가 작성되도록 합니다. 이를 통해 프로그램의 안정성을 향상 시킬 수 있습니다.  

 

추상메소드는 자손클래스에서 반드시 재정의해서 사용되기 때문에 조상의 구현이 무의미한 메소드입니다.

 

구현방법

  • 추상메소드가 되는 메서드의 선언부만 남기고 구현부는 세미콜론(;)으로 대체
  • 구현부가 없다는 의미로 abstract 키워드를 선언부에 추가
  • 객체를 생성할 수 없는 클래스라는 의미로 클래스 선언부에 abstract 추가
// 추상메소드를 갖고 있기 때문에 Phone은 추상클래스로 정의됨
abstract class Phone {
	private String name, model, serialnum;
    
    // 전화를 거는 것은 Phone의 공통된 기능
    public void call(){
    	System.out.print("Call using " + model ); 
    }
    
    /**
    * 각 Phone마다 충전방식이 다르다(C타입, 5핀 등..)
    * chargePhone() 함수를 추상메소드로 작성하여 
    * 자식클래스(iPhone, Galaxy 등)에서 강제로 구현할 수 있도록 유도한다.
    **/
    public abstract void chargePhone()
}

 

추상클래스는 상속 전용의 클래스로, 클래스에 구현부가 없는 메서드가 있으며 객체를 생성할 수 없습니다. 또한 조상클래스에서 상속받은 추상메소드를 재정의하지 않은 경우에는, 클래스 내부에 추상메소드가 있는 상황이므로 자식클래스는 추상클래스로 선언되어야합니다.

 

인터페이스(Interface)

인터페이스란?
클래스들이 구현해야 하는 동작을 지정하는데 사용되는 추상 자료형
인터페이스는 최고 수준의 추상화 단계로, 모든 메서드가 abstract 형태

 

작성

  • 클래스와 유사하게 interface 선언
  • 모든 멤버변수는  "public static final" 로 작성, 생략가능
  • 모든 메서드는 "public abstract"로 작성, 생략가능

 

상속

  • 인터페이스도 extends 를 이용하여 상속
  • 클래스와 다른 점은 다중상속 가능
public interface myInterface extends devInterface{
    //멤버변수
    public static final int dev = 10;	
    int dange = 15;//생략
    
    //메소드
    public abstract void method1(int a);
    void method2(int b);//생략
 }

 

 

구현과 객체참조

  • 클래스에서 implements 키워드를 사용해서 interface 구현
  • implements한 클래스는 1) 모든 abstract 메서드를 override하여 구현하거나 2) 구현하지 않을 경우 abstract 클래스로 표시
  • 여러 개의 interface implements 가능
public class myClass implements myInterface {
    @Override
    public void method1(int a){
    	System.out.println("method1 : " + a);
    }
    
    @Override
    public void method2(int b){
    	System.out.println("method2는 " + b + "입니다");
    }
}

 

필요성

  • 구현의 강제로 표준화 처리
  • 인터페이스를 통한 간접적인 클래스 사용으로 손쉬운 모듈 교체 지원
  • 서로 상속읜 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장
  •  모듈 간 독립적 프로그래밍 가능 ➔ 개발기간 단축

 

default method

  • 인터페이스에 선언된 구현부가 있는 일반 메서드
  • 메서드 선언부에 default modifier 추가 후 메서드 구현부 작성하며 접근 제한자는 public으로 한정됨(생략가능)
필요성 
기존에 interface 기반으로 동작하는 라이브러리의 interface에 추가해야하는 기능이 발생
default 메서드는 abstract가 아니므로 반드시 구현해야할 필요는 없어짐

 

 

마무리

오늘은 추상클래스, 추상메소드 그리고 이를 활용한 인터페이스에 대해 알아보았습니다.

실제로 프로젝트를 구현하면서 interface 개념을 많이 활용하기 때문에 개념을 이해한다면 보다 체계적이고 효율적인 코드를 구현할 수 있을거라 생각합니다!