[Java] 자바에서는 스택을 잘 안 쓴다고?

2025. 7. 22. 23:42·공부 기록/CS

포스팅 계기

이미지로 대신한다.

 

그래서 오늘은 왜 스택을 잘 안 쓰는지, 그럼 대신 뭘 사용하는지에 대해 작성해보려 한다.


Stack은 Vector를 상속받기 때문

자바의 `Stack` 클래스는 `java.util.Vector`를 상속받아 만들어졌다.

바로 이 점에서 문제가 시작된다.

 

`Vector`는 동기화된(synchronized) 클래스이다.

이는 멀티스레드 환경에서 안전하다는 장점이 있으나, 싱글스레드 환경에서는 불필요한 성능 저하를 일으킨다.

동기화되는 게 왜?

동기화(Synchronization)란?

동기화는 여러 스레드가 공유 자원에 접근할 때, 동시에 접근하지 못하게 막는 것이다.

int cnt = 0;

public void increment() {
    cnt++; // 여러 스레드가 동시에 실행하면 문제 발생 가능
}

 

여러 스레드가 동시에 `cnt++`를 실행하게 되면 덮어쓰기 같은 문제가 발생할 수 있다.

따라서 자바에서는 `synchronized`를 사용한다.

public synchronized void increment() {
    cnt++;
}

 

이렇게 하게 되면 한 번에 하나의 스레드만 이 메서드를 실행할 수 있게 된다.

그런데 왜 성능 저하가?

한 스레드가 실행하고 있는 사이, 다른 스레드는 대기해야 하기 때문이다.

이 대기 시간이 누적되면 성능이 저하된다...만

싱글스레드 환경에서는 '다른 스레드' 자체가 없기 때문에, 대기할 스레드도 없다.

 

그럼에도!

`synchronized`가 걸린 메서드는 JVM 내부적으로 모니터 락(Monitor Lock)을 관리해야 한다.

그 락을 얻고 해제하는 과정 자체도 비용이 들게 된다.


따라서 ArrayDeque을 사용한다!

`ArrayDeque`은 `Deque` 인터페이스를 구현한 클래스이다.

Deque(Double Ended Queue)은 이름 그대로 양쪽 끝에서 삽입과 삭제가 가능한 자료구조지만,

한쪽만 사용하면 스택처럼 쓸 수 있다.

 

`ArrayDeque`은

  1. 내부적으로 배열을 사용해 빠르고
  2. `synchronized`가 없어 불필요한 비용도 없을 뿐더러
  3. null 저장도 막아주기 때문에 안전하다.

실제로 Oracle 공식 문서에서도 `Stack`보다 `ArrayDeque` 사용을 권장하고 있다.

A more complete and consistent set of LIFO stack operations is provided by the Deque interface and its implementations, which should be used in preference to this class.

'공부 기록 > CS' 카테고리의 다른 글

[Java] String이 뭐야  (0) 2025.07.13
[Spring] Controller, Service, Repository, Domain, DTO가 뭐야  (2) 2025.06.22
[Java] String to int, int to String 변환하기  (2) 2025.05.11
[Java] LinkedList와 ListIterator에 대한 고찰  (1) 2025.05.01
[백엔드/Java] Stream vs for-loop 성능 비교  (1) 2025.04.21
'공부 기록/CS' 카테고리의 다른 글
  • [Java] String이 뭐야
  • [Spring] Controller, Service, Repository, Domain, DTO가 뭐야
  • [Java] String to int, int to String 변환하기
  • [Java] LinkedList와 ListIterator에 대한 고찰
lelezhong
lelezhong
흘러가듯이
  • lelezhong
    zhong
    lelezhong
  • 전체
    오늘
    어제
    • 전체보기 (14)
      • 개인 프로젝트 (1)
        • Hatchery (1)
      • SSAFY (3)
      • 공부 기록 (10)
        • CS (6)
        • 알고리즘 (1)
        • 트러블슈팅 (1)
        • 정처기 (2)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자바
    tostirng
    티스토리 인라인
    어레이덱
    java
    ssafy
    티스토리 백틱
    싸피 에세이
    위젯 기반 웹 게임
    정처기 오답
    인라인 코드 공백
    싸피 14기
    dto란
    백틱 공백
    싸피
    싸피14기
    싸피 코테
    싸피 14기 지원
    정처기 25년 1회차
    스프링 계층 구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
lelezhong
[Java] 자바에서는 스택을 잘 안 쓴다고?
상단으로

티스토리툴바