[1] 문자열(String)
String은 character들을 나열한 것이에요!
자바에서는 String을 native type으로 가지고 있지는 않지만,
standard Java library에서는 String이라는 class를 제공해주죠! (자바 친절해 /(@^0^@)/)
만약 darong이라는 변수에 문자열 "cute"를 저장하고 싶다면
다음과 같이 선언하면 끝!
String darong = "cute";
얘는 string literal로 선언한 거에요!
string literal은 바로 변수에 내용이 저장되는데, String Constant Pool이라는 메모리 장소에 저장된답니다!
String darong = new String("cute");
라고 저장할 수도 있어요!
이렇게 저장하는 방식은 String constant pool 메모리 공간에 저장되는 것이 아니라
정말 새로운 메모리 공간에 저장되는 거에요!
두 방식의 아주 중요한 차이점은
string literal 로 선언한 방법은 값이 같으면 같은 메모리 공간을 참조하지만,
new로 선언한 방법은 값이 같더라도 다른 메모리 공간을 참조한다는데에 있어요!
예를 들어
String darong = "cute";
String porong = "cute";
라고 한다면
이렇게 darong이라는 변수와 porong 이라는 변수가 같은 메모리 공간을 가리키지만
String porong = new String("cute");
String darong = new String("cute");
라고 선언하면
위와 같이 서로 다른 메모리 공간을 가리키게 됩니다!
String은 '+' 연산을 지원합니다!
String dog = "cute";
String darong = "is "+ dog;
라고 하면 dog라는 변수에는 문자열 "cute"가 저장되어있고,
darong 이라는 변수에는 "is cute"라는 문자열이 저장되게 돼요!
그렇다면 이런 경우는 어떨까요?
int age = 2;
String darong = "is "+ age + " years old";
결론부터 말하면 가능합니다!
age가 integer(정수형)이지만, String인 darong 에 저장될 때는
같은 문자열로 저장되어 darong이라는 변수에는 "is 2 years old"가 저장되어 있겠네요!
이제는 여러 유용한 String과 관련된 method를 봅시다!
1. join
join은 static method에요.
join 의 쓰임은 바로 예시를 보는게 좋을 것 같아요!
String darong = String.join(", ", "cute", "lovely", "handsome");
이라고 쓰면, darong이라는 변수에는
"cute, lovely, handsome" 이라는 문자열이 저장됩니다!
즉 join은 여러 문자열들을 주어진 구분자로 합쳐서 하나의 문자열로 만들어주는 애에요!
2. substring
요 친구 부터는 instance method에요!
substring은 어떤 string의 substring을 리턴해주는 아주 고마운 아이에요!
(C언어만 생각하면 울컥,,,)
String darong = "is cute";
String dog = darong.substring(3, 7);
이라고 쓰면 darong이라는 변수의 index 3부터 index 7전까지의 substring을
dog라는 변수에 저장하라는 의미가 돼요!
0 | 1 | 2 | 3 | 4 | 5 | 6 |
i | s | c | u | t | e |
index 3부터 index 7 전까지니까 index 6까지인 "cute"가 dog라는 변수에 저장되겠네요!
String darong = "is cute";
String dog = darong.substring(3);
이라고 작성하면 darong이라는 변수의 문자열 index 3 부터 끝까지를 dog라는 변수에 저장하라는 의미에요
따라서 dog라는 변수에는 "cute"가 저장되겠네요
3. split
split은 말 그대로 split 해주는 애인데, join의 반대라고 생각하면 돼요!
join은 여러 문자열을 주어진 구분자(delimiter)로 묶는 거니까
반대인 split은 주어진 구분자로 문자열을 잘라주는 역할을 합니당
문자열을 자른 후 String의 array에 저장해줘요!
예시를 볼까요?
String darong = "cute, lovely, handsome";
String[] dog = darong.split(", ");
// dog = ["cute", "lovely", "handsome" ]
darong이라는 변수에 담긴 문자열을 ", "로 나누라는 의미에요!
따라서 dog라는 배열에는 ["cute", "lovely", "handsome"]이 저장되겠네요
4. length
length는 String의 길이를 바로 알려줘요!
String darong = "is cute";
int darongLength = darong.length();
// darongLength = 7
위와 같이 작성하면 darongLength라는 변수에는 7이 저장됩니다!
5. equals
두 문자열이 서로 같은지 확인할 때 사용하는 애에요!
boolean 타입의 true 혹은 false를 리턴합니다!
두 문자열이 같은 내용을 가지면 true, 다르면 false를 리턴해요
그럼 이런 의문이 들 수 있죠!
"== 이거 쓰면 되지 않아?"
하지만 ==는 두 문자열이 같은 내용을 담고 있는지 확인하는게 아니라
정말 같은 곳(메모리 공간)을 가리키는지 판단해줘요
예를 들어
String darong = new String("cute");
String porong = new String("cute");
if(darong == porong) { System.out.println("darong and porong is same"); }
else { System.out.println("darong and porong is different"); }
와 같이 코드를 작성했다고 합시다!
우리가 그냥 생각하기엔 darong과 porong이라는 변수에 모두 문자열 "cute"가 담겨있으니까
darong == porong 은 true가 되서 if 문의 내용이 출력되겠지! 라고 예상하겠지만
JAVA는 darong 과 porong이 다른 공간을 가리키고 있으니 다르다고 판단하여
else문의 내용이 출력된답니다!
(가장 처음 설명한 String의 선언의 2가지 방식 생각나죠??)
그렇다면 String literal 방식으로
String darong = "cute";
String porong = "cute";
if(darong == porong) { System.out.println("darong and porong is same"); }
else { System.out.println("darong and porong is different"); }
라고 선언했다면 어떤 것이 출력될까요??
앞에서 String literal 방식의 경우 내용이 같으면 같은 공간을 참조한다고 했으니까
if 문의 내용이 출력되겠네요!
따라서 둘의 내용이 같은지 확인할 때는 equals를 사용해야해요!
String darong = new String("cute");
String porong = new String("cute");
if(darong.equals(porong)) { System.out.println("darong and porong is same"); }
else { System.out.println("darong and porong is different"); }
이러한 코드를 작성하면, darong과 porong의 내용은 같으니,
if문의 내용이 실행됩니다!
6. 기타 등등
boolean startsWith(String str) | str로 문자열이 시작되는지 판단 |
boolean endsWith(String str) | str로 문자열이 끝나는지 판단 |
boolean contains(CharSequence str) | 문자열이 str을 포함하고 있는지 판단 |
int indexOf(String str) | 문자열에서 str의 index를 리턴 |
int lastIndexOf(String str) | 문자열에서 반대 방향으로 탐색하여 str의 index를 리턴 |
int indexOf(String str, int fromindex) | 문자열의 fromindex부터 indexOf(String str) 수행 |
int lastIndexOf(String str, int fromIndex) | 문자열의 fromindex부터 lastIndexOf(String str) 수행 |
String replace(CharSequence oldStr, CharSequence newStr) | oldStr을 newStr으로 바꿈 |
String toUpperCase() | 문자열을 모두 대문자로 바꿔줌 |
String toLowerCase() | 문자열을 모두 소문자로 바꿔줌 |
++ 정수를 문자열로 어떻게 바꿀까요??
Integer.toString을 사용하면 됩니다!
int n = 123;
String str = Integer.toString(n);
str에는 문자열 "123"이 저장된답니다!
++ 그렇다면, 문자열을 정수로 어떻게 바꿀까요?
Integer.parseInt를 사용하면 된니다!
String str = "1234";
int n = Integer.parseInt(str);
이라고 하면 n에는 1234라는 정수가 저장됩니다!!
++ 그럼 이번엔 double <-> String 을 살펴보면,
double -> String 을 위해서는 Double.toString을 사용하면 되고,
String -> double 을 위해서는 Double.parseDouble 을 사용하면 됩니다!