티스토리 뷰

programming language/Java

[자바] String 클래스

무니웜테일패드풋프롱스 2020. 4. 4. 10:18

String 클래스

 

String클래스의 주된 특지은 바로 'Immutable ' 변경불가능 하다는 것이다. 

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

public final class String implements java.io.Serializable, Comparable{
		private char[] value; }

따라서 한번 생성된 String 인스턴스가 가지고 있는 문자열은 변경 할 수 없다. 

String a = "a";
String b = "b";
String a = a+b;

아마 덧셈 연산자를 통해 변경이 가능할 수 있겠다고 생각할지 모르겠지만 ,이는 문자열이 변경된게 아니라, 여산시 마다 새로운 문자열을 가진 String 인스턴스가 생성된 것 뿐이다.

 

문자열의 비교

String 문자열을 만들 때는 두가지 방법이 있다. 문자열 리터럴을 지정하는 방법과 String 클래스에 생성자를 통해 만드는 방법이다.

String str1 = "abc";
String str2 ="abc";
String str3 = new String("abc");
String str4= new String("abc");

일단 두 가지의 차이를 설명하자면, 문자열 리터럴이 지정된 String 인스턴스는, 이미 존재하는 '문자열 리터럴 String 인스턴스'를 참조하는 것이다.

 

String 클래스 생성자를 통해 만드는 경우는, 당연히 서로 다른 인스턴스를 만드는 것이다.

 

문자열 리터럴 String 인스턴스의 경우, 컴파일 시 클래스 파일에 저장되고, 같은 내용의 문자열 리터럴은 한번만 저장된다. 따라서 같은 문자열 리터럴을 지정하게 되는 경우, 하나의 인스턴스를 공유하게 되는 것이다. 

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

System.out.println(str1.equals(str2));
System.out.println(str3.equals(str4));
System.out.println("str1's hash Code: "+ System.identityHashCode(str1)+"str2's hash Code:"+System.identityHashCode(str2));
System.out.println("str3's hash Code: "+System.identityHashCode(str3)+"str4's hash Code:"+System.identityHashCode(str4));

따라서 이와같은 메서드들을 출력하면 결과값은 아래와 같다.

true //String 클래스 내에서 equal 메서드를 오버라이딩 했으므로
true //서로 다른 인스턴스라도, 같은 문자열을 가지고 있어서 true 
str1's hash Code: 366712642str2's hash Code:366712642 //문자열 리터럴은 같은 주소 참조
str3's hash Code: 1829164700str4's hash Code:2018699554 //생성된 인스턴스들은 다른 주소 참조 

 

String join과 StringJoiner

간단하므로 예제로 사용법만 숙지하도록 하자

import java.util.StringJoiner;


public class test {
	public static void main(String[] args) {
		String animals ="dog,cat,bear";
		String[] arr = animals.split(",");
		System.out.println(String.join("-", arr)); //dog-cat-bear
		
		StringJoiner sj= new StringJoiner("/","[","]");
		for(String s: arr) {
			sj.add(s);
		}	
        System.out.println(sj.toString()); //[dog/cat/bear] 
	}
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함