ToBe끝판왕

[ JAVA ] String 클래스 (2) 본문

■ 프로그래밍 SKILLS/JAVA

[ JAVA ] String 클래스 (2)

업그레이드중 2024. 8. 19. 21:35
반응형




 


■ java.lang 패키지 에 관하여 알아보자 !

•  자바 언어를 이루는 가장 기본이 되는 클래스들을 보관하는 패키지

•  java.lang 패키지의 대표적인 클래스
-  Object : 모든 자바 객체의 부모 클래스
-  String : 문자열
-  Integer, Long, Double : 래퍼타입 , 기본형 데이터 타입을 객체로 만든 것

 

 

String  클래스

 

•  자바에서 문자를 다루는 대표적인 타입은 char , String 2가지가 있다.

 

•  Char

-  문자 하나 다룰 때 사용

-  여러 문자를 나열하기 위해선 char[] 배열을 사용해야 함

 

•  String 클래스

-  문자열을 매우 편리하게 다룰 수 있다.

-  String은 클래스이기 때문에, 기본형이 아닌 참조형이다.

-  String은 불변객체이다.

 

 


 

StringBuilder - 가변 String

 

 

•  불변 객체인 String 클래스의 단점

-  문자를 더하거나 변경할때 마다 새로운 객체를 생성해야 한다.

-  더 많은 String 객체가 생성되고 GC( Garbage Collection) 한다.

-  결과적으로 컴퓨터의 CPU, 메모리 자원을 더 많이 사용하게 된다.

// 두 문자를 더하는 경우 다음과 같이 작동
// 불변객체인 String 내부의 값은 변경 불가능 X
// 변경된 값을 기반으로 새로운 String 객체 생성

"A" + "B"
String("A") + String("B") //문자는 String 타입이다.
String("A").concat(String("B"))//문자의 더하기는 concat을 사용한다.
new String("AB") //String은 불변이다. 따라서 새로운 객체가 생성된다.

 

 

•  StringBuilder( 가변 String )

-  가변 String 이 존재해야 한다.

-  값을 변경하면 되기 때문에 새로운 객체 생성 필요 X

-  성능과 메모리 사용면에서 불변보다 더 효율적이다.

//StringBuilder 는 내부에 final 이 아닌 변경할 수 있는 byte[] 을 가지고 있다. ```java

