반응형

추상(abstract) 클래스와 인터페이스(interface) 클래스


1. 추상  클래스와  추상 메소드란?

추상클래스란 말 그대로 추상적으로 밖에 그려지지 않은 클래스라고 한다. 즉, 클래스가 전체적인 구성을 다 가지지 못한 채 설계만 되어있는 클래스이다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스를 생성할 수는 없다. 추상클래스는 상속(Extends)을 통해서 자식 클래스에 의해 완성이 된다. 그래서 추상클래스 자체로는 제 기능을 다하지는 못하지만, 새로운 기능을 정의하는데 있어서 바탕(틀)이 될 수 있다!


package ch7;


// 추상 클래스는 class 선언부 앞에 abstract를 적어준다.

abstract class 클래스명 {

.....

abstract 메소드명();  // 추상 메소드

}

  • 추상 메소드가 하나 이상 포함되면 반드시 추상클래스로 선언이 되어야 한다.
  • 추상클래스에서 추상 메소드가 아닌 일반 메소드를 포함시킬 수 있다.
  • 추상클래스를 상속하는 자식 클래스에서 부모가 가진 메소드를 모두 오버라이딩 해야 한다.
  • 추상 메소드는 몸체가 없고 선언부만 존재한다.
예제 1

package ch7;


// 추상클래스 선언

// 구현부가 없이 선언부만 존재하는 것을 확인할 수 있다.

abstract class Player{

boolean pause;

int currentPos;

// 생성자로 변수 초기

Player(){

pause = false;

currentPos = 0;

}

abstract void play(int pos);

abstract void stop();

}


class AudioPlayer extends Player{

// play 메소드의 구현부

void play (int pos){

System.out.println("AudioPlayer.play");

}

// void 메소드의 구현부 

void stop (){

System.out.println("AudioPlayer.stop");

}

}


class CDPlayer extends Player{

// play 메소드의 구현부

void play (int pos){

System.out.println("CDPlayer.play");

}

// void 메소드의 구현부 

void stop (){

System.out.println("CDPlayer.stop");

}

}


class abEx02{

public static void main (String args[]){

AudioPlayer ap = new AudioPlayer();

ap.play(1);

CDPlayer cp = new CDPlayer();

cp.play(1);

}

}


2. 인터페이스(Interface) 클래스란?

인터페이스는 추상클래스처럼 추상 메소드를 갖지만 추상 클래스보다 추상화 정도가 높아서 추상 클래스와 달리 몸통을 갖춘 일반 메소드 또는 멤버 변수를 구성원으로 가질 수 없다. 오직 추상 메소드와 상수만을 멤버로 가질 수 있으므로 그 외의 다른 어떠한 요소도 허용하지 않는다. 추상클래스를 부분적으로 미완성된 설계도라고 했다면, 인터페이스 클래스는 아무 것도 없고 밑그림만 그려져 있는 상태이다.


package ch7;


interface 클래스{

public static final 변수타입 변수명 = ;

public abstract 메소드(매개변수);

}

  • 모든 멤버변수는 public static final 이어야하며, 이를 생략할 수 있다.
  • 모든 메소드는 public abstract 이어야 하며, 이를 생략할 수 있다.
  • 인터페이스는 인터페이스로부터만 상속(Extends)받을 수 있으며, 클래스와 달리 다중 상속이 가능하다.
    ex) interface Fightable extends Movable, Attackable{ } 
    여기서 MovableAttackable은 모두 interface 클래스다.
인터페이스의 구현
 class A2 {

    void autoPlay(I i) {

          i.play();

     }

 }


 interface I {

      public abstract void play();

 }


 class B2 implements I {

     public void play() {

          System.out.println("play in B class");

     }

 }


 class C2 implements I {

     public void play() {

          System.out.println("play in C class");

     }

 }


class InterfaceTest2 {

public static void main(String[] args) {

A2 a = new A2();

a.autoPlay(new B2()); 

a.autoPlay(new C2());

}

}

결과 

play in B class

play in C class


인터페이스 클래스의 장점

  1. 개발 시간을 단축시킬 수 있다.
    메소드를 호출하는 쪽에서는 메소드의 내용에 관계없이 선언부만 알면 되기 때문이다. 
  2. 표준화가 가능하다.
    프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램의 개발이 가능하다.
  3. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
    서로 상속관계에 있지도 않고, 같은 조상 클래스를 가지고 있지 않은 서로 아무런 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어줄 수 있다.

  4. 독립적인 프로그래밍이 가능하다.
    인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제 구현에 독립적인 프로그램을 작성하는 것이 가능하다.
    클래스와 클래스 간의 직접적인 관계를 인터페이스를 통해서 간접적인 관계로 변경하면 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.



참고링크

  • 자바의 정석


+ Recent posts