5. 문자열 자료형과 기초 사용법 | Notion
String : 문자열 자료형
yalco.notion.site
String : 문자열 자료형
1. 0~다수의 문자들로 구성
2. ""로 둘러쌈
3. 이제까지 배운 자료형(원시자료형. int같은 자료형들은 크기가 정해져 있음)들과 달리 참조 자료형
할당되는 메모리가 고정적이지 않다.
특별히 원시값과 유사하게 사용될 수 있음(편의를 위해)
문자열 생성 방식
1. 리터럴 방식
String str1 = "Hello World!";
2. 인스턴스 생성 방식
String str4 = new String("나중에 자세히 배웁니다.");
인스턴스는 일단 특정 기능을 가진 무언가로 이해하고 넘어가자.
https://deveric.tistory.com/123
[Java] 많이 헷갈려하는 String constant pool과 Runtime Constant pool, Class file constant pool
String Constant Pool과 Constant Pool 이 두 가지는 완전히 다른 개념입니다. 용어가 비슷한 형태이기 때문에 이 두 가지를 혼용하여 헷갈리는 경우가 많습니다만, 저장되는 위치부터 저장하는 데이터의
deveric.tistory.com
문자열 비교
1. == 비교
String hl1 = "Hello";
String hl2 = "Hello";
String wld = "World";
// 리터럴끼리는 == 을 사용하여 비교 가능
boolean bool1 = hl1 == hl2;
boolean bool2 = hl1 == wld;
2개의 자료형이 같은 객체인지를 판별할때 사용한다.
hl1, hl2는 문자열이 같으므로 true,
hl1과 wld는 다르므로 false.
// 리터럴끼리는 == 을 사용하여 비교 가능
boolean bool1 = hl1 == hl2;
boolean bool2 = hl1 == wld;
String hl3 = new String("Hello");
String hl4 = new String("Hello");
String hl5 = hl4;
// 💡 인스턴스와 비교하려면 .equals 메소드를 사용해야 함
// 특별한 경우가 아니면 문자열은 .equals로 비교할 것
boolean bool3 = hl3 == hl4;
boolean bool4 = hl1.equals(hl2);
boolean bool5 = hl1.equals(hl3);
boolean bool6 = hl3.equals(hl4);
boolean bool7 = wld.equals(hl2);
// 같은 곳을 참조하는 인스턴스들
boolean bool8 = hl4 == hl5;
String constant pool에 저장되는 문자열은 전부 같은 곳에 저장이 된다.
-> 리터럴 방식의 변수값은 내용이 같기만 하면 모두 같은 곳을 가리킨다.
객체 인스턴스로 생성된 변수들은 매번 새로 생성되서 자리를 차지한다.
->equals는 내용을 비교하기 때문에, 객체 인스턴스방식으로 생성된 변수는 equals로 비교하는 것이 필요하다.
문자열을 equals로 비교해야 하는 이유는 생성을 어떠한 방식으로 하는지에 따라 저장되는 공간이 달라서 주소가 달라질 수 있고, 이는 예측하지 못한 비교값을 나타낼 수 있다.(ex 리터럴 방식 == 인스턴스 방식)
그러므로, 자바에서 문자열을 비교할 때는 .equals를 사용해서 예측 불가능한 에러를 피하자.
메모리상 식별자 비교하기
// ⭐️ 각각의 메모리상 주소 식별자 비교
int hl1hash = System.identityHashCode(hl1);
int hl2hash = System.identityHashCode(hl2);
int hl3hash = System.identityHashCode(hl3);
int hl4hash = System.identityHashCode(hl4);
int hl5hash = System.identityHashCode(hl5);
hl1, hl2는 리터럴 방식으로 주소가 동일.
hl3,hl4는 동일한 내용을 인스턴스로 생성했으나 주소가 다름.
hl4,hl5 역시 동일한 주소를 참조.
연산자
1. 리터럴로 선언하더라도 객체 인스턴스로 만들어지므로, 객체의 기능을 사용가능하다.
그래서 equals로 비교가 가능하다.
boolean bool_a2 = "안녕".equals("안녕");
boolean bool_a3 = "안녕".equals(str_a1);
2. +는 문자열을 이어붙인 결과를 반환한다.
3. +=는 변수에 문자열을 이어붙인다. 단, 상수에다가는 이어 붙일 수 없다.(final 변수)
// += 연산자:
// 1. ⭐️ 해당 변수에 문자열을 이어붙임 (부수효과)
String str_c1 = "나는 아무 생각이 없다. ";
str_c1 += "왜냐하면 ";
--> 나는 아무 생각이 없다. 왜냐하면
4. 문자열에 다른 자료형을 +하면 문자열로 이어 붙여진다.
int intNum = 123;
float fltNum = 3.14f;
boolean bool = true;
char character = '가';
String str_d1 = "자, 이어붙여볼까요? ";
// 💡 문자열에 다른 자료형을 더하면 문자열로 이어붙여짐
String str_d2 = str_d1 + intNum + fltNum + bool + character;
자, 이어붙여볼까요? 1233.14true가
타 자료형간 비교
1. 타 자료형에서 문자열로 변환할때는 String.valueOf를 사용 or ""를 붙인다.
// 💡 타 자료형으로부터 문자열로 변환
String str1 = String.valueOf(true);
String str2 = String.valueOf(false);
String str3 = String.valueOf(123);
String str4 = String.valueOf(3.14f);
String str5 = String.valueOf('가');
2. 문자열을 정수 자료형으로 변환할때는 각각 Wrapper 클래스의 parse.. 메서드를 사용한다.
// 문자열을 정수 자료형으로 변환하기
byte bytNum = Byte.parseByte(str123);
short srtNum = Short.parseShort(str123);
int intNum = Integer.parseInt(str123);
long lngNum = Long.parseLong(str123);
3. boolean 변수는 특이하게 대소문자에 상관없이 'true'이면 true를 반환한다.
boolean bool1 = Boolean.parseBoolean("TRUE");
boolean bool2 = Boolean.parseBoolean("true");
boolean bool3 = Boolean.parseBoolean("T");
boolean bool4 = Boolean.parseBoolean("TruE");
4. char은 charAt을 사용해서 문자열로 뱉는다.
String strA = "A";
// 다음 강에 배울 메소드
char chr = strA.charAt(0);
런타임 에러
컴파일러가 걸러내지 못하는 에러를 말한다. 실행중에 발생해서 그렇다.
이건 실행으로 테스트시 하나씩 주석해제하며 테스트해보는 것이 좋다.
// ⚠️ 런타임 에러 발생. 하나씩 주석해제해서 테스트
// '실행'으로 테스트하거나, 디버그 후 콘솔 탭에서 확인해볼 것
//byte bytNum2 = Byte.parseByte("12345");
//int intNum2 = Integer.parseInt("123.45");
//double dblNum2 = Integer.parseInt("하나");
위 예제의 경우 byte는 더 큰 자리수가 들어가서, int는 정수형이 안들어가서. double도 숫자가 아 문자열이 들어가서 그렇다.
parse관련 함수를 사용할때는 들어가있는 파라미터에 따라서 런타임 오류가 날 수도 있으니 신경써야 한다.
이스케이프
이스케이프 표현
|
대체
|
\"
|
큰따옴표
|
\’
|
작은따옴표
|
\n
|
줄바꿈
|
\t
|
탭
|
\\
|
백슬래시 하나
|
이스케이프를 사용한 결과
String str1 = "문자열에 \"큰따옴표가\" \'안 들어가요\'";
String str2 = "엔터도 \n안 들어가요.\t \\못 믿겠으면 넣어봐.";
관건은 역슬래시로 보인다.
출처
- 인프런, 문자열 자료형과 기초 사용 (날짜)
'얄코의 제대로 파는 자바 > 섹션3' 카테고리의 다른 글
비트연산자 (0) | 2024.03.03 |
---|---|
타입 추론 (0) | 2024.03.03 |
문자열의 메소드들(하) (0) | 2024.03.01 |
문자열의 메서드들(상) (0) | 2024.02.28 |