일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 코딩
- Java
- 자바
- 상속
- SSR
- try-catch
- 새벽공부
- 인터페이스
- exception
- 변수
- throws
- FileInputStream
- 바이트 단위 스트림
- 백엔드
- 메서드
- 다형성
- 졸리다
- 배열
- 파이팅
- 문자 단위 스트림
- node.js
- MPA
- 초보개발자
- 예외 처리
- 자료형
- 코린이
- 보조 스트림
- ArrayList
- 인스턴스
- 개발자
- Today
- Total
SHUSTORY
11-2 String 클래스 본문
String을 선언하는 두 가지 방법
자바는 문자열을 사용할 수 있도록 String 클래스를 제공한다.
String 사용 시 문자열을 생성자의 매개변수로 하여 생성하는 방식과 이미 생성된 문자열 상수를 가리키는 방식이 있다.

비슷해 보이는 위 두 가지 방법에는 큰 차이가 있다.
new 예약어를 사용하여 객체를 생성하는 경우, "abc" 문자열을 위한 메모리가 할당되고 새로운 객체가 생성된다.
하지만 String str2 = "test"; 와 같이 생성자를 이용하지 않고 바로 문자열 상수를 가리키는 경우
str2가 기존에 만들어져 있던 "test"라는 문자열 상수의 메모리 주소를 가리키게 된다.
따라서 String str3 = "test"; 코드를 작성하게 되면 str2와 str3는 같은 주소 값을 갖게 된다.
test나 10,20 등 프로그램에서 사용되는 상수 값을 저장하는 공간을 '상수 풀' 이라고 한다.

예제01에서 str1과 str2는 따로 생성된 인스턴스로 주소 값이 다르지만, 문자열 값이 같으므로 equals( ) 메서드 사용 시 true가 반환되었다.
문자열 abc는 상수 풀에 저장되어 있으므로 str3와 str4가 가리키는 주소 값이 같으며, equal( ) 메서드 사용 시 문자열 값도 같기 때문에 true가 반환된다.
String 클래스의 final char[ ] 변수
다른 프로그래밍 언어에서 문자열을 구현할 때 일반적으로 char[ ] 배열을 사용한다.
자바는 String 클래스를 제공해 char[ ] 배열을 구현하지 않고도 편리하게 문자열을 사용할 수 있는데,
이는 String 클래스의 구현 내용을 살펴보면 private final char value[ ]라고 선언된 char형 배열이 있기 때문이다.
변수가 final로 선언되어 있는 것을 볼 수 있는데, 따라서 한 번 생성된 문자열은 변경되지 않는다.
두 개의 문자열을 생성한 후 연결하면 문자열이 변경되는 것이 아닌,
새로운 주소 값을 갖게 되며 문자열이 이어붙어지게 되는 것이다.

concat( ) 메서드를 호출하여 두 문자열을 연결할 수 있다.
System.identityHashCode( ) 메서드를 사용하여 주소 값을 호출할 수 있다.
StringBuffer와 StringBuilder 클래스 활용하기
프로그램을 만들다 보면 문자열을 변경하거나 연결해야 할 때가 많은데,
String 클래스는 한번 생성되면 그 내부의 문자열이 변경되지 않기 때문에 메모리가 많이 낭비되며 불편하다.
이러한 문제를 해결해 주는 것이 StringBuffer와 StringBuilder 클래스이다.
두 클래스는 내부에 변경 가능한( final이 아닌 ) char[ ]를 변수로 가지고 있다.
이 클래스들을 통해 문자열을 연결하면 기존에 사용하던 char[ ] 배열이 확장되므로 추가 메모리를 사용하지 않는다.
두 클래스의 차이는 여러 작업( 스레드 )이 동시에 문자열을 변경하려 할 때 문자열이 안전하게 변경되도록 보장해 주는가
그렇지 않은가의 차이이다.
StringBuffer 클래스는 문자열이 안전하게 변경되도록 보장하지만, StringBuilder 클래스는 보장해주지 않는다.
프로그램에서 따로 스레드를 생성하는 멀티스레드 프로그램이 아니라면 StringBuilder를 사용하는 것이 실행속도가 더 빠르다.

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 |