자바/자바 입문 공부일지

자바 기초 공부 일지 17. String 클래스의 메소드, .concat(), equals, compareTo, compareToIgnoreCase, valueOf 함수 (수정중)

Tomitom 2022. 10. 27. 17:51
반응형

 

 

●  문자열 연결시키기 

 

1. concat 함수 

문자열을 연결 시킬 때 .concat 함수가 있습니다. 

기존에는 + 연산자로 문자열을 합쳤었지만, concat 은 + 와 동작하는 방식이 다릅니다. 

+ 는 정수, 실수, 문자열을 append 식으로 더해준다고 보시면 됩니다. 

concat 함수는 합친 문자열을 String 으로 변환시켜서 합치는데, 문자열을 추가할 때마다 새로운 인스턴스를 생성한다는 면에서 차이가 있습니다. (성능이나 속도 면에서도 좋지 않습니다..) 

하단의 예제를 먼저 보겠습니다. 

 

package day14;


public class Test06 {

    public static void main(String[] args) {
   
         String st1 = "Thrill";     // 사랑은 스릴...
                  String st2 = "Shock";     // 쇼크...
               
                  String st3 = st1.concat(st2);
                  System.out.println(st3);
               
                  String st4 = "Suspense ".concat(st3);     // 서스펜스....
                  System.out.println(st4)
    }

}
 
사랑은 스릴 쇼크 서스펜스

 

 

이렇듯  .concat() 은 문장 열 뒤에 문자열을 붙이고 그것에 대한 새로운 인스턴스를 생성하는 것으로 동작합니다. 
 

●  문자열의 일부 추출(슬라이싱) 

 

파이썬에서 배웠던 슬라이싱과 동일한 역할을 합니다. 

출처 : 윤성우의 열혈 자바 프로그램

 

 

●  문자열의 비교 (등가 연산자의 비교는 같은 메모리인지를 비교하는 것이며,

문자열의 내용을 비교하기 위해서는 equals 를 사용합니다.) 

 

   if(st1.equals(st2))
      System.out.println("두 문자열은 같습니다.");
   else
      System.out.println("두 문자열은 다릅니다.");
   

equals -> 같으면 ture, 다르면 false

 

 


   cmp = st1.compareTo(st2);
   if(cmp == 0)
      System.out.println("두 문자열은 일치합니다.");
   else if (cmp < 0)
      System.out.println("사전의 앞에 위치하는 문자: " + st1);
   else
      System.out.println("사전의 앞에 위치하는 문자: " + st2);
   

compareTo -> 같을 경우에는 0인데, 다를 경우에는 0이 아닌 숫자가 나옵니다. 

앞에 있는 것이 사전 편찬 순서로 앞이라면 - 1 뒤에 있는 것이 사전 편찬 순서로 뒤라면 1 입니다.

 

 

   if(st1.compareToIgnoreCase(st2) == 0)
      System.out.println("두 문자열은 같습니다.");
   else
      System.out.println("두 문자열은 다릅니다.");
}

 

compareToIgnoreCase -> 대소문자 구별 없이 써있는 알파벳만으로 비교를 합니다. 같으면 true, 다르면 false.

 

● 기본 자료형의 값을 문자열로 바꾸기 

 

double e = 2.718281;
String se = String.valueOf(e);

 

static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(double d)
static String valueOf(float f)
static String valueOf(int i)
static String valueOf(long l)

 

예를 들어 숫자 1을 valueOf 하게 되면 문자열로 1이 됩니다.

 

System.out.println("funny" + "camp");

(=) 같은 의미입니다. 
System.out.println("funny".concat("camp"));

String str = "age: " + 17; -> String str = "age: ".concat(17);
이렇게는 불가능합니다. 17은 정수이기 때문에 같은 문자열이 아니기에 이어질 수 없습니다. 
이럴 때에는 
String str = "age: " + 17; -> String str = "age: ".concat(String.valueOf(17));

valueOf 로 문자열로 변환을 시켜주어야 이어붙이기가 가능합니다. 

 

 

● .concat 함수를 사용해서 메소드 뒤에 메소드를 붙여서 문자열을 이어서 호출할 수 있습니다. 


String str = "AB".concat("CD").concat("EF");
   → String str = ("AB".concat("CD")).concat("EF");
   → String str = "ABCD".concat("EF");
   → String str = "ABCDEF";

 

메소드 호출문 뒤에 메소드 호출을 또 이어서 쓰는 방식을 체이닝chaining 이라고 합니다. 

 

● 문자열 결합 최적화 

 

 

String  클래스를 이용해서 문자열 결합을 할 때, 문자열 인스턴스가 계속해서 생겨나는 것은 바람직한 현상이 아닙니다. 

따라서 이 경우에는 문자열 인스턴스 생성을 최소화해가며 문자열을 결합할 수 있도록 StringBuilder 클래스를 사용하는 것이 좋습니다. 

StringBuilder 는 동일한 메모리에 있는 객체를 수정하면서 사용하기 때문에 변하기 쉬운 mutable한  인스턴스를 만듭니다. 

 

 

 

반응형