๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ/Java

[JAVA] ์ถ”์ƒํด๋ž˜์Šค VS ์ธํ„ฐํŽ˜์ด์Šค ์™œ ์‚ฌ์šฉํ• ๊นŒ? ์ฐจ์ด์ , ์˜ˆ์ œ๋กœ ํ™•์ธ :: ๋งˆ์ด์ž๋ชฝ

by ๐ŸŒปโ™š 2020. 2. 8.

์ถ”์ƒํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค ์™œ... ์‚ฌ์šฉํ• ๊นŒ?

์šฐ๋ฆฌ๋Š” ์ถ”์ƒํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด์„œ ์•Œ๊ณ  ์žˆ๋ƒ๊ณ  ๋ˆ„๊ฐ€ ๋ฌผ์–ด๋ณธ๋‹ค๋ฉด ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ๋Œ€๋‹ต์„ ํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋ก ์ ์ธ ๋‚ด์šฉ ๋ง๊ณ  ์ •์ž‘ "์™œ ์‚ฌ์šฉํ•˜๋‚˜์š”?", "์ฐจ์ด์ ์ด ๋ญ”๊ฐ€์š”?", "์ถ”์ƒํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์–ด๋–ป๊ฒŒ ์ •ํ•˜๋‚˜์š”?" ์ด๋Ÿฐ ์‹ค๋ฌด์ ์ธ ์งˆ๋ฌธ์ด ๋“ค์–ด์˜ค๋ฉด ์‹œ์›ํ•˜๊ฒŒ ๋Œ€๋‹ตํ•˜๊ธฐ๊ฐ€ ์ƒ๊ฐ๋ณด๋‹ค ํž˜๋“ค๊ฒ๋‹ˆ๋‹ค. ํž˜๋“œ์…จ๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ ์ด ๊ธ€์„ ์ฝ๊ณ  ๊ณ„์‹ค๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ €๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜€๊ณ  ๋‹จ์ˆœํžˆ ์ถ”์ƒํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ณด๋‹ค ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€๊ฐ€ ๊ถ๊ธˆํ•˜์…จ๋‹ค๋ฉด ์•„๋ž˜ ์ œ ์ƒ๊ฐ๋“ค์„ ์ฒœ์ฒœํžˆ ์ฝ์–ด์ฃผ์‹œ๋ฉด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์„๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

 

 

์ผ๋‹จ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ถ”์ƒํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.

์ถ”์ƒํด๋ž˜์Šค๋ž€?

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

class ์•ž์— "abstract" ์˜ˆ์•ฝ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์†์„ ํ†ตํ•ด์„œ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๊ณ  ์„ ์–ธ๋ถ€๋งŒ ์ž‘์„ฑํ•˜๋Š” ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
2
3
4
abstract class ํด๋ž˜์Šค์ด๋ฆ„ {
    ...
    public abstract void ๋ฉ”์„œ๋“œ์ด๋ฆ„();
}

 

์ธํ„ฐํŽ˜์ด์Šค๋ž€?

์ถ”์ƒํด๋ž˜์Šค๊ฐ€ ๋ฏธ์™„์„ฑ ์„ค๊ณ„๋„๋ผ๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธฐ๋ณธ ์„ค๊ณ„๋„๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋„ ์ถ”์ƒํด๋ž˜์Šค์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ๋„์›€์„ ์ฃผ๋Š” ๋ชฉ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ  ํด๋ž˜์Šค์™€ ๋‹ค๋ฅด๊ฒŒ ๋‹ค์ค‘์ƒ์†(๊ตฌํ˜„)์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
interface ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฆ„ {
    public static final ์ƒ์ˆ˜์ด๋ฆ„ = ๊ฐ’;
    public abstract void ๋ฉ”์„œ๋“œ์ด๋ฆ„();
}

 

์ถ”์ƒํด๋ž˜์Šค VS ์ธํ„ฐํŽ˜์ด์Šค ์ฐจ์ด์ 

์ถ”์ƒํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ณตํ†ต์ ์€ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์™œ ๊ตณ์ด 2๊ฐ€์ง€๋กœ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉํ• ๊นŒ์š”? ์ถ”์ƒํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋Šฅ๋“ค์„ ์‚ดํŽด๋ณด๋ฉด ์ถ”์ƒํด๋ž˜์Šค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—ญํ• ์„ ๋‹ค ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์™œ ๊ตณ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋Š”๊ฒŒ ์žˆ๋Š” ๊ฑธ๊นŒ์š”?

