반응형

 

자바 - String 클래스의 특징 (객체 생성방법에 따른 차이)

 

 

처음 자바를 공부할때는 int, float, char와 같이 String도 마치 기본형처럼 생각했던 적이 있습니다. 아마도 프로그래밍을 처음 배울 때 가장 기초적인 예제로 정수형 int와 문자열 String을 자주 사용해서일지도 모릅니다. 그런데 여러가지 문자열 데이터를 다루게 되면서 String은 다른 기본형과는 다르다는 것을 알게 되고, 조금 시간이 지나서 가만히 살펴보면 String은 첫 글자가 대문자로 시작하는 클래스임을 깨닫게 됩니다. (저만 그랬던 건가요?)

그럼 문자열을 다룰 때 기본적으로 알고 있어야 하는 String 클래스의 특징에 대해서 알아보도록 하겠습니다. 

 

 

   목차

  1. String 클래스의 특징
    • String 객체 생성방법에 따른 차이
    • String 객체는 내용을 수정할 수 없는 immutable 클래스
  2. String 클래스의 메소드

 

 

1. String 클래스의 특징

 

1) String 객체 생성방법에 따른 차이

우리가 흔히 문자열을 사용할 때는 String 변수에 바로 문자열을 대입시킵니다. 그런데 String은 클래스이므로 문자열을 바로 대입시키지 않고 아래와 같이 new 연산자를 통해서도 객체 생성을 할 수 있습니다. 

 

  1. String s1 = "Hello";
  2. String s3 = new String("Hello");

 

위 두 방법은 둘 다 사용은 가능하나 생성방법에 따라 내부적인 동작에는 차이가 있습니다. 

 

먼저 아래 예제를 살펴보면 s1과 s2처럼 문자열로 생성된 String 객체는 해당 문자열이 동일한 내용일 경우 그 문자열을 공유합니다. 따라서 비교연산자(==)로 참조변수 s1과 s2를 비교하게 되면 결과가 true로 나옵니다. 

반면에, s3과 s4처럼 new 연산자를 통해 String 객체를 생성하게 되면 해당 문자열이 동일한 내용일지라도 각 객체마다 문자열이 새롭게 생성됩니다. 따라서 비교연산자(==)로 참조변수 s3과 s4를 비교하게 되면 각 변수가 가리키고 있는 주소값이 다르기 때문에 결과는 false가 나오게 됩니다. 

그래서 문자열의 경우 String이 클래스이지만 new 연산자로 생성하는 것보다 문자열 대입을 통해 생성하는 것이 좋습니다.

 

String객체 생성에 따른 차이 - 문자열로 생성된 String 객체는 동일 문자열에 대해 서로 공유하지만 new 연산자를 통해 생성된 String 객체는 동일 문자열이라 해도 각 객체마다 새롭게 문자열을 생성합니다.
String객체 생성에 따른 차이

 

 

(1) String 객체 생성 및 실행

public class HelloWorld {
	public static void main(String[] args) {
		
		 String s1 = "Hello";
		 String s2 = "Hello";

		 System.out.println(s1==s2);

		 String s3 = new String("Hello");
		 String s4 = new String("Hello");
		 
		 System.out.println(s3==s4);
	}
}

 

(2) 실행결과

true
false

 

 

 

2) String 객체는 내용을 수정할 수 없는 immutable 클래스

String 객체의 또 한 가지 특징은 앞서 말한 두 가지 방식 중 어떠한 방식으로든 String 객체를 한번 생성하고 나면 그 객체의 내용을 수정할 수 없다는 것입니다.

만약 아래와 같이 "Hello" 문자열 객체를 만든 후 다시 "World" 문자열을 더하게 되면 "Hello" 문자열 객체가 "HelloWord"로 바뀌는 것이 아니라 "Hello" 객체는 그대로 있고 새롭게 "HelloWorld" 객체가 생성됩니다. 그리고 참조변수 s1은 새롭게 생성된 문자열 "HelloWorld" 가리키도록 변경됩니다. 

그런데 만약 자주 문자열 내용을 변경하게 되면 아래와 같이 새로운 문자열이 계속 생기게 되므로 효율이 떨어지게 됩니다. 그래서 문자열 내용을 수정할 수 있는 클래스로 StringBuffer 클래스가 있습니다. StringBuffer 클래스에 대해서는 다음에 따로 정리하여 글을 올리도록 하겠습니다. 

 

  1. String s1 = "Hello";
  2. s1 = s1 + "World";

 

String 참조변수에 새로운 문자열을 대입시킨경우 기존의 문자열은 그대로 있고 새로운 문자열이 생성되어 그 주소값을 가리키게 된다.
String 참조변수에 새로운 문자열을 대입시킨경우

 

 

(1) String 객체 생성 후 문자열 변경 후 실행

public class HelloWorld {
	public static void main(String[] args) {
		
		 String s1 = "Hello";
		 String s2 = "Hello";
		 System.out.println(s1==s2);
		 System.out.println("s1: " + s1);
		 System.out.println("s2: " + s2);
		 
		 s2 = s2 + "World";
		 System.out.println(s1==s2);
		 System.out.println("s1: " + s1);
		 System.out.println("s2: " + s2);
		 
		 System.out.println("--------------");
		 
		 String s3 = new String("Hello");
		 String s4 = s3;
		 System.out.println(s3==s4);
		 System.out.println("s3: " + s3);
		 System.out.println("s4: " + s4);
		 
		 s3 = s3 + "World";
		 System.out.println(s3==s4);
		 System.out.println("s3: " + s3);
		 System.out.println("s4: " + s4);
	}
}

 

(2) 실행결과

true
s1: Hello
s2: Hello
false
s1: Hello
s2: HelloWorld
--------------
true
s3: Hello
s4: Hello
false
s3: HelloWorld
s4: Hello

 

 

 

 

2. String 클래스의 메소드

 

String클래스에는 문자열을 편리하게 다룰 수 있는 여러가지 유용한 메소드들이 포함되어 있습니다. String클래스의 메소드들에 대한 내용 및 사용법은 아래 링크를 참고하시기 바랍니다. 

 

  1. int length() : 문자열 길이 반환
  2. boolean equals(Object an Object) : 문자열이 같은지 비교
  3. boolean equalsIgnoreCase(String anotherString) : 문자열이 같은지 비교 (대소문자 구분없이 비교)
  4. int compareTo(String anotherString) : 사전순으로 문자열을 비교한 결과값 반환
  5. boolean contains(CharSequence s) : 문자열이 포함되어 있는지 여부를 반환
  6. String[] split(String regex) : 문자열을 구분자로 잘라서 배열로 담아 반환
  7. char charAt(int index) : index위치에 있는 문자를 반환
  8. 기타 등등

 

 

2022.07.18 - [IT 개발/Java] - [Java] 자바 - String클래스의 메소드 및 사용예제

 

[Java] 자바 - String클래스의 메소드 및 사용예제

자바 - String클래스의 메소드 및 사용예제 String클래스의 메소드들을 이용해서 여러가지 문자열을 다루는 방법에 대해서 사용예제와 함께 알아보도록 하겠습니다.    목차 String클래스의 메소드

kadosholy.tistory.com

 

반응형

+ Recent posts