Notice
Recent Posts
Recent Comments
Link
개발자는 기록이 답이다
Java, String의 constant pool과 Heap의 차이 본문
Java String
문자열?
순서를 가진 문자들의 집합
- “쌍따옴표를 통해 나타낼 수 있음”
- 글자, 단어, 문장, 문서 등 문자로 구성된 자료형
// 기본 자료형
int var_integer = 10;
double var_real - 3.141592;
char var_character = 'A';
boolean var_boolean = true;
// 참조 자료형
String string_empty = "";
String string_word = "Hello";
String string_line = "Hello String!"
String string_doc = "First line\\nSecond line";
Java.lang.String
- java.lang 패키지로 제공되는 Java문자열 클래스
- 별도의 Import없이 사용 가능
- 문자열 작업에 유용한 메소드 제공
String str_literal = "Hello";
String str_object = new String("Hello");
- 한 번 인스턴스가 생성되면 수정할 수 없음(immutable object)
// 자료형 열거할때 array 사용하는데, 중간에 원소에 접근해서 변형 가능
char[] char_arr = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
char_arr[4] = 'E';
System.out.println(char_arr);
// ABCDEFG
// String은 불가능, 배열등에 사용하는 대괄호를 사용하지 않음
String str = "ABCDEFG";
str[4] = 'E';
System.out.println(str);
// Compile Error!
// 원소에 접급하거나 원소값을 알고 싶을 경우
// 해당 인덱스의 값을 읽어오는 건 가능
String str = "ABCDEFG";
// 캐릭터 엣을 사용해서 해당 인덱스 값을 반환해줄 뿐, 접근자를 제공하는 건 아님
// 이걸 통해 값 변경은 할 수 없음
str.charAt(4) = 'E';
System.out.println(str);
// Compile Error!
- 값의 변경은 불가능하지만, 새 String을 만들어 바꿀 수는 있다.
- or Using StringBuilder
- 문제를 풀면서 다른 사람 코드를 보게 되면 StringBuilder를 많이 보게될텐데
- String보다 이점이 많아서 사용하는 것이다
// 부분적으로 변형하는게 아니라 새로운 클래스로 대체 해야한다
String str = "ABCDEFG";
str = "ABCDEFG";
System.out.println(str);
// ABCDEFG
String str = "ABCDEFG";
char[] temp_arr = str.toCharArray();
temp_arr[4] = 'E';
str = new String(temp_arr);
System.out.println(str);
// ABCDEFG
String str = "ABCDEFG";
// 덧셈 연산하는것도 새 인스턴스를 생성해서 돌려주는 것이다
str = str.substring(0, 4) + 'E' + str.substring(5,7);
System.out.println(str);
// ABCDEFG
서로 같은 두 문자열
String 값 저장 방식에 따라 차이가 있다
String str1 = "abc";
String str2 = new String("abc");
// 기본형은 상관없지만 오프젝트 클래스는 ==연산이 해당 인스턴스의 주소값 비교를 한다
// 담겨있는 값이 같아도 주소값이 다르다
System.out.println(str1 == str2);
// false
// String 선언의 두 방법
String str_literal1 = "test";
String str_literal2 = "test";
String str_obejct1 = new String("test");
String str_object2 = new String("test");
- 공통 풀에 저장하느냐, 흰 영역에 저장하느냐에 따라 차이
- 어느 영역의 저장공간에 값을 가지고 있느냐에 따라 String비교가 달라진다
- literal은 공통풀에 기록되서 같은 내용이면 같은 곳을 가르키고,
- 동일한 값이 있으면 새로 저장하지 않고 기존 값을 참조한다
- 기존의 constant String pool 참조
- new로 생성한건 흰 영역에 기록되서 같은 내용이라도 별개로 존재한다
- constant String pool 참조하지 않고 바로 Heap에 따로 저장
// Stirng 주소 비교
// 서로 같은 주소에 공유데이터로 저장되서 비교
System.out.println(str_literal1 == str_literal2); // true
// literal은 constant pool, object는 heap 영역
System.out.println(str_literal1 == str_object1); // false
// object 1,2가 heap영역에서 서로 개별적으로 저장되어있음
System.out.println(str_object1 == str_object2); // false
// String value 비교
System.out.println(str_literal1.equals(str_literal2)); // true
System.out.println(str_literal1.equals(str_object1)); // true
System.out.println(str_object1.equals(str_object2)); // true
String Methods
https://docs.oracle.com/javase/8/docs/api/java/lang/String.html
Method name | Return value | Description |
charAt(int index) | char | index번째 문자 |
length() | int | 문자열의 길이 |
equals(Object anObject) | boolean | 문자열 값의 비교 |
compareTo(String anotherString) | int | 두 문자열을 사전순으로 비교한 결과 |
toCharArray() | char[] | 문자열을 변환한 character array |
toLowerCase() | String | 모든 문자를 소문자로 변경한 새 문자열 |
toUpperCase() | String | 모든 문자를 대문자로 변경한 새 문자열 |
contains(CharSequence s) | boolean | 문자열을 포함 여부 |
replace(CharSequence target, CharSequence replacement) | String | target을 모두 replacement로 바꾼 새 문자열 |
split(String regex) | String[] | 정규 표현식에 맞게 문자열을 여러 문자열로 분할 |
substring(int beginIndex, int endIndex | String | [beginIndex, endIndex]를 갖는 새 문자열 반환 |
indexOf(int ch, int fromIndex) | int | fromIndex로 부터 ch문자가 나타나는 가장 첫 인덱스 |
... | ... | ... |
📕본 포스팅은 패스트캠퍼스의 "핵심유형 20개로 한 번에 끝내는 알고리즘 코딩테스트 with Java 초격차 패키지 Online." 을 공부하면서 정리한 내용입니다.
https://medium.com/@joongwon/string-의-메모리에-대한-고찰-57af94cbb6bc
https://nelmm.gitbook.io/til/algorithm/time-space-complexity
https://joshuajangblog.wordpress.com/2016/09/21/time_complexity_big_o_in_easy_explanation/
'언어 > Java' 카테고리의 다른 글
JVM이해하기 - 자바, JVM, JDK, JRE의 차이 (2) | 2023.11.20 |
---|---|
Java List에서 요소 삭제: remove(), removeAll(), removeIf() 메서드 사용법 비교 (0) | 2023.10.24 |
Java, 자료구조 Array 배열의 개념과 시간복잡도 (1) | 2023.09.27 |
Java로 보는 시간복잡도, 공간복잡도 (0) | 2023.08.29 |
시간 복잡도 Time Complexity with Java (0) | 2023.08.29 |