객체지향 언어에서는 클래스 타입을 사용할 수 있습니다.
문자열 역시 별도의 클래스 타입으로 만들어 사용할 수 있습니다. 자바의 경우 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 |