본문 바로가기

Java

자바 String 클래스의 메소드

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
            
            
      }
}