본문 바로가기

java

문자열 다루기?

객체지향 언어에서는 클래스 타입을 사용할 수 있습니다.

문자열 역시 별도의 클래스 타입으로 만들어 사용할 수 있습니다. 자바의 경우 String 클래스가 문자열 타입이라고 할 수 있습니다.

 

자바에서는 문자열 처리가 매우 쉽지만 기본적인 구조와 특징들을 잘 이해하고 사용하지 않으면 생각하지 못한 문제가 발생하거나 성능상에 문제가 발생할 수 있습니다.

 

String 클래스는 불변(immutable)클래스

 

  • 생성된 String 인스턴스가 갖고 있는 문자열값은 읽어올 수만 있고, 변경할 수는 없다.
  • ’+’ 연산자를 이용해서 문자열을 결합하는 경우 인스턴스내의 문자열이 바뀌는 것이 아니라 새로운 문자열이 담긴 String 인스턴스가 생성됨.
  • 문자열간의 결합등의 작업은 문자열 + 보다는 StringBuffer클래스를 사용.
String s1 = "hello";
String s2 = "hello";
  • “hello” 라는 값을 가지는 새로운 String 클래스의 인스턴스 생성후 s1은 해당 인스턴스 참조.
  • s2는 이미 “hello” 값을 가지는 인스턴스가 있으므로 새로운 객체를 생성하지 않고 s1의 변수 주소 할당
  • 따라서 s1 == s2 비교는 true.
String s1 = new String("hello");
String s2 = "hello";
  • s1은 새로운 인스턴스 생성 새로운 주소값 할당.
  • 이때 “hello” 값을 가지는 인스턴스가 있다면 해당 인스턴스 주소를 값으로 가짐. 없다면 새롭게 인스턴스 생성후 참조.
  • s2는 이미 “hello” 값을 가지는 인스턴스가 있으므로 새로운 객체를 생성하지 않고 s1의 인스턴스 참조. 단 s2변수의 주소는 새롭게 할당.
  • 따라서 s1 == s2 비교는 false.

분명 s1 과 s2는 같은 값을 가지고 있는데 비교연산시 false 가 나오게 되므로 실제 프로그램을 개발할때 예상치 못한 문제가 발생할 수 있습니다. 이유는 비교연산시 내용이 아니라 변수의 주소값을 비교하기 때문에 그렇습니다.

따라서 문자열 비교시 String 클래스에서 제공하는 equals() 메서드를 사용하는 것이 바람직 합니다.

 

System.out.println(s1 == s2);   // false
System.out.println(s1.equals(s2))   // true

 

'java' 카테고리의 다른 글

제네릭이란 무엇인가? ( Generics )  (0) 2021.01.21
java 예외 처리  (0) 2021.01.20
제어자?  (0) 2021.01.20
오버로딩과 오버라이딩  (0) 2021.01.19
자바 메모리 관리 ?  (0) 2021.01.19