ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Interface] absract 클래스와 interface
    Programming/TIL 2018. 10. 2. 01:27


    추상 클래스와 인터페이스

    1. 추상화

    • 추상화는 중요한 특징을 찾아낸 후 간단하게 표현하는 것이다.

    • 필요한 부분, 중요한 부분을 통합하여 하나로 만드는 것을 말한다.

    • 예를 들어 {도형, 네 개의 변, 네 개의 각} 나열되어 있는 세 가지 요소를 일일히 언급하지 않고, '사각형'이라고 부르는 것이 추상화의 한 예라고 할 수 있다.

    • 추상화는 여러가지 요소들을 하나로 통합하는 방향성을 가지고 있다. (한 가지 문제를 여러가지로 쪼개서 나눠보는 '문제 분할'과 반대의 개념)

    • 추상화를 이용하여 핵심적인 것만을 남겨 표현하게 되면, 복잡한 내용도 한 눈에 알아볼 수 있어 이해하기 쉽다는 장점이 있다.

    Example

    • 그림과 같이 다른 종류의 트럭과 자동차가 있다. 색깔과 모양, 엔진 유형 및 용도가 다르므로 다른 느낌을 준다.

    • 그러나 이 개체들은 모두 타이어와 엔진, 기어와 같은 공통적인 특성과 동작을 가지고 있다.

    • 차량은 자동차 또는 트럭의 일반적인 아이디어로, 특정 자동차 또는 트럭의 다른 특성을 제거한 일반적인 차량의 속성과 행동에 대한 정보만으로 표현된다.

    • 트럭과 자동차의 두 가지 주요 범주로 분류할 수 있고, 트럭과 자동차의 공통속성과 동작을 포함하는 추상클래스 Vehicle을 추가하여 트럭 및 자동차 카테고리에 대한 추상화를 추가로 만들 수 있다.

    2. 추상 클래스(Abstract class)

    특징

    • 추상 클래스는 클래스 내 추상 메소드가 하나 이상 포함되거나, abstract로 정의된 경우를 말한다.

      abstract class al
    • 추상 클래스는 개념이며, 하위 클래스에 의해 구현된다.

    • 추상 클래스 혼자로는 class의 역할을 다 못하지만, 새로운 class를 작성하는데 있어 그 바탕이 되는 부모클래스(Super class)로서 중요한 의미를 갖는다.

    • 추상 클래스는 자체적으로 객체화 할 수 없는 클래스이기 때문에 상속되어야한다.

    • 추상 클래스의 일부 또는 모든 멤버가 구현되지 않을 수 있고, 구현은 상속 클래스의 몫이다.

    • 구현된 추상 클래스 멤버는 상속 클래스에 의해 재정의 될 수 있고, 상속하는 클래스(추상 클래스)는 계속 추가 인터페이스나 기타 기능을 구현할 수 있다.

    Example

    • Checking Account 와 Saving Acount 두 클래스 사이의 공통적인 특성은owner와 balance이고, 동작은 deposit과 withdraw이 있다.

    • 따라서 두 개체의 추상 클래스는 Bank Account가 된다.

    추상 클래스를 언제 사용 할까?

    • 추상 클래스는 그 추상 클래스를 상속 받아서 기능을 이용하고 확장시키는데 있다.

    • 기본 동작을 제공하려면 추상 클래스를 사용한다. (코드 재사용 가능성)

    • 추상 클래스는 해당 하위 클래스에 대한 공용 인터페이스를 정의한다.

    • 추상 클래스는 구체적인 메소드 구현에 앞서 미리 구성요소를 만들어 둘 때 유용하다.

    예제 코드

    package abstract_interface;

    public class ExamAbstract {
       /**
       * 추상클래스 & 추상메서드 abstract 사용하기 추상클래스는
       * 말그대로 약간 추상적인 의미를 가진 클래스여야 하며
       * 비추상적인 클래스에서 이를 상속받아 사용합니다.
       */
       public static void main(String [] ar){
           Tiger tiger = new Tiger("Hodol");
           tiger.cry();
           tiger.behavior();
           System.out.println("사자의 이름은 :" + tiger.animal_name);
           
           Dog dog = new Dog("Mikey"); dog.cry();
           dog.behavior();
           System.out.println("개의 이름은 :" + dog.animal_name);
      }

    }

    abstract class Animal {
       String animal_name;
       Animal(String name) {
           animal_name = name;
      }
       public abstract void cry();
       
       public abstract void behavior();
    }

    class Tiger extends Animal {
       public Tiger(String name) {
           super(name);
      }
       
       @Override
       public void cry() {
           // TODO Auto-generated method stub
           System.out.println("어흥");
      }
       
       @Override
       public void behavior() {
           // TODO Auto-generated method stub
           System.out.println("우측으로 빠르게 움직인다.");
      }

    }

    class Dog extends Animal {
       public Dog(String name) {
           super(name);
      }
       @Override
       public void cry() {
           // TODO Auto-generated method stub
           System.out.println("멍멍");
      }
       
       @Override
       public void behavior() {
           // TODO Auto-generated method stub
           System.out.println("왼쪽으로 느리게 달린다");
      }
    }


    출처: http://commin.tistory.com/106 [Commin의 일상코딩]

    3. 인터페이스(Interface)

    • 모든 메소드가 추상 메소드인 경우 인터페이스이다.

    • 인터페이스는 함수의 껍데기만 있는데, 그 이유는 그 함수의 구현을 강제하기 위해서이다. 구현을 강제함으로써 인터페이스를 구현한 객체들에 대해서 같은 동작을 보장할 수 있다.

    • 추상 메소드는 아직 구현되어 있지 않은 abstract로 정의된 메소드를 말한다.

    • 추상 클래스가 미완성된 설계도라면, 인터페이스는 밑그림만 있는 기본 설계도이다. 즉 뼈대를 기반으로 구현하는 것이다.

    • 인터페이스를 추가하여 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제한다.

    • 인터페이스는 여러개의 인터페이스를 구현할 수 있다.

      class al implements a, b, c ...

    Example

    • 위 그림의 동물들은 모두 포유류이며 모피나 털을 가지고 있고, 우유로 새끼에게 영양을 주는 공통된 행동과 특성을 공유한다.

    • 그러나 박쥐는 포유류임에도 불구하고 박쥐만이 가지는 날 수 있는 특별한 행동을 한다.

    • 새 또한 날 수있는 조류에 속하는데, 박쥐와 새는 각각 다른 범주에 속하지만 공통된 행동을 하므로 Flyable 인터페이스를 생성하고 박쥐와 새 클래스가 이 인터페이스를 구현할 수 있다.

    예제 코드

    package abstract_interface;

    public class ExamInterface {
       /**
         * 인터페이스는 추상클래스의 일종이지만 보다 더 극단적인경우입니다.
         * 추상메서드로만 구성되며 abstract와다르게 메서드만 정의가 가능합니다.
         * 공동 작업을 할때 메서드의 표준화를 시키기 위하여 많이 사용되며,
         * 서로 다른 클래스를 연결할 때도 사용됩니다.
         */
       public static void main(String[] ar) {
           Door door = new Door();
           door.open();
           door.close();
           door.Red();
           door.Blue();
           Bottle bottle = new Bottle();
           bottle.open();
           bottle.close();
      }
    }

    interface OpenCloseIf{
       public void open();
       public void close();
    }

    interface PaintIf{
       public void Red();
       public void Blue();
    }

    /**
     * Interface 는 implements 로 상속받으며 * extends 상속과는 다르게 다중 상속이 가능합니다.
     */
    class Door implements OpenCloseIf , PaintIf{
       @Override public void open() {
           // TODO Auto-generated method stub
           System.out.println("Door Open");
      }
       
       @Override
       public void close() {
           // TODO Auto-generated method stub
           System.out.println("Door Close");
      }
       @Override
       public void Red() {
           // TODO Auto-generated method stub
           System.out.println("Paint the door red");
      }
       @Override
       public void Blue() {
           // TODO Auto-generated method stub
           System.out.println("Paint the door blue");
      }
    }

    class Bottle implements OpenCloseIf {
       @Override
       public void open() {
           // TODO Auto-generated method stub
           System.out.println("Bottle Open");
      }
       @Override
       public void close() {
           // TODO Auto-generated method stub
           System.out.println("Bottle Close");
      }
    }


    출처: http://commin.tistory.com/106 [Commin의 일상코딩]

    4. 추상 클래스와 인터페이스의 차이

    추상 클래스는 그 추상 클래스를 상속받아서 기능을 이용하고, 확장시키는데 있다.

    인터페이스는 함수의 껍데기만 있는데, 그 이유는 그함수의 구현을 강제하기 위해서이다. 구현을 강제함으로써 인터페이스를 구현한 객체들에 대해서 같은 동작을 보장할 수 있다.

    추상클래스는 메소드를 구현하지만, 모든 메소드를 구현하지 않는 불완전하게 정의된 클래스이다.

    인터페이스는 클래스와 별도로 일련의 연관된 메소드를 정의한다.

    ** 공통점 : 선언부만 있는 멤버는 하위 클래스에서 반드시 구현 필수

    추상 클래스는 클래스 이지만,

    인터페이스는 클래스가 아니다.

    추상 클래스는 일반적으로 베이스 클래스로 상속해서 더 구체적인 클래스를 만들 때 쓰기 좋다. (기능 확장)

    인터페이스는 서로 관련이 없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 각각 구현할 때 용이하다. 예) 새와 박쥐

    추상 클래스는 한 개의 클래스에 여러 개를 사용할 수 없다. (단일 상속)

    인터페이스는 한 개의 클래스에 여러 개의 인터페이스를 구현할 수 있다. (다중 구현 가능)

    ** 출처

    https://www.slideshare.net/HarisBinZahid/abstract-class-and-interface-49451395

    https://wikidocs.net/219

    https://blog.naver.com/jh_p0415/221361720347

    'Programming > TIL' 카테고리의 다른 글

    디자인 패턴과 아키텍쳐  (0) 2020.03.07
    프레임워크 vs 라이브러리  (0) 2020.02.12
    Domain Object, DAO, DTO,  (0) 2020.02.12
    MVC 패턴과 Layerd Architecture  (0) 2020.02.12
    [markdown] 정리  (0) 2018.10.05

    댓글

Designed by Tistory.