yoni

[27][OOP] 추상 메소드, 추상 클래스(Abstract Class), 인터페이스(Interface) 본문

java of educational by contents

[27][OOP] 추상 메소드, 추상 클래스(Abstract Class), 인터페이스(Interface)

yoni-1117 2018. 12. 9. 14:30
이거 수업 안들음 나중에복습할것
[01] 추상 메소드, 추상 클래스(Abstract Class), @Override 에노테이션

1) 추상 메소드
    - 기능이 다양하게 구현되거나 시간의 흐름에따라 변경이될 가능성이 있는 메소드
    - 기능을 구현하지 않고 메소드 Stub만 구현한 메소드. '{, }' 생략 
      예) public abstract void fall();
    - 메소드가 기능이 결정이 되었으나 구현을 하지 않은 경우로 추후
      어떤 형태로든 구현할 예정인 메소드
    - 실제 구현은 나중에 함으로 기능을 설계하는 것에 중심을 둠.

 
2) 추상 클래스
    - 일반 메소드와 추상 메소드가 같이 혼합되어 있는 class 입니다.
    - 추상 클래스안의 추상메소드는 하위(자식, extends) 클래스에서 구현을해야 합니다.
      구현을 하지 않으면 자식 클래스도 추상클래스가되어 객체를 만들 수 없습니다.
    - Annotation(주석): @Override - 추상 메소드를 구현하거나
      부모 클래스의 일반 메소드를 다시 구현했다는 표시. 
 
      예)
      public abstract class MySQL {     <-- 추상 클래스 선언
         public abstract void execute();  <-- 추상 메소드 선언
            ..... 
            ..... 

3) 다형성(Polymorphism)
    - 일반적으로 객체 생성과 할당되는 타입은 동일해야하나 좌변의 타입과
      우변의 타입이 다릅니다.
      Java java = new Java();
      Object oop = new Java();
      OOP oop = new Java();
      OOP oop = new JSP();
    - 추상 클래스는 상속에 기반한 기술로 부모 클래스는 자식 클래스를
      할당 받을 수 있습니다.
    - 추상 클래스를 구현한 자식 클래스는 필요에 따라 자유롭게
      부모 클래스(Airline)에 할당이 가능합니다. 
      예) Airline air = new Singapore();
           Airline air = new Asiana();

4) 다형성의 분석예

    - Payment pay = new Pay2015();
    - 부모 클래스(Payment)는 자식 클래스(Pay2015)를 할당 받을 수 있습니다.
    - pay 객체의 타입은 Payment가 됩니다.
    - 메모리상에 실제 가지고있는 데이터는 new를 이용하여 생성한 Pay2015 class 입니다.
    - 자식 클래스의 메소드를 호출하려면, 자식 타입으로 형변환하거나,
      부모 클래스의 추상 메소드를 구현한 경우만 가능합니다.
 
 
1. 추상 클래스 실습
 
[실행 화면]
 
현금 결재
신용 카드 결재 2.5%
휴대폰 결재 300 원
-------------------------
현금 결재
신용 카드 결재 1.7%
휴대폰 결재 200 원
-------------------------
현금 결재
신용 카드 결재 1.3%
휴대폰 결재 100 원
-------------------------
현금 결재
신용 카드 결재 종량제로 결제 방법 변화
휴대폰 결재 50원
===============
현금 결재
신용 카드 결재 2.5%
휴대폰 결재 300 원
-------------------------
현금 결재
신용 카드 결재 1.7%
휴대폰 결재 200 원
-------------------------
현금 결재
신용 카드 결재 1.3%
휴대폰 결재 100 원
-------------------------
현금 결재
신용 카드 결재 종량제로 결제 방법 변화
휴대폰 결재 50원
-------------------------
 
  
▷ oop4.Payment.java
-----------------------------------------------------------------------------------
package oop4;
 
public abstract class Payment {
  public void cach() {
    System.out.println("현금 결재");
  }
  
  public abstract void card();    // 추상 메소드
  public abstract void mobile();  // 추상 메소드
}
 
 
 
-----------------------------------------------------------------------------------
 
▷ oop4.Pay2015.java
-----------------------------------------------------------------------------------
package oop4;
 
public class Pay2015 extends Payment {
 
  .....
 
 
 
}
 
 
-----------------------------------------------------------------------------------

▷ oop5.Pay2016.java
-----------------------------------------------------------------------------------
package oop5;
 
public class Pay2016 extends Payment {
 
