객체지향개념 II-3

윤재열·2022년 1월 9일
0

Java

목록 보기
14/71
post-custom-banner

추상클래스(abstract clas)

클래스가 설계도라면 추상클래스는 '미완성 설계도'
추상메서드(미완성 메서드)를 포함하고 있는 클래스

  • 추상메서드 : 선언부만 있고 구현부가 없는 메서드

    일반메서드가 추상메서드를 호출할 수 있다.(호출할 때 필요한 건 선언부)
    완성된 설계도가 아니므로 인스턴스를 생성할 수 없다.
    다른 클래스를 작성하는 데 도움을 줄 목적으로 작성된다.

    꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 사용
    추상클래스를 상속받는 자손클래스에서 추상메서드의 구현부를 완성해야한다.

추상클래스의 작성

여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존클래스의 공통 부분을 뽑아서 추상클래스를 만든다.

public abstract class Unit {
    public int x,y;
    public abstract void move(int x,int y);
    public void stop() {//현재위치에 정지
    }
         }
         class Marine extends Unit{
             @Override
             public void move(int x, int y) {//지정된 위치로 이동
             }
             public void stimPack(){//스팀팩을 사용한다.
             }
         }
         class Tank extends Unit{
             @Override
             public void move(int x, int y) {//지정된 위치로 이동
             }
             public  void changeMode(){//공격모드로 변환한다.
             }
         }
         class Dropship extends Unit{
             @Override
             public void move(int x, int y) {//지정된 위치로 이동
             }
             public void load(){//선택된 대상을 태운다.
             }
             public void unloda(){//선택된 대상을 내린다.
             }
         }

인터페이스(interface)

일종의 추상클래스, 추상클래스보다 추상화 정도가 높다.
실제 구현된 것이 전혀 없는 기본 설계도.
추상메서드와 상수만을 멤버로 가질 수 있다.
인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용.
미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는데 사용된다.

인터페이스의 작성

'class'대신 'interface'를 사용한다는 것 외에는 클래스 작성과 동일

하지만, 구성요소(멤버)는 추상메서드와 상수만 가능하다.

인터페이스의 상속

인터페이스도 클래스처럼 상속이 가능하다(클래스와 달리 다중상속 허용)

인터페이스는 Object클래스와 같은 최고 조상이 없다.

인터페이스의 구현

인터페이스를 구현하는 것은 클래스를 상속받는 것과 같다.
다만,'extends'대신 'implements'를 사용한다.

인터페이스에 정의된 추상메서드를 완성해야 한다.

상속과 구현이 동시에 가능하다.

인터페이스를 이용한 다형성

인터페이스 타입의 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.

인터페이스를 메서드의 매개변수 타입으로 지정할 수 있다.

인터페이스를 메서드의 리턴타입으로 지정할 수 있다.

인터페이스의 장점

  1. 개발시간을 단축시킬 수 있다.
  • 일단 인터페이스가 작성되면, 이를 사용해서 프로그램을 작성하는 것이 가능하다.메서드가 호출하는 쪽에서는 선언부만 알면 되기 때문이다.
    동시에 다른 한 쪽에서는 인터페이스를 구현하는 클래스를 작성하도록 하여, 인터페이스를 구현하는 클래스가 작성될 때까지 기다리지 않고,양쪽에서 동시에 개발을 진행할 수 있다.
  1. 표준화가 가능하다.
  • 프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램 개발이 가능하다.
  1. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
  • 서로 상속관계에 있지도 않고, 같은 조상클래스를 가지고 있지 않은 서로 아무런 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.
  1. 독립적인 프로그래밍이 가능하다.
  • 인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때무에 실제구현에 독립적인 프로그램을 작성하는 것이 가능하다.
    클래스와 클래스간의 직접적인 관계를 인터페이스를 이용해서 간적적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.

예제

interface Repairable {
}
class UnitEx{
    int hitPoint;
    final int MAX_HP;
    UnitEx(int hp){
        MAX_HP =hp;
    }
}
class GrounUnit extends UnitEx{
    GrounUnit(int hp){
        super(hp);
    }
}
class AirUnit extends UnitEx{
    AirUnit(int hp){
        super(hp);
    }
}
class TankEx extends GrounUnit implements Repairable {
    TankEx() {
        super(150); //Tank의 HP는 150이다.
        hitPoint = MAX_HP;
    }
    @Override
    public String toString() {
        return "Tank";
    }
}
class MarineEx extends GrounUnit{
    MarineEx(){
        super(40);
        hitPoint = MAX_HP;
    }
}
class SCV extends GrounUnit implements Repairable{
    SCV(){
        super(60);
        hitPoint=MAX_HP;
    }
    void repair(Repairable r){
        if(r instanceof Unit){
            UnitEx u =(UnitEx) r;
            while(u.hitPoint != u.MAX_HP){
                u.hitPoint++;   //Unit의 HP를 증가시킨다.
            }
        }
    }
}
class RepairableTest{
    public static void main(String[] args) {
        TankEx tank = new TankEx();
        MarineEx marine = new MarineEx();
        SCV scv = new SCV();

        scv.repair(tank);   //SCV가 Tank를 수리한다.
        scv.repair(marine);//Error;
    }
}

인터페이스의 이해

  • 인터페이스는 두 대상(객체)간의 '연결,대화,소통'을 돕는 '중간역할'을 한다.
    선언과 구현을 분리시키는 것을 가능하게 한다.
  • 인터페이스를 이해하려면 두가지를 기억해야한다.
  1. 클래스를 사용하는 쪽(User)과 클래스를 제공하는 쪽(Provider)이 있다.
  2. 메서드를 사용하는 쪽(User)에서는 사용하려면 메서드의 선언부만 알면 된다.

public class Clock {
    private int hour;
    private int minute;
    private int second;

    public int getHour() {
        return hour;
    }

    public void setHour(int hour) {
        if(hour < 0 || hour>23)return;
        this.hour = hour;
    }

    public int getMinute() {
        return minute;
    }

    public void setMinute(int minute) {
        if(minute < 0 || minute > 59)return;
        this.minute = minute;
    }

    public int getSecond() {
        return second;
    }

    public void setSecond(int second) {
        if(second < 0 || second > 59)return;
        this.second = second;
    }
}

 interface ClockIntf{
    public int getHour();
    public void setHour(int hour);
    
    public int getMinute();
    public void SetMunute(int minute);
    
    public int getSecond();
    public void setSecond(int second);
}

디폴트 메서드(default method)

인터페이스에 새로운 메서드를 추가하면 인터페이스를 구현한 기존의 모든 클레스가 이 메서드를 구현해야한다.
이 문제를 해결하기 위해 '디폴트 메서드'를 고안.
디폴트 메서드는 추상 메서드의 기본 구현을 제공한다. 그래서 몸통{}을 가지고 있으며, 앞에 'default'를 붙이고 항상 public이다.(생략가능)


내부클래스(inner class)

클래스 안에 선언된 클래스
특정 클래스 내에서만 주로 사용되는 클래스를 내부 클래스로 선언한다.
GUI어플리케이션(AWT,Swing)의 이벤트 처리에 많이 사용된다.

내부 클래스의 장점
내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
코드의 복잡성을 줄일 수 있다.(캡슐화)

내부 클래스의 종류와 특징

내부 클래스의 종류는 변수의 선언위치에 따른 종류에 동일하다.
유효범위와 성질도 변수와 유사하므로 비교해보면 이해하기 쉽다.

profile
블로그 이전합니다! https://jyyoun1022.tistory.com/
post-custom-banner

0개의 댓글