우아한테크코스 블랙잭 미션 수행 전 문자와 문자열에 대해 학습한 내용을 정리했다
자바에서는 문자열을 위한 클래스를 제공한다. 다른 언어에서 문자 배열을 사용하는 것과 약간 다르다.
String은 자바 프로그래밍에서 가장 많이 생성되는 객체이다.
final String a = "a"; //L0
final String b = new String("a"); //L1
final String c = new String("a").intern(); //L2
string 생성 방법은 다음처럼 여러 가지가 있다
위 세 결과로는 모두 "a"가 나온다.
따라서 바이트 코드를 통해 결과를 구분할 수 있다.
L0
LINENUMBER 13 L0
LDC "a"
ASTORE 1
L1
LINENUMBER 14 L1
NEW java/lang/String
DUP
LDC "a"
INVOKESPECIAL java/lang/String.<init> (Ljava/lang/String;)V //생성자 호출 확인가능
ASTORE 2
L2
LINENUMBER 15 L2
NEW java/lang/String
DUP
LDC "a"
INVOKESPECIAL java/lang/String.<init> (Ljava/lang/String;)V
INVOKEVIRTUAL java/lang/String.intern ()Ljava/lang/String;
ASTORE 3
String 객체는 문자열의 상태 값을 변경할 수 없다.
이 때 발생할 수 있는 문제는 무엇일까?
위에서 언급했듯 STRING은 불변 객체다. 따라서 String과 String을 더한다면 그 시점에 메모리 할당과 해제를 반복한다.
그러나 StringBuilder는 기존 데이터에 새 데이터를 더하는 방식이다. 따라서 위 방식보다 훨씬 빠르다
실제로 둘의 속도 차이는 어마무시하다...
(팁)
for (int i =0,end = ai.size();i<end;i++){
}
다음과 같이 선언하면 for문을 돌 때마다 Size가 호출되지 않아 최적하가 된다.