Skip to content

Latest commit

ย 

History

History
232 lines (167 loc) ยท 7.15 KB

week8.md

File metadata and controls

232 lines (167 loc) ยท 7.15 KB

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

๐Ÿ“–๋ชฉํ‘œ

์ž๋ฐ”์˜ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ํ•™์Šตํ•˜์—ฌ๋ผ.


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

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


์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ํ•˜๊ธฐ

Java์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค์™€ ๊ฐ™์ด ๋ ˆํผ๋Ÿฐ์Šค ํƒ€์ž…์— ์†ํ•˜๋ฉฐ, ์˜ค์ง ์ƒ์ˆ˜, ๋ฉ”์†Œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜, default ๋ฉ”์†Œ๋“œ, static ๋ฉ”์†Œ๋“œ ๊ทธ๋ฆฌ๊ณ  ์ค‘์ฒฉ๋œ ํƒ€์ž…๋งŒ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” interface ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

interface ์ธํ„ฐํŽ˜์ด์Šค_์ด๋ฆ„ {
  int a = 10;		// -> public static final int a = 10;
  void ๋ฉ”์„œ๋“œ_A(๋งค๊ฐœ๋ณ€์ˆ˜);	// -> public abstract void ๋ฉ”์„œ๋“œ_A(๋งค๊ฐœ๋ณ€์ˆ˜);
  int ๋ฉ”์„œ๋“œ_B();		// -> public abstract int ๋ฉ”์„œ๋“œ_B();
}

์ธํ„ฐํŽ˜์ด์Šค์—์„œ๋Š” ํ•„๋“œ์˜ ๊ฒฝ์šฐ public static final, ๋ฉ”์†Œ๋“œ์˜ ๊ฒฝ์šฐ public abstract ๋ฅผ ์ƒ๋žตํ•ด๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ด๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.


์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ํ•˜๊ธฐ

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

class ๊ตฌํ˜„์ฒด implements ์ธํ„ฐํŽ˜์ด์Šค_์ด๋ฆ„ {
  @Override
  public void ๋ฉ”์„œ๋“œ_A(๋งค๊ฐœ๋ณ€์ˆ˜) {
    ...
  }
  
  @Override
  public int ๋ฉ”์„œ๋“œ_B() {
    ...
  }
}

์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜ํ•œ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋Š” ๋ฌด์กฐ๊ฑด ๊ตฌํ˜„ํ•ด์•ผํ•˜๋ฉฐ, ๋งŒ์•ฝ ์ผ๋ถ€๋งŒ ๊ตฌํ˜„ํ•ด์•ผ ๋œ๋‹ค๋ฉด abstract ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.


์ธํ„ฐํŽ˜์ด์Šค ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ

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

interface Human {
  void say()
}

class User implements Human {
  @Override
  public void say() {
    System.out.println("Hi!")
  }
}

์œ„์™€ ๊ฐ™์ด Human์ด๋ž€ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ทธ์— ๋Œ€ํ•œ ๊ตฌํ˜„์ฒด๊ฐ€ ์กด์žฌํ•  ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

class App {
  public static void main(String[] args) {
    Human jongnan = new User();
    jongnan.say();
  }
}

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

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

interface Human {
  void move();
  void say();
}

interface Weapon {
  void attack();
}

interface Citizen extends Human {
}

interface Soldier extends Human, Weapon {
}

์ƒ์†์„ ๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋Š” ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๊นŒ์ง€ ๊ตฌํ˜„์„ ํ•ด์•ผ๋œ๋‹ค.


์ธํ„ฐํŽ˜์ด์Šค์˜ default ๋ฉ”์†Œ๋“œ(Java 8)

Java 8์—์„œ๋ถ€ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค์— ์ถ”๊ฐ€๋œ default ๋ฉ”์†Œ๋“œ๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹Œ ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ์˜€์ง€๋งŒ, ์ด๋ฅผ ์ถ”๊ฐ€ํ•œ ์ด์œ ๋Š” ํšจ์œจ์ ์ธ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด์„œ์ด๋‹ค. ๊ธฐ์กด ์ธํ„ฐํŽ˜์ด์Šค์— ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด, ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด ๋ชจ๋‘ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์ƒ๊ธด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ๋‹จ์—์„œ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ํ•œ ๊ณณ๋งŒ ์†๋ณด๋ฉด ๋œ๋‹ค.

interface Eng {
  void move();
  default void say() {
    System.out.println("Hi!");
  }
}

์œ„์™€ ๊ฐ™์ด default ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์„ ์–ธ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ ‘๊ทผ์ œ์–ด์ž๋Š” public์œผ๋กœ ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

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

interface Eng {
  default void say() {
    System.out.println("Hi!");
  }
}

interface Kor {
  default void say() {
    System.out.println("์•ˆ๋…•!");
  }
}

class User implements Eng, Kor {
  // ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ!
}

์ง์ ‘ ์ฝ”๋”ฉํ•ด๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ์• ๋งคํ•œ ์ƒํ™ฉ์—์„œ๋Š” ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ฆ‰, ๋‹ค์ค‘ ์ƒ์†์„ ๋ง‰์•„ ๋†“์•˜์ง€๋งŒ, ์ด๋ฅผ ํšŒํ•„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์กด์žฌํ•œ๋‹ค. ๋ฐ”๋กœ ์• ๋งคํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค.

class User implements Eng, Kor {
  @Override
  public void say() {
    Eng.super.say();
  }
}

์œ„์™€ ๊ฐ™์ด say ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•œ๋‹ค๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์›ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ default ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


์ธํ„ฐํŽ˜์ด์Šค์˜ static ๋ฉ”์†Œ๋“œ(Java 8)

Java 8์— ๋˜ํ•œ static ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. static ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ตฌํ˜„์ฒด์—์„œ๋Š” ์ด๋ฅผ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์—†๋‹ค.

interface User {
  static String getType() {
    return "Human";
  }
  
  void say();
}

class American implements User {
  public void say() {
    System.out.println("Hi!");
  }
}

class Korean implements User {
  public void say() {
    System.out.println("์•ˆ๋…•!");
  }
}

class App {
  public static void main(String[] args) {
    User kor = new Korean();
    String userType = User.getType();
    String korType = kor.getType();	// ์—๋Ÿฌ๋ฐœ์ƒ
  }
}

์œ„์™€ ๊ฐ™์ด ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฐ”๋กœ ์ ‘๊ทผํ•˜์—ฌ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•˜๋ฉฐ ๊ทธ๋ ‡์ง€ ์•Š์„ ์‹œ์—๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.


์ธํ„ฐํŽ˜์ด์Šค์˜ private ๋ฉ”์†Œ๋“œ(Java 9)

Java 9๋ถ€ํ„ฐ ์ค‘๋ณต์ ์ธ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์บก์Šํ™”๋ฅผ ์œ„ํ•ด private ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. 8์—์„œ default์™€ static ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์žˆ์–ด ์ค‘๋ณต์ ์ธ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋˜‘๊ฐ™์ด default์™€ static ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—†์•จ ์ˆ˜ ์žˆ์ง€๋งŒ, ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด private ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

interface User {
  default void walk() {
    printMove();
  }
  
  default void run() {
    printMove();
  }
  
  default void stop() {
    System.out.println("๋ฉˆ์ถค!");
  }
  
  private void printMove() {
    System.out.println("์›€์ง์ž„ ์‹œ์ž‘!");
  }
}

static ๋ฉ”์†Œ๋“œ์—์„œ๋Š” private static ํ‚ค์›Œ๋“œ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.



Reference