모든 프로그램언어에서 가장 기본이 되는 자료형은 숫자형으로 원시 자료형(Premitive Type)이라고 한다. 그런데 실제 우리가 사용하는 프로그램에서는 숫자 값들 보다는 문자,
문자열을 더 많이 사용한다. 예를 들어 네이버 메인 화면의 정보들 역시 문자열로 되어 있고 카페나 블로그에 글을 쓸때에도 이름, 제목 , 내용 등 모두 문자열을 사용하게 된다
자바에서는 문자열 처리가 매우 쉽지만 기본적인 구조와 특징들을 잘 이해하고 사용하지 않으면 생각하지 못한 문제가 발생하거나 성능상에 문제가 발생할 수 있습니다.
String 클래스는 불변(immutable)클래스 이므로 다음과 같은 특징이 있습니다.
+보다는 StringBuffer 클래스 사용 
"hello" 라는 값을 가지는 새로운 String 클래스의 인스턴스 생성 후 s1은 해당 인스턴스 참조s2는 이미 "hello"값을 가지는 인스턴스가 있으므로 새로운 객체를 생성하지 않고 s1의 변수 주소 할당s1==s2 비교는 true
s1은 새로운 인스턴스 생성 새로운 주소값 할당"hello"값을 가지는 인스턴스가 있다면 해당 인스턴스 주소를 값으로 가짐 없다면 새롭게 인스턴스 생성후 참조s2는 이미 "hello"값을 가지는 인스턴스가 있으므로 새로운 객체 생성 x , s1의 인스턴스 참조 단, s2변수의 주소는 새롭게 할당따라서 s1 == s2 비교는 false
분명 s1과 s2는 같은 값을 가지고 있는데 비교연산시 false 가 나오게 되므로 실제 프로그램을 개발할 때 예상지 못한 문제가 발생한다. 이유는 비교연산시 내용이 아니라 변수의 주소값을 비교하기 때문이다.
-> 따라서 문자열 비교시 String 클래스에서 제공하는 equals() 메서드를 사용하는 것이 바람직


hashCode() 메서드는 문자열 내용에 기반한 유일한 코드값으로 s1~s4는 내용이 동일 하므로 모두 같은 값을 갖는다s1==s2 , s3==s4는 변수의 주소가 서로 다르므로 falses2==s4 는 변수의 주소가 동일하므로 trues1.equals(s2), s2.equals(s3) 등은 모두 내용이 동일하므로 trues2 = s2 + "world"; s2는 "hello world" 인스턴스를 새로 생성하고 새로운 변수 주소를 가지고 생성된 인스턴스 주소를 값으로 가짐 s5 는 새로운 변수 주소를 가지며 앞에서 생성된 인스턴스 주소를 값으로 가짐 따라서 s2==s5는 false, false.equls()로 비교하면 true가 됨join() 메서드는 문자열에 구분 자를 넣어 결합하거나 분리하는 기능을 제공

StringJoiner 클래스는 문자열 결합을 도와주는 클래스로 형식에 맞게 문자열을 결합하는데 이용할 수 있습니다.

-> 구분자 , 접두사 , 접미사
trim() 은 문자열 양쪽의 공백을 제거해주는 메서드이고 substring()은 문자열 내용 중 일부만 추출할 때 사용 , replace()는 특정 문자를 다른 문자로 대체

앞에서 배운것 처럼 문자열 결합시 새로운 인스턴스가 계속해서 생겨나기 때문에 for문을 돌면서 지속적으로 문자열을 결합하는 형태의 프로그램은 성능에 큰 영향을 미친다
StringBuffer와StringBuilder클래스는 기본적으로 동일한 클래스이며 문자열을 결합하는데 유용한 클래스, 두 클래스의 차이는 멀티스레드에 안전하게 처리되었는지의 차이로StringBuffer의 경우Thread safe로 멀티스레드 처리에 안전하지만 성능이 저하될 수 있다. 따라서 멀티스레드 처리가 없는 프로그램이라면 StringBuilder 가 유리하다고 할 수 있다


