String 클래스
: 문자열을 다루기 위한 클래스
- String 클래스 = 데이터(char[]) + 메서드(문자열 관련)
- char[]: 문자 배열
- 메서드: 문자 배열을 다루는 메서드들
- 내용을 변경할 수 없는 불면(immutable) 클래스
a+b가 합쳐진 "ab"는, 새로운 주소값 0x300을 갖는 문자열 객체가 되고 그걸 a에 대입하면 a의 주소값은 0x300으로 바뀌고 0x100 주소값을 가진 객체와의 연결은 끊어진다.
따라서 System.out.println(a); 를 하면 0x300의 주소값을 가진 "ab"가 불려진다.
- 덧셈 연산자(+)를 이용한 문자열 결합은 성능이 떨어짐.
- 위에 예시처럼 계속 새로운 객체가 만들어지므로 성능이 떨어진다.
- 문자열 결합이나 변경이 잦다면, 내용을 변경가능한 StringBuffer를 사용한다.
문자열의 비교
- String str = "abc"'; 와 String str = new String("abc");의 비교
- 문자열 리터럴로 문자열을 만들면 하나의 문자열을 여러 참조변수가 공유
- new 연산자를 사용하면 항상 새로운 문자열 객체가 생성된다.
- 문자열은 내용 변경 불가라 여러 참조변수가 공유해도 상관없다 = 같은 값을 가지는 문자열을 여러개 만들 필요가 없다.
- 그래서 문자열을 쓸때는 주소를 비교하는 연산자(==)가 아니라 내용을 비교하는 equals()를 써줘야한다.
문자열 리터럴
- 문자열 리터럴은 프로그램 실행시 자동으로 생성된다.(constant pool에 저장)
빈 문자열(" ", empty string)
- 내용이 없는 문자열.
- 크기가 0인 char형 배열을 저장하는 문자열
String str = "";
- 크기가 0인 배열을 생성하는 것은 어느 타입이나 가능
char[] chArr = new char[0];
int[] iArr = {};
- 문자(char)와 문자열(String)의 초기화
String s = null;
char c = '\u0000';
보다는
Sring s = "";
char c = ' ';
가 좋은 방법이다
String 클래스의 생성자와 메서드
- compareTo() 는 정렬할 때 사용한다.
- int pos 는 position으로 검색 시작 위치를 말한다.
- split()의 int limit은 문자열을 regex 로 나누는데, 2개로 나눈다.
- valueOf() 은 값을 문자열로 변환하여 반환한다! → 알고리즘에서 진짜 자주 쓰임.