Java String클래스

Bennie97·2022년 2월 5일
0

1. String Class

String 클래스는 문자열을 다루기 위한 클래스로
char배열 데이터와 메소드들로 이루어져있다.

String을 생성할때는 두가지 방법이 있다.

String str = "Hello World";	// 첫번째 방법
String str = new String("Hello World");	// 두번째 방법

이 두 방법 모두 System.out.println(str)을 해보면
Hello World을 출력하지만 사실 차이가 있다.

첫번째 방법은 Constant pool이라는곳에 Hello World라는 문자열 리터럴이 생성되며 두번째 방법은 Heap영역에 str이 가리키는 객체가 생성되는것이다.


package test;

public class test {

	public static void main(String[] args) {
		String str1 = "Hello World";
		String str2 = "Hello World";
		
		String str3 = new String("Hello World");
		String str4 = new String("Hello World");
		
		System.out.println(System.identityHashCode(str1));
		System.out.println(System.identityHashCode(str2));
		System.out.println(System.identityHashCode(str3));
		System.out.println(System.identityHashCode(str4));
        System.out.println(str1 == str2);
		System.out.println(str3 == str4);
	}

}

705927765
705927765
366712642
1829164700
true
false

str1과 str2 같이 new를 이용하지 않고 String선언을 하면 constant pool에 문자열 리터럴이 생성되므로 동일한 내용의 문자열 리터럴일시 같은 주소(저기선 705927765)를 가리키게 된다.

그러나 new를 사용해서 String 선언을 하면 heap영역에 만들어지므로
같은 내용의 문자열 리터럴이어도 계속 메모리의 빈공간에 객체가 생성되게 된다.

또한 String은 Immutable(불변)하다는 특성이 있다.
즉, '+'연산자 등으로 연산을 하되, 새로운 영역의 메모리에 객체가 생성되서 참조하게 된다는 것이다, 예제를 살펴보면

package test;

public class test {

	public static void main(String[] args) {

		String str1 = "Hello";
		System.out.println(System.identityHashCode(str1));
		String str2 = "World";
		System.out.println(System.identityHashCode(str2));
		str1 = str1 + str2;
		System.out.println(System.identityHashCode(str1));
		
		System.out.println(str1);
	
	}
}

705927765
366712642
1829164700
HelloWorld

이처럼 '+' 연산자를 이용해서 문자열 결합을 하게 되면
결합된 문자열이 새로운 공간을 차지하게 되고
그 공간의 주소를 str1이 참조하게 된다. 따라서
문자열 변경이 잦을때는 String 대신 StringBuilder나 StringBuffer를 사용하게 된다.

2. String Class의 주요 생성자와 메서드

생성자

1. String(char[] value)

문자열 배열을 String으로 바꾸어 새로운 String객체 생성

char[] value = {'H', 'e', 'l', 'l', 'o'};
String str = new String(value);
System.out.println(str);

Hello

2. String(char[] value, int offset, int count)

문자열 배열을 String으로 바꾸는데 인덱스 범위는 offset부터 시작 count개 까지

char[] value = {'H', 'e', 'l', 'l', 'o'};
String str = new String(value, 0, 4);
System.out.println(str);

Hell

3. String(StringBuffer buffer)

StringBuffer가 가지고 있는 문자열과 동일한 내용의 String 객체 생성.

StringBuffer sb = new StringBuffer("Hello");
String str = new String(sb);
System.out.println(str);

Hello

4. String(StringBuilder builder)

StringBuilder가 가지고 있는 문자열과 동일한 내용의 String 객체 생성.

StringBuilder sb = new StringBuilder("Hello");
String str = new String(sb);
System.out.println(str);

Hello


메서드

1. char charAt(int index)

지정된 index번째 위치에 있는 문자를 반환한다.

String str = "Hello";
char c = str.charAt(1);
System.out.println(c);

e

2. int compareTo(String anotherString)

문자열 anotherString을 사전순서로 비교한다. 같으면 0 사전순으로 이전이면 음수
이후이면 양수를 반환한다.

