Programing Language/Java
[Java] 자바 문자열 타입(String Type)
vinedpillar
2022. 6. 15. 00:29
문자열 타입
- 문자열은 문자를 연결한 단어나 문장 형태를 저장하기 위한 타입입니다.
- 자바의 문자열은 String 클래스의 객체를 만드는 방식으로 생성됩니다.
- 자바에서 문자열 타입은 2가지 방법으로 생성할 수 있습니다.
(두 가지 방식 모두 메모리에 저장되는 방식은 동일하지만 String 클래스의 특징으로 인해 활용에 조금의 차이가 발생)
String 타입 객체 생성
// String 타입 객체 생성 첫 번째 방법
// 변수 선언과 같이 타입, 변수명 명시 후 값 대입
// 문자열 타입의 값은 반드시 큰따옴표("") 안에 표기
String 변수명 = "저장 할 문자열";
// String 타입 객체 생성 두 번째 방법
// new 키워드를 통해 객체 생성
string 변수명 = new String("저장 할 문자열");
String 타입 특징
- String 클래스는 사용되는 빈도가 높은만큼 메모리를 효율적으로 활용하기 위해 다른 클래스와 다른 특징을 가지고 있습니다.
- 첫 번째 특징: 한 번 생성된 객체는 변경이 불가능하며, 객체의 값을 변경할 경우 새로운 객체를 생성합니다.
String 타입으로 선언된 변수의 값 변경
// str1에 문자열 값을 넣고, 이를 str2에 복사
// str1의 값을 변경하면, 주소를 가지는 참조 타입의 특성상 str2의 값도 변경되어야 함
// 하지만 두 변수가 서로 다른 값을 가지게 됨
String str1 = "안녕";
String str2 = str1;
str1 = "안녕하세요";
// 안녕하세요 출력
System.out.println(str1);
// 안녕 출력
system.out.println(str2);
- 두 번째 특징: 리터럴을 바로 대입하는 경우 문자열이 같다면 하나의 객체를 공유해서 사용합니다.
String 타입의 객체 공유
// 리터럴을 직접 대입하는 방식으로 같은 값의 객체를 생성할 경우 기존에 같은 방식으로 생성된 객체의 주소값을 활용하여 생성
// new 키워드로 객체를 생성하는 경우 같은 값의 객체를 생성하더라도 새로운 메모리 주소를 생성
String str1 = new String("apple");
String str2 = "apple";
String str3 = "apple";
String str4 = new String("apple");
// 서로 다른 방식으로 생성된 객체이기 때문에 false 출력
System.out.println(str1 == str2);
// 리터럴 대입 방식으로 같은 객체를 생성했기 때문에 true 출력
System.out.println(str2 == str3);
// 첫 번째와 같은 이유로 false 출력
System.out.println(str3 == str4);
// new 키워드로 새로운 메모리 주소를 생성했기 때문에 false 출력
System.out.println(str1 == str4);
- 이러한 특징 때문에 다소 불편한 상황이 발생할 수 있기 때문에 다른 방식으로 문자열을 저장하는 클래스를 제공하고 있습니다.
- StringBuilder: 생성한 문자열을 변경할 수 있도록 저장하며, 멀티쓰레드 환경에서 동기화를 지원하지 않습니다.
- StringBuffer: 생성한 문자열을 변경할 수 있도록 저장하며, 멀티쓰레드 환경에서 동기화를 지원하지만 처리 속도가 더 소요됩니다.
String 객체의 연산
- String 객체는 + 연산을 통해 문자열을 연결할 수 있습니다.
- String의 연산은 문자열 + 문자열 경우와 기본 타입 + 문자열 두 가지 방식으로 진행됩니다.
- 문자열 + 문자열 방식
String의 연결 연산 예시
String str1 = "문자열";
String str2 = " 타입";
// "문자열 타입" 출력
System.out.println(str1 + str2);
- 기본 자료형 + 문자열 방식
- 기본적으로 연산은 동일한 자료형끼리만 가능하기 때문에 기본 자료형을 먼저 문자열 타입으로 변경한 후에 문자열 + 문자열 방식으로 연결합니다.
String 연결 연산 예시2
int num1 = 23;
int num2 = 12;
String str1 = " 스트리트";
// int 값인 23을 문자열 "23"으로 변경 후에 연산
// "23 스트리트" 출력
System.out.println(num1 + str1);
// " 스트리트23" 출력
System.out.println(str1 + num1);
// 문자열 변경에 앞서 수치 연산 먼저 수행하기 때문에 덧셈이 먼저 수행되고 문자열 변경 수행
// "35 스트리트" 출력
System.out.println(num1 + num2 + str1);
- 문자열은 한 번 생성되면 변경이 불가능하기 때문에 문자열의 변경을 통해 메모리에 생성되는 불용 객체가 많이 생성됩니다.
- 따라서 프로그램 구동 시 문자열의 잦은 수정이 예상된다면 StringBuilder나 StringBuffer 등을 활용하는 것이 좋습니다.