티스토리 뷰

반응형

 

🤔 추상 클래스(abstaract class)란?

✔ 미완성 설계도. 미완성 메서드를 갖고 있는 클래스

✔ 다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가

✔ 미완성 메서드. 구현부(몸통, {})이 없는 메서드

/* 주석을 통해 어떤 기능을 수행할 목적으로 작성하였는지 설명 */

 

 

 

다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가

Player p = new player(); // 에러. 추상 클래스의 인스턴스 생성 불가

그럼 인스턴스 생성 불가한 클래스를 만드는 이유가 뭘까?

👉 다른 클래스 작성에 도움을 주기 위해서!!

 

abstract class Player { // 추상클래스(미완성 클래스)
	abstract void play(int pos); // 추상메서드(몸통{}이 없는 미완성 메서드)
  	abstract void stop(); // 추상메서드
}

class AudioPlayer extends Player { 
	void play(int pos) { /* 내용 생략 */ } // 추상메서드를 구현
    	void stop() { /* 내용 생략 */ } // 추상메서드를 구현
}

AudioPlayer ap = new AudioPlayer(); // OK.

 

🤔 언제 추상 메서드를 사용할까?

꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 사용한다.

 

abstract class Player { // 추상클래스
    abstract void play(int pos); // 추상메서드
    abstract void stop(); // 추상메서드
}

class AudioPlayer extends Player {
    void play(int pos) { /* 내용 생략 */ } // 추상메서드를 구현
    void stop() { /* 내용 생략 */ } // 추상메서드를 구현
}

abstract class AbstractPlayer extends Player {
    void play(int pos) { /* 내용 생략 */ } // 추상메서드를 구현
    // 두개의 메서드 중 하나의 메서드만 구현했으므로 abstract 붙여줘야함.
    // 안붙이면 에러!!
}

 

abstract class Player { // 추상클래스
    boolean pause; // 일시정지 상태를 저장하기 위한 변수
    int currentPos; // 현재 Play되고 있는 위치를 저장하기 위한 변수 // 현재 재생 위치

    Player() { // 추상클래스도 생성자가 있어야 한다.
        pause = false;
        currentPos = 0;
    }

    /**
     * 지정된 위치(pos)에서 재생을 시작하는 기능이 수행하도록 작성되어야 한다.
     */
    abstract void play(int pos); // 추상메서드

    /**
     * 재생을 즉시 멈추는 기능을 수행하도록 작성되어야 한다.
     */
    abstract void stop(); // 추상메서드

    /*
    인스턴스 메서드도 추상메서드를 사용할 수 있다.
    왜냐? 인스턴스 메서드 객체 생성 후에 호출할 수 있으니까
    아직 객체 생성안했으니까 play() 메서드 호출 안됨.

    상속을 통해 자손이 추상메서드를 완성한 후에
    자손 객체 생성하면 호출할 수 있다.
     */
    void play() {
        play(currentPos); // 추상메서드를 사용할 수 있다.
    }
}

 

 

abstract class Player { // 추상클래스
    abstract void play(int pos);

    abstract void stop();
}

class AudioPlayer extends Player {
    void play(int pos) {
        System.out.println(pos + "위치부터 play합니다.");
    }

    void stop() {
        System.out.println("재생을 멈춥니다.");
    }
}

public class TT {
    public static void main(String[] args) {
        AudioPlayer ap = new AudioPlayer();
        ap.play(100);
        ap.stop();

        Player ap2 = new AudioPlayer(); // 다형성
        ap2.play(100);
        ap2.stop();
    }
}

 

 

 

🤔 추상클래스의 작성법은?

✔ 여러 클래스에 공통적으로 사용될 수 있는 추상 클래스를 바로 작성하거나

기존 클래스의 공통 부분을 뽑아서 추상클래스를 만든다.

 

