JAVA를 자바

[1] 문자열(String)

지식보부상님 2020. 12. 28. 18:44

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 을 사용하면 됩니다!