JAVA < 문자열 >

Zero·2022년 4월 2일
0

문자열

모든 프로그램언어에서 가장 기본이 되는 자료형은 숫자형으로 원시 자료형(Premitive Type)이라고 한다. 그런데 실제 우리가 사용하는 프로그램에서는 숫자 값들 보다는 문자, 문자열을 더 많이 사용한다. 예를 들어 네이버 메인 화면의 정보들 역시 문자열로 되어 있고 카페나 블로그에 글을 쓸때에도 이름, 제목 , 내용 등 모두 문자열을 사용하게 된다


문자열 생성 및 비교

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

String 클래스는 불변(immutable)클래스 이므로 다음과 같은 특징이 있습니다.

  • 생성된 String인스턴스가 갖고 있는 문자열값은 읽어올 수 만 있고, 변경 x
  • '+'연산자를 이용해서 문자열을 결합하는 경우 인스턴스내의 문자열이 바뀌는 것이 아니라 새로운 문자열이 담긴 String 인스턴스가 생성
  • 문자열간의 결합등의 작업은 문자열 +보다는 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는 변수의 주소가 서로 다르므로 false
  • s2==s4 는 변수의 주소가 동일하므로 true
  • s1.equals(s2), s2.equals(s3) 등은 모두 내용이 동일하므로 true
  • s2 = s2 + "world"; s2"hello world" 인스턴스를 새로 생성하고 새로운 변수 주소를 가지고 생성된 인스턴스 주소를 값으로 가짐
  • s5 는 새로운 변수 주소를 가지며 앞에서 생성된 인스턴스 주소를 값으로 가짐 따라서 s2==s5false, false.equls()로 비교하면 true가 됨

String 클래스 주요 메서드


join() , StringJoiner

join() 메서드는 문자열에 구분 자를 넣어 결합하거나 분리하는 기능을 제공

  • split() 메서드는 StringTokenizer 클래스를 사용해 구현할수도 있음

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

-> 구분자 , 접두사 , 접미사

trim(), substring(), replace(), toCharArr()

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

문자열 원소의 위치 및 크기 관련

  • indexOf() : 특정 문자가 처음 나오는 위치를 리턴
  • lastIndexOf() : 특정 문자가 마지막으로 나오는 위치를 리턴
  • charAt() : 지정된 인덱스의 문자를 리턴
  • startsWith() : 특정 문자 혹은 문자열 패턴으로 시작하는지 확인
  • length() : 문자열의 길이를 리턴

StringBuffer, StringBuilder 클래스 활용

앞에서 배운것 처럼 문자열 결합시 새로운 인스턴스가 계속해서 생겨나기 때문에 for문을 돌면서 지속적으로 문자열을 결합하는 형태의 프로그램은 성능에 큰 영향을 미친다

StringBufferStringBuilder 클래스는 기본적으로 동일한 클래스이며 문자열을 결합하는데 유용한 클래스, 두 클래스의 차이는 멀티스레드에 안전하게 처리되었는지의 차이로 StringBuffer의 경우 Thread safe로 멀티스레드 처리에 안전하지만 성능이 저하될 수 있다. 따라서 멀티스레드 처리가 없는 프로그램이라면 StringBuilder 가 유리하다고 할 수 있다

  • 최종적으로 문자열이 필요한 경우에만 toString()으로 변환
  • 서로다른 StringBuffer 인스턴스에 같은 값이 들어 있어도 == , equals()를 이용한 비교는 false
  • toString()으로 변환한다음 equals()로 비교해야 함

0개의 댓글