String 클래스의 메소드
String은 원시타입(primitive type) 처럼 쓰이지만 참조형 클래스객체다. 그리고 불변immutable 객체다.
이 말이 무슨 말인가 하면 자바에서는 String 문자열끼리의 + 연산으로 문자열을 합칠 수 있고 내가 선언한 변수 안에서 연산이 이루어지는 것 같지만, 사실은
String a = "aaa";
String 타입 변수 a= "aaa"에 +연산으로
String a += "bbb";
+"bbb"가 이루어졌다면, 이미 존재하는 a에 bbb가 붙어 a = aaabbb가 되는 것이 아니라
새롭게 객체를 생성하는 구조를 가지고 있다.
String 타입을 비교할때 == 연산자를 쓰지 않고 .equals()를 쓰는 이유가 그것이다.
equals():
다음과 같은 문자열들을 비교해보겠다.
String aa = "hello";
String bb = "world";
String cc = "hello";
System.out.println(aa==bb); //false
System.out.println(aa==cc); //true
예상과 같은 결과가 나온다.
이런 경우는 어떨까?
String bb = "world";
String dd = new String("world");
System.out.println(bb==dd); //false
System.out.println(bb.equals(dd)); //true
단순비교(==)로는 false가 equals()로는 true가 반환되는 것을 볼 수 있다. 같은 값이지만 서로 다른 객체이기 때문이다.
문자열 ee를 'hell'로 선언하고, o를 덧붙여 hello로 만들어 비교해보겠다.
String aa = "hello";
String ee = "hell";
ee += "o";
System.out.println(ee==aa); //false
System.out.println(ee.equals(aa)); //true
분명히 같은 문자열이고 String으로 선언했는데도 == 연산으로는 false가 리턴되는 것을 볼 수 있다.
다른 메소드들도 알아보자.
String a = "Hello world ";
.length() :
문자열의 길이를 리턴한다. 반환형은 int형이다.
System.out.println("length >>>>>>>>>>>>>> "+a.length());
length >>>>>>>>>>>>>> 12
.isEmpty() :
해당 변수가 비었는지 아닌지를 Boolean으로 리턴해준다.
System.out.println("isEmpty >>>>>>>>>>>>> "+a.isEmpty());
isEmpty >>>>>>>>>>>>> false
String을 미리 선언할때 자주 쓰이는 방법인 String a = ""; 를 사용후 .isEmpty()를 사용하면 true가 리턴될 것이다.
.indexOf() :
해당 문자가 시작되는 인덱스를 int로 리턴해준다.
해당 문자가 존재하지 않으면 -1을 리턴한다.
System.out.println("indexOf >>>>>>>>>>>>> "+a.indexOf("world"));
indexOf >>>>>>>>>>>>> 6
.substring(int beginindex, (int endindex)):
파이썬의 슬라이싱이라고 생각하면 쉽다.
인덱스는 배열과 같이 0부터 시작하며 두번째 인자 -1 까지 출력해준다.
System.out.println("substring(num) >>>>>> "+a.substring(0, 4));
substring(num) >>>>>> Hell
두번째 인자를 입력하지 않으면 첫번째 인자부터 문자열 끝까지 리턴한다.
System.out.println("substring(num1,num2)> "+a.substring(6));
substring(num1,num2)> world
.replaceAll(String regex, String replacement) :
문자열을 교체해준다.
.replace(char oldchar, char newchar)과 비슷하지만, replaceAll()은
testString .replaceAll("a.?c"."d");
와 같은 정규식 표현도 가능하다는 차이가 있다.
System.out.println("replaceAll >>>>>>>>>> "+a.replaceAll("world", "Java"));
replaceAll >>>>>>>>>> Hello Java
.toUpperCase() :
해당 문자열을 전부 대문자로 교체해 준다.
System.out.println("toUpperCase >>>>>>>>> "+a.toUpperCase());
toUpperCase >>>>>>>>> HELLO WORLD
.toLowerCase() :
반대로 해당 문자열을 전부 소문자로 교체해 준다.
System.out.println("toLowerCase >>>>>>>>> "+a.toLowerCase());
toLowerCase >>>>>>>>> hello world
.trim():
문자열 앞뒤에 있는 공백을 제거해준다. (중간은 제외)
값을 입력받는다거나 할 때 공백이 있으면 오류가 나는 경우가 있는데 실수를 사전에 방지해줄 수 있다.
System.out.println("trim >>>>>>>>>>>>>>>> "+a.trim());
.charAt(int index) :
해당 위치의 문자 하나를 char형으로 반환한다.
보통은 반복문과 함께 쓰이는 경우가 많다.
System.out.println("charAt >>>>>>>>>>>>>> "+a.charAt(0));
charAt >>>>>>>>>>>>>> H
.valueOf() :
기본적으로 다른 자료형에 있는 toString()과 같지 않냐고 하겠지만, valueOf()는 nullPointer 오류가 없다.
기본자료형이라면 모두 인자로 받을 수 있다.
System.out.println("valueOf >>>>>>>>>>>>> "+String.valueOf(a));
valueOf >>>>>>>>>>>>> Hello world
.toCharArray() :
문자를 한 글자씩 찢어 Char배열로 반환한다.
사용빈도가 굉장히 높은 느낌.
char[] array = a.toCharArray();
System.out.println(Arrays.toString(array));
[H, e, l, l, o, , w, o, r, l, d, ]
.getBytes() :
byte 배열로 반환한다. 다만 한글은 한글자에 2byte이기 때문에 3개->6byte로 반환된다.
byte[] array2 = a.getBytes();
=System.out.println(Arrays.toString(array2));
[72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 32]
.split(String regex) :
문자열을 파라미터 기준으로 찢어 String형 배열로 반환해준다.
String str2 = "apple,banana,orange";
String[] array1 = str2.split(",");
System.out.println(Arrays.toString(array1));
[apple, banana, orange]
다음은 포스팅에 사용된 코드 전문이다.
String_.java
import java.util.Arrays;
public class String_ {
public static void main(String[] args) {
String a = "Hello world ";
System.out.println("length >>>>>>>>>>>>>> "+a.length()); // 길이
System.out.println("isEmpty >>>>>>>>>>>>> "+a.isEmpty()); // 비었는지 아닌지 boolean으로
System.out.println("indexOf >>>>>>>>>>>>> "+a.indexOf("world")); // world가 시작되는 인덱스 반환 : -1이면 없다
System.out.println("substring(num) >>>>>> "+a.substring(0, 4)); // 0부터 '3'까지 출력하겠다
System.out.println("substring(num1,num2)> "+a.substring(6)); // 6부터 끝까지 출력하겠다
System.out.println("replaceAll >>>>>>>>>> "+a.replaceAll("world", "Java")); // world를 Java 로 교체하겠다
System.out.println("toUpperCase >>>>>>>>> "+a.toUpperCase()); // 모두 대문자로 교체하겠다
System.out.println("toLowerCase >>>>>>>>> "+a.toLowerCase()); // 모두 소문자로 교체하겠다
System.out.println("charAt >>>>>>>>>>>>>> "+a.charAt(0)); // 해당위치의 문자 하나를 반환하겠다 (char)
System.out.println("valueOf >>>>>>>>>>>>> "+String.valueOf(a)); //toString과 같지만 null포인터오류가 없다. (기본자료형 모두가능)
System.out.println("trim >>>>>>>>>>>>>>>> "+a.trim()); //문자열 앞뒤에 있는 공백을 제거하겠다(중간제외)
char[] array = a.toCharArray(); // 문자를 한글자씩 찢어서 char 배열로 반환한다
System.out.println(Arrays.toString(array));
byte[] array2 = a.getBytes(); //byte로 반환한다. 다만 한글은 한글자에 2byte이기 때문에 3개->6byte로 반환된다.
System.out.println(Arrays.toString(array2));
String str2 = "apple,banana,orange";
String[] array1 = str2.split(","); // ,를 기준으로 문자열을 잘라 배열에 넣겠다
System.out.println(Arrays.toString(array1));
String aa = "hello";
String bb = "world";
String cc = "hello";
String dd = new String("world");
String ee = "hell";
ee += "o";
System.out.println(aa==bb); //false
System.out.println(aa==cc); //true
System.out.println(bb==dd); //false
System.out.println(bb.equals(dd)); //true
System.out.println(ee==aa); //false
System.out.println(ee.equals(aa)); //true
}
}