[JAVA] 자바 독학기 #8 - 문자열 자료형과 기초 사용법(feat. 얄팍한 코딩사전)
문자열 자료형과 기초 사용법
다른 포스팅들과 마찬가지로
얄코 자바 강의를 들으며 내가 모르는 내용, 제대로 몰랐던 내용을 위주로 기록하였다!
🔸목차
String Pool(String Constant Pool)
🔸문자열 자료형(String) ?
- 영어든, 한글이든, 빈 문자열이든, 이모티콘이등 다 가능
- '' 가 아닌 "" 안에 입력
- 다른 자료형들은 데이터 하나에 지정된 메모리 용량이 있었으나, string은 정해지지 않았음
- 원시자료형 X, 참조 자료형O. 하지만 원시값과 유사하게 사용될 수 있음
생성 방식
- 리터럴 방식
String str1 = "Hello World!";
- 인스턴스 생성 방식 (단순히 문자열만이 아니라 내부에 다양한 정보가 포함되어있음)
String str2 = new String("이렇게도 생성 가능해요.");
🔸String Pool(String Constant Pool)
리터럴로 정의한 변수는 Heap 안에 String Pool 이란 공간에 따로 저장됨
>> 같은 문자열이 적힌 리터럴 변수들은 같은 것을 가리킴
인스턴스 방식으로 정의한 변수는 Heap 공간안에 저장되어 있음
>> 값에 상관없이 매번 새로 생성되어 각각 자리를 차지함
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
boolean bool1 = str1 == str2; // true
boolean bool2 = str1 == str3; // false
리터럴로 만든 변수와 인스턴스 방식으로 생성한 변수를 비교하기 위해서는
equals() 를 사용해야함
boolean bool1 = str1 == str3; // false
boolean bool2 = str1.equals(str3); // true
== : 같은 종이에 적혀 있는가?
equals : 같은 글이 적혀있는가?
객체 인스턴트의 경우 = 를 이용하면 메모리 주소가 복사됨
>> 새로 공간을 차지하는게 아니라 같은 곳을 바라봄
>> == 으로 비교해도 true
>> 문자열은 equals로 비교하는 것이 권장됨
String str4 = new String("bcd");
String str5 = str4;
boolean bool3 = str5 == str4; // true
+ 각각의 메모리상 주소 식별자 비교
int str1Hash = System.identityHashCode(str1); // 메모리 주소값 출력됨
🔸문자열의 기타 특징
1. 리터럴로 선언해도 객체 인스턴스로 생성됨
>> 객체의 기능인 메소드도 사용 가능
>> 객체와 비교도 가능
String study = "공부중";
boolean bool1 = study.equals("공부중"); // true
boolean bool2 = "공부중".equals("공부중"); // true
boolean bool3 = "공부중".equals(study1); // true
2. 문자열을 서로 더하면 이어붙여줌(+=도 동일)
3. 문자열에는 -=, +=, *= 사용 불가능
4. 타 자료형과 연산?
문자열과 타 자료형을 더해주면 모두 이어붙여줌
5. 타 자료형을 문자열로 변환
1) valueOf() 사용
String str1 = String.valueOf(true); // "true"
String str2 = String.valueOf(123); // "123"
String str3 = String.valueOf(3.14f); // "3.14" // f 빼버
String str4 = String.valueOf('가'); // "가"
2) "" 더해주기 -> 더 간편함
String str5 = true + "";
String str6 = 123.45 + "";
6. 문자열을 정수 자료형으로 변환
parse***() 사용
String str_test = "123";
byte byteNum = Byte.parseByte(str_test); // byteNum: 123
short srtNum = Short.parseShort(str_test); // srtNum: 123
// 하지만 변환할 자료형에 맞는 값을 넣어줘야 함
byte byteNum2 = Byte.parseByte("12345"); // 컴파일 단계에서는 에러가 없지만 실행하면 에러남(런타임 오류)
// boolean 자료형의 경우
// 대소문자 무관 true 인 경우만 true 반환
boolean bool1 = Boolean.parseBoolean("TRUE"); // bool1: true
boolean bool2 = Boolean.parseBoolean("true"); // bool2: true
boolean bool3 = Boolean.parseBoolean("A"); // bool3: false
🔸이스케이프 표
" " 안에 " "를 넣고싶은데 넣으면 컴파일 에러가 남
엔터도 넣지 못함
String str1 = "난 이 문장에 "이거를" 넣고 싶은데"; // Error
// " 앞에 이스케이프 표인 \ 을 쓰면 됨
// 엔터는 \n을 사용
String str2 = "난 이 문장에 \"이거를\" 넣고, \n엔터도 넣고 싶어.";
기타
\t : tab
\\ : 백슬래시 하나