본문 바로가기

책 공부/자바의 신

interface 와 abstract class

반응형

interface 와 abstract class

 

interface 와 abstract class를 사용하는 이유

  • 설계시 선언해 두면 개발할 때 기능을 구현하는 데에만 집증할 수 있다.
  • 개발자의 역량에 따른 메소드의 이름과 매개 변수 선언의 격차를 줄일 수 있다.
  • 공통적인 인터페이스와 abstract class를 선언해 놓으면, 선언과 구현을 구분할 수 있다.

interface

 

interface안에는 몸통이 없는 메소드가 선언되어 있다.

public boolean equals(Object o);

interface 정리

  • interface는 몸통이 있으면 안된다. (메소드 선언 후 중괄호를 열고, 닫거나, 중괄호 안에 한 줄의 코드도 있으면 안된다.)
  • interface는 static이나 final 메소드가 선언이 불가능 하다.

 

interface 구현

public interface MemberDAO{
	
    public boolean addMember(MemberDto member);
    public boolean removeMember(MemberDto member);

}

class에 implements로 interface를 구현했다면 반드시 class안에 override를 통해서 interface안에 구현된 부분의 body부분을 추가해야한다. 

public class MemberMangerImpl implements MemberDAO{

    @Override
    public boolean addMember(MemberDTO member){
    	// body 구현
        return true;
    }
	
    @Override
    public boolean removeMember(MemberDTO member){
    	// body 구현
        return false;
    }
}

 

반대로 abstract class로 구현한 상태에서는 선택적으로 구현이 가능하다.

abstract class AbstractClass {
    abstract void abstractMethod();
    
    void regularMethod() {
        System.out.println("Regular method in abstract class");
    }
}

class ConcreteClass extends AbstractClass {
    void abstractMethod() {
        System.out.println("Implementation of abstract method");
    }

    // regularMethod를 오버라이딩하지 않아도 됨
}

 

위의 코드처럼 abstract가 붙은 method는 반드시 상속해야하지만 abstract가 없는 일반 method는 오버라이딩을 하지 않아도 괜찮아서 선택적으로 사용이 가능하다. 대신 abstract class는 extend로 단일 상속이지만 implement는 다중 상속이 가능한 차이점도 존재한다.

 

정리
설계 단계에서 인터페이스만 만들어 놓고, 개발 단계에서 실제 작업을 수행하는 메소드를 만들면 설계 단계의 산출물과 개발 단계의 산출물을 보다 효율적으로 관리할 수 있다. (외부에 노출되는 것을 정의하기 위해 사용)

 

abstract class

 

abstract class는 선언시 class 앞에  abstract라는 예약어를 사용하며, 몸통이 없는 메소드 선언문에도 abstract라는 예약어를 사용한 것을 볼 수 있다. abstract class는 abstract로 선언한 메소드가 하나라도 있다면 class선언 부에서 abstract를 붙여야 한다.

abstract class는 자바에서 마음대로 초기화하고 실행할 수 없도록 되어 있다. abstract class는 구현해 놓은 클래스로 초기화 및 실행이 가능하다.

public abstract class MemberAbstract{

    public abstract boolean addMember(MemberDTO member);
    public abstract boolean removeMember(MemberDTO member);
    public void printLog(String data){
       System.out.println("Data= " + data);
    }
    
}

 

abstract class 정리

  • abstrcat class는 클래스 선언시 abstrcat라는 예약어 추가하여 사용한다.
  • abstrcat class 안에는 abstrcat로 선언된 메소드가 있을 수도 없을 수도 있다.
  • abstrcat로 선언된 메소드가 하나라도 있으면, 그 class는 반드시 abstrcat로 선언되어야 한다.
  • abstrcat class는 몸통이 있는 메소드가 있어도 상관 없으며, static이나 final 메소드가 있어도 상관없다.

abstract class 상속

public class MemberInher extends MemberAbstract{
    public boolean addMember(MemberDTO member){
        // body 구현
        return true;
    }
    public boolean removeMember(MemberDTO member){
        // body 구현
        return false;
    }
}

class 상속에서 abstract class로 상속 받는다면 abstract class 안에 abstract 메소드는 상속받은 class에서 모두 구현을 해야 오류가 발생하지 않는다. 

 

정리표

  interface abstract class class
선언 예약어 interface abstract class class
구현 안 된 메소드 포함 가능 여부 가능(필수) 가능 불가능
구현된 메소드 포함 가능 여부 불가 가능 가능(필수)
static 메소드 선언 가능 여부 불가능 가능 가능
final 선언 가능 여부 불가능 가능 가능
상속 여부 불가능 가능 가능
구현 여부 가능 불가능 불가능

 

반응형

'책 공부 > 자바의 신' 카테고리의 다른 글

Java에서 this란 무엇인가?  (0) 2022.09.01
java final 알아보기  (1) 2022.08.29
오버로딩(overloading) vs 오버라이딩(overriding)  (0) 2022.08.17
자바의 신 기본 정리  (1) 2022.08.14