public final class StringBuilder {
 char[] value;// 자바 9 이전
 byte[] value;// 자바 9 이후
 //여러 메서드
 public StringBuilder append(String str) {...}
 public int length() {...}
 ...
}
```

//
(실제로는 상속 관계에 있고 부모 클래스인 AbstractStringBuilder 에 value 속성과 length() 메서드가 있
다.)

 

 

•  StringBuilder 예시

-  append( ) 메서드  :  여러 문자열 추가

-  insert( ) 메서드  :  특정 위치에 문자열 삽입

-  delete( ) 메서드  :  특정 범위의 문자열 삭제

-  reverse( ) 메서드  :  문자열을 뒤집는다.

-  toString( ) 메서드  :  StrinBuilder 결과를 String 을 생성해 반환

package lang.string.builder;

public class StringBUilderMain {

    public static void main(String[] args) {

        StringBuilder sb = new StringBuilder();
        sb.append("Hello");
        sb.append("Java");
        System.out.println("sb = " + sb);

        sb.insert(5,"Hello");
        System.out.println("sb insert() = " + sb);

        sb.delete(5,10);
        System.out.println("sb delete() = " + sb);

        sb.reverse();
        System.out.println("sb reverse() = " + sb);

        // StringBuilder --> String
        String str = sb.toString();
        System.out.println("str = " + str);
    }
}
// 실행 결과

sb = HelloJava
sb insert() = HelloHelloJava
sb delete() = HelloJava
sb reverse() = avaJolleH
str = avaJolleH

 

 

▶ StringBuilder는 문자열을 변경하는 동안만 사용하다가 문자열 변경이 완료되면 불변객체인 String으로

     변환하는 것이 좋다.

 

 


 

 

String 최적화

 

•   자바 컴파일러는 문자열 리터럴 더하는 부부은 자동으로 합쳐준다.

// 문자열 리터럴 더하는 부분은 자동으로 합쳐줌

// 컴파일 전
String str = "Hello, " + "Java!";

// 컴파일 후
String str = "Hello, Java!";

 

 

•  반복문에서의 String 최적화

// 최적화를 위해 직접 StringBuilder 를 사용


package lang.string.builder;

public class StringBuilderMain {

    public static void main(String[] args) {

        long startTime = System.currentTimeMillis();

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 100000; i++) {
            sb.append("Hello Summer");
        }
        String result = sb.toString();
        long endTime = System.currentTimeMillis();

        System.out.println("result = " + result);
        System.out.println("Time = " + (endTime - startTime) + "ms");

    }
}

 

 

•   StringBuilder 를 직접 사용하면 더 좋은 경우

-  반복문에서 반복해서 문자를 연결

-  조건문을 통해 동적으로 문자열을 조합

-  복잡한 문자열의 특정부분을 변경해야 할 때

-  매우 긴 대용량 문자를 다룰 때

 

 


 

메서드 체이닝

 

 

 

•   메서드 체이닝 예시

 

// add 메서드에서 자기 자신의 참조값 this를 반환


package lang.string.chaining;

public class ValueAdder {

    private int value;

    public ValueAdder add(int addValue ) {
        value += addValue;
        return this;
    }

    public int getValue() {
        return value;
    }
}
// add() 메서드의 반환값은 사용 X

package lang.string.chaining;

public class MethodChainingMain1 {

    public static void main(String[] args) {

        ValueAdder adder = new ValueAdder();
        adder.add(1);
        adder.add(2);
        adder.add(3);

        int result = adder.getValue();
        System.out.println("result = " + result);
    }
}
// 실행 결과

result = 6

 

 

 

•  add( ) 메서드의 반환값을 사용하여, 메서드 체이닝 기법을 활용한 예시

-  add( ) 메서드는 자기 자신(this)의 참조값 반환

-  이 반환값을 변수에 담아 두지 않고, 참조값을 사용하여 바로 메서드를 호출할 수 있다.

-  메서드가 끝나는 지점에 바로 . 를 찍어 변수명을 생략 가능하다.

 

package lang.string.chaining;

public class MethodChainingMain3 {

    public static void main(String[] args) {

        ValueAdder adder = new ValueAdder();
        int result = adder.add(1).add(2).add(3).getValue();
        System.out.println("result = " + result);


    }
}

 

// 실행 결과

result = 6

 

// 실행 순서

adder.add(1).add(2).add(3).getValue() //value=0
x001.add(1).add(2).add(3).getValue() //value=0, x001.add(1)을 호출하면 그 결과로 x001
을 반환한다.
x001.add(2).add(3).getValue() //value=1, x001.add(2)을 호출하면 그 결과로 x001을 반환한
다.
x001.add(3).getValue() //value=3, x001.add(3)을 호출하면 그 결과로 x001을 반환한다.
x001.getValue() //value=6

 

 

▶  메서드 체이닝 기법은 코드를 간결하고 읽기 쉽게 만든다.

 

 

 

•   StringBuilder + 메서드 체이닝 기법

-  StringBuilder 기법은 메서드 체이닝 기법을 제공

-  StringBuilder 에서 대부분의 메서드도 메서드 체이닝 기법을 제공하기 위해 자기 자신을 반환한다.

 

// 위의 StringBuilder 코드를 메서드체이닝 기법을 활용하여 아래와 같이 변경


package lang.string.builder;

public class StringBuilderMain {

    public static void main(String[] args) {

        //  StringBuilder + 메서드 체이닝 기법
        StringBuilder sb1 = new StringBuilder();
        String string = sb1.append("Hello").append("Java")
                .insert(5, "Hello")
                .delete(5,10)
                .reverse()
                .toString();

        System.out.println("string = " + string);

    }
}
// 실행 결과

string = avaJolleH

 

 

 

•   메서드 예시

package lang.string.builder;

public class StringBuilderMain {

    public static void main(String[] args) {

        // startWith() 메서드
        String url = "https://www.naver.com";
        boolean result = url.startsWith("https://");
        System.out.println("startWith() result = " + result);


        // length() 메서드
        String[] arr = {"hello", "java","summer","night"};
        int sum = 0;
        for (String s : arr) {
            System.out.println(s + ":" + s.length());
            sum += s.length();
        }
        System.out.println("length() sum = " + sum);


        // indexOf() 메서드
        String str = "abcdefg.pdf";
        int idx = str.indexOf(".pdf");
        System.out.println("indexOf() idx = " + idx);


        // substring() 메서드 + indexOf() 메서드
        String ext = ".pdf";

        int extIndex = str.indexOf(ext);

        String fileName = str.substring(0,extIndex);
        String extName = str.substring(extIndex);

        System.out.println("fileName = " + fileName);
        System.out.println("extName = " + extName);


        // trim() 메서드
        String original = "   Hello Summer   ";
        String trimmed = original.trim();
        System.out.println("trim() trimmed = " + trimmed);


        // split() 메서드
        String email = "hello@example.com";

        String[] parts = email.split("@");
        String idPart = parts[0];
        String domainPart = parts[1];

        System.out.println("idPart = " + idPart);
        System.out.println("domainPart = " + domainPart);

    }
}
// 실행 결과

startWith() result = true

hello:5
java:4
summer:6
night:5
length() sum = 20

indexOf() idx = 7

fileName = abcdefg
extName = .pdf

trim() trimmed = Hello Summer

split() idPart = hello
split() domainPart = example.com

 

 

 

 

※ 해당 내용은 인프런 김영한 강사님의  "실전 자바 중급1" 인강의 참고자료와 예시들을 참고하였습니다

 

 

 

 

반응형
Comments