String class

김설영·2022년 4월 8일
0

문자열을 다루기 위한 클래스 : Data(char[], 문자 배열) + Method(문자열 관련)

public final class String implements java.io.Serializable, Comparable {
	private char[] value;
    ...
}
  • 내용을 변경할 수 없음. (불변, immutable 클래스)
    • 문자를 + 연산자를 이용해서 더할 때마다, 새로운 문자열이 만들어지기 때문에, 성능이 떨어짐
    • 문자열 결합 혹은 변경이 잦을 경우, StringBuffer class를 사용해야 한다.
String a = "a"		// 참조변수 a가 가리키는 주소 : 0x100
String b = "b"		// 참조변수 b가 가리키는 주소 : 0x200

a = a + b 			// a + b == "ab" : 새로운 메모리 공간에 값이 생성 됨. 주소 : 0x300
					// a가 가리키는 주소가 0x300으로 변경

문자열 비교

  • String str = "abc"(문자열 리터럴) VS String str = new String("abc");
    • 어차피 내용을 바꿀 수 없기 때문에, 여러 참조변수가 문자열의 주소를 공유해도 문제가 없다.
    • 같은 내용의 문자열을 여러번 만들어도 문제가 없기 때문에, 굳이 인스턴스를 만들 필요가 없음.
  • 문자열을 비교할 때에는, "==" 연산자가 아닌, "a.equals(b)"를 쓴다.
String str1 = "abc";				// 문자열 리터럴 "abc" 주소가 str1에 저장
String str2 = "abc";				// 문자열 리터럴 "abc" 주소가 str1에 저장
// str1과 str2가 가리키는 주소는 같다! (문자열 리터럴 "abc"가 저장된 주소를 가리키기 때문!)

String str3 = new String("abc");	// 새로운 String 인스턴스 생성
String str4 = new String("abc");	// 새로운 String 인스턴스 생성
// str3과 str4가 가리키는 주소는 다르다! (내용이 같아도, new 연산자는 항상 새로운 인스턴스를 만들기 때문)

문자열 리터럴

  • 문자열 리터럴은 프로그램 실행 시, 객체 생성 없이 자동으로 생성됨.

  • 이후, 상수 저장소인 Constant pool에 저장됨.

  • 같은 내용의 문자열 리터럴은 "하나"만 만들어짐.

    • 내용 변경이 불가능하기 때문에, 여러 참조변수가 String 객체의 주소를 공유해도 문제가 없다.

빈 문자열

  • "", Empty string

  • 내용이 없는 문자열. 길이가 0인 char형 배열을 저장하는 문자열

  • Java에서는 길이가 0인 배열을 생성하는 것이 허용된다.

String str = "";	// 빈 문자열로 초기화

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

String s = null;	 // 기본적으로 null로 초기화 됨
char c = '\u0000';   // 기본적으로 유니코드 첫번째 문자로 초기화 됨

// 아래 방식을 더 권장함
String s = "";	// 빈 문자열로 초기화
char c = ' ';	// 공백 문자로 초기화

// new 연산자를 이용하여 String 객체를 만들어서 초기화 하기 보다,
// 그냥 ""로 전부 초기화 하는게 메모리상 이득이다. 하나의 빈 문자열을 전부 공유하기 때문.
String str1 = "";
String str2 = "";
String str3 = "";

문자열과 기본형 간의 변환

  • 숫자 -> 문자열
    1. 숫자 + ""
    2. String.valueOf(숫자)
  • 문자열 -> 숫자
    1. Integer.parseInt("문자열")
    2. Integer.valueOf("문자열") -> 새로운 방법. (Boolean, Byte, Integer, Long, Float, Double)
  • parse 메서드와 valueOf 메서드의 반환 타입이 다르다.
    • parse : 변환하고자 하는 기본형타입으로 반환 함. (ex: int, long, double...)
    • valueOf : 참조형으로 반환 함. (ex: Integer, Long, Double...)
      -> 기본형으로 써도 됨. autoboxing 이란 것이 참조형을 기본형으로 자동 변환해주기 때문
profile
블로그 이동하였습니당! -> https://kimsy8979.tistory.com/

0개의 댓글