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

이왕이면 μ œλ„€λ¦­ νƒ€μž…μœΌλ‘œ λ§Œλ“€λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ29)]
πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”

이왕이면 μ œλ„€λ¦­ νƒ€μž…μœΌλ‘œ λ§Œλ“€λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ29)]

2023. 5. 30. 10:59

1. λ“€μ–΄κ°€κΈ° μ „ πŸ„‍♀️

  μ•„λž˜μ˜ Object 기반으둜 λ§Œλ“€μ–΄μ§„ Stack 클래슀λ₯Ό μ‚΄νŽ΄λ³΄μž.

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

    public Stack() {
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }

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

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

        Object 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 static void main(String[] args) {
    Stack stack = new Stack();
    for(String arg : List.of("a", "b", "c"))
        stack.push(arg);
    while (!stack.isEmpty()) {
        System.out.println(((String)stack.pop()).toUpperCase());
    }
}

  이 ν΄λž˜μŠ€λŠ” μ œλ„€λ¦­ νƒ€μž…μ΄μ–΄μ•Ό ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” μŠ€νƒμ—μ„œ κΊΌλ‚Έ κ°μ²΄λ₯Ό ν˜•λ³€ν™˜ν•΄μ•Ό ν•˜λŠ”λ°, μ΄λ•Œ λŸ°νƒ€μž„ μ˜€λ₯˜κ°€ λ‚  μœ„ν—˜μ΄ μžˆκΈ° λ•Œλ¬Έμ΄λ‹€.

 

  κ·Έλž˜μ„œ '클래슀 선언에 νƒ€μž… 맀개 λ³€μˆ˜λ₯Ό μΆ”κ°€ν•˜κ³ ', 'μ½”λ“œμ— 쓰인 Objectλ₯Ό μ μ ˆν•œ νƒ€μž… λ§€κ°œλ³€μˆ˜λ‘œ λ°”κΎΈλ©΄' μ•„λž˜μ™€ κ°™λ‹€.

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

    public Stack() {
        elements = new E[DEFAULT_INITIAL_CAPACITY]; // Type parameter 'E' cannot be instantiated directly
    }

    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);
        }
    }
}

  ν•΄λ‹Ή μ½”λ“œλŠ” μ»΄νŒŒμΌλ˜μ§€ μ•ŠλŠ”λ‹€. 

  elements = new E[DEFAULT_INITIAL_CAPACITY];μ—μ„œμ™€ 같이 E와 같은 싀체화 λΆˆκ°€ νƒ€μž…μœΌλ‘œλŠ” 배열을 λ§Œλ“€ 수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. μ œλ„€λ¦­ λ°°μ—΄ μƒμ„±μ„ μ œκ±°ν•˜λŠ” λ‘ κ°€μ§€ λ°©λ²•을 μ•Œμ•„λ³΄λ©΄μ„œ μ œλ„€λ¦­ νƒ€μž…μœΌλ‘œμ˜ λ³€κ²½μ„ μ™„μ„±ν•΄ 보자.

 

 

2. [방법 1] Object 배열을 μƒμ„±ν•œ λ‹€μŒ μ œλ„€λ¦­ λ°°μ—΄λ‘œ ν˜•λ³€ν™˜ν•˜λŠ” 것 🏌️‍♀️

  μ œλ„€λ¦­ λ°°μ—΄ 생성 였λ₯˜λ₯Ό ν•΄κ²°ν•˜λŠ” 첫 번째 방법은 Object 배열을 μƒμ„±ν•œ λ‹€μŒ μ œλ„€λ¦­ λ°°μ—΄λ‘œ ν˜•λ³€ν™˜μ„ ν•˜λŠ” 것이닀.

// κΈ°μ‘΄
public Stack() {
    elements = new E[DEFAULT_INITIAL_CAPACITY];
}

