숑숑이의 개발일기
article thumbnail

본글은 'Do it 자바 완전 정복' 책을 통한 공부내용을 정리한 글입니다.

 

참조 자료형의 가장 대표적인 형태는 클래스다. 이번에는 문자열을 저장하는 String 클래스를 알아본다

 

문자열의 표현과 객체 생성

String 클래스의 객체를 생성하는 데에는 크게 2가지 방법이 존재한다.

// 1
String 참조 변수명 = new String("문자열");
String str = new String("안녕");

// 2
String 참조 변수명 = "문자열";
String str = "안녕";

 

String 클래스의 특징

1) 객체 안의 값을 변경시 새로운 객체를 생성한다

String str1 = new String("안녕");
String str2 = str1;
str1 = "안냥하세요";
System.out.println(str1);	// 안녕하세요
System.out.println(str2);	// 안녕

참조 자료형을 복사하면 스택 메모리의 값이 복사되므로 str1과 str2는 동일한 객체를 가르킨다. 이때 str1의 값을 변경할 경우 안녕하세요 라는 문자열을 포함하고 있는 새로운 String객체를 생성하고, 객체의 위치를 str1에 저장한다.

배열의 특징과 비교해보자. 배열은 객체의 값 자체가 수정되므로 참조 변수 복사 이후 하나의 변수에서 수정하면 나머지 변수에도 적용된다.
int[] arr1 = new int[] {3, 4, 5};
int[] arr2 = arr1;
arr1[0] = 6;
arr1[1] = 7;
arr1[2] = 8;	// arr2가 가르키는 값도 변경됨.
System.out.println(Arrays.toString(arr1));	// 6, 7, 8
System.out.println(Arrays.toString(arr2));	// 6, 7, 8

 

2) 리터럴을 바로 입력한 데이터는 문자열이 같을 때 하나의 객체를 공유한다

문자열 리터럴만 입력해 String 객체를 생성하면 하나의 문자열을 여러 객체가 공유할 수 있다. 이는 다른 클래스에는 없는 특징으로 메모리 효율성을 증가시키기 위한 것이다

String str1 = new String("안녕");
String str2 = "안녕";
String str3 = "안녕";
String str4 = new String("안녕");
System.out.println(str1 == str2);	// false
System.out.println(str2 == str3);	// true
System.out.println(str1 == str4);	// false

 

String 객체의 '+' 연산

String 객체는 + 연산을 이용해 문자열을 연결할 수 있다.

1) 문자열 + 문자열 연산

String str1 = "안녕" + "하세요" + "!";
System.out.println(str1);	// 안녕하세요!

String str2 = "반갑";
str2 += "습니다";

System.out.println(str2);	// 반갑습니다

위의 코드에서 결과가 "안녕하세요!"라고 나오는 것을 예측하는 일은 어렵지 않다. 우리는 아래의 그림과 같이 객체가 5개 만들어진다는 것을 알아야 한다.

 

2) 문자열 + 기본 자료형 또는 기본 자료형 + 문자열 연산

System.out.println(1 + "안녕");		// 1안녕
System.out.println(1 + "안녕" + 2);	// 1안녕2
System.out.println("안녕" + 1 + 2);	// 안녕3

+ 연산은 앞에서부터 연산을 수행한다는 것을 잊지말자.

 

String 클래스의 주요 메서드

구분 리턴 타입 메서드 설명
문자열 길이 int length() 문자열의 길이.
글자개수를 리턴.
문자열 검색 char charAt(int index) 인덱스 위치에서의 문자를 리턴
int indexOf(int ch)
indexOf(int ch, int fromIndex)
indexOf(String str)
indexOf(String str, int fromIndex)
문자열에 포함된 문자 또는 문자열의 위치를 에서부터 검색했을 때 일치하는 인덱스 값
(fromIndex는 검색 시작 위치)
int IastIndexOf(int ch)
IastIndexOf(int ch, int fromIndex)
IastIndexOf(String str)
IastIndexOf(String str, int fromIndex)
문자열에 포함된 문자 또는 문자열의 위치를 에서부터 검색했을 때 일치하는 인덱스 값
(fromIndex는 검색 시작 위치)
문자열 변환 및 검색 float String.valueOf(boolean b)
String.valueOf(char c)
String.valueOf(int i)
String.valueOf(long l)
String.valueOf(float f)
String.valueOf(double d)
boolean, char, int, long, float, double 값을 문자열로 변환하기 위한 정적 메서드
double concat(String str) 문자열 연결(String 객체의 + 연산과 동일)
문자열 배열 변환 byte[] getBytes()
getBytes(Charset charset)
문자열을 byte[]로 변환(변환할 때 문자 셋(charset) 지정 가능)
char[] toCharArray() 문자열을 char[]로 변환
문자열 수정 String toLowerCase() 영문 문자를 모두 소문자로 변환
String toUpperCase() 영문 문자를 모두 대문자로 변환
String replace(char oldChar, char newChar) oldChar 문자열을 newChar 문자열로 대체한 문자열 생성
String substring(int beginIndex)
substring(int beginIndex, int endIndex)
beginIndex부터 끝까지의 문자열 생성
beginIndex부터 endIndex-1 위치까지의 문자열 생성
String[] split(String regex)
split(String regex, int limit)
regex를 기준으로 문자열을 분할한 문자열 배열을 생성(regex 구분 기호는 '|' 기호로 여러개 사용가능, limit는 분할의 최대 개수)
String trim() 문자열의 앞뒤 공백 제거
문자열 내용 비교 boolean equals() 문자열의 실제 내용 비교
(==는 메모리 번지(stack) 비교)
boolean equalslgnoreCase(String anotherString) 대소문자 구분 없이 문자열의 실제 내용 비교

이중 split 메서드에 대해 이해하기 쉽도록 아래 코드를 보자

String str = "abc/def-ghi jkl";
 String[] strArr = str.split("/|-| ");
 System.out.println(Arrays.toString(strArr));
 // '/'또는 '-'또는 ''(공백)으로 구분된 문자열 배열 반환

 

profile

숑숑이의 개발일기

@숑숑-

풀스택 개발자 준비중입니다