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

๐Ÿ“š์ฝ์€ ์ฑ… ์ •๋ฆฌ/๊ฐ์ฒด์ง€ํ–ฅ๋””์ž์ธํŒจํ„ด

[JAVA ๊ฐ์ฒด์ง€ํ–ฅ ๋””์ž์ธ ํŒจํ„ด] 2์žฅ : ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์›๋ฆฌ

์ถ”์ƒํ™”

์–ด๋–ค ์˜์—ญ์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ์†์„ฑ์ด๋‚˜ ํ–‰๋™์„ ์ถ”์ถœํ•˜๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•œ๋‹ค.

 

์—ฌ๋Ÿฌ ๊ฐ์ฒด์˜ ๊ณตํ†ต๋œ ํŠน์ง•์„ ํŒŒ์•…ํ•ด ํ•˜๋‚˜์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ผ๋ฐ˜ํ™”ํ•˜๊ฒŒ ๋œ๋‹ค.

์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

๊ฐ ๊ฐœ์ฒด์˜ ๊ตฌ์ฒด์ ์ธ ๊ฐœ๋…์— ์˜์กดํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์„ค๊ณ„๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ex) ์ž๋™์ฐจ๋Š” ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ž๋™์ฐจ๋“  ์ƒ๊ด€ ์—†์ด ์—”์ง„์˜ค์ผ์„ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

์บก์Šํ™”

์บก์Šํ™”๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์€ ๋‹น์—ฐํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ!

์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

์บก์Šํ™”๋Š” ์ •๋ณด ์€๋‹‰์„ ํ†ตํ•ด ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„์™€ ๋†’์€ ์‘์ง‘๋„๋ฅผ ๊ฐ–๋„๋ก ํ•œ๋‹ค. 

-> ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•ด๋„ ์˜ํ–ฅ์ด ์ ์Œ

 

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

์ •๋ณด์€๋‹‰์ด ์—†๋‹ค๋ฉด ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋ณ€๊ฒฝ๋œ ํด๋ž˜์Šค์˜ ๋น„๋ฐ€์— ์˜์กดํ•˜๋Š” ํด๋ž˜์Šค ๋˜ํ•œ ๋ณ€๊ฒฝํ•ด์•ผํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค.

์ด๋Š” ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋†’์ด๊ณ  ์„œ๋กœ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์น˜๊ฒŒ ๋œ๋‹ค.

 

์ผ๋ฐ˜ํ™” ๊ด€๊ณ„

์ผ๋ฐ˜ํ™”๋Š” ๋˜ ๋‹ค๋ฅธ ์บก์Šํ™”๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

(๊ฐ์ฒด ์ง€ํ–ฅ์—์„œ ์ƒ์† ๊ด€๊ณ„)

 

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

 

์ผ๋ฐ˜ํ™”๋Š” ๋˜ ๋‹ค๋ฅธ ์บก์Šํ™”!

'์‚ฌ๋žŒ' ํด๋ž˜์Šค๋Š” ์ž๋™์ฐจ๋Š” ์•Œ์ง€๋งŒ ๊ตฌ์ฒด์ ์ธ ์ž๋™์ฐจ์˜ ์ข…๋ฅ˜๋ฅผ ์•Œ์ง€ ๋ชปํ•œ๋‹ค. ์ฆ‰, ์‚ฌ๋žŒ์€ ์ž๋™์ฐจ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ, 'ํ˜„๋Œ€', 'ํ† ์š”ํƒ€' ๋“ฑ ์ž๋™์ฐจ๊ฐ€ ๋” ์ถ”๊ฐ€๋˜์–ด๋„ ์‚ฌ๋žŒ์€ ๊ทธ์ € ์ž๋™์ฐจ๋งŒ ์•Œ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (์‚ฌ๋žŒ์˜ ๋ณ€๊ฒฝ ์—†์ด ํ™•์žฅ ๊ฐ€๋Šฅ)

 

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ์ผ๋ฐ˜ํ™” ๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ์ž์‹ ํด๋ž˜์Šค๋ฅผ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์€๋‹‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

[KEYPOINT] : "์ผ๋ฐ˜ํ™” ๊ด€๊ณ„๋Š” ์ž์‹ ํด๋ž˜์Šค๋ฅผ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์€๋‹‰ํ•˜๋Š” ์บก์Šํ™”์˜ ์ผ์ข…์ด๋‹ค."

์ผ๋ฐ˜ํ™” ๊ด€๊ณ„์™€ ์œ„์ž„

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ผ๋ฐ˜ํ™” ๊ด€๊ณ„๋ฅผ ์†์„ฑ์ด๋‚˜ ๊ธฐ๋Šฅ์˜ ์ƒ์†, ์ฆ‰ ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด ์กด์žฌํ•œ๋‹ค๊ณ  ์˜คํ•ดํ•˜๊ณ  ์žˆ๋‹ค!

์ด๋Š” ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋‹ค!!

 

MyStack์„ ArrayList๋ฅผ ์ƒ์†ํ•ด ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

์ด ๋•Œ ์šฐ๋ฆฌ๋Š” Userํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด MyStack์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