์ด๋ก ์ ์ธ ์ฐจ์ด์ ์„ ๋‹ค ์ œ์™ธํ•˜๊ณ  ๋‘๊ฐœ๋กœ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ์‚ฌ์šฉ์šฉ๋„๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

 

1. ์‚ฌ์šฉ์˜๋„ ์ฐจ์ด์ 

์ถ”์ƒํด๋ž˜์Šค๋Š” IS - A "~์ด๋‹ค".

์ธํ„ฐํŽ˜์ด์Šค๋Š” HAS - A "~์„ ํ•  ์ˆ˜ ์žˆ๋Š”".

์ด๋ ‡๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค์ค‘์ƒ์†์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์šฉ๋„๋ฅผ ์ •ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์˜ ํŠน์„ฑ์ƒ ํ•œ๊ฐœ์˜ ํด๋ž˜์Šค๋งŒ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜์—ฌ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ตฌ๋ถ„์„ ์ถ”์ƒํด๋ž˜์Šค ์ƒ์†์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•˜๊ณ , ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ธ€๋กœ ํ‘œํ˜„ํ•˜์—ฌ ์ดํ•ด๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๋” ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

2. ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ ์‚ฌ์šฉ ์—ฌ๋ถ€

๋งŒ์•ฝ ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ธฐ๋ณธ ํ‹€์„ ๊ตฌ์„ฑํ•œ๋‹ค๋ฉด... ๊ณตํ†ต์œผ๋กœ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค๋„ ๋ชจ๋“  ํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์—ฌ ์žฌ์ •์˜ ํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์ถ”์ƒํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค. ์–ด!? ๊ทธ๋Ÿฌ๋ฉด ๊ทธ๋ƒฅ ์ถ”์ƒํด๋ž˜์Šค๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€์š”? ์œ„์—์„œ ์–˜๊ธฐ ํ–ˆ๋“ฏ์ด ์ž๋ฐ”๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋งŒ ์ƒ์†์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ถ”์ƒํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š”๋ฐ ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด? ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ž‘์„ฑํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ํŽธํ•˜๊ฒ ์ฃ ?

 

์•„๋ฌด๋ž˜๋„ ๊ธ€๋กœ๋งŒ ์„ค๋ช…ํ•˜๋Š”๋ฐ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ์–ธ์ œ ๋ฌด์—‡์„ ์‚ฌ์šฉํ•ด์•ผํ• ์ง€ ์•Œ์•„ ๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค.

์ถ”์ƒํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค ์˜ˆ์ œ (์ƒ๋ช…์ฒด)

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

 

Creature ์ถ”์ƒํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public abstract class Creature {
    private int x;
    private int y;
    private int age;
    
    public Creature(int x, int y, int age) {
        this.age = age;
        this.x = x;
        this.y = y;
    }
    
    public void age() {
        age++;
    }
    
    public void move(int xDistance) {
        x += xDistance;
    }
    
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    
    public abstract void attack();
    public abstract void printInfo();
    
    @Override
    public String toString() {
        return "x : " + x + ", y : " + y + ", age : " + age;
    }
}
 

๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ๋ช…์ฒด๊ฐ€ ๊ฐ–๋Š” ์š”์†Œ๋กœ ์œ„์น˜ x, y๊ทธ๋ฆฌ๊ณ  age ๋‚˜์ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์„ ์–ธํ–ˆ๊ณ  ์ƒ์„ฑ์ž๊ฐ€ ๋งŒ๋“ค์–ด ์งˆ๋•Œ ์ด 3๊ฐ€์ง€ ์š”์†Œ๋Š” ๋ฐ›์•„์„œ ๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. toString ๋ฉ”์„œ๋“œ๋Š” ๋‚˜์ค‘์— ์ถœ๋ ฅ์€ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

 

1
2
3
4
5
6
7
public void age() {
    age++;
}
 
public void move(int xDistance) {
    x += xDistance;
}
 

์ƒ๋ช…์ฒด๋ผ๋ฉด ๋‚˜์ด๋ฅผ ๋จน๊ณ  x์ขŒํ‘œ์ƒ์œผ๋กœ ์ด๋™ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ๊ณตํ†ต ์ ์ธ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ƒ์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

1
2
public abstract void attack();
public abstract void printInfo();

์ถ”์ƒ๋ฉ”์„œ๋“œ๋กœ๋Š” ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ƒ๋ช…์ฒด์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด์ง€๋งŒ ๊ฐ๊ฐ ์ƒ๋ช…์ฒด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌํ˜„์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ๋‘ ๋ฉ”์„œ๋“œ๋Š” ์ถ”์ƒ๋ฉ”์„œ๋“œ๋กœ ์„ ์–ธํ•˜์—ฌ ํ•˜์œ„ํด๋ž˜์Šค์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

