일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- framework
- 코딩
- 그리디알고리즘
- 알고리즘
- 읽기쉬운코드
- 애자일
- JPA
- 개발
- 애자일프로그래밍
- 코딩테스트
- Spring
- 그리디
- database
- spring boot
- 백준
- 자바
- Baekjoon
- 개발자
- 애자일기법
- cleancode
- 프레임워크
- 클린코드
- Elasticsearch
- 스프링
- ES
- 코드
- Java
- 엘라스틱서치
- 데이터베이스
- API
- Today
- Total
튼튼발자 개발 성장기🏋️
문자열을 생성할 때 어떻게 생성하나요? 본문
java에서 문자열을 생성할 때 보편 적으로 두 가지 방법이 있다. (StringBuilder, StringBuffer 제외)
String str1 = "str1";
String str2 = new String("str1");
이 두 방법에는 어떤 차이가 있을까?
일단 이를 이해하려면 jvm의 메모리 구조를 알아야 한다.
[그림 1]과 같이 jvm은 크게 다섯 가지의 메모리 구조를 갖는다. 컴파일이 된 class 파일은 Class Loader로부터 method 영역에 로드된다.
- method 영역: 클래스에 대한 정보가 저장된다. (클래스 이름, 접근 제어자, 필드, 메서드) 또한 static 변수가 저장되는데 힙 영역에 생성된 객체를 참조할 수 있다.
- Heap 영역: 런타임에 생성되는 모든 객체가 저장된다.
- stack 영역: 메서드를 실행하기위한 정보들이 저장된다. 메서드가 하나 호출될 때마다 Frame이라는 자료구조가 들어가는데 메서드가 끝나거나 예외가 터지면 사라진다. Frame에는 자기 자신의 인스턴스(this)와 메서드의 파라미터, 메서드의 지역변수를 가지며 연산에 대한 값을 저장하기 위해 operand stack을 가진다.
- PC Register: 현재 실행되고 있는 명령의 주소를 저장된다. 멀티 스레스 프로그래밍 환경에서 서로 다른 스레드간 점유가 오고가는 과정에서 이전에 어떤 명령을 실행했는지에 대해서 알 수 있다.
- Native method stack: C나 C++로 작성된 메서드를 실행할 때 사용된다.
여기서 method영역과 Heap 영역은 모든 thread에서 공유하기 때문에 Thread safe하지 못한다. 반면에 stack, PC Register 그리고 Native Method Stack의 경우에는 스레드 별로 생성되어 서로 다른 스레드에서 간섭할 수 없기 때문에 Thread safe하다.
문자열 리터럴을 사용했을 경우
이 방법에서는 "문자열 상수 풀(String Constant Pool)"이라는 공간에 저장이 된다. 이 공간은 Heap 영역 안에 있다. 이름에서 알 수 있듯이 리터럴이 이전에 상수 풀에 저장된 적이 있다면, 새로운 객체를 생성하지 않고 이미 존재하는 객체의 참조를 할당한다. 그렇기 때문에 리터럴을 사용하는 것이 메모리 효율성이 높다. 중복된 문자열 객체를 생성하지 않고, 이미 존재하는 객체를 재사용하기 때문이다.
new 연산자를 통해 생성한 경우
이 방법도 마찬가지로 런타임에서 생성된 객체이므로 힙 영역에 저장된다. 하지만 문자열 상수 풀에 저장되지 않는다. 리터럴이 상수 풀에 존재하더라도, 힙 메모리에 새로운 String 객체가 생성된다. 즉 위 예제에서 str1과 str2는 서로 다른 메모리 주소를 참조한다. 그렇기 때문에 메모리 효율성이 떨어진다.
'프로그래밍 > JAVA' 카테고리의 다른 글
값을 비교할 것인가 메모리 주소를 비교할 것인가? (0) | 2024.08.28 |
---|---|
Error와 Exception의 차이를 아시나요? (1) | 2024.08.28 |
STREAM 활용 (0) | 2022.08.23 |
Optional (0) | 2022.08.12 |
Stream (0) | 2022.07.25 |