개발자는 기록이 답이다

Java, String의 constant pool과 Heap의 차이 본문

언어/Java

Java, String의 constant pool과 Heap의 차이

slow-walker 2023. 8. 21. 12:14

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

String Methods

 

String Methods

A new tool for teams & individuals that blends everyday work apps into one.

www.notion.so

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

 

시간복잡도 와 공간복잡도 ( Time Complexity & Space Complexity ) - TIL

연산 => 산술, 대입, 비교, 이동

nelmm.gitbook.io

https://joshuajangblog.wordpress.com/2016/09/21/time_complexity_big_o_in_easy_explanation/

 

(번역) 알고리즘 쉽게 이해하기 : 시간 복잡도와 Big-O 표기

(번역) 알고리즘을 쉬운 영어로 : 시간 복잡도와 Big-O 표기 오늘 번역글은 medium 의 freecodecamp 글입니다. 알고리즘, 시간 복잡도, Big-O 를 사례를 들어가며 이해하기 쉽게 풀어서 설명된 글입니다.

joshuajangblog.wordpress.com