Animal ์ถ”์ƒํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
public abstract class Animal extends Creature{
    
    public Animal(int x, int y, int age) {
        super(x, y, age);
    }
    
    @Override
    public void attack() {
        System.out.println("๋ชธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ฒฉ!!");
    }
}
 

 ๋™๋ฌผ ํด๋ž˜์„œ๋Š” ์ƒ๋ช…์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์—  Creature ์ถ”์ƒํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™๋ฌผ์€ ๋ชธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ƒ๋ฉ”์„œ๋“œ ์ค‘์— attack๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์ถ”์ƒํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๋‹ค ํ•˜์…จ๋‹ค๋ฉด ์ฝ”๋“œ์ƒ ์ด์ƒํ•œ ๋ถ€๋ถ„์ด ์ง‘ํž๊ฒ๋‹ˆ๋‹ค. ๋ฐ”๋กœ printInfo ๋ฉ”์„œ๋“œ๋„ ์ถ”์ƒ๋ฉ”์„œ๋“œ์ธ๋ฐ ์™œ ๋™๋ฌผ ํด๋ž˜์Šค์—๋Š” ์—†๋Š” ๊ฑธ๊นŒ์š”?? ์ด ์ด์œ ๋Š” ํ•˜๋‚˜ ๋” ๋‚ด๋ฆฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒ๋ช…์ฒด ํด๋ž˜์Šค๋„ ๋™๋ฌผ ํด๋ž˜์Šค๋„ ์ถ”์ƒํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ฆ‰ ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ ์„ ์–ธํ•œ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ์•ž์œผ๋กœ ๋™๋ฌผ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•  ํด๋ž˜์Šค์—๊ฒŒ ์œ„์ž„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™๋ฌผ ํด๋ž˜์Šค๋„ ์ถ”์ƒํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ„์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ƒํด๋ž˜์Šค๋Š” ์ƒ์†์„ ์œ„ํ•œ ํด๋ž˜์Šค์ด๋‹ˆ๊นŒ!!

 

Human ์ถ”์ƒํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public abstract class Human extends Creature implements Talkable{
    public Human(int x, int y, int age) {
        super(x, y, age);
    }
    
    @Override
    public void attack() {
        System.out.println("๋„๊ตฌ๋ฅผ ์‚ฌ์šฉ!!");
    }
    
    @Override
    public void talk() {
        System.out.println("์‚ฌ๋žŒ์€ ๋ง์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.");
    }
}
 

์ธ๊ฐ„ ํด๋ž˜์Šค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ attack ์ถ”์ƒ๋ฉ”์„œ๋“œ๋Š” ๊ตฌํ˜„ํ•ด์ฃผ๊ณ , printInfo ์ถ”์ƒ๋ฉ”์„œ๋“œ๋Š” ์•„๋ž˜๋กœ ์œ„์ž„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธ๊ฐ„ ํด๋ž˜์Šค๋Š” ๋™๋ฌผ ํด๋ž˜์Šค์™€ ๋‹ค๋ฅด๊ฒŒ Talkable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.  ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ๋“ฏ์ด Talkable ์ธํ„ฐํŽ˜์ด์Šค์—์„œ๋Š” talk๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋กœ ์žˆ๊ฒ ์ฃ ? ์ถ”์ƒํด๋ž˜์Šค๋„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋ณด๋ฉด ์ •๋ง ์ผ๋ฐ˜ํด๋ž˜์Šค์™€ ํฌ๊ฒŒ ์ฐจ์ด๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Talkable ์ธํ„ฐํŽ˜์ด์Šค

1
2
3
public interface Talkable {
    abstract void talk();
}

Talkable ์ธํ„ฐํŽ˜์ด์Šค์—์„œ๋Š” ํฌ๊ฒŒ ๋‹ค๋ฃฐ ๊ฒƒ ์—†์ด ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋งŒ ์„ ์–ธ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋“ค์˜ ๋ช…๋ช… ๊ทœ์น™์„ ๋ณด์‹œ๋ฉด ์•„์‹œ๊ฒ ์ง€๋งŒ ~able๋กœ ๋๋‚˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋“ค์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‹ค ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ "~๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”" ํด๋ž˜์Šค๋ผ๋Š” ๊ฒƒ์€ ๋ช…์‹œํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ex) Parsable, Comparable...

 

Flyable ์ธํ„ฐํŽ˜์ด์Šค

