String클래스

MIN·2023년 12월 23일

Java

목록 보기
33/36
post-thumbnail
이 글은 자바의 정석 기초편을 공부한 내용을 토대로 작성한 글입니다.
혹시 잘못된 내용이 있을 시 댓글로 알려주시면 감사하겠습니다 ^U^

자바에서는 다른 언어와 다르게 문자열을 위한 클래스를 제공하는데, 그 클래스가 String 클래스다.
또한 문자열을 다루는데 필요한 메서드를 함께 제공한다.

🥑 변경 불가능한 클래스

String클래스는 문자열을 저장하기 위해서 문자열 배열 참조변수(char[ ]) value를 인스턴스 변수로 정의해놓고 있다.
인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스변수에 문자형 배열(char[ ])로 저장되는 것이다.

// String클래스는 앞에 final이 붙어있으므로 다른 클래스의 조상이 될 수 없다
public final class String implements 
			java.io.Serializable, Comparable {
            
	private char[] value;
    
}

한번 생성된 String인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고, 변경은 불가능하다.
예를 들어 2개의 String 타입의 문자열 2개를 + 연산자를 사용해 결합하면 문자열이 바뀌는 것이 아닌 새로운 문자열이 담긴 String인스턴스가 생성되는 것이다.

따라서 '+'를 이용하여 문자열을 결합하는 것은 연산할 때마다 새로운 String인스턴스가 생성되어 메모리 공간을 차지하므로 최소한으로 사용하는 것이 좋다.
(또는 StringBuffer클래스를 사용한다)

🥑 문자열 비교

String str1 = "자바";	// 문자열 리터럴 "자바"의 주소가 str1에 저장됨
String str2 = "자바"; 	// 문자열 리터럴 "자바"의 주소가 str2에 저장됨

String str3 = new String("자바");	// 새로운 String 인스턴스 생성
String str4 = new String("자바");	// 새로운 String 인스턴스 생성

위 예시에서 str1과 str2는 같은주소에 담긴 문자열 "자바"의 값을 갖고 있다.

하지만 str3과 str4는 각각 새로운 주소에 담긴 String인스턴스의 "자바" 값을 가진다.

따라서 str과 str2의 객체를 비교했을 경우에는 true가 나오지만
str3과 str4의 객체를 비교했을 경우에는 서로 다른 주소를 가지고 있으므로 false가 나온다.


같은 내용의 문자열은 컴파일시 한번만 저장된다. 한번 생성하면 내용을 변경할 수 없으니 하나의 인스턴스를 공유하면 되기 때문이다.

🥑 빈 문자열 (empty String)

길이가 0인 char형 배열을 내부적으로 가지고 있는 문자열이 빈 문자열이다.

🥑 문자열과 기변형 간의 변화

숫자를 문자열로 문자열을 숫자로 변환해야 하는 경우가 많다.
숫자에 빈 문자열 ""을 더해주는 방법도 있지만,
valueOf()를 사용하는 방법도 있다.

int i = 123;

String str1 = i + "";
String str2 = String.valueOf(i);

반대로 String을 숫자로 바꾸는 방법은 다음과 같다.

int i = Integer.parseInt("123");
int j = Integer.valueOf("123");

원래 valueOf()의 반환 타입은 int가 아닌 Integer인데,
곧, 배울 오토박싱(auto-boxing)에 의해 Integer가 int로 자동변환된다.

parseInt나 parseFloat과 같은 메서드는 문자열에 공백 또는 문자가 포함되어 있을 경우 예외(NumberFormatException)이 발생할 수 있으므로 문자열 양 끝의 공백을 제거해주는 trim()을 같이 사용해주는 것이 좋다.

int i = Integer.parseInt(" 123".trim());
profile
기초부터 시작하는 감쟈 ※ 소개글 확인해주세요!! ※

0개의 댓글