Amenable
Amenable's Blog
Amenable
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (189)
    • ๐Ÿ“‚ JAVA (87)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (65)
      • ์ฃผ์š” ๊ฐœ๋… (22)
    • ๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์  (22)
      • ์‹ค์šฉ์ฃผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ (1)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (2)
      • ํด๋ฆฐ ์ฝ”๋“œ (8)
      • ํ•จ๊ป˜ ์ž๋ผ๊ธฐ (1)
      • ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” HTTP&Network Basic (10)
    • ๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๊ฐœ๋… (8)
      • ๋ฌธ์ œํ’€์ด (0)
    • ๐Ÿ“‚ ๋„คํŠธ์›Œํฌ (14)
      • ๊ฐœ๋… (6)
      • ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ (8)
    • ๐Ÿ“‚ ์Šคํ”„๋ง (13)
      • ๊ธฐ๋ณธ ๊ฐœ๋… (13)
    • ๐Ÿ“‚ WEB (5)
    • ๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ (12)
      • ๊ฐœ๋… (2)
      • ์ •๋ ฌ (8)
      • ํŠธ๋ฆฌ (2)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
      • ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ (2)
      • ์ตœ๋‹จ ๊ฒฝ๋กœ (2)
      • ๋ฌธ์ž์—ด (2)
      • ETC (4)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด (4)
      • BOJ_๋ฐฑ์ค€ (4)
    • ๐Ÿ“‚ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (3)
    • ๐Ÿ“‚ DevOps (2)
      • ๋ฐฐํฌ (2)
    • ๐Ÿ“‚ ํ›„๊ธฐ (8)
      • ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค(ํ”„๋ฆฌ์ฝ”์Šค) (4)
      • 2023๋…„ (3)
      • 2024๋…„ (1)
    • ๐Ÿ“‚ ํšŒ๊ณ  (1)
      • 2023๋…„ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿš€ GitHub

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Amenable

Amenable's Blog

ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด API ์œ ์—ฐ์„ฑ์„ ๋†’์ด๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ31)]
๐Ÿ“‚ JAVA/์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”

ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด API ์œ ์—ฐ์„ฑ์„ ๋†’์ด๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ31)]

2023. 6. 1. 20:48

1. PECS ๐ŸŒž

  PECS(Producer-Extends, Consumer-Super)๋ž€ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž… T๊ฐ€ ์ƒ์‚ฐ์ž๋ผ๋ฉด <? extends T>๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์†Œ๋น„์ž๋ผ๋ฉด <? super T>๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

  ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ PECS๋ฅผ ์ดํ•ดํ•ด ๋ณด๋„๋ก ํ•˜์ž.

public class Stack<E> {
    private E[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;

    // ๋ฐฐ์—ด elements๋Š” push(E)๋กœ ๋„˜์–ด์˜จ E ์ธ์Šคํ„ด์Šค๋งŒ ๋‹ด๋Š”๋‹ค.
    // ๋”ฐ๋ผ์„œ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜์ง€๋งŒ,
    // ์ด ๋ฐฐ์—ด์˜ ๋Ÿฐํƒ€์ž„ ํƒ€์ž…์€ E[]๊ฐ€ ์•„๋‹Œ Object[]๋‹ค!
    @SuppressWarnings("unchecked")
    public Stack() {
        elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
    }

    public void push(E e) {
        ensureCapacity();
        elements[size++] = e;
    }

    public E pop() {
        if(size == 0)
            throw new EmptyStackException();

        E result = elements[--size];
        elements[size] = null; // ๋‹ค ์“ด ์ฐธ์กฐ ๊ฐ์ฒด ํ•ด์ œ
        return result;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    private void ensureCapacity() {
        if(elements.length == size) {
            elements = Arrays.copyOf(elements, 2 * size + 1);
        }
    }

    public void pushAll(Iterable<E> src) {
        for(E e : src)
            push(e);
    }

    public void popAll(Collection<E> dst) {
        while(!isEmpty())
            dst.add(pop());
    }
}

  ์ฝ”๋“œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ง€๊ธˆ๊นŒ์ง€๋Š” ํƒ€์ž…๋งค๊ฐœ๋ณ€์ˆ˜ E๋งŒ์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ํƒ€์ž…๋งŒ ์ง€์ •ํ•ด์„œ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด๋‹ค.

  ์ œ๋„ค๋ฆญ์€ ๋ถˆ๊ณต๋ณ€์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜ ์ฝ”๋“œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ํƒ€์ž…์„ ๋„ฃ์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค.

public static void main(String[] args) {
    Stack<Number> numberStack = new Stack<>();

    Iterable<Number> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
    numberStack.pushAll(numbers); // ๊ฐ€๋Šฅ 

    Iterable<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6);
    numberStack.pushAll(integers); // ๋ถˆ๊ฐ€๋Šฅ // ์ปดํŒŒ์ผ ์—๋Ÿฌ
}