1
2
3
4
public interface Flyable {
    void fly(int yDistance);
    void flyMove(int xDistance, int yDistance);
}
 

๋‹ค์Œ์€ ์ƒˆ ์ข…๋ฅ˜์˜ ๋™๋ฌผ ํด๋ž˜์Šค์— ๊ตฌํ˜„์‹œํ‚ฌ Flyable ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋™๋ฌผ๋“ค๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ yํ–‰์œผ๋กœ ์œ„๋กœ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค.

 

Pigeon ์ผ๋ฐ˜ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Pigeon extends Animal implements Flyable{
    public Pigeon(int x, int y, int age) {
        super(x, y, age);
    }
    
    @Override
    public void fly(int yDistance) {
        setY(getY() + yDistance);
    }
    
    @Override
    public void flyMove(int xDistance, int yDistance) {
        setY(getY() + yDistance);
        setX(getX() + xDistance);
    }
    
    @Override
    public void printInfo() {
        System.out.println("Pigeon -> " + toString());
    }
}
 

๋น„๋‘˜๊ธฐ ํด๋ž˜์Šค๋Š” ์ผ๋ฐ˜ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๋™๋ฌผ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๊ณ  ๋‚ ์ˆ˜ ์žˆ๋Š” ๋™๋ฌผ์ด๊ธฐ์— Flyable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ๊ณ  ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋“ค์„ ๊ตฌํ˜„ ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. printInfo ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด์‹œ๋ฉด ์ด์ „์— Creatureํด๋ž˜์„œ์˜ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด์ฃผ์—ˆ์ฃ ?

 

Swimable ์ธํ„ฐํŽ˜์ด์Šค

1
2
3
public interface Swimable {
    void swimDown(int yDistance);
}

Swimable ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ฐจ์ด์ ์—์„œ 2. ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ ์‚ฌ์šฉ์—ฌ๋ถ€์™€ ๊ด€๋ จ๋œ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์•ž์œผ๋กœ ๊ฑฐ๋ถ์ด์™€ ์ผ€๋นˆ์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ• ๊ฒ๋‹ˆ๋‹ค. ๊ฑฐ๋ถ์ด๋Š” ๋™๋ฌผ์ด๊ณ  ์ผ€๋นˆ์€ ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‘ ์ƒ๋ช…์ฒด ๋ชจ๋‘ ์ˆ˜์˜์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ๊ฒฝ์šฐ ์ƒ๋ช…์ฒด ํด๋ž˜์Šค์—๋‹ค๊ฐ€ swinDown ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์–ด์•ผํ•˜๋‚˜? ์•„๋‹ˆ๋ฉด ๊ฐ๊ฐ ๋™๋ฌผ๊ณผ ์‚ฌ๋žŒ ํด๋ž˜์Šค์— ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์–ด์•ผํ•˜๋‚˜? ์Œ... ํ•˜์ง€๋งŒ ๋™๋ฌผ์ด๋‚˜ ์‚ฌ๋žŒ์ค‘์—์„œ ์ˆ˜์˜์„ ๋ชปํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค!? ๋ฐ”๋กœ ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋‹ค๋กœ ์„ ์–ธ์„ ํ•ด์ค˜์„œ ๊ฐ๊ฐ ์ˆ˜์˜์„ ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์— ๊ตฌํ˜„์‹œ์ผœ์ค˜์„œ ๋งŒ๋“ค์–ด ์ฃผ๋ฉด ๊ฐ€๋…์„ฑ๋„ ์ข‹๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š” ์ธก๋ฉด์—์„œ๋„ ๋›ฐ์–ด๋‚˜๊ฒ ์ฃ ??

 

Turtle ์ผ๋ฐ˜ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Turtle extends Animal implements Swimable{
    public Turtle(int x, int y, int age) {
        super(x, y, age);
    }
    
    @Override
    public void swimDown(int yDistance) {
        setY(getY() - yDistance);
    }
    
    @Override
    public void printInfo() {
        System.out.println("Turtle -> " + toString());
    }
}
 

๊ฑฐ๋ถ์ด ํด๋ž˜์Šค์—์„œ ์•„๋ž˜๋กœ ์ˆ˜์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์žฌ์ •์˜ ํ•ด์ฃผ๊ณ 

 