// λ³€κ²½
public Stack() {
    elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY]; // Unchecked cast: 'java.lang.Object[]' to 'E[]'
}

  μ΄λ ‡κ²Œ ν•˜λ©΄ μΌλ°˜μ μœΌλ‘œλŠ” νƒ€μž…μ΄ μ•ˆμ „ν•˜μ§€ μ•Šμ•„μ„œ μ»΄νŒŒμΌλŸ¬κ°€ κ²½κ³ λ₯Ό 보낸닀.

 

  ν•˜μ§€λ§Œ, λ°°μ—΄ elementsλŠ” private ν•„λ“œμ— μ €μž₯되고, ν΄λΌμ΄μ–ΈνŠΈλ‘œ λ°˜ν™˜λ˜κ±°λ‚˜ λ‹€λ₯Έ λ©”μ„œλ“œμ— μ „λ‹¬λ˜λŠ” 일이 μ „ν˜€ μ—†λ‹€. 비검사 ν˜•λ³€ν™˜μ€ ν™•μ‹€νžˆ μ•ˆμ „ν•˜λ‹€.

  κ·Έλž˜μ„œ μ•„λž˜μ™€ 같이 @SuppressWarnings μ• λ„ˆν…Œμ΄μ…”μœΌλ‘œ κ²½κ³ λ₯Ό 숨길 수 μžˆλ‹€.

// λ°°μ—΄ elementsλŠ” push(E)둜 λ„˜μ–΄μ˜¨ E μΈμŠ€ν„΄μŠ€λ§Œ λ‹΄λŠ”λ‹€.
// λ”°λΌμ„œ νƒ€μž… μ•ˆμ „μ„±μ„ 보μž₯ν•˜μ§€λ§Œ,
// 이 λ°°μ—΄μ˜ λŸ°νƒ€μž„ νƒ€μž…μ€ E[]κ°€ μ•„λ‹Œ Object[]λ‹€!
@SuppressWarnings("unchecked")
public Stack() {
    elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
}

 

  μ œλ„€λ¦­ λ°°μ—΄ 생성을 μ œκ±°ν•˜λŠ” 첫 번째 λ°©λ²•μ˜ μž₯단점은 μ•„λž˜μ™€ κ°™λ‹€.

  • μž₯점
    가독성이 μ’‹λ‹€.
    ν˜•λ³€ν™˜μ„ λ°°μ—΄ μƒμ„± μ‹œμ—λ§Œ ν•΄μ£Όλ©΄ λœλ‹€.
  • 단점
    Eκ°€ Objectκ°€ μ•„λ‹Œ ν•œ λ°°μ—΄μ˜ λŸ°νƒ€μž„ νƒ€μž…μ΄ μ»΄νŒŒμΌνƒ€μž„ νƒ€μž…κ³Ό 달라 νž™ μ˜€μ—Ό(Heap Pollution)을 μΌμœΌν‚¨λ‹€.

 

 

3. [방법 2] elements ν•„λ“œμ˜ νƒ€μž…μ„ E[]μ—μ„œ Object[]둜 λ°”κΎΈλŠ” 것 πŸ‚

  μ œλ„€λ¦­ λ°°μ—΄ 생성 였λ₯˜λ₯Ό ν•΄κ²°ν•˜λŠ” 두 번째 방법은 elements ν•„λ“œμ˜ νƒ€μž…μ„ E[]μ—μ„œ Object[]둜 λ°”κΎΈλŠ” 것이닀.

public class Stack<E> {

    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;

    public Stack() {
        elements = 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 = (E) 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);
        }
    }
}

  pop() λ©”μ„œλ“œμ—μ„œ 배열이 λ°˜ν™˜ν•œ μ›μ†Œλ₯Ό E둜 ν˜•λ³€ν™˜ν•˜λŠ” κ³Όμ •μ—μ„œ κ²½κ³ κ°€ λœ¬λ‹€.

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

    E result = (E) elements[--size]; // Unchecked cast: 'java.lang.Object' to 'E'
    elements[size] = null; // λ‹€ μ“΄ μ°Έμ‘° 객체 ν•΄μ œ
    return result;
}

  EλŠ” 싀체화 λΆˆκ°€ νƒ€μž…μ΄λ―€λ‘œ μ»΄νŒŒμΌλŸ¬λŠ” λŸ°νƒ€μž„μ— μ΄λ€„μ§€λŠ” ν˜•λ³€ν™˜μ΄ μ•ˆμ „ν•œμ§€ 증λͺ…ν•  방법이 μ—†λ‹€. μ΄λ²ˆμ—λ„ λ§ˆμ°¬κ°€μ§€λ‘œ μš°λ¦¬κ°€ μ§μ ‘ μ¦λͺ…ν•˜κ³  κ²½κ³ λ₯Ό μˆ¨κΈΈ μˆ˜ μžˆλ‹€.

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

    // pushμ—μ„œ E νƒ€μž…λ§Œ ν—ˆμš©ν•˜λ―€λ‘œ 이 ν˜•λ³€ν™˜μ€ μ•ˆμ „ν•˜λ‹€.
    @SuppressWarnings("unchecked")
    E result = (E) elements[--size];

    elements[size] = null; // λ‹€ μ“΄ μ°Έμ‘° 객체 ν•΄μ œ
    return result;
}

 

  μ œλ„€λ¦­ λ°°μ—΄ 생성을 μ œκ±°ν•˜λŠ” 두 번째 λ°©λ²•μ˜ μž₯단점은 μ•„λž˜μ™€ κ°™λ‹€.

  • μž₯점
    νž™ μ˜€μ—Όμ„ κ±±μ •ν•˜μ§€ μ•Šμ•„도 λœλ‹€.
  • 단점
    λ°°μ—΄μ—μ„œ μ›μ†Œλ₯Ό μ½μ„ λ•Œλ§ˆλ‹€ ν˜•λ³€ν™˜μ„ ν•΄μ€˜μ•Ό ν•œλ‹€.

 

 