System.out.println("aaa".compareTo("aaa"));
System.out.println("aaa".compareTo("bbb"));	// a : 97 b : 98 a - b : -1
System.out.println("bbb".compareTo("aaa"));
System.out.println("aaa".compareTo("abb"));
System.out.println("aaa".compareTo("AAA")); // a : 97 A : 65 a - A : 32
System.out.println("AAA".compareTo("aaa"));
System.out.println("AAA".compareTo("bbb"));	// A : 65 b : 98 A - b : -33
System.out.println("BBB".compareTo("aaa")); // B : 66 a : 97 B - a : -31
System.out.println("bCC".compareTo("CCC")); // b : 98 C : 67 B - a : 31

0
-1
1
-1
32
-32
-33
-31
31

사실 결과는 유니코드 값 차이로 나온다.
a의 유니코드 값이 97이고 b의 유니코드 값이 98이기 때문에
"a".compareTo("b")는 97 - 98 = -1(음수)라고 나오는 것이다.
헷갈린땐 그냥 왼쪽보다 오른쪽이 더 크면 음수라고 생각하면 된다.
보통 상식으로 생각해보자.

  • a보다 b가 크지 않은가?
    그럼 "aaa".compareTo("bbb")는 왼쪽보다 오른쪽이 더 크니까 음수이다.

그러나 이건 언제까지나 같은 소문자는 소문자끼리 대문자는 대문자끼리의 비교에서나 해당된다.

  • 보통의 상식으로는 대문자 A가 소문자 a보다 크다고 생각할것이다.
    그래서
  • "a".compareTo("A")는 왼쪽보다 오른쪽이 더 크므로 음수라고 생각할텐데
    실은 a의 아스키 코드 값이 97이고 A의 아스키코드 값은 65여서 값은 97-65 = 32(양수) 가 나오게 된다.

대문자 계열이 소문자 계열보다 아스키코드 앞부분에 위치해있으므로
우리들의 상식(대문자가 소문자 보다 크다)와 맞지 않는다. 헷갈린다.

따라서 이것을 쓸때는 같은 소문자계열 아니면 같은 대문자계열과 비교해서 쓰거나 하도록 하자.

3. int compareToIgnoreCase(String str)

문자열 anotherString을 사전순서로 비교한다. 같으면 0 사전순으로 이전이면 음수
이후이면 양수를 반환한다. 단 대소문자는 신경쓰지 않는다.

System.out.println("aaa".compareToIgnoreCase("aaa"));
System.out.println("aaa".compareToIgnoreCase("bbb"));	
System.out.println("bbb".compareToIgnoreCase("aaa"));
System.out.println("aaa".compareToIgnoreCase("abb"));
System.out.println("aaa".compareToIgnoreCase("AAA")); 
System.out.println("AAA".compareToIgnoreCase("aaa"));
System.out.println("AAA".compareToIgnoreCase("bbb"));	
System.out.println("BBB".compareToIgnoreCase("aaa")); 
System.out.println("bCC".compareToIgnoreCase("CCC")); 

0
-1
1
-1
0
0
-1
1
-1

compareToIgnoreCase는 대소문자를 신경쓰지 않는다. 오로지 사전순만 신경쓴다.
따라서 왼쪽보다 오른쪽이 더 크면 음수라고 생각하자고 했기때문에
System.out.println("AAA".compareToIgnoreCase("bbb")); 의 결과는 음수이다.

4. String concat(String str)

문자열 str을 뒤에 덧붙여서 반환한다.

String str1 = "Hello";
String str2 = "World";
str1 = str1.concat(str2);
System.out.println(str1);

HelloWorld

5. boolean contains(CharSequence s)

문자열 s가 포함되어있으면 true 반환 그렇지 않으면 false

String str1 = "Hello";
System.out.println(str1.contains("el"));

true

6. boolean endsWith(String suffix)

문자열 suffix로 끝나면 true 그렇지 않으면 false

String str = "Hello";
System.out.println(str.endsWith("llo"));

true

