[JAVA] ์ธํ„ฐํŽ˜์ด์Šค๋ž€? (๋‹คํ˜•์„ฑ, ์ถ”์ƒํด๋ž˜์Šค, implements)

2022๋…„ 02์›” 15์ผ by doozi

    [JAVA] ์ธํ„ฐํŽ˜์ด์Šค๋ž€? (๋‹คํ˜•์„ฑ, ์ถ”์ƒํด๋ž˜์Šค, implements) ๋ชฉ์ฐจ

๐Ÿ“› ์ถ”์ƒํด๋ž˜์Šค

๋ฏธ์™„์„ฑ ๋ฉ”์„œ๋“œ(์ถ”์ƒ ๋ฉ”์„œ๋“œ)๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค. (์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ๋˜๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜ ํฌํ•จ ๊ฐ€๋Šฅ)
ํด๋ž˜์Šค ์•ž์— abstract ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋งŒ ๋ถ™์ด๋ฉด ๋œ๋‹ค.

 

๐Ÿšจ ์ธ์Šคํ„ด์Šค(ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด)๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.
๐Ÿšจ ์ƒ์†์„ ํ†ตํ•ด์„œ ์ž์† ํด๋ž˜์Šค์— ์˜ํ•ด์„œ๋งŒ ์™„์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.

abstract class ํด๋ž˜์Šค ์ด๋ฆ„ {
    ...
}

๐Ÿ“› ์ถ”์ƒ๋ฉ”์„œ๋“œ

์•ž์— abstract ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™๊ณ , ๊ตฌํ˜„๋ถ€(์ค‘๊ด„ํ˜ธ{} ๋กœ ๊ฐ์‹ธ์ ธ ์žˆ๋Š” ๋ถ€๋ถ„)๋ฅผ ์—†์•ค ๋ฉ”์„œ๋“œ

abstract ๋ฆฌํ„ดํƒ€์ž… ๋ฉ”์„œ๋“œ์ด๋ฆ„();

๊ตฌํ˜„๋ถ€๋Š” ์ƒ์†์„ ํ†ตํ•ด ์™„์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.

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) { ... } // ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„
}

๐Ÿ“› ์ธํ„ฐํŽ˜์ด์Šค

์ผ์ข…์˜ ์ถ”์ƒํด๋ž˜์Šค.
์˜ค์ง! ์ถ”์ƒ๋ฉ”์„œ๋“œ์™€ ์ƒ์ˆ˜(๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’)๋งŒ์„ ๋ฉค๋ฒ„๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

interface ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„ {
    public static final ํƒ€์ž… ์ƒ์ˆ˜์ด๋ฆ„ = ๊ฐ’;
    public abstract ๋ฉ”์„œ๋“œ์ด๋ฆ„(๋งค๊ฐœ๋ณ€์ˆ˜๋ชฉ๋ก);
}

๐Ÿšจ ๋ชจ๋“  ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” public static final ์ด์–ด์•ผํ•˜๋ฉฐ, ์ด๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
๐Ÿšจ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” public abstract ์ด์–ด์•ผํ•˜๋ฉฐ, ์ด๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
(์ƒ๋žต๋œ ์ œ์–ด์ž๋Š” ์ปดํŒŒ์ผ ์‹œ์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.)

๐Ÿ“› ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ƒ์†

์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ๋งŒ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
ํด๋ž˜์Šค์™€ ๋‹ฌ๋ฆฌ, ๋‹ค์ค‘ ์ƒ์† ๊ฐ€๋Šฅ. (ํ•˜์ง€๋งŒ, ์ž๋ฐ”์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋‹ค์ค‘ ์ƒ์†์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†๋‹ค.)

interface Movable {
    void move(int x, int y);
}

interface Attackable {
    void attack(Unit u);
}

interface Fightable extends Movable, Attackable { ... }

๐Ÿ“› ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„

implements ('๊ตฌํ˜„ํ•˜๋‹ค'๋ผ๋Š” ๋œป) ํ‚ค์›Œ๋“œ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด๋ถ€์˜ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ์™„์„ฑํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

class ํด๋ž˜์Šค ์ด๋ฆ„ implements ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฆ„ {
    // ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋„๋‹ˆ ์ถ”์ƒ๋ฉ”์„œ๋“œ ๊ตฌํ˜„
}

class Fighter implements Fightable {
    pulic void move(int x, int y) { ... }
    public void attack(Unit u) { ... }
}

