String VS StringBuffer/StringBuilder

String과 StrungBuffer/StrungBuilder 클래스의 가장 큰 차이점은 String은 불변의 속성을 갖는다는 점이다.
그렇기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용해 주면 좋은 성능을 기대할 수 있다. 그러나 문자열 추가, 수정, 삭제 등의 연산이 빈번하게 발생하는 알고리즘에 String클래스를 사용하면 힙메모리에 많은 가비지가 생성되어 힙메모리 부족으로 어플리케이션 성능에 치명적인 영향을 끼치게 된다.

이를 해결하기 위해 가변성을 가지는 StringBuffer/StringBuilder클래스를 도입했다.

StringBuffer VS StringBuilder

이 두클래스의 큰 차이점은 동기화의 유무이다. StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다는 점이다. 참고로 String도 불변성을 가지기 때문에 마찬가지로 멀티쓰레드 환경에서의 안정성을 가지고 있다.

반대로 StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer보다 뛰어나다.

Comment and share

String Class

String 객체가 하나 생성되면, 그 값은 길어지거나 줄어들 수 없으며 그 문자들 중 어떤 것도 바뀔 수 없다.
그래서 String 객체는 변경불능이라고 한다.

String클래스의 자주 사용하는 함수이다.
|함수|반환형|설명
|—|—|—
|CharAt(int index)|char|index로 지정된 첨자 위치에 있는 문자를 반환한다.
|compareTo(String str)|int|이 String이 String str보다 사전적 순서에서 앞서면 음수값, 같으면 0값, 뒤에 있으면 0값이다.
|Concat(String str)|String|이 String과 str을 접합하여 구성되는 새로운 String을 반환한다.
|equals(String str)|boolean|이 String이 str과 같은 문자열이면 (대소문자 구분) True, 그렇지 않으면 False 반환
|equalslgnoreCase(String str)|boolean|이 String이 str과 같은 문자열이면(대소문자 미 구분) True, 그렇지 않으면 False 반환
|length()|int|이 String의 문자 개수를 반환한다.
|replace(char oldChar, char newChar)|String|String에 나타나는 oldChar를 모두 new Char로 변경한다.
|substring(int offset, int endIndex)|String|이 String의 offset 위치에서부터 endIndex-1까지에 걸친 문자열을 반환한다.
|toLowerCase()|String|모든 대문자를 소문자로 변환한다.
|toUpperCase()|String|모든 소문자를 대문자로 변환한다.

예제

public class StringClass {
    
    public static void main(String[] args){
        
        String text = "First String V";
        String concat, upperCase, replace, subString;
        
        System.out.println("기본 String : "+ text);
        System.out.println("기본 String 길이 : "+text.length());    // 문자열 길이 출력
        
        concat = text.concat(", Second String V");    // 문자열 연결
        
        upperCase = concat.toUpperCase();        // 문자열 대문자로 변환
        
        replace = upperCase.replace('V', 'K');    //  문자 V를 K로 변환
        
        subString = replace.substring(3, 10);    // 3~9 문자열 잘라내기
        
        
        System.out.println("Concat String : " + concat);
        System.out.println("upperCase String : " + upperCase);
        System.out.println("replace String : " + replace);
        System.out.println("subString String : " + subString);
        
        
    }

}

System.out.println(“기본 String 길이 : “+text.length()); // 문자열 길이 출력

text인 “First String V” 의 문자열 길이를 반환한다.

-> 14

concat = text.concat(“, Second String V”); // 문자열 연결

text인 “First String V” 뒤에 concat 메소드로 “, Second String V” 를 연결했다.

-> First String V, Second String V

upperCase = concat.toUpperCase(); // 문자열 대문자로 변환

concat인 “First String V, Second String V” 의 문자열을 대문자로 변환한다

-> FIRST STRING V, SECOND STRING V

replace = upperCase.replace(‘V’, ‘K’); // 문자 V를 K로 변환

upperCase인 “FIRST STRING V, SECOND STRING V” 문자열 중 ‘V’ 문자를 ‘K’ 문자로 변환 한다.

-> FIRST STRING K, SECOND STRING K

subString = replace.substring(3, 10); // 3~9 문자열 잘라내기

replace 인 “FIRST STRING K, SECOND STRING K” 문자열의 3번째 부터 9번째 문자열까지 잘라낸다 (0부터 시작)

-> ST STRI

Comment and share

char, String

자바에서는 char배열이 아닌 String클래슬를 이용해서 문자열을 처리하는 이유는 무엇일까?
String클래스는 char배열에 기능(메서드)을 추가한 것이다.
char배열과 String클래스의 한 가지 중요한 차이가 있는데, String객체(문자열)는 읽을 수만 있을 뿐 내용을 변경할 수 없다는 것이다.

public static void main(String[] args) {
    
    String str = "java";
    str = "8";
    System.out.println(str); // java8

    }

}

위처럼 String값이 바뀌는 것 같지만 새로운 문자열이 생겨 str이 새로운 주소값을 가르키는 것이다.

그리고 String문자열에서 하나의 문자만 꺼내오고 싶을 때 charAt이라는 메소드를 사용한다.
배열에서 “배열이름[index]”로 index에 위치한 값을 가져오는 것과 같다고 생각하면 된다.

public class Test {
public static void main(String[] args) {
    String str = "Hello";
    char ch = str.charAt(1);  // e
    }
}

Comment and share

  • page 1 of 1

Hyeon Soo Ahn

author.bio


author.job