안녕하세요, 여행벌입니다.
오늘은 자바에서 굉장히 많이 사용하는 String 클래스의 특징과 메소드에 대해서 정리해보겠습니다.
String 클래스
String 클래스는 자바에서 지원해주는 클래스입니다. 클래스이므로 인스턴스를 생성해서 사용하면 됩니다.
String name = new String("travelbeeee");
name 이라는 이름의 String 인스턴스를 생성했고, 생성자에 "travelbeeee"를 매개변수로 입력했습니다. 일반적인 클래스 인스턴스 생성과 다를게 없습니다. 하지만, 이전의 포스팅을 보면 제가 아래와 같이 String 클래스의 인스턴스를 생성한 것을 볼 수 있습니다.
String name = "travelbeeee";
new 키워드 없이 String 클래스의 인스턴스를 생성해서 사용해왔습니다. 즉, String 클래스는 "" (큰따옴표) 만으로도 인스턴스 생성이 가능합니다.
public static void main(String[] args){
int len = "travelbeeee".length();
System.out.println(len);
}
위의 String 클래스의 인스턴스를 만들고, length 메소드를 실행시켜보았습니다. 실행해보면 "11" 이 예상대로 출력됩니다! 즉, "" (큰따옴표) 만으로도 인스턴스 생성이 가능한 것을 확인할 수 있습니다.
String 클래스에는 큰 특징이 하나 있습니다. 바로,
"String 인스턴스는 Immutable 인스턴스입니다."
Immutable은 "변경할 수 없는" 이라는 뜻입니다. String 인스턴스는 처음에 문자열을 선언하면 그 내용을 바꿀 수 없습니다!
String name = "travelbeeee";
name 이라는 이름의 String 클래스의 인스턴스는 내부에 문자열 "travelbeeee"를 지니게 되고, 이 내용은 인스턴스가 소멸될 때까지 바꿀 수 없습니다.
String name = "travelbeeee";
String name2 = "travelbeeee";
그럼 위와 같은 경우에 다른 일반적인 클래스의 인스턴스와 어떤 차이가 발생할까요?
String 인스턴스는 Immutable 인스턴스이므로, 문자열 내용이 같은 경우에는 하나의 인스턴스를 서로 공유하게 됩니다.
즉, 위의 코드는 아래의 코드와 동일합니다.
String name = "travelbeeee";
String name2 = name;
그럼 문자열 내용이 같은 인스턴스를 2개 생성하려면 어떻게 해야될까요? new 키워드를 이용해서 그냥 인스턴스를 2개 생성하면 됩니다.
String name = "travelbeeee";
String name2 = new String("travelbeeee");
다음 예제를 통해 확인해보겠습니다.
package Hello;
public class test{
public static void main(String args[]) {
String str1 = "travelbeeee";
String str2 = "travelbeeee";
String str3 = new String("travelbeeee");
if(str1 == str2) {
System.out.println("str1 과 str2는 동일한 인스턴스를 참조 중");
}
else {
System.out.println("str1과 str2는 다른 인스턴스를 참조 중 ");
}
if(str1 == str3) {
System.out.println("str1과 str3는 동일한 인스턴스를 참조 중");
}
else {
System.out.println("str1과 str3는 다른 인스턴스를 참조 중");
}
}
}
결과는 다음과 같습니다.
str1 과 str2는 동일한 인스턴스를 참조 중
str1과 str3는 다른 인스턴스를 참조 중
우리는 str1과 str3가 같은 내용의 문자열을 지니고 있지만, 다른 인스턴스를 참조하고 있는 것을 확인할 수 있습니다. 반면에 str1과 str2는 같은 인스턴스를 참조하고 있습니다.
String 인스턴스는 그 안에 저장된 데이터를 수정할 수 없는, 참조만 가능한 인스턴스이기 때문에 Immutable 인스턴스여도 문제가 발생하지 않습니다.
String 클래스 switch 문
자바 7부터 String 인스턴스를 이용해서 switch 문의 구성이 가능해졌습니다.
package Hello;
public class test{
public static void main(String args[]) {
String str1 = "travelbeeee";
switch(str1) {
case "travel":
System.out.println("이름은 : travel 입니다.");
break;
case "beeee":
System.out.println("이름은 : beeee 입니다.");
break;
case "travelbeeee":
System.out.println("이름은 : travelbeeee 입니다.");
}
}
}
결과는 다음과 같습니다.
이름은 : travelbeeee 입니다.
이처럼 자바 7에서부터 switch 문에서 String 인스턴스 사용을 지원해주기 때문에 조금 더 편하게 코드를 구현할 수 있습니다.
String 클래스 메소드
이제 String 클래스에 있는 메소드 중 자주 사용되는 메소드를 정리해보도록 하겠습니다.
public int length() // 문자열의 길이를 반환해주는 메소드
public boolean isEmpty() // 문자열이 비어있는지 확인해주는 메소드
public boolean isEquals(Object obj) // 두 인스턴스가 지니고 있는 문자열이 같은지 확인해주는 메소드
public int compareTo(String str)
// 두 인스턴스가 지니고 있는 문자열의 사전 순서를 비교해주는 메소드
public int compareToIgnoreCase(String str)
// 두 인스턴스가 지니고 있는 문자열을 대소문자 상관 없이 사전 순서로 비교해주는 메소드
public static String valueOf(Object obj)
// 기본 자료형의 값을 문자열로 바꿔주는 메소드
public String concat(String str)
// 두 인스턴스가 지니고 있는 문자열을 하나로 이어주는 메소드
public int length()
length 메소드는 String 인스턴스의 문자열의 길이를 반환해줍니다. 반환형은 int 형이고, String 클래스에서 가장 많이 사용되는 메소드가 아닐까 싶습니다.
package Hello;
public class test{
public static void main(String args[]) {
String str1 = "travelbeeee";
System.out.println(str1.length());
}
}
11
public boolean isEmpty()
isEmpty 메소드는 String 인스턴스에 저장된 문자열이 없다면 true를 반환하고, 아니면 false를 반환합니다. 즉 String 인스턴스의 length 메소드를 호출한 값이 "0" 이라면 true를 반환하고, 아니면 false를 반환합니다.
package Hello;
public class test{
public static void main(String args[]) {
String str1 = "travelbeeee";
System.out.println(str1.isEmpty());
}
}
false
public boolean equals(Object obj)
equals 메소드는 두 인스턴스가 지니는 문자열이 같으면 true 를 반환하고, 다르면 false를 반환합니다. 매개변수로 Object형을 입력 받지만, String 클래스가 Object 클래스를 상속하므로 String 인스턴스의 참조 값을 전달할 수 있습니다.
package Hello;
public class test{
public static void main(String args[]) {
String str1 = "travelbeeee";
System.out.println(str1.equals("travelbeeee"));
System.out.println(str1.equals("travelbeee"));
}
}
true
false
public int compareTo(String str)
compareTo 메소드는 equals 메소드에서 조금 더 자세히 비교를 해주는 메소드입니다. 두 문자열이 사전 순서로 누가 앞서는지를 결과로 알려줍니다. 두 문자열의 내용이 일치하면 "0" 을 반환하고, 호출된 인스턴스의 문자열이 인자로 전달된 문자열보다 앞서면 음수를 반환하고 아니면 양수를 반환합니다.
package Hello;
public class test{
public static void main(String args[]) {
String str1 = "travelbeeee";
System.out.println(str1.compareTo("travelbeeee"));
System.out.println(str1.compareTo("abcdefg"));
System.out.println(str1.compareTo("xzcxvzxcvkas"));
}
}
0
19
-4
public int compareToIgnoreCase(String str)
compareToIgnoreCase 는 문자열 비교에 있어서 대소문자 구분을 하지 않고 사전 순서로 누가 앞서는지를 알려주는 메소드입니다. compareTo 메소드와 결과는 같으나 이 결과값이 대소문자를 구분하지 않은 결과값입니다.
package Hello;
public class test{
public static void main(String args[]) {
String str1 = "travelbeeee";
System.out.println(str1.compareTo("TRAVELBEEEE"));
System.out.println(str1.compareToIgnoreCase("TRAVELBEEEE"));
}
}
32
0
public static String valueOf(Object obj)
valueOf 메소드는 기본 자료형의 값을 문자열로 바꿔줍니다. 클래스 메소드이므로 인스턴스 생성 없이 사용할 수 있습니다.
package Hello;
public class test{
public static void main(String args[]) {
String str1 = String.valueOf(123); // 정수 123을 문자열로 변환
System.out.println(str1.equals("123"));
}
}
int형 123을 문자열로 변환해준 후 문자열 "123" 과 비교해봤습니다.
true
public String concat(String str)
concat 메소드는 두 인스턴스의 문자열을 이어줍니다. 이어준다는 뜻은 말 그대로 "travel" 과 "beeee"를 concat하면 "travelbeeee"로 만들어줍니다.
concat 메소드는 "+" 연산을 통해서도 사용할 수 있습니다. "travel" + "beeee" 를 진행하면 자동으로 "travel" .concat("beeee") 를 호출합니다.
package Hello;
public class test{
public static void main(String args[]) {
String str1 = "travel";
System.out.println(str1 + "beeee");
System.out.println(str1.concat("beeee"));
}
}
travelbeeee
travelbeeee
그럼 다음과 같은 경우는 자바에서 어떻게 처리해줄까요?
"123" + 7;
String 인스턴스와 int 형을 + 연산을 진행해보았습니다. + 연산은 자동으로 concat 으로 바뀌므로 위의 코드는 아래와 같습니다.
"123".concat(7);
하지만 concat 매소드는 매개변수로 String 인스턴스를 입력받기 때문에, 에러가 발생합니다. 즉 우리가 원하는 결과를 얻고 싶으면 다음과 같이 진행해야됩니다.
"123" + String.valueOf(7);
메소드가 워낙 많아서 다음 포스팅에서 이어서 정리해보도록 하겠습니다.
'Computer Language > JAVA' 카테고리의 다른 글
[JAVA] #15 자바 StringBuilder 클래스 특징 및 메소드 정리 (0) | 2020.06.01 |
---|---|
[JAVA] #14 자바 String 클래스 특징 및 메소드 정리(2) (0) | 2020.05.28 |
[JAVA] #12 자바 메소드 오버로딩(Method Overloading) (0) | 2020.05.28 |
[JAVA] #11 자바 클래스 변수와 클래스 메소드(static) (0) | 2020.05.27 |
[JAVA] #10 자바 접근 수준 지시자(public, protected, private, default) (0) | 2020.05.26 |