4. 마무리 πŸ‡

  μ§€κΈˆκΉŒμ§€ μ„€λͺ…ν•œ 방법이 이전 μ•„μ΄ν…œ 주제인 'λ°°μ—΄λ³΄λ‹€λŠ” 리슀트λ₯Ό μ‚¬μš©ν•˜λΌ'와 λͺ¨μˆœλœλ‹€κ³  생각할 수 μžˆλ‹€. ν•˜μ§€λ§Œ, 배열을 항상 리슀트둜 λ°”κΏ€ 수 μžˆλŠ” 것은 μ•„λ‹ˆλ‹€. 그리고 항상 쒋은 것도 μ•„λ‹ˆλ‹€. λ˜ν•œ, μžλ£Œκ΅¬μ‘°λŠ” μ„±λŠ₯에 λ―Όκ°ν•˜κΈ° λ•Œλ¬Έμ— μžλ£Œκ΅¬μ‘°λ₯Ό κ΅¬ν˜„ν•  λ•Œμ—λŠ” λ°°μ—΄μ„ μ“°λŠ” κ²½μš°κ°€ λ§Žλ‹€.

  κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 이번 μ•„μ΄ν…œμ—μ„œ μ„€λͺ…ν•œ Stack μ˜ˆμ œλ„ μ•Œμ•„λ‘λ„λ‘ ν•˜μž.

 

ν•΄λ‹Ή 글은 λ°±κΈ°μ„  λ‹˜μ˜ 'μ΄νŽ™ν‹°λΈŒ μžλ°” μ™„λ²½ 곡랡'을 μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

'πŸ“‚ JAVA > μ΄νŽ™ν‹°λΈŒ μžλ°”' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

ν•œμ •μ  μ™€μΌλ“œμΉ΄λ“œλ₯Ό μ‚¬μš©ν•΄ API μœ μ—°μ„±μ„ 높이라 - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ31)]  (0) 2023.06.01
이왕이면 μ œλ„€λ¦­ λ©”μ„œλ“œλ‘œ λ§Œλ“€λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ30)]  (0) 2023.05.31
λ°°μ—΄λ³΄λ‹€λŠ” 리슀트λ₯Ό μ‚¬μš©ν•˜λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ28)]  (0) 2023.05.30
비검사 κ²½κ³ λ₯Ό μ œκ±°ν•˜λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ27)]  (0) 2023.05.23
둜 νƒ€μž…μ€ μ‚¬μš©ν•˜μ§€ 말라 - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ26)]  (0) 2023.05.23
    'πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • ν•œμ •μ  μ™€μΌλ“œμΉ΄λ“œλ₯Ό μ‚¬μš©ν•΄ API μœ μ—°μ„±μ„ 높이라 - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ31)]
    • 이왕이면 μ œλ„€λ¦­ λ©”μ„œλ“œλ‘œ λ§Œλ“€λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ30)]
    • λ°°μ—΄λ³΄λ‹€λŠ” 리슀트λ₯Ό μ‚¬μš©ν•˜λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ28)]
    • 비검사 κ²½κ³ λ₯Ό μ œκ±°ν•˜λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ27)]
    Amenable
    Amenable
    CS, μžλ°”, 자료ꡬ쑰, μ•Œκ³ λ¦¬μ¦˜, μŠ€ν”„λ§, μŠ€ν”„λ§ λΆ€νŠΈμ— ν•΄λ‹Ήν•˜λŠ” κ°œλ°œμ— κ΄€ν•œ λ‚΄μš©μ„ κ³΅μœ ν•©λ‹ˆλ‹€.

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”