SHUSTORY

11-2 String 클래스 본문

프로그래밍/JAVA

11-2 String 클래스

어서오시우 2023. 3. 6. 19:17
728x90

String을 선언하는 두 가지 방법

자바는 문자열을 사용할 수 있도록 String 클래스를 제공한다.

String 사용 시 문자열을 생성자의 매개변수로 하여 생성하는 방식이미 생성된 문자열 상수를 가리키는 방식이 있다.

String 선언

비슷해 보이는 위 두 가지 방법에는 큰 차이가 있다.

new 예약어를 사용하여 객체를 생성하는 경우, "abc" 문자열을 위한 메모리가 할당되고 새로운 객체가 생성된다.

 

하지만 String str2 = "test"; 와 같이 생성자를 이용하지 않고 바로 문자열 상수를 가리키는 경우

str2가 기존에 만들어져 있던 "test"라는 문자열 상수의 메모리 주소를 가리키게 된다.

따라서 String str3 = "test"; 코드를 작성하게 되면 str2와 str3는 같은 주소 값을 갖게 된다.

 

test나 10,20 등 프로그램에서 사용되는 상수 값을 저장하는 공간을 '상수 풀' 이라고 한다.

 

예제01

 

예제01에서 str1과 str2는 따로 생성된 인스턴스로 주소 값이 다르지만, 문자열 값이 같으므로 equals( ) 메서드 사용 시 true가 반환되었다.

문자열 abc는 상수 풀에 저장되어 있으므로 str3와 str4가 가리키는 주소 값이 같으며, equal( ) 메서드 사용 시 문자열 값도 같기 때문에 true가 반환된다.

 

 

String 클래스의 final char[ ] 변수

다른 프로그래밍 언어에서 문자열을 구현할 때 일반적으로 char[ ] 배열을 사용한다.

 

자바는 String 클래스를 제공해 char[ ] 배열을 구현하지 않고도 편리하게 문자열을 사용할 수 있는데,

이는 String 클래스의 구현 내용을 살펴보면 private final char value[ ]라고 선언된 char형 배열이 있기 때문이다.

 

변수가 final로 선언되어 있는 것을 볼 수 있는데, 따라서 한 번 생성된 문자열은 변경되지 않는다.

두 개의 문자열을 생성한 후 연결하면 문자열이 변경되는 것이 아닌,

새로운 주소 값을 갖게 되며 문자열이 이어붙어지게 되는 것이다.

예제02

concat( ) 메서드를 호출하여 두 문자열을 연결할 수 있다.

System.identityHashCode( ) 메서드를 사용하여 주소 값을 호출할 수 있다.

 

 

StringBuffer와 StringBuilder 클래스 활용하기

프로그램을 만들다 보면 문자열을 변경하거나 연결해야 할 때가 많은데,

String 클래스는 한번 생성되면 그 내부의 문자열이 변경되지 않기 때문에 메모리가 많이 낭비되며 불편하다.

이러한 문제를 해결해 주는 것이 StringBuffer와 StringBuilder 클래스이다.

 

두 클래스는 내부에 변경 가능한( final이 아닌 ) char[ ]를 변수로 가지고 있다.

이 클래스들을 통해 문자열을 연결하면 기존에 사용하던 char[ ] 배열이 확장되므로 추가 메모리를 사용하지 않는다.

 

두 클래스의 차이는 여러 작업( 스레드 )이 동시에 문자열을 변경하려 할 때 문자열이 안전하게 변경되도록 보장해 주는가

그렇지 않은가의 차이이다.

StringBuffer 클래스는 문자열이 안전하게 변경되도록 보장하지만, StringBuilder 클래스는 보장해주지 않는다.

프로그램에서 따로 스레드를 생성하는 멀티스레드 프로그램이 아니라면 StringBuilder를 사용하는 것이 실행속도가 더 빠르다.

 

예제03

 

append( ) 메서드를 통해 메모리를 새로 생성하지 않고도 하나의 메모리에 문자열을 계속 연결할 수 있으며,

예제03 17행에서 볼 수 있듯이 문자열을 변경한 후 buffer에 toString( ) 메서드를 호출하면 다시 문자열로 반환할 수 있다.

'프로그래밍 > JAVA' 카테고리의 다른 글

12-1 제네릭  (0) 2023.03.07
11-3 Wrapper 클래스  (0) 2023.03.06
11-1 Object 클래스  (0) 2023.03.06
10-3 인터페이스 요소 살펴보기  (0) 2023.03.05
10-2 인터페이스와 다형성  (0) 2023.03.05