🏃♂️ 들어가기 앞서..
본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕
*해당 교재의 목차 순서와 구성을 참고하여 작성하며
각 내용마다 부족할 수 있는 내용이나 개인적으로 궁금한 점은
추가적인 검색을 통해 채워나갈 예정입니다.
String
클래스String 클래스 = 데이터 (char[] : 문자배열) + (문자열관련) 메서드
※ String클래스는 앞에final
이 붙어 있어서 다른 클래스의 조상이 될 수 없다.
String클래스에는
" 문자열을 저장하기 위해 문자형 배열 참조변수 (char[]
) value를 인스턴스 변수 (iv)로 정의 " 해놓고 있다.
따라서
" 인스턴스 생성시 "
< 생성자의 매개변수로 입력받는 문자열 >은
이 인스턴스 변수에 " 문자형배열로 저장되는 것 "이다.
독특한 것은
한 번 생성된 String 인스턴스는 갖고 있는 문자열을
Read Only이며 변경할 수 없다.
( 불변 immutable 클래스 )
예를 들어
String a = "a" ; // 참조변수 a는 "문자열 a 인스턴스" 메모리를 참조하고 있음
String b = "b" ; // 참조변수 b는 "문자열 b 인스턴스" 메모리를 참조하고 있음
a = a + b ;
/*
여기서 "a" 인스턴스에서 값이 "ab"로 바뀌는 것이 아니라
"ab"라는 문자열 인스턴스가 새롭게 생성되고
참조변수 a 는 "ab"인스턴스 메모리를 참조하게 되는 것이다.
READ ONLY!!
*/
위처럼
+
덧셈 연산자를 통한 문자열 결합은
매번 새롭게 인스턴스 생성 & 메모리 차지를 하기 때문에 효율적이지 않다.
" 문자열 결합 / 추출 등 문자열 작업이 많이 필요한 경우 "
String클래스의StringBuffer
클래스를 사용하는 것이 좋다.
(저장 문자열 내용 변경가능)
문자열을 만들 때,
2가지 방법이 있다.
앞서 살펴봤든
생성자를 통해 인스턴스를 만드는 것은 상당히 비효율적일 수 있기때문에
문자열 리터럴을 공유하는
첫 번째 방법이
바람직하다.
// 문자열 비교에선 equals() 를 사용하는 것이 좋음.
/*
" 공유 "
str1 과 str2의 hashCode() 동일 & equals() true
*/
String str1 = "abc"; //문자열 리터럴 "abc"의 주소 저장
String str2 = "abc"; //문자열 리터럴 "abc"의 주소 저장
/*
" 각 객체 생성 "
str3 과 str4의 hashCode() 상이 -> 등가비교연산자 false (주소 비교)
하지만 String클래스에서 문자열은 갖기때문에 equals() true
*/
String str3 = new String("abc") ; //새로운 인스턴스 생성
String str4 = new String("abc") ; //새로운 인스턴스 생성
※ 문자열 리터럴 ( String 리터럴 )
우선 문자열 리터럴은
우리가 별도로 생성하지 않아도
프로그램 실행시 자동으로 생성된다.
(당연히 이 리터럴들도 String 인스턴스이며 내용을 변경할 수 없다.)
클래스 파일 내 리터럴들은
JVM 내 " 상수 저장소(constant pool) "에 저장된다.
말 그대로
아~~~무 내용이 없는 문자열이다.
" 크기가 0인 char형 배열 "을
저장하는 문자열 이다.
( 크기 : Byte, 길이 : length_개수 )
String str = ""; // 빈 문자열로 초기화
char c = ' ' ; //공백으로 초기화 : char형은 반드시 하나의 문자를 지정해야한다는 것을 잊지말자.
사실
크기가 0인 배열을 생성하는 것은
어떤 타입이든 가능하다.
char[] chArr = new char[0] ; //길이가 0인 char배열
int[] iArr = {} ; //길이가 0인 int배열
이 빈 문자열은
초기화를 시킬 때 아주 유용하게 쓰이니
초기화하는 방법을 알아보자.
char[] chArr1 = new char[0] ;
char[] chArr2 = {} ;
String s1 = new String(chArr1);
String s2 = new String(chArr2);
String s3 = new String("");
String s4 = ""; // 가장 효율적이고 바람직한 방법