  ํ•˜์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ Stack<Number>์— Integer๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ฒด์˜ ์ƒ์œ„ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  ๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

// ๊ธฐ์กด
public void pushAll(Iterable<E> src) {
    for(E e : src)
        push(e);
}


// ๋ณ€๊ฒฝ - ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ ์‚ฌ์šฉ
public void pushAll(Iterable<? extends E> src) {
    for(E e : src)
        push(e);
}
public static void main(String[] args) {
    Stack<Number> numberStack = new Stack<>();

    Iterable<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6);
    numberStack.pushAll(integers);

    Iterable<Double> doubles = Arrays.asList(1.0, 2.1, 3.2, 4.3, 5.4, 6.5);
    numberStack.pushAll(doubles);
}

  ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Number์˜ ํ•˜์œ„ ํƒ€์ž…๋“ค์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

  ์ด๋Ÿฌํ•œ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์‚ฐ์ž(Producer)๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์ƒ์‚ฐ์ž์—์„œ๋Š” extends๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” E์˜ ํ•˜์œ„ ํƒ€์ž…์„ ๋ฐ›์•„์„œ ๋„ฃ์–ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

 

  pushAll๋กœ ๋„ฃ๋Š” ๊ฒƒ์„ ์‚ดํŽด๋ณด์•˜์œผ๋ฏ€๋กœ ๊บผ๋‚ด๋Š” ๊ฒƒ์ธ popAll๋„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž

  ๊บผ๋‚ผ ๋•Œ์—๋Š” ํ•ด๋‹น ํƒ€์ž… E๋ณด๋‹ค ๋” ์ƒ์œ„ ํƒ€์ž…์œผ๋กœ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด E๊ฐ€ Number์ธ ๊ฒฝ์šฐ Object๋กœ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

  ํ•˜์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์ด ํ˜„์žฌ๋Š” ํƒ€์ž… ํ•˜๋‚˜๋กœ ์„ ์–ธ์ด ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ์˜ ์˜๋„๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค.

// ๊ธฐ์กด
public void pushAll(Iterable<E> src) {
    for(E e : src)
        push(e);
}

  ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋„ ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

// ๋ณ€๊ฒฝ - ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ ์‚ฌ์šฉ
public void pushAll(Iterable<? extends E> src) {
    for(E e : src)
        push(e);
}
public static void main(String[] args) {
    Stack<Number> numberStack = new Stack<>();

    Collection<Object> objects = new ArrayList<>();
    numberStack.popAll(objects);
}

  ์ฆ‰, ์ด๋ ‡๊ฒŒ pushAll๊ณผ ๊ฐ™์ด ์ƒ์‚ฐ์ž(Provider) ์—ญํ• ์„ ํ•  ๋•Œ์—๋Š” extends๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  popAll๊ณผ ๊ฐ™์ด ์†Œ๋น„์ž(Consumer) ์—ญํ• ์„ ํ•  ๋•Œ์—๋Š” super๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

  ์ด๊ฒƒ์ด PECS(Producer-Extends, Consumer-Super) ๊ทœ์น™์ด๋‹ค.

 

 

2. ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ VS ์™€์ผ๋“œ์นด๋“œ ๐ŸŒ

  ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์™€์ผ๋“œ์นด๋“œ์—๋Š” ๊ณตํ†ต๋˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์–ด์„œ, ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ๋•Œ ๋‘˜ ์ค‘ ์–ด๋А ๊ฒƒ์„ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ์„ ๋•Œ๊ฐ€ ๋งŽ๋‹ค.

  swap์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค๊ณ  ํ•  ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

// ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์šฉ
public static <E> void swap(List<E> list, int i, int j);
// ์™€์ผ๋“œ์นด๋“œ ์‚ฌ์šฉ
public static void swap(List<?> list, int i, int j);

  ๋งŒ์•ฝ public API๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ๋‘ ๋ฒˆ์งธ๊ฐ€ ๋‚ซ๋‹ค. ์–ด๋–ค ๋ฆฌ์ŠคํŠธ๋“  ์ด ๋ฉ”์„œ๋“œ์— ๋„˜๊ธฐ๋ฉด ๋ช…์‹œํ•œ ์ธ๋ฑ์Šค์˜ ์›์†Œ๋“ค์„ ๊ตํ™˜ํ•ด ์ค„ ๊ฒƒ์ด๊ณ , ์‹ ๊ฒฝ ์จ์•ผ ํ•  ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

  ๊ธฐ๋ณธ ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋ฉ”์„œ๋“œ ์„ ์–ธ์— ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ๋‚˜์˜ค๋ฉด ์™€์ผ๋“œ์นด๋“œ๋กœ ๋Œ€์ฒดํ•˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

  ์ด๋•Œ ๋น„ํ•œ์ •์  ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ผ๋ฉด ๋น„ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ๋กœ ๋ฐ”๊พธ๊ณ , ํ•œ์ •์  ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ผ๋ฉด ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ๋กœ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค.

  ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋ฉด ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๋Š”๋‹ค.

public class Swap {

    public static void swap(List<?> list, int i, int j) {
        list.set(i, list.set(j, list.get(i)));
    }
}

  List<?>์—๋Š” null ์™ธ์—๋Š” ์–ด๋–ค ๊ฐ’๋„ ๋„ฃ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋„์šฐ๋ฏธ ๋ฉ”์„œ๋“œ๋ฅผ ๋”ฐ๋กœ ์ž‘์„ฑํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

public class Swap {

    public static void swap(List<?> list, int i, int j) {
        swapHelper(list, i, j);
    }

    private static <E> void swapHelper(List<E> list, int i, int j){
        list.set(i, list.set(j, list.get(i)));
    }
}

 

ํ•ด๋‹น ๊ธ€์€ ๋ฐฑ๊ธฐ์„  ๋‹˜์˜ '์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” ์™„๋ฒฝ ๊ณต๋žต'์„ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

'๐Ÿ“‚ JAVA > ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํƒ€์ž… ์•ˆ์ „ ์ด์ข… ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ณ ๋ คํ•˜๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ33)]  (1) 2023.06.10
์ œ๋„ค๋ฆญ๊ณผ ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ํ•จ๊ป˜ ์“ธ ๋•Œ๋Š” ์‹ ์ค‘ํ•˜๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ32)]  (0) 2023.06.03
์ด์™•์ด๋ฉด ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ30)]  (0) 2023.05.31
์ด์™•์ด๋ฉด ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ29)]  (1) 2023.05.30
๋ฐฐ์—ด๋ณด๋‹ค๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ28)]  (0) 2023.05.30
    '๐Ÿ“‚ JAVA/์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • ํƒ€์ž… ์•ˆ์ „ ์ด์ข… ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ณ ๋ คํ•˜๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ33)]
    • ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ํ•จ๊ป˜ ์“ธ ๋•Œ๋Š” ์‹ ์ค‘ํ•˜๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ32)]
    • ์ด์™•์ด๋ฉด ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ30)]
    • ์ด์™•์ด๋ฉด ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ29)]
    Amenable
    Amenable
    CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”