일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백준
- 알고리즘
- string
- SQL
- Spring
- primitivetype
- 데이터탑입
- 자바오류
- 프로그래머스
- java
- 시뮬레이션
- 차이점
- 변수
- char
- include태그
- 자바
- json파싱
- JSON
- 주사위굴리기
- 내맘대로정리
- ClassPathResource
- 차이
- Exception
- ReferenceType
- mybatis
- 원시타입
- 참조타입
- sql태그
- Char[]
- 코딩테스트
- Today
- Total
재채기는 H
왜 char[] 과 String Type으로 나누어 사용할까? [Java] 본문
문득 자바개발을 하다가 생각했다. 그냥 char[]을 안쓰고 String 클래스만 쓰면 안될까?
우선 String을 생성하는 방식은 두가지있습니다.
- 리터럴(literal) : String Constant Pool 저장
- new 연산자 : Heap 저장
위의 그림과 같이 리터럴로 생성할 경우, String Constant Pool에 저장되어 같은 문자열을 공유합니다.
(즉, Pool안에서 같은 값을 동시에 공유한다.)
new연산자로 생성할 경우는 같은 값이어도 각각 Heap메모리에 저장됩니다.
위의 내용을 보면 알 수 있다.
- String이 리터럴 방식은 같은 문자열을 공유한다.
- String의 'equals() 메소드' 와 '== 연산자' 비교의 차이 (값 비교와 주소 비교)
- 리터럴 방식과 다르게 new 연산자는 각각 Heap 메모리 주소를 가진다.
String 클래스를 열어보면 final char[] 타입으로 불변성을 가집니다. 그래서 String 변수의 값을 바꿀 때마다 값을 수정하는 것이 아니라 새로 선언하고 JVM이 정리합니다. 즉, String은 읽기만 가능하고 수정은 불가능합니다.
예를 들면
String str = 'Hello';
str += " World";
는 "Hello" + "World" 가 합쳐서 "Hello World" 가 되는 것이 아니라
기존의 str 변수의 "Hello"를 냅두고 새로 "Hello World" 문자열로 초기화 하는 것 입니다.
여기서 "Hello"는 JVM이 정리합니다.
StringBuilder와 StringBuffer를 통해 가변성을 지원함으로써 String의 단점(?)을 보완해줍니다. 둘의 차이는 동시성을 지원해주냐 안지원해주냐의 문제인데 나중에 다루도록 하겠습니다.
char 배열일 때는 문자값을 인덱스를 통해 메모리에 저장됩니다. 또한 String과 다르게 인덱스를 통해 접근하여 값을 수정할 수 있습니다.
char[]은 선언할 때는 배열의 크기를 정하여 선언합니다.
char[] ch = new char[1000];
String str = "Hello World";
char[] cArr = str.toCharArray();
물론, String 또한 toCharArray() 메소드를 통해 char형 배열로 변형 후,
charAt()을 통해 인덱스 접근할 수 있습니다.
1. 메모리 사이즈를 명시 차이
2. 자료형 타입 (기본형, 참조형)
3. 저장되는 메모리 차이 (stack - heap)
4. String Constant Pool 사용여부
String 클래스는 char 배열을 메모리적 측면과 기능적 측면을 추가한것 같습니다.
이러한 점을 고려하여 변수선언시, 목적에 맞게 사용하면 될 것 같다.
'내맘대로정리' 카테고리의 다른 글
Primitive Type과 Reference Type 차이는? (0) | 2022.08.18 |
---|---|
데이터 타입과 변수의 차이는? (2) | 2022.08.16 |