๐Ÿšจ ์ผ๋ถ€์˜ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋งŒ ์™„์„ฑํ•ด ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด abstract ๋ฅผ ๋ถ™์—ฌ์„œ ์ถ”์ƒํด๋ž˜์Šค ๋กœ ์„ ์–ธํ•ด์ค˜์•ผํ•œ๋‹ค.

abstract class Fighter implements Fightable {
    public void move(int x, int y) { ... }
}

๐Ÿšจ ์ƒ์†(extends)๊ณผ ๊ตฌํ˜„(implements)์€ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

class Fighter extends Unit implements Fightable {
    public void move(int x, int y) { ... }
    public void attack(Unit u) { ... }
}

๐Ÿ“› ์ธํ„ฐํŽ˜์ด์Šค์˜ ์žฅ์ 

  • ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‹จ์ถ• ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ํ‘œ์ค€ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์„œ๋กœ ๊ด€๊ณ„ ์—†๋Š” ํด๋ž˜์Šค๋“ค์—๊ฒŒ ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋…๋ฆฝ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿ“› ๋‹คํ˜•์„ฑ

์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ˜•ํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ.
์กฐ์ƒ ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์ž์†ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ.

class Tv { // ์กฐ์ƒ ํด๋ž˜์Šค
    boolean power;
    int channeel;

    void power() { power = !power; }
    void channelUp { ++channel; }
    void channelDown { --channel; }
}

class CaptionTv extends Tv { // ์ž์‹ ํด๋ž˜์Šค
    String text;
    void caption() { ... }
}  

Tv t = new CaptionTv(); // ์กฐ์ƒ ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์ž์† ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐ

์ฐธ์กฐ๋ณ€์ˆ˜ t์˜ ํƒ€์ž…์ด ์กฐ์ƒ(Tv)์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์ธ์Šคํ„ด์Šค๊ฐ€ CaptionTv ๋ผ ํ• ์ง€๋ผ๋„,
์ฐธ์กฐ๋ณ€์ˆ˜ t ๋กœ๋Š” CaptionTv ์ธ์Šคํ„ด์Šค์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

Tv ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋“ค๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋•Œ๋ฌธ์— ์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉค๋ฒ„์˜ ๊ฐœ์ˆ˜๋Š” ์ธ์Šคํ„ด์Šค์˜ ๋ฉค๋ฒ„ ๊ฐœ์ˆ˜๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ์ ๋‹ค.

๐Ÿ“› ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•œ ๋‹คํ˜•์„ฑ

์ธํ„ฐํŽ˜์ด์Šค๋Š” ์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„(implements) ํ•˜๋ฉด์„œ ์™„์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ๋‹ค.
์ฆ‰, ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์กฐ์ƒ์ด๋ผํ•  ์ˆ˜ ์žˆ๋Š” ์…ˆ์ด๋‹ค.

๋•Œ๋ฌธ์— ์•ž์„œ ์„ค๋ช…ํ•œ ๋‹คํ˜•์„ฑ์˜ ํŠน์ง•์ด ์ธํ„ฐํŽ˜์ด์Šค์—์„œ๋„ ์ ์šฉ๋œ๋‹ค.

 

์ธํ„ฐํŽ˜์ด์Šค Fightable์„ ํด๋ž˜์Šค Fighter๊ฐ€ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ,
์•„๋ž˜์™€ ๊ฐ™์ด ์ฐธ์กฐ๋ณ€์ˆ˜(f)์˜ ํƒ€์ž…์„ ์กฐ์ƒ(Fightable)์œผ๋กœ ์ •์˜ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

Fightable f = new Fighter();

๐Ÿšจ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ์ธํ„ฐํŽ˜์ด์Šค์ธ ๊ฒฝ์šฐ๐Ÿšจ

void attack(Fightable f) {
    ...
}

Fightable ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ f ๊ฐ€ ๊ฐ–๋Š” ์˜๋ฏธ๋Š”
๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ attack ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Fightable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋„˜๊ฒจ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

attac(new Fighter());

๐Ÿšจ๋ฆฌํ„ดํƒ€์ž…์ด ์ธํ„ฐํŽ˜์ด์Šค์ธ ๊ฒฝ์šฐ๐Ÿšจ

Fightable method() {
    Fighter f = new Fighter();
    return f;
}

๋ฉ”์„œ๋“œ๊ฐ€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

'JAVA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

JDBC๋ž€?  (2) 2023.10.29