[JAVA] String 클래스

sy·2023년 7월 10일
0

JAVA

목록 보기
6/8
post-custom-banner

자바에서는 문자열을 위해 char형의 배열이 아닌 String 클래스를 제공한다.

1. 변경이 불가능한 (immutable) 클래스

  • String 클래스에는 문자열을 저장하기 위해서 문자형 배열 참조변수(char[]) value를 인스턴스 변수로 정의해놓고 있다.
  • 한 번 생성된 String 인스턴스가 가지고 있는 문자열은 읽어올 수 만 있고, 변경할 수는 없다.
  • '+' 연산자를 이용해서 문자열을 결합하는 경우 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열이 담긴 String 인스턴스가 생성되는 것이다.
String a = "a";
String b = "b";
a = a + b; // 문자열이 바뀌는 것이 아닌 새로운 인스턴스가 생성

  • 문자열 간의 결합이나 추출 등 문자열을 다루는 작업을 많이 한다면 String 클래스 사용했을 때, 매 연산 시 마다 새로운 문자열을 가진 String 인스턴스가 생성되어 메모리공간을 차지하므로 StringBuffer 클래스를 사용하는 것이 좋다. StringBuffer 인스턴스에 저장된 문자열은 변경이 가능하다.

2. 문자열 비교

  • 문자열을 만드는 두 가지 방법
    • 문자열 리터럴을 지정
    • String 클래스의 생성자를 사용
String str1 = "abc"; // 문자열 리터럴 "abc"의 주소가 str1에 저장됨
String str2 = "abc"; // 문자열 리터럴 "abc"의 주소가 str2에 저장됨
String str3 = new String("abc"); // 새로운 String 인스턴스를 생성
String str4 = new String("abc"; // 새로운 String 인스턴스를 생성

문자열 리터럴을 지정한 경우

  • 이미 존재하는 것을 재사용

String 클래스의 생성자를 이용한 경우

  • new 연산자에 의해서 메모리할당이 이루어지므로 항상 새로운 String 인스턴스가 생성

📌 equals() vs '=='

equals()를 사용했을 때는 두 문자열의 내용("abc")을 비교하기 때문에 두 경우 모두 true

'==' 등가비교 연산자로 비교했을 때 각 String 인스턴스의 주소를 비교하기 때문에 결과가 다르다.

3. 문자열 리터럴

자바 소스 파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장된다. 이 때 같은 내용의 문자열 리터럴은 한 번만 저장된다. 문자열 리터럴도 String 인스턴스이고, 한 번 생성하면 내용을 변경할 수 없으므로 하나의 인스턴스를 공유하면 되기 때문이다.

public static void main(String[] args) {
	String s1 = "AAA";
    String s2 = "AAA";
    String s3 = "AAA";
    String s4 = "BBB";
}

클래스 파일에는 소스파일에 포함된 모든 리터럴의 목록이 있다. 해당 클래스 파일에 클래스 로더에 의해 메모리에 올라갈 때, 이 리터럴의 목록에 있는 리터럴들이 JVM 내에 있는 상수 저장소(constant pool)에 저장된다.

4. 빈 문자열 (empty string)

길이가 0인 배열

String s = "";

참조변수 s가 참조하고 있는 String 인스턴스는 내부에 new char[0]과 같이 길이가 0인 char형 배열에 저장하고 있는 것이다.

char[] chArr = new char[0]; // 길이가 0인 char 배열
int[] iArr = {}; // 길이가 0인 int 배열

// char c = ""; // 에러
char c = ' '; // 반드시 하나의 문자를 지정해야함. 공백으로 초기화

5. String 클래스의 생성자와 메소드

자주 사용되는 목록

6. join()과 StringJoiner

join : 여러 문자열 사이에 구분자를 넣어서 결합한다. split()와 반대 작업

String animals = "dog,cat,bear";
String[] arr = animals.split(","); // ["dog", "cat", "bear"]
String str = String.join("-", arr); // dog-cat-bear

java.util.StringJoiner 클래스

StringJoiner sj = new StringJoiner(",", "[", "]");
Strin[] strArr = {"aaa", "bbb", "ccc"};

for(String s : strArr)
	sj.add(s.toUpperCase());

System.out.println(sj.toString()); // [AAA,BBB,CCC]

join(), StringJoiner JAVA8에서 추가됨

7. 기본형 -> String, String -> 기본형

기본형 -> String

  1. 숫자에 빈 문자열 "" 더해주기
  2. valueOf()
int i = 100;
String str1 = i + "";
String str2 = String.valueOf(i);

성능은 valueOf가 더 좋지만, 빈 문자열을 더하는 방법이 간단하고 편하기 때문에 성능 향상이 필요한 경우메만 valueOf 쓰기

String -> 기본형

  1. valueOf()
  2. parseInt()
int i = Integer.parseInt("100");
int i2 = Integer.valueOf("100");

예전에는 parseInt()와 같은 메서드를 많이 썼는데, 메서드의 이름을 통일하기 위해 valueOf()가 나중에 추가 되었다. valueOf(String s)는 메서드 내부에서 parseInt(String s)를 호출할 뿐이므로 두 메서드는 반환 타입만 다른 같은 메서드다.

💡 valueOf()의 타입은 int가 아니라 Integer 이지만 auto-boxing에 의해 int로 자동 변환된다.

int iVal = 100;
String strVal = String.valueOf(iVal);

double dVal = 200.0;
String strVal2 = dVal + "";

// '+'가 포함된 문자열 변환 (JDK1.7부터 가능)
double sum = Integer.parseInt("+"+strVal) + Double.parseDouble(strVal2);




출처
https://www.youtube.com/watch?v=PG8kPjwWbWU

post-custom-banner

0개의 댓글