public class TTTT {
    public static void main(String[] args) {
        Unit[] group = new Unit[3];
        group[0] = new Marine();
        group[1] = new Tank();
        group[2] = new Dropship();

        for (int i = 0; i < group.length; i++)
            group[i].move(100, 200); // 가능

        Object[] group2 = new Object[3];
        group2[0] = new Marine();
        group2[1] = new Tank();
        group2[2] = new Dropship();

        for (int i = 0; i < group2.length; i++)
            group2[i].move(100, 200); // 불가능 // 왜냐? Object에는 move없으니까

    }
}

abstract class Unit {
    int x, y;

    abstract void move(int x, int y);

    void stop() { /* 현재 위치에 정지 */ }
}

class Marine extends Unit { // 보병
    void move(int x, int y) {
        System.out.println("Marine[x=" + x + ",y=" + y + "]");
    }

    void stimPack() { /* 스팀팩을 사용한다 */ }
}

class Tank extends Unit {
    void move(int x, int y) {
        System.out.println("Tank[x=" + x + ",y=" + y + "]");
    }

    void changeMode() { /* 공격모드를 변환한다. */ }
}

class Dropship extends Unit { // 수송선
    void move(int x, int y) {
        System.out.println("Dropship[x=" + x + ",y=" + y + "]");
    }

    void load() { /* 선택된 대상을 태운다. */ }

    void unload() { /* 선택된 대상을 내린다. */ }
}

 

 

🤔 인터페이스(interface)란?

✔ 추상 메서드의 집합

✔ 구현된 것이 전혀 없는 설계도(껍데기(모든 멤버가 public))

 

 

 

✅ 추상 클래스(abstract class)와 인터페이스(interface)의 차이는?

✔ 추상클래스 : 일반 클래스(추상 메서드를 가지는 일반 클래스), IV 가짐

✔ 인터페이스 : 추상 메서드 말고 아무것도 못가짐. IV 못가짐

 

 

🤔 인터페이스의 상속?

✔ 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상 아님)

✔ 다중 상속이 가능(부모 여러 개) (추상메서드는 충돌해도 문제 없음.)

 

 

🤔 인터페이스의 구현

✔ 인터페이스에 정의된 추상 메서드를 완성하는 것

class 클래스이름 implements 인터페이스이름 {
	// 인터페이스에 정의된 추상메서드를 모두 구현해야 한다.   
}

✔ 일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 함.

 

public class P implements Fightable {
    public void move(int x, int y) { /* 내용 생략 */ }
    public void attack(Unit u) { /* 내용 생략 */ }
}

interface Fightable {
    void move(int x, int y);
    void attack(Unit unit);
    // Fighter 클래스는 Fightable 인터페이스를 구현했다.
}

 

 

🤔 인터페이스란?

추상메서드의 집합!

 

🤔 인터페이스의 구현이란?

인터페이스의 추상메서드 몸통{} 만들기!(미완성 설계도 완성하기)

 

abstract class Player { // 추상클래스(미완성 클래스)
    abstract void play(int pos);
    abstract void stop();
}

class AudioPlayer extends Player {
    /*
    상속을 통해 미완성 설계도(Player)를 완성시킴(AudioPlayer)
     */
    void play(int pos) { /* 내용 생략 */ } // 추상메서드를 구현
    void stop() { /* 내용 생략  */ } // 추상메서드를 구현
}

interface Fightable {
    /*
    interface(Fightable)를 구현해서 설계도를 완성(Fighter)시킴.
     */
    void move(int x, int y);
    void attack(Unit u);
}

class Fighter implements Fightable {
    public void move(int x, int y) { /* 내용 생략 */ }
    public void attack(Unit u) { /* 내용 생략 */ }
}

 

✅ 추상클래스와 인터페이스의 공통점은?

✔ 추상 메서드를 가지고 있다.(미완성 설계도)

 

✅ 추상 클래스와 인터페이스의 차이점은?

✔ 인터페이스는 iv를 가질 수 없다.

 


다음 포스팅은 자바의 정석 Ch7 마지막 포스팅이 될 것 같다.

열심히 공부하자. 📙

얼마 안남았다! 더 열심히 공부하자. 🔥

반응형