Kevin ์ผ๋ฐ˜ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Kevin extends Human implements Programmer, Swimable{
    public Kevin(int x, int y, int age) {
        super(x, y, age);
    }
    
    @Override
    public void coding() {
        System.out.println("Hello World!");
    }
    
    @Override
    public void swimDown(int yDistance) {
        setY(getY() - yDistance);
        if(getY() < -10) {
            System.out.println("๋„ˆ๋ฌด ๊นŠ์ด ๋“ค์–ด๊ฐ€๋ฉด ์ฃฝ์„์ˆ˜๋„ ์žˆ์–ด!!");
        }
    }
    
    @Override
    public void printInfo() {
        System.out.println("Kevin -> " + toString());
    }
}
 

Kevinํด๋ž˜์Šค์—์„œ๋„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ์žฌ์ •์˜ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ผ€๋นˆ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” y๊ฐ’์ด -10์ดํ•˜๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด ์ฃฝ์„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๋Š” ๋˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์œผ๋กœ ์žฌ์ •์˜ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ด๋Ÿฐ ๋ถ€๋ถ„์—์„œ๋Š” ์ถ”์ƒํด๋ž˜์Šค ๋ง๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์ฃ ??

๊ทธ๋ฆฌ๊ณ  ๋˜๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์žฅ์ ! ๋ฐ”๋กœ ๋‹ค์ค‘๊ตฌํ˜„! Kevin์€ ์ˆ˜์˜๋„ ํ•  ์ˆ˜ ์žˆ๊ณ  ์ฝ”๋”ฉ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Programmer์™€ Swimable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๊ณ  ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

Programmer ์ธํ„ฐํŽ˜์ด์Šค

1
2
3
public interface Programmer {
    void coding();
}

 

Main ์‹คํ–‰ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class Main {
    public static void main(String[] args) {
        Pigeon p = new Pigeon(5,10,14);
        p.printInfo();
        p.age();
        p.move(100);
        p.printInfo();
        p.fly(5);
        p.printInfo();
        p.flyMove(1020);
        p.printInfo();
        p.attack();
        System.out.println();
        
        Kevin kev = new Kevin(0035);
        kev.printInfo();
        kev.age();
        kev.move(10);
        kev.printInfo();
        kev.attack();
        kev.coding();
        kev.swimDown(20);
        kev.printInfo();
        kev.talk();
        System.out.println();
        
        Turtle tur = new Turtle(100-1095);
        tur.printInfo();
        tur.age();
        tur.move(-100);
        tur.printInfo();
        tur.attack();
        tur.swimDown(1000);
        tur.printInfo();
    }
}
 

์„ค๊ณ„ํ•œ ๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์œผ๋‹ˆ... ์ด์ œ ํ™•์ธ ํ•ด๋ด์•ผ๊ฒ ์ฃ ?

์‹คํ–‰๊ฒฐ๊ณผ

์œ„ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์ง์ ‘ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋ฅธ ์˜ˆ์‹œ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋ฉด ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒํด๋ž˜์Šค์˜ ์ฐจ์ด์ ๊ณผ ์ƒํ™ฉ๋ณ„ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผํ• ์ง€ ๊ฐ์ด ์˜ฌ๊ฒƒ ๊ฐ™์•„์š”. ์ €๋„ ๋‚˜๋ฆ„๋Œ€๋กœ ๊ณต๋ถ€ํ•˜๊ณ  ์‹ค์Šต์„ ํ†ตํ•ด ์ถ”์ƒํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์ •๋ฆฌ๋ฅผ ํ•ด๋ดค๋Š”๋ฐ ๋งž๊ณ  ํ‹€๋ฆฐ ๋ถ€๋ถ„๋“ค๋„ ๋ถ„๋ช… ์กด์žฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ€๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ •์ • ๋ฐ ์œ„ ๋‚ด์šฉ์— ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๊ผญ ๋‚จ๊ฒจ์ฃผ์„ธ์š”!!

 

์ •๋ฆฌ

์ถ”์ƒํด๋ž˜์Šค ์‚ฌ์šฉ ์‹œ๊ธฐ : ์ƒ์† ๊ด€๊ณ„๋ฅผ ์ญ‰ ํƒ€๊ณ  ์˜ฌ๋ผ๊ฐ”์„๋•Œ ๊ฐ™์€ ์กฐ์ƒํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š”๋ฐ ๊ธฐ๋Šฅ๊นŒ์ง€ ์™„๋ณ€ํžˆ ๋˜‘๊ฐ™์€ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

(ex. attack, printInfo)

์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ ์‹œ๊ธฐ : ์ƒ์† ๊ด€๊ณ„๋ฅผ ์ญ‰ ํƒ€๊ณ  ์˜ฌ๋ผ๊ฐ”์„๋•Œ ๋‹ค๋ฅธ ์กฐ์ƒํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š”๋ฐ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ

(ex. Swimable)

๋Œ“๊ธ€