  .....
 
 
}
 
 
 
-----------------------------------------------------------------------------------
 

▷ oop4.Pay2017.java
-----------------------------------------------------------------------------------
package oop4;
 
public class Pay2017 extends Payment {
 
  @Override
  public void card() {
    System.out.println("신용 카드 결재 1.3%");    
  }
 
  @Override
  public void mobile() {
    System.out.println("휴대폰 결재 100 원");
  }
 
  
  
}
 
 
 
-----------------------------------------------------------------------------------
 

▷ oop4.Pay2018.java
-----------------------------------------------------------------------------------
package oop4;
 
public class Pay2018 extends Payment {
 
  @Override
  public void card() {
    System.out.println("신용 카드 결재 종량제로 결제 방법 변화");
 
  }
 
  @Override
  public void mobile() {
    System.out.println("휴대폰 결재 50원");
 
  }
 
}
 
 
 
-----------------------------------------------------------------------------------
  
  
▷ oop4.AbsTest.java
-----------------------------------------------------------------------------------
package oop4;
 
public class AbsTest {
 
  public static void main(String[] args) {
    // Payment payment = new Payment();
 
    .....
 
 
  }
  
}
 
 
 
-----------------------------------------------------------------------------------
 
 
  
[03] Interface의 이해와 필요성
      - Interface 기반의 구현은 인터페이스를 구현한 다양한 클래스의 객체를 할당받을 수 있어
        변경 및 옵션에 따른 관리가 수월합니다.
      - 추상 클래스와 같은 목적을 가지고 있으나 메소드가 전부 추상입니다.
      - 개발자가 구현해야하는 기능을 설계자가 명시할 때 사용합니다.
      - 다양한 기능으로 구현이 될때 사용합니다.
      - 인터페이스는 Abstract class(추상 클래스)와 같이 객체 생성이 불가능하며,
         Interface를 구현한 클래스의 객체만 할당 받을 수 있으며, 
        이 원리는 추상 클래스와 동일합니다. 
      - 인터페이스 구현은 implements(구현)를 사용.
        예)
        class Android implements Smartphone{ 
 
 
[실행 화면]
The mobile is Android.
The mobile is Smartphone.
Google 맵 지원
사원증 기능 지원
-------------------------
The mobile is IPhone.
Apple 맵 지원
교통 카드 지원
-------------------------
The phone is Phone.
The phone is not Smartphone.
Android 전화
Android 문자
IPhone 전화
IPhone 문자
 
 
1. Interface
▷ oop4.Smartphone.java
-----------------------------------------------------------------------------------
package oop4;
 
public interface Smartphone {
//  public abstract void map();  // 추상 메소드
//  public abstract void nfc();    // 추상 메소드
 
  public void map();  // 추상 메소드, abstract 생략 가능
  public void nfc();    // 추상 메소드, abstract 생략 가능
  
//  public void print() {  // 멤버 메소드 선언 불가능
//    
//  }
}
 
 
 
 
-----------------------------------------------------------------------------------
 
 
2. Interface 구현 class

▷ oop4.Android.java
-----------------------------------------------------------------------------------
package oop4;
 
public class Android implements Smartphone {
 
  .....
 
}
 
 
 
 
-----------------------------------------------------------------------------------
 
 
3. Interface 구현 class

▷ oop4.IPhone.java
-----------------------------------------------------------------------------------
package oop4;
 
public class IPhone implements Smartphone {
 
  @Override
  public void map() {
    System.out.println("Apple 맵 지원");
 
  }
 
  @Override
  public void nfc() {
    System.out.println("교통 카드 지원");
 
  }
 
}
 
 
-----------------------------------------------------------------------------------
  
  
4. Concrete class 
   - 구현된 기능이 앞으로 변경되지 않을 것이라고 가정한 클래스


▷ oop4.Phone.java
-----------------------------------------------------------------------------------
package oop4;
 
public class Phone {
 
  public void call() {
    System.out.println("전화");
 
  }
 
 
  public void sms() {
    System.out.println("문자");
 
  }
 
}
 
 
-----------------------------------------------------------------------------------
  
 
5. 사용

▷ oop4.InterTest.java
-----------------------------------------------------------------------------------
package oop4;
 
public class InterTest {
 
  public static void main(String[] args) {
    // Smartphone smartphone = new Smartphone();
 
    .....
 
 
  }
 
}
 
 
 
-----------------------------------------------------------------------------------


Comments