본문 바로가기

# 02/Java

[윤성우의 열혈자바] 11-3. String 클래스의 메소드

반응형

"ABC".length();


-> "ABC"에 해당하는 인스턴스가 먼저 생성되고 참조값이 반환된 다음 그 참조값을 기반으로 인스턴스에 접근하여      length 메소드 호출하는 방식임!!








문자열 연결시키기


class StringConcat {

public static void main( String[] args ) {

String st1 = "Coffee";

String st2 = "Bread";


String st3 = st1.concat(st2);

System.out.println(st3);


String st4 = "Fresh".concat(st3);

System.out.println(st4);

}

}








문자열의 일부 추출


String str = "abcdefg";


str.substring(2);


// 인덱스 2 이후의 내용으로 이뤄진 문자열 "cdefg" 반환


String str = "abcdefg";


str.substring(2, 4);


// 인덱스 2 ~ 3 에 위치한 내용의 문자열 반환








문자열의 내용 비교


public static void main (String[] args) {

String st1 = "Lexicographically";

String st2 = "lexicographically";

int cmp;


if ( st1.equals(st2))                            // 내용 비교. 단, 소문자, 대문자 구분있음!!

System.out.println ( "두 문자열은 같습니다." );

else

System.out.println( "두 문자열은 다릅니다." );


cmp = st1.compareTo(st2);                // 사전의 위치 확인!!


if ( cmp == 0 )

System.out.println( "두 문자열은 일치합니다." );

else if ( cmp < 0 )

System.out.println( "사전의 앞에 위치하는 문자 : " + st1 );

else

System.out.println( "사전의 앞에 위치하는 문자 : " + st2 );



if ( st1.compareToIgnoreCase (st2) == 0 )            // 사전 위치 비교인데 대문자 소문자 구분안함!!

System.out.println( "두 문자열은 같습니다." );

else

System.out.println( "두 문자열은 다릅니다." );

}


->  두 문자열은 다릅니다.

사전의 앞에 위치하는 문자 : Lexicographically

두 문자열은 같습니다.


(== 참조 값 비교하는 것임!!)








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


String se = String.valueOf(e);








문자열 대상 + 연산과 += 연산


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


-> 컴파일러에 의한 자동 변환     System.out.println( "funny".concat("camp") );




String str = "funny";

str += "camp";        // str = str + "camp"


->  str = str.concat( "camp" )








문자열 결합의 최적화를 하지 않을 경우


String birth = "<양>" + 7 + '.' + 16;


-> 너무 과도한 String 인스턴스 생성으로 이어진다. 따라서, 컴파일러는 이렇게 변환하지 않는다.


String birth = "<양>".concat(String.valueOf(7)).concat(String.valueOf('.')).concat(String.valueOf(16));


이 문장에서 중간에 새로 생성하는 String 인스턴스의 수는? 많다!!!!!! 6개?정도임








문자열 결합의 최적화를 진행 할 경우


String birth = "<양>" + 7 + '.' + 16;


-> 최종 결과물에 대한 인스턴스 생성 이외에 중간에 인스턴스 생성하지 않는다. 따라서 컴파일러는 이 방식으로 변환을 진행한다.


String birth = (new StringBuilder("<양>").append(7).append('.').append(16)).toString();


이 문장에서 중간에 새로 생성되는 String 인스터스의 수는? 딱 한 개!!!!! StringBuilder, toString(), <양> 이렇게 인스턴스 생성됨!!



StringBuilder append (String str)

StringBuilder append (double d)

StringBuilder append (int i)

StringBuilder append (char c)


. . . 등등 다양하게 오버로딩 그리고 반환하는 값은 호출된 메소드가 속한 인스턴스의 참조 값








StringBuilder


public static void main (String[] args) {

// 문자열 "123"이 저장된 인스턴스의 생성

StringBuilder stbuf = new StringBuilder( "123" );


stbuf.append(45678);                        // 문자열 덧붙이기

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


stbuf.delete(0, 2);                            // 문자열 일부 삭제

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


stbuf.replace(0, 3, "AB");                    // 문자열 일부 교체

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


stbuf.reverse();                                // 문자열 내용 뒤집기

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


String sub = stbuf.substring(2, 4);        // 일부만 문자열로 반환

System.out.println(sub);

}


-> 12345678

345678

AB678

876BA

6B








StringBuffer


StringBuffer와 StringBuilder는 기능적으로 완전히 동일하다. 즉 다음 세 가지가 일치한다.


- 생성자를 포함한 메서드의 수

- 메소드의 기능

- 메소드의 이름과 매개변수의 선언



BUT!!


- StringBuffer는 쓰레드에 안전하다.

- 따라서 쓰레드 안전성이 불필요한 상황에서 StringBuffer를 사용하면 성능의 저하만 유발하게 된다.

- 그래서 StringBuilder가 등장하게 되었다.



-> StringBuffer가 먼저 나왔고 쓰레드에 안전하다. 하지만 쓰레드 안전성이 불필요한 상황에서 성능의 저하만 유발하게 되어 StringBuilder가 등장했다.




반응형