스파르타 이노캠/워밍업

2023.05.24 수 워밍업 3일차

haema_ 2023. 5. 24. 21:01
728x90
  • 학습목표
  1. 알고리즘 페어 프로그래밍 문제 3일차
  • 학습 스케쥴

3:00 ~ 4:00 PM - 알고리즘 페어 프로그래밍 2일차 학습 공유

4:00 ~ 6:00 PM - 알고리즘 페어 프로그래밍 학습

7:00 ~ 9:00 PM - 토의 및 마무리


 

 

출력 문자열 처리

System.out.println(); 기능은 상황에 따라 다르긴 하지만 실무 수준에서는 부담이 높아질 수 있으므로 되도록 지양.

StringBuilder StringBuffer, BufferWriter 사용 익숙해지도록 하기


 

StringBuilder와 BufferWriter 차이

  • StringBuilder는 내부적으로 문자열을 동적으로 생성하는 반면, BufferedWriter는 버퍼를 사용하여 문자열 처리.
  • StringBuilder는 BufferedWriter보다 빠르지만, BufferedWriter는 StringBuilder보다 메모리 효율 좋음.
  • StringBuilder는 여러 곳에서 동시에 같은 문자열 인스턴스에 접근할 때 중복 점유를 막을 수 없음. 반면, BufferedWriter는 여러 곳에서 동시에 같은 문자열 인스턴스에 접근할 때 중복 점유를 막을 수 있음.

문자열을 빠르게 처리해야 한다면 StringBuilder를 사용하고, 만약 문자열을 메모리 효율적으로 처리해야 한다면 BufferedWriter를 사용하자.

내부 구현 문자열을 동적으로 생성 버퍼를 사용하여 문자열을 처리
성능 빠름 느림
메모리 효율 나쁨 좋음
중복 점유 가능 불가능

 

StringBuffer와 BufferedWriter 차이

둘 모두 내부적으로 버퍼를 사용해서 문자열을 저장.

  • StringBuffer는 문자열이 추가될 때마다 자동으로 크기가 조정된다. 따라서 StringBuffer는 문자열을 추가하는 작업이 매우 효율적.
  • BufferedWriter는 문자열이 추가될 때마다 특정 크기로 고정됨. 따라서 BufferedWriter는 문자열을 추가하는 작업이 StringBuffer보다 약간 느림.
  • StringBuffer는 동기화된 클래스. 즉, 한 스레드가 StringBuffer를 수정하는 동안 다른 스레드는 StringBuffer를 읽을 수 없다. 따라서 StringBuffer는 멀티 스레드 환경에서 안전하게 사용할 수 있음.
  • BufferedWriter는 비동기화된 클래스. 즉, 한 스레드가 BufferedWriter 수정 중에도 다른 스레드는 BufferedWrite 접근 가능. 따라서 BufferedWriter는 멀티 스레드 환경에서 안전하게 사용할 수 없음.

따라서, 문자열을 추가하는 작업이 많고 멀티 스레드 환경에서 사용할 경우 StringBuffer를 사용, 문자열을 추가하는 작업이 많지 않고 멀티 스레드 환경에서 사용하지 않을 경우 BufferedWriter를 사용.

여기서 한가지 주의할 점은, StringBuffer는 내부적으로 버퍼를 사용하여 문자열을 저장하기 때문에, StringBuffer에 저장된 문자열은 한번에 출력되지 않는다. StringBuffer에 저장된 문자열은 버퍼가 가득 찼을 때, 또는 flush() 메서드가 호출되었을 때 출력된다. 따라서 StringBuffer를 사용하여 문자열을 출력할 때는, 출력할 문자열의 크기가 버퍼의 크기보다 크지 않도록 주의.

 

StringBuilder와 StringBuffer의 차이

 

두 클래스는 문법이나 배열구성도 모두 같지만, 동기화(Synchronization)에서의 지원의 유무가 다르다.

  • StringBuffer는 동기화를 지원하여 멀티 스레드 환경에서도 안전하게 동작할 수 있다.
  • StringBuilder는 동기화를 지원하지 않으므로 단일 스레드 환경에서만 안전하게 사용 가능.

따라서, 문자열을 수정하는 작업이 빈번하게 발생하는 멀티 스레드 환경에서는 StringBuffer를 사용하고, 단일 스레드 환경에서는 StringBuilder를 사용하여 성능을 향상시킬 수 있다.

append() 100ns 50ns
insert() 150ns 75ns
delete() 125ns 62.5ns
reverse() 200ns 100ns
charAt() 25ns 12.5ns
indexOf() 50ns 25ns
lastIndexOf() 75ns 37.5ns
substring() 100ns 50ns
toString() 125ns 62.5ns

위의 표에서 알 수 있듯이, StringBuffer는 StringBuilder보다 모든 연산에서 약간 더 느리지만, 멀티 스레드 환경에서는 동기화된 접근이 가능하기 때문에 성능이 더 안정적이다.


각각을 정리해보면,

  • 멀티스레드에서 문자열 변동이 잦은 상황 - StringBuffer 사용
  • 단일스레드에서 시간효율 - StringBuilder 사용
  • 단일스레드에서 메모리효율 - BufferWriter사용

으로 정리할 수 있을 듯.

 


 

 

스택(Stack)

LIFO(Last in First out)의 형태.

자바에서는 java.util.Stack 참조하여 라이브러리 사용가능

push(), pop(), peek(), isEmpty(), isFull()

 

큐(Queue)

FIFO(First in First out)의 형태.

import java.util.Queue;

한쪽 방향에서는 요소가 들어가고, 반대쪽에서 나오기만 가능

덱(Deque)

FIFO(First in First out)의 형태이지만, 양쪽에서 들어가고 나오는 것이 가능

큐보다 구현이 어렵지만, 더 많은 기능을 사용할 수 있음.

반응형

'스파르타 이노캠 > 워밍업' 카테고리의 다른 글

2023.05.29 월 워밍업 6일차  (0) 2023.05.29
2023.05.26 금 워밍업 5일차  (0) 2023.05.26
2023.05.25 목 워밍업 4일차  (0) 2023.05.25
2023.05.23 화 워밍업 2일차  (0) 2023.05.23
2023.05.22 월 워밍업 1일차  (0) 2023.05.22