본문 바로가기
Programming/Java

[자바/Java] 문자열1 - String

by 코딩하는 랄로 2023. 10. 8.
728x90

문자열(String)

자바로 프로그래밍을 하다보면 primitive type, reference type 등 많은 기본 타입의 변수와 참조 타입의 변수를 선언하고 사용을 한다.

 

자바에서는 문자열, 즉 String 타입의 변수는 기본 타입인 아닌 String 클래스를 통해 객체를 생성하여 사용하는 참조 타입이다. (처음 접하는 분들은 모를 수 있는..)

 

그렇기 때문에 String 타입으로 선언된 객체는 String 클래스에 선언된 수많은 유용한 메소드를 사용할 수 있기 때문에 자바에서는 문자열 타입의 객체를 많이 사용한다.

 

이번 글에서는 String 클래스에 존재하는 유용한 메소드 들에 대해서 알아보겠다.

 

 

 

문자열 선언

자바에서 클래스를 통해 객체를 생성할 때 new 키워드를 사용하여 생성하지만 String 클래스 타입으로 객체를 생성할 때는 기본 타입의 변수를 생성하는 것처럼 생성하는 것이 가능하다.

 

String 변수명 = "Hello, World";

 

물론, new 키워드를 통한 객체 생성도 가능하다.

 

String 변수명 = new String("Hello, World");

 

위의 두 가지 방식대로 각자 선언한 두 변수는 모두 String 클래스의 메소드를 사용할 수 있다. 그렇다면, 위의 두가지 방식대로 선언한 변수는 어떠한 차이점이 있을까? 

 

바로 참조하는 방식에서의 차이이다. 아래의 예제를 살펴보자.

//String literal
String str1 = "Hello";   //바로 대입하는 문자열을 literal이라고 한다.
String str2 = "Hello";

System.out.println(str1 == str2); // 주소 비교

//new String()
Stirng str3 = new String("Hello");
Stirng str4 = new String("Hello");

System.out.println(str3 == str4); // 주소 비교

String 변수의 문자열을 기본 타입처럼 선언하여 줄 때에는 객체를 참조하기 전에 해당 문자열이 메모리에 이미 존재하면 해당 주소를 참조하게 된다.

 

반면에 new 키워드를 통해 객체를 생성하여 주면, 같은 값을 가지고 있더라도 무조건 메모리에 새로운 주소를 참조하게 되는 것이다.

 

그렇기 때문에 첫번째 비교에서는(str1 == str2)에서는 true가, 두번째 비교에서는 false가 나온다.(문자열을 비교하기 위해서는 String 클래스의 메소드를 사용하여야 한다.)

 

여기서 재미있는 점은, String literal 방식에서 문자열 연산을 통해 나온 리터럴 값도 존재하면 해당 주소를 반환한다는 것이다.

String str1 = "Hello";
String str2 = "He";
String str3 = "llo";

String str4 = str2 + str3;

System.out.println(str1 == str4);   //true

 

 

 

String 클래스의 여러 메소드

String 클래스에는 유용하게 사용할 수 있는 여러 메소드들이 있다. 그 중에 몇가지 유용한 메소드들을 다음과 같다.(많이 사용하는...)

 

  • str1.concat(str2)   :   str2의 문자열을 str1에 이어붙이 새로운 문자열을 반환
  • str.length()   :   문자열의 길이를 반환
  • str.charAt(int index)   :    해당 index의 문자(char)를 반환
  • str.toCharArray()   :   해당 문자열을 문자(char) 타입으로 나눈 배열을 반환
  • str.indexOf(String(char) c)  :   문자열 안에서 특정 문자(char) 혹은 문자열의 위치를 반환
  • str.toUpperCase()   :   문자열의 문자를 모두 대문자로 변환한 문자열을 반환
  • str.toLowerCase()   :  문자열의 문자를 모두 소문자로 변환한 문자열을 반환
  • str.startWith(String prefix)   :   문자열이 주어진 prefix문자열로 시작하는지 여부 true/false 반환
  • str.endWith(String prefix)   :   문자열이 주어진 prefix문자열로 끝나는지 여부 true/false 반환
  • str.split(Stirng regex)   :   문자열을 주어진 문자열로 쪼개어 String[] 배열을 반환
  • String.join(delemeter, elements...)   :   해당 elemets들을 주어지 delemeter를 구분자로 문자열을 합친 문자열을 반환
  • str.subString(int index)   :   index지점을 포함한 이 후의 문자열을 반환
  • str.subString(startIndex, endIndex)   :   startIndex ~ endIndex 바로 전까지의 문자열을 반환
  • str.strip()   :   좌우 공백 제거
  • str.stripLeading()   :   좌측 공백 제거
  • str.stripTrailing()   :   우측 공백 제거
  • str.replace(target, replacement)   :   target을 모두 replacement로 치환한 문자열을 반환
  • str1.equals(str2)   :   문자열 비교
  • str1.equalsIgnoreCase(str2)   :   대소문자 구분없이 문자열 비교

 

이 외에도 여러 메소드들이 있다.

 

 

Immutalbe class : String

 

String 클래스의 메소드를 사용하기 전에 한가지 주의하여할 점이 있는 데, 바로 String은 변경불가(immutable)하다는 것이다.

 

즉, 메소드를 수행했다고 해서 기존의 문자열이 변경되는 것이 아닌 새로운 메모리 공간에 값을 할당하는 것이고, 이 공간을 반환하는 것이다.

 

그렇기 때문에  이 값을 새로운 문자열 변수 또는 기존의 문자열 변수가 참조하는 과정이 없다면 해당 메모리는 garbage collection에 의해 없어진다.

String str1 = "Hello, ";

str1.concat("Java");

System.out.println(str1);  // Hello,


// concat 메소드가 반환한 문자열을 다시 str1이 참조하도록 해야함
str1 = str1.concat("Java");

System.out.println(str1);  // Hello, Java

 

728x90