Paradox Simulation

728x90
반응형

주로 Java를 공부할 때 String 객체를 많이 사용하게 된다.

하지만, String객체는 설계부터가 불변 객체로 설계되었기 때문에 한번 생성이 되면 내용을 바꿀 수 없는 단점이 있다. (물론 자바에서는 바꾸게 해 주지만,)

 

예를 들어서

String test = "test";

라는 코딩을 했다고 가정하자, test라는 문자열 인스턴스를 메모리에 생성하게 된다.

test라는 레퍼런스는 "test"라는 값을 가지고 있고, 단지 test는 "test"라는 문자열을 가리키는 레퍼런스가 된다.

(C 포인터 개념으로 생각하면 됨.)

 

하지만, 우리는 코딩할 때 다음과 같이 문자열을 늘리거나 추가를 한다.

test += "테스트";

그럼 출력 결과는 원하는 대로 나오는가?

 

정답은 yes다

 

출력 결과를 본다면 다음과 같다.

"test테스트"

 

그럼 어떻게 돌아가는 것일까? 

자바에서는 다음과 같이 처리하게 된다.

test = new StringBuffer(test).append("테스트").toString();

자동으로 변환해주기에 다음과 같이 나오는 것이지 원래는 StringBuffer를 이용하여 개발하는 게 맞다고 생각한다.

 

 

그래서 StringBuffer 자료형은 주로 문자열을 추가하거나 변경할 때 사용된다.

StringBuffer의 메서드들은 다음과 같다.

 

StringBuffer.append

public class StringBufferTest {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer(); // StringBuffer 객체 생성
        sb.append("test"); // test 문자열 추가
        sb.append(" + ");
        sb.append("추가 테스트");

        System.out.println(sb);
    }
}

 

append 메서드를 이용하여 StringBuffer로 선언한 sb 객체 안에 데이터를 넣는 과정이다.

 

StringBuffer는 다른 많은 기능들을 지원한다.

 

StringBuffer.insert

insert 객체는 다음과 같이 사용한다.

 

public class StringBufferTest {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer(); // StringBuffer 객체 생성
        sb.append("test"); // test 문자열 추가
        sb.append(" + ");
        sb.append("추가 테스트");

        sb.insert(3, "어디에");

        System.out.println(sb);
    }
}

보시다시피 "어디에"라는 글자는 tes 다음에 위치하게 되었다.

앞에 있는 index 값이 위치가 되며, 3번째 위치는 tes뒤에 추가하게 된다.

(만약 맨 앞에 붙이고 싶다면 0을 쓰면 된다)

 

StringBuffer.substring

public class StringBufferTest {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer(); // StringBuffer 객체 생성
        sb.append("test"); // test 문자열 추가
        sb.append(" + ");
        sb.append("추가 테스트");

        sb.insert(3, "어디에");

        System.out.println(sb.substring(0,4));
    }
}

다음은 StringBuffer의 substring (기존 String에도 있는 메서드)를 이용해봤다.

0부터 4자리까지 사용하는 거로 나와있다.

 

그럼 만약에 뒤에서 4자리를 자르고 싶을 땐 어떻게 해야 할까?

public class StringBufferTest {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer(); // StringBuffer 객체 생성
        sb.append("test"); // test 문자열 추가
        sb.append(" + ");
        sb.append("추가 테스트");

        sb.insert(3, "어디에");

        System.out.println(sb.substring(sb.length()-4));
    }
}

잘 보면 4자리가 나온 것을 알 수 있다.(맨 앞 공백까지)

 

또 다른 기능들을 살펴보자.

 

StringBuffer.charAt

public class StringBufferTest {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer(); // StringBuffer 객체 생성
        sb.append("test"); // test 문자열 추가
        sb.append(" + ");
        sb.append("추가 테스트");

        sb.insert(3, "어디에");

        System.out.println(sb.charAt(3));
    }
}

charAt 메서드는 해당 index 값에 위치한 글자를 "한 글자" 반환하는 메서드이다.

 

 

StringBuffer.reverse

public class StringBufferTest {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer(); // StringBuffer 객체 생성
        sb.append("test"); // test 문자열 추가
        sb.append(" + ");
        sb.append("추가 테스트");

        sb.insert(3, "어디에");

        System.out.println(sb.reverse());
    }
}

 

reverse 메서드의 경우 출력해야 하는 값을 전부 반대로 뒤집어서 출력해주는 기능이다.

 

StringBuffer.replace

public class StringBufferTest {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer(); // StringBuffer 객체 생성
        sb.append("test"); // test 문자열 추가
        sb.append(" + ");
        sb.append("추가 테스트");

        sb.insert(3, "어디에");
        sb.replace(0, 4, "&&");
        System.out.println(sb); 

    }
}

replace는 말 그대로 start index부터 end index까지 어떤 글자로 변환시켜주는 기능이다.

 

더 많은 기능이 있지만, 주로 사용하는 것들에 대해서 다루고, 나중에 더 필요한 기능이 있으면 추가적으로 정리하겠다.

 

마지막 메서드는 length()이다.

 

StringBuffer.length

String 때처럼 StringBuffer의 길이를 반환시켜주는 메서드이다.

public class StringBufferTest {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer(); // StringBuffer 객체 생성
        sb.append("test"); // test 문자열 추가
        sb.append(" + ");
        sb.append("추가 테스트");

        sb.insert(3, "어디에");
        System.out.println(sb);
        System.out.println(sb.length());

    }
}

 

728x90
반응형
250x250
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band