Userํด๋ž˜์Šค์—์„œ๋Š” MyStack์œผ๋กœ ArrayList์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Stack์˜ ์ค‘๊ฐ„์— ๋„ฃ๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ด๊ฒƒ์€ Stack์˜ ๋ฌด๊ฒฐ์„ฑ ์กฐ๊ฑด์ธ "LIFO" ์œ„๋ฐฐ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ, ์ด ๋‘ ํด๋ž˜์Šค์˜ ์ผ๋ฐ˜ํ™” ๊ด€๊ณ„๋Š” ์„ฑ๋ฆฝํ•  ์ˆ˜ ์—†๋‹ค. (Stack "is a kind of" ArrayList??) -> Nope

 

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ํด๋ž˜์Šค์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ๋งŒ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์ข‹์„๊นŒ? ๋‹ต์€ "์œ„์ž„"์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์œ„์ž„

์œ„์ž„์€ ์ž์‹ ์ด ์ง์ ‘ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋„๋ก ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ์œ„์ž„ ์˜ˆ์‹œ ์ฝ”๋“œ
Public class MyStack<String>{  
  private ArrayList<String> arList = new ArrayList<String>;
  public void push(String ele){
    arList.add(ele);
  }
  public String pop(){
    return arList.remove(size() - 1);
  }
  public boolean isEmpty(){
    return arList.isEmpty();
  }
}

 

๊ธฐ๋Šฅ๋งŒ ์žฌ์‚ฌ์šฉํ•  ๋•Œ๋Š” "์œ„์ž„", ์ผ๋ฐ˜ํ™” ๊ด€๊ณ„๋ผ๋ฉด "์ƒ์†"์„ ์‚ฌ์šฉํ•˜์ž.

๋‹คํ˜•์„ฑ

๊ฐ์ฒด์ง€ํ–ฅ์—์„œ ๋‹คํ˜•์„ฑ์€ '์„œ๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜์„ ๋•Œ ๊ฐ์ž์˜ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋Šฅ๋ ฅ'์ด๋‹ค.

 

๋‹คํ˜•์„ฑ๊ณผ ์ผ๋ฐ˜ํ™”๊ด€๊ณ„๋ฅผ ์ด์šฉํ•ด์„œ ์ž์‹ ํด๋ž˜์Šค๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋‹ค๋ฃฐ ํ•„์š”์—†์ด ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•œ๋‹ค.

Public abstract class Pet{  
  public abstract void talk();
}

public class Cat extends Pet{
  public void talk(){
    sysout("์•ผ์˜น");
  }
}

public class Dog extends Pet{
  public void talk(){
    sysout("๋ฉ๋ฉ");
  }
}

public class Parrot extends Pet{
  public void talk(){
    sysout("์•ˆ๋…€์˜");
  }

  public void fly(){
    sysout("๋‚ ์•˜๋‹ค!");
  }
}

public class Main{
  public static void main(String[] args){
    Pet[] p = {new Cat(), new Dog(), new Parrot};
    ((Cat)p[0]).talk();
    ((Cat)p[1]).talk();
    p[2].fly();
    p[2].talk();
  }
}

์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ๊ฐ์˜ ๋™๋ฌผ์˜ ์šธ์Œ์†Œ๋ฆฌ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋กœ ์ฒ˜๋ฆฌํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, ์ƒˆ๋กœ์šด ๋™๋ฌผ์ด ์ถ”๊ฐ€๋˜๋”๋ผ๋„ ์ˆ˜์ •์—†์ด ๋˜‘๊ฐ™์€ ๋ฉ”์„œ๋“œ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜๊ฐ€ ์ž์‹ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ๋ฒ•์น™)

(๋‹จ, ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ๋ฌผ๋ ค์ค€ ๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ๋ฟ์ด๋‹ค.

 

[KEYPOINT] : ๋‹คํ˜•์„ฑ๊ณผ ์ผ๋ฐ˜ํ™”๊ด€๊ณ„๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ• ๊ฒŒ ํ•  ๋ฟ ์•„๋‹ˆ๋ผ ๋ณ€ํ™”์—๋„ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

 

ํ”ผํ„ฐ ์ฝ”๋“œ์˜ ์ƒ์† ๊ทœ์น™

1. ์ž์‹ ํด๋ž˜์Šค์™€ ๋ถ€๋ชจ ํด๋ž˜์Šค ์‚ฌ์ด๋Š” '์—ญํ•  ์ˆ˜ํ–‰' ๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค.
2. ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋‹ค๋ฅธ ์„œ๋ธŒ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ํ•„์š”๊ฐ€ ์ ˆ๋Œ€ ์—†์–ด์•ผ ํ•œ๋‹ค.
3. ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ฑ…์ž„์„ ๋ฌด์‹œํ•˜๊ฑฐ๋‚˜ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๊ณ  ํ™•์žฅ๋งŒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
4. ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋‹จ์ง€ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ์žฌ์‚ฌ์šฉํ•  ๋ชฉ์ ์œผ๋กœ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋ฉด ์•ˆ๋œ๋‹ค. (์œ„์ž„)
5. ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ์—ญํ• , ํŠธ๋žœ์žญ์…˜, ๋””๋ฐ”์ด์Šค ๋“ฑ์„ ํŠน์ˆ˜ํ™” ํ•ด์•ผ ํ•œ๋‹ค.