"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가 등장했다.
'# 02 > Java' 카테고리의 다른 글
[윤성우 열혈자바] 12-1. 콘솔 출력 (0) | 2019.10.21 |
---|---|
[Java] String과 StringBuffer, StringBuilder의 차이점 (0) | 2019.10.21 |
[윤성우의 열혈자바] 11-2. String 클래스 (0) | 2019.10.21 |
[윤성우의 열혈자바] 11-1. 메소드의 오버로딩 (0) | 2019.10.21 |
[윤성우의 열혈자바] 10-4. 또 다른 용도의 static 선언 (0) | 2019.10.21 |