[우테코] 문자와 문자열

이건회·2023년 2월 28일
0

우테코

목록 보기
12/19

개요

우아한테크코스 블랙잭 미션 수행 전 문자와 문자열에 대해 학습한 내용을 정리했다

문자열

자바에서는 문자열을 위한 클래스를 제공한다. 다른 언어에서 문자 배열을 사용하는 것과 약간 다르다.
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

  • 위에서 보면 L0의 String a = "a"처럼 리터럴로 선언한 String은 String pool에서 나와 새 객체가 생성되지 않고 캐싱된 것을 가져온다.
  • L1은 독립적인 새 객체가 생성된다.
  • L2는 객체를 생성한 이후에, String pool을 가리키도록 값을 바꾼다.
  • 그런데 그냥 리터럴로 선언하면 되는걸 INTERN이 왜 필요할까? 고민해보자
  • 핵심은 위와 같이 코드를 짜다 최적화를 하기 위해 드는 고민 시 의심 및 검증을 위해 바이트코드를 활용할 수 있는 점이다.
  • JVM에 대한 이해도를 높일 필요성이 있다

String은 불변이다

String 객체는 문자열의 상태 값을 변경할 수 없다.
이 때 발생할 수 있는 문제는 무엇일까?

String + String vs StringBuilder

위에서 언급했듯 STRING은 불변 객체다. 따라서 String과 String을 더한다면 그 시점에 메모리 할당과 해제를 반복한다.

그러나 StringBuilder는 기존 데이터에 새 데이터를 더하는 방식이다. 따라서 위 방식보다 훨씬 빠르다

실제로 둘의 속도 차이는 어마무시하다...

질문

  • 문자와 문자열은 어떠한 차이가 있는가? : char가 선언된 단일 문자가 배열로 합쳐진 것이 통상적인 문자열이나, 자바에서는 STRING 클래스를 통해 문자열을 다룬다.
  • 자바의 String은 어떠한 특징을 가지고 있는가? String 사용 시 주의할 점은 없는가? : String은 불변 객체다. 따라서 문자열을 합치거나 할때 메모리가 삭제 후 재할당된다. 이 때는 StringBuilder를 사용하는것이 적합하다.
  • 모르는 개념을 처음 학습하는 본인만의 방식은 무엇인가? 왜 그러한 방식으로 학습을 하는가? : 가장 신뢰할 수 있는 것이 공식 문서이므로, 공식 문서를 먼저 확인한다.

(팁)

for (int i =0,end = ai.size();i<end;i++){
}

다음과 같이 선언하면 for문을 돌 때마다 Size가 호출되지 않아 최적하가 된다.

profile
하마드

0개의 댓글