본문 바로가기
프로그래밍/자바

자바 문법 - 문자열(String 객체) 다루기

by pentode 2019. 8. 11.

자바 문자열은 객체이고 문자열 리터럴은 큰 따옴표로 묶어 표시합니다.

 

String text = "추석에 배를 먹습니다.";

 

문자열 리터럴도 객체이므로 바로 메소드를 호출할 수 있습니다.

 

int length = "추석에는 배".length();

 

1. 문자열 연결하기

 

자바 문자열을 연결하는데는 + 연산자를 사용합니다.

 

String h = "Hello ";

String j = "Java!";

String text = h + j;

System.out.println(text);

결과)
Hello Java!

 

자바에서 문자열에 연산을 사용하는데 있어서 주의해야 할 점이 있는데, 자바 문자열은 불변(immutable)이라는 점입니다. 문자열에 연산을 가하면 현재 문자열을 변경되지 않고 변경된 새 문자열이 만들어져서 반환됩니다.

 

String h = "Hello Java!";

String t = h.substring(0, 5);

System.out.println(h);

System.out.println(t);


결과)
Hello Java!
Hello

 

많은 문자열을 연결할 경우에는 성능문제로 인해 + 연산자 보다는 StringBuilder 객체를 사용합니다. 이전에는 StringBuffer 객체를 사용했었는데, JDK 1.5 부터 StringBuilder 객체가 나와서 이것을 사용합니다.

 

StringBuffer와 StringBuilder 객체의 차이점은 StringBuffer 객체의 메소드는 synchronized 되어 있어서 다중 쓰레드에서 안전하고, StringBuilder는 synchronized 되어 있지 않아서 다중 쓰레드 환경에서는 사용할 수 없지만 싱글 쓰레드 환경에서 동기화 오버헤드가 없으므로 더 빠르게 동작합니다. 그래서 대부분의 경우 StringBuilder를 사용합니다.

 

StringBuilder sb = new StringBuilder();

sb.append("Hello ")
  .append("Java!");


System.out.println(sb.toString());


결과)
Hello Java!

 

 

2. 문자열 비교하기

 

String 객체를 비교할 때는 equals() 메소드를 사용합니다. 기본 타입이 같은지 비교할때 사용되는 == 연산자를 사용하여 객체를 비교하게 되면 객체가 존재하는 메모리상의 주소가 같은지를 비교하게 되어서 잘못된 결과를 보게 될 것입니다. 객체인 String 을 비교할 때는 equals() 메소드를 사용합니다.

 

String h = "Hello ";

String j = "Java!";


if(h.equals(j)) {
    System.out.println("h와 j는 같은 내용을 가지는 문자열 입니다.");
}

 

문자열을 특정 문자열 리터럴과 비교할 경우가 있습니다. 이 경우 "".equals() 처럼 비교하고자 하는 리터럴의 메소도를 사용하는것이 안전합니다.

 

 

아래처럼 사용할 경우 h가 null이면 NullPointerException이 발생할 수 있습니다.

 

if(h.equals("Hello")) {
    ...
}

 

아래의 경우에는 h가 null일 경우 false 를 반환합니다.

 

if("Hello".equals(h)) {
    ...
}

 

 

문자열을 사전순으로 정렬했을때의 우선 순위를 비교하려면 compareTo() 메소드를 사용합니다.

 

String year = "2018"

int result = "2019".compareTo(year);


if(result > 0) {
    // 현재 년도 보다 큽니다.
} else if(result == 0) {
    // 현재 년도와 같습니다.
} else if(result < 0) {
    // 현재 년도 보다 작습니다.
}

 

 

3. 자주 사용하는 문자열 메소드

 

- char charAt(int index)

  지정된 인덱스의 한 문자를 반환합니다.

 

- int compareTo(String anotherString)

  두 문자열의 사전적 우선 순위 비교 입니다.

 

- int compareToIgnoreCase(String str)

  대소문자를 구분하지 않는 사전적 비교 입니다.

 

- boolean contains(CharSequence s)

  문자열을 포함하고 있는지 확인합니다.

 

- boolean endsWith(String suffix)

  문자열의 끝이 인자로 주어진 문자열인지 확인합니다.

 

- boolean equals(Object anObject)

  같은 내용의 문자열인지 비교합니다.

 

- boolean equalsIgnoreCase(String anotherString)

  대소문자를 구분하지 않고 비교합니다.

 

- byte[] getBytes()

  플랫폼 기본 캐릭터셋으로 인코딩된 바이트 배열을 링크합니다.

 

- byte[] getBytes(String charsetName)

  인자로 주어인 캐릭터 셋으로 인코딩된 바이트 배열을 반환합니다. 캐릭터셋을 변환하기 위해서 주로 사용되어 집니다.

 

- int indexOf(int ch)

  인자로 주어진 문자가 있는 위치를 반환합니다. 없으면 음수를 반환합니다.

 

- boolean isEmpty()

  빈문자열 인지 확인합니다.

 

- int lastIndexOf(int ch)

  인자로 주어진 문자가 마지막으로 나타난 위치를 반환합니다. 없으면 음수를 반환합니다.

 

- int length()

  문자열의 길이를 반환합니다.

 

- boolean matches(String regex)

  인자로 주어진 정규식에 매치되는지 확인합니다.

 

- String replace(char oldChar, char newChar)

  문자열에서 첫번째 인자의 문자를 두번째 인자의 문자로 바꿉니다.

 

- String replace(CharSequence target, CharSequence replacement)

  문자열을 바꿉니다.

 

- String replaceAll(String regex, String replacement)

  정규식을 사용하여 매치되는 문자열을 바꿉니다.

 

- String[] split(String regex)

  정규식에 매치되는 부분을 구분자로 문자열을 분할 합니다.

 

- String[] split(String regex, int limit)

  문자열 분할시 두번째 인자로 마지막 빈 요소 처리 및 분할할 갯수를 지정합니다.

 

- boolean startsWith(String prefix)

  인자로 주어진 문자열로 시작하는지 확인합니다.

 

- String substring(int beginIndex)

  문자열에서 인자로 주어인 인덱스 이후의 문자열을 추출합니다.

 

- String substring(int beginIndex, int endIndex)

  인자로 주어진 인덱스 사이의 문자열을 반환합니다.

 

- String toLowerCase()

  소문자로 변경합니다.

 

- String toUpperCase()

  대문자로 변경합니다.

 

- String trim()

  문자열 앞, 뒤의 whitespace를 제거합니다.

 

- static String valueOf(int i)

  인자로 주어진 타를 타입의 데이터를 문자열로 변경하는 정적 메소드 입니다. 모든 원시 타입에 대해 오버로딩된 메소드가 있습니다.

 

 

String 객체의 전체 메소드는 다음을 참조 하세요.

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html

 

반응형