7. boolean equals(Object anObject)

매개변수 anObject와 문자열을 비교한다. 같으면 true
다르거나 anObject가 String이 아니면 false를 반환한다.

String str = "Hello";
System.out.println(str.equals("Hello"));

true

8. boolean equalsIgnoreCase(String anotherString)

매개변수 anotherString와 문자열을 비교한다. 대소문자는 신경쓰지 않는다.

String str = "Hello";
System.out.println(str.equalsIgnoreCase("hELLO"));

true

9. int indexOf(int ch)

문자 ch가 문자열에 존재한다면 어디에 존재하는지 인덱스로 위치를 알려준다. (만일 여러개 존재한다면 왼쪽기준으로 첫번째 위치를 반환한다. )
없을경우 -1을 반환한다.

String str = "Hello";
System.out.println(str.indexOf('l'));
System.out.println(str.indexOf('z'));

2
-1

10. int indexOf(int ch, int fromIndex)

int indexOf(int ch)와 동일하되 fromIndex위치부터 찾는다. 단 fromIndex위치부터 찾는다 해서 인덱스가 fromIndex위치기준이 아니라 전체 문자열 기준으로 한 index를 반환한다. 못 찾거나 fromIndex가 문자열의 index범위를 벗어나거나 하면 -1을 반환한다.

String str = "Hello";
System.out.println(str.indexOf('l', 0));
System.out.println(str.indexOf('l', 1));
System.out.println(str.indexOf('l', 2));
System.out.println(str.indexOf('l', 3));
System.out.println(str.indexOf('l', 4));
System.out.println(str.indexOf('l', 9));

2
2
2
3
-1
-1

11. int indexOf(String str)

문자열 str이 존재하는지 확인하여 그 위치(index)를 반환한다. 없으면 -1을 반환함.

String str = "HelloWorld";
System.out.println(str.indexOf("World"));

5

12. int indexOf(String str, int fromIndex)

문자열 str이 존재하는지 확인하여 그 위치(index)를 반환한다. 없으면 -1을 반환함. 대신
fromIndex위치부터 찾는다.

String str = "HelloWorldHello";
System.out.println(str.indexOf("Hello", 0));
System.out.println(str.indexOf("Hello", 7));

0
10

13. int lastIndexOf(int ch)

#9번의 indexOf(int ch)와 동일하다. 단 맨 뒤에서 부터 찾는다.

String str = "www.google.com";
System.out.println(str.lastIndexOf('.'));

10

14. int lastIndexOf(int ch, int fromIndex)

#10번의 int indexOf(int ch, int fromIndex)와 동일하다. 단 맨뒤에서부터 찾는다.
"www.google.com" 이라는 문자열에서 fromIndex가 예를들어 4이고 ch가 '.'이면
앞에서 부터 4번째 인덱스에 해당하는 'g' 부터 거꾸로 오른쪽에서 왼쪽방향으로 찾아서 w와 g사이에있는 .의 index를 반환 즉 3이 반환된다. 그리고 총 문자열의 길이를 넘어선 fromIndex는 그냥 그 문자열의 길이로 생각된다.

String str = "www.google.com";
System.out.println(str.lastIndexOf('.', 0));
System.out.println(str.lastIndexOf('.', 1));
System.out.println(str.lastIndexOf('.', 2));
System.out.println(str.lastIndexOf('.', 3));
System.out.println(str.lastIndexOf('.', 4));
System.out.println(str.lastIndexOf('.', 5));
System.out.println(str.lastIndexOf('.', 6));
System.out.println(str.lastIndexOf('.', 7));
System.out.println(str.lastIndexOf('.', 8));
System.out.println(str.lastIndexOf('.', 9));
System.out.println(str.lastIndexOf('.', 10));
System.out.println(str.lastIndexOf('.', 11));
System.out.println(str.lastIndexOf('.', 12));
System.out.println(str.lastIndexOf('.', 13));
System.out.println(str.lastIndexOf('.', 14));
System.out.println(str.lastIndexOf('.', 15));
System.out.println(str.lastIndexOf('.', 16));

