Publish:

ํƒœ๊ทธ: ,

์นดํ…Œ๊ณ ๋ฆฌ:

  • ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ„์˜ ์ƒ์†์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.
  • ์ถ”์ƒํด๋ž˜์Šค์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด์ ์„ ์•Œ์•„๋ณธ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†

๋งŒ์•ฝ ์ด๋ฏธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฟ ์กด์žฌํ•˜๋Š” ์ƒํƒœ์—์„œ ์ƒˆ๋กœ์šด ๊ทœ์น™์„ ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜ํ•˜๊ณ  ์‹ถ์„๋• ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ์ด ๊ธ€์—์„œ๋Š” ๊ธฐ์กด ์ธํ„ฐํŽ˜์ด์Šค์— ์ƒˆ๋กœ์šด ๊ทœ์น™ ์ถ”๊ฐ€์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋”œ๋ ˆ๋งˆ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ๋‹ค.

1
2
3
4
  // Interface
  public interface Spec {
    void m1();
  }
1
2
3
4
5
6
7
8
  // Concrete Class
  public class A implements Spec {

    @Override
    public void m1() {
      System.out.println("A.m1()");
    }
  }
1
2
3
4
5
6
7
8
  // Concrete Class
  public class B implements Spec {

  @Override
  public void m1() {
    System.out.println("B.m1()");
  }
}

ํ˜„์žฌ ์ด๋Ÿฐ์‹์œผ๋กœ ๊ตฌํ˜„๋œ ์ƒํƒœ์ธ๋ฐ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค C ๋Š” m1() ๊ธฐ๋Šฅ์™ธ์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ •์˜ํ•ด์„œ ์“ฐ๊ณ ์‹ถ์€ ์ƒํ™ฉ์ด๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
  public class C implements Spec {
    @Override
    public void m1() {
      System.out.println("A.m1()");
    }
    
    // ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
    public void m2() {
      ...
    }
  }

์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ผ์ข…์˜ ๊ทœ์น™ ๋ชจ์Œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •์˜๋œ ๊ทœ์น™์€ ๋ชจ๋“  ๊ตฌํ˜„ํด๋ž˜์Šค๊ฐ€ ๋”ฐ๋ผ์•ผ๋งŒ ํ•œ๋‹ค. ๋งŒ์•ฝ m2() ๋ฅผ Spec ์ธํ„ฐํŽ˜์ด์Šค์— ์ถ”์ƒ๋ฉ”์†Œ๋“œ๋กœ ์ •์˜ํ•œ๋‹ค๋ฉด Spec ์„ ๊ตฌํ˜„ํ•œ ๋ชจ๋“  ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜ํ•˜๋ฉด์„œ๋„ ๊ธฐ์กด ๊ตฌํ˜„ํด๋ž˜์Šค์—๋Š” ์˜ค๋ฅ˜์ „ํŒŒ๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?
์ž๋ฐ”์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ œ์‹œํ•œ๋‹ค.

default method

java 8 ์ดํ›„๋กœ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ default method ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š์œผ๋ฉด์„œ ๊ธฐ์กด ๊ทœ์น™์— ์ƒˆ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์œ ์šฉํ•œ๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•œ ๋ฉ”์„œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„œ๋ธŒํด๋ž˜์Šค์˜ ๊ตฌํ˜„์„ ๊ฐ•์ œํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋‹จ์ ์ด๋‹ค.
1
2
3
4
5
6
  public implements Spec {
    void m1();
    
    // default method : ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ ํ•  ๋ฉ”์†Œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋นˆ ์ƒํƒœ๋กœ ๊ตฌํ˜„๋งŒ ํ•ด๋‘”๋‹ค.
    default void m2() {}
  }

์•ž์— default ํ‚ค์›Œ๋“œ๋ฅผ ๋„ฃ๊ณ  ๊ตฌํ˜„๋ถ€๊นŒ์ง€ ์ž‘์„ฑํ•ด ์ฃผ๋ฉด ๋œ๋‹ค. ์ด๋•Œ default ๋Š” ์ ‘๊ทผ์ œํ•œ์ž์˜ default ๊ฐ€ ์•„๋‹ˆ๋ผ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ๋ฉ”์†Œ๋“œ๋ฅผ ๋œปํ•œ๋‹ค. (์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ•ญ์ƒ ์ถ”์ƒ๋ฉ”์†Œ๋“œ(public abstract) ๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค..)

1
2
3
4
5
6
7
8
9
10
11
12
  public class C implements Spec {
    @Override
    public void m1() {
      System.out.println("A.m1()");
    }
  
    // ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€. ์ด ๋ฉ”์†Œ๋“œ๋Š” ์ถ”์ƒ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์„ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š”๋‹ค.
    @Override
    public void m2() {
        ...
    }
  }

default method ๊ฐ€ ํ•„์š”ํ•œ ๊ตฌํ˜„ํด๋ž˜์Šค์—์„  ํ•„์š”์— ๋”ฐ๋ผ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ default mehthod ๋Š” ์ถ”์ƒ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ธŒํด๋ž˜์Šค์˜ ๊ตฌํ˜„์„ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ์‹ค์ˆ˜๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ์ •์ƒ์ ์ธ ์ž‘๋™์„ ํ•˜๋ฉฐ, ์ด๋ฅผ ๋ง‰์„ ์ˆ˜๊ฐ€ ์—†๋‹ค.

extends interface

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

์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ธฐ์กด์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•œ๋‹ค.

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

1
2
3
  public interface Spec2 extends Spec{
    void m3();
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  public class C implements Spec2{
    // ์„œ๋ธŒ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ์‹œ ์ˆ˜ํผ์ธํ„ฐํŽ˜์ด์Šค๋„ ๋ชจ๋‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
    @Override
    public void m1() {
      System.out.println("A.m1()");
    }
    
    @Override
    public void m2() {
          ...
    }
  
    @Override
    public void m3() { // ์ถ”๊ฐ€
          ...
    }
    
  }

์ธํ„ฐํŽ˜์ด์Šค ๊ฐ„์˜ ์ƒ์†์„ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ๊ธฐ๋Šฅ์ด 100๊ฐœ ์ •๋„๋œ๋‹ค๋ฉด ๋ชจ๋“  ๊ตฌํ˜„ ํด๋ž˜์Šค์—์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•ด์•ผํ•œ๋‹ค.

with abstract class

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

์ถ”์ƒํด๋ž˜์Šค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  interface CommonSpec {
    m1();
    m2();
    m3();
    m4();
  }
  
  abstract class AbstractSpec implements CommonSpec{
    @Override
    public void m1() {}
    
    @Override
    public void m2() {}
    
    @Override
    public void m3() {}
    
    @Override
    public void m4() {}
  }
1
2
3
4
5
6
7
8
9
10
11
12
  public class MyClass extends AbstractSpec {
    // ๊ตฌํ˜„ํด๋ž˜์Šค์—์„œ ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋งŒ ์žฌ์ •์˜ ํ•œ๋‹ค.
    @Override
    public void m1() {
      System.out.println("MyClass.m1()");
    }
    
    @Override
    public void m2() {
      System.out.println("MyClass.m2()");
    }
  } 
๋ฐฉ๋ฌธํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋Œ“๊ธ€,์ง€์ ,ํ”ผ๋“œ๋ฐฑ ์–ธ์ œ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค๐Ÿ˜Š

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