-1
-1
-1
3
3
3
3
3
3
3
10
10
10
10
10
10
10

15. int lastIndexOf(String str)

11번의 int indexOf(String str) 동일하다. 단 뒤에서 부터 찾는다.

String str = "www.google.www.google";
System.out.println(str.lastIndexOf("www"));

11

16. int lastIndexOf(String str, int fromIndex)

12번의 int indexOf(String str, int fromIndex)와 동일하다, 단 뒤에서 부터 찾는다.

String str = "www.google.www.google";
System.out.println(str.lastIndexOf("google", 10))

4

17. int length()

문자열의 길이를 반환한다.

String str = "Hello";
System.out.println(str.length());

5

18. String[] split(String regex)

문자열을 분리자 regex 단위로 잘라서 문자열 배열에 담아 리턴한다.

String str = "I love you.";
String[] strarr = str.split(" ");
for(String st : strarr) {
System.out.println(st);
}

I
love
you.

19. boolean startsWith(String prefix)

문자열 prefix로 시작하는지 검사한다. 맞으면 true 그렇지 않으면 false를 반환한다.

String str = "Hello World";
System.out.println(str.startsWith("Hell"));

true

20. String substring(int beginIndex)

인덱스 beginIndex 부터 끝까지 문자열을 잘라서 String으로 리턴한다.

String str = "Hello World";
System.out.println(str.substring(3));

lo World

21. String substring(int beginIndex, int endIndex)

인덱스 beginIndex 부터 endIndex-1까지 문자열을 잘라서 String으로 리턴한다.

String str = "Hello World";
System.out.println(str.substring(1, 3));

el

22. char[] toCharArray()

String을 새로운 char배열을 생성해서 반환한다.

String str = "Hello World";
char[] charray = str.toCharArray();
for(char c : charray) {
	System.out.print(c);
}

Hello World

23. String toLowerCase()

모든문자열을 소문자로 변경하여 반환한다.

String str = "Hello World";
str = str.toLowerCase();
System.out.println(str);

hello world

24. String toUpperCase()

모든문자열을 대문자로 변경하여 반환한다.

String str = "Hello World";
str = str.toUpperCase();
System.out.println(str);

HELLO WORLD

25. String trim()

문자열 맨앞과 맨뒤 공백을 제거한 문자열을 반환한다.

String str = "	Hello World	";
str = str.trim();
System.out.println(str);

Hello World

26. static String valueOf 시리즈

  • static String valueOf(boolean b)
  • static String valueOf(char c)
  • static String valueOf(char[] data)
  • static String valueOf(double d)
  • static String valueOf(float f)
  • static String valueOf(int i)
  • static String valueOf(long l)
  • static String valueOf(Object obj)

매개변수로 받은값을 문자열로 변환하여 리턴한다.
Object obj 같은경우에는 obj.toString()의 값이 반환된다.
특히 이중에서 static String valueOf(int i) 이문장은 숫자를 문자열로 바꿀때 요긴하게 자주사용되므로 숙지해두자.

char [] arr = {'H', 'e', 'l', 'l', 'o'};
String bool = String.valueOf(true);
String c = String.valueOf('c');
String data = String.valueOf(arr);
String d = String.valueOf(100.0d);
String f = String.valueOf(100.0f);
String i = String.valueOf(206);
String l = String.valueOf(100_000_000l);

System.out.println(bool);
System.out.println(c);
System.out.println(data);
System.out.println(d);
System.out.println(f);
System.out.println(i);
System.out.println(l);

true
c
Hello
100.0
100.0
206
100000000

27. static String join(CharSequence delimiter, CharSequence... elements)

문자열 사이에 구분자를 넣어서 결합후 반환한다.

String str = "Hello World How are you?";
String[] arr = str.split(" ");
String newstr = String.join("+", arr);
System.out.println(newstr);

Hello+World+How+are+you?


참고 Java™ Platform, Standard Edition 8
API Specification

profile
현명한개발자가되자

0개의 댓글