본문 바로가기

복습

[Java 복습] String 클래스, StringBuffer, StringBuilder

String 클래스 

  • 데이터(char[ ]) + 메서드(문자열 관련)
  • 내용을 변경할 수 없는 불변 클래스
String a = "a"; // x001 => x003
String b = "b"; // x002
a = a + b; // 새로운 문자열 "ab", x003 주소가 a로 대입
  • 문자열 결합을 할 때마다 새로운 주소값이 만들어지니 성능이 떨어짐!
  • 덧셈 연산자(+) 를 이용한 문자열 결합은 성능이 떨어짐.
  • 문자열의 결합이나 변경이 잦다면, 내용을 변경가능한 StringBuffer를 사용.

 

문자열의 비교

String str1 = "abc"; // 문자열 리터럴 "abc"의 주소가 str1에 저장됨
String str2 = "abc"; // 문자열 리터럴 "abc"의 주소가 str2에 저장됨
String str3 = new String("abc"); // 새로운 String 인스턴스를 생성
String str4 = new String("abc"); // 새로운 String 인스턴스를 생성

 

 

 

 

 

 

문자열 리터럴

문자열 리터럴은 프로그램 실행시 자동으로 생성된다.(constant pool(상수 저장소)에 저장)

같은 내용의 문자열 리터럴은 하나만 만들어진다.

 

 

빈 문자열

내용이 없는 문자열. 크기가 0인 char형 배열을 저장하는 문자열

String str = "";

 

크기가 0인 배열을 생성하는 것은 어느 타입이나 가능

char[] chArr = new char[0]; // 길이가 0인 char 배열
int[] iArr = {}; // 길이가 0인 int 배열

 

 

 

 

문자와 문자열의 초기화

String s = null;
char c = '\u0000';

String s = ""; // 빈 문자열로 초기화
char c = ' '; // 공백으로 초기화

 

 

String 클래스의 생성자와 메서드

 

너무 많다.. 공식 API 문서를 확인해보자!

 

 

join( )과 StringJoiner

join( )은 여러 문자열 사이에 구분자를 넣어서 결합한다.

String animals = "dog,cat,bear";
String[] arr = animals.split(","); // 문자열을 ',' 구분자로 나눠서 배열에 저장
String str = String.join("-", arr); // 배열의 문자열을 '-'로 구분해서 결합
System.out.println(str);
dog-cat-bear

 

 

 

문자열과 기본형 간의 변환

숫자를 문자열로 바꾸는 방법

int i = 100;
String str1 = i +""; // 100을 "100"으로 변환하는 방법1(편리함)
String str2 = String.valueOf(i); // 100을 "100"으로 변환하는 방법2(빠르긴함)

 

 

문자열을 숫자로 바꾸는 방법

int i = Integer.parseInt("100"); // "100"을 100으로 변환하는 방법1(old)
int i2 = Integer.valueOf("100"); // "100"을 100으로 변환하는 방법2(new)
Integer i2 = Integer.valueOf("100"); // 원래는 반환 타입이 Integer(Auto boxing)

 

 

StringBuffer 클래스

String 처럼 문자열 배열(char[ ])을 내부적으로 가지고 있다.

그러나 String과 달리 내용을 변경할 수 있다.

문자열 조작을 많이 사용할 때는 StringBuffer를 사용하는 것이 좋음

 

 

 

StringBuffer의 생성자

 

배열은 길이 변경불가. 공간이 부족하면 새로운 배열을 생성해야 한다.

 

 

과정

  1. 새로운 배열을 생성한다(x2)
  2. 내용을 복사한다.
  3. 참조를 변경한다.

 

StringBuffer는 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해야 한다.

public StringBuffer(int length) {
        value = new char[length];
        shared = false;
    }
    
public StringBuffer() {
    this(16); // 버퍼의 크기를 지정하지 않으면 버퍼의 크기는 16이 된다.
}

public StringBuffer(String str) {
    this(str.lenght() + 16); // 지정한 문자열의 길이보다 16이 더 크게 버퍼를 생성한다.
}

 

 

 

StringBuffer의 변경

StringBuffer는 String과 달리 내용 변경이 가능하다.

append( )는 지정된 내용을 StringBuffer에 추가 후, StringBuffer의 참조를 반환(반환 타입 StringBuffer)

StringBuffer sb2 = sb.append("ZZ"); // sb의 내용 뒤에 "ZZ"를 추가한다.
System.out.println(sb); // abc123ZZ
System.out.println(sb2); // abc123ZZ
StringBuffer sb = new StringBuffer("abc");
sb.append("123");
sb.append("ZZ");

sb.append("123").append("ZZ"); // StringBuffer 자신의 참조를 반환하기 때문에 메서드 체이닝 사용가능

 

 

 

StringBuffer의 비교(주의!!!)

StringBuffer는 equals()가 오버라이딩되어 있지 않다.(주소비교)

StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc"); // 내용이 같다

System.out.println(sb == sb2); //false
System.out.println(sb.equals(sb2)); // false

 

StringBuffer를 String으로 변환 후에 equals( )로 비교해야 한다.

String s = sb.toString(); // sb를 String으로 변환
String s2 = sb2.toString(); // sb2를 String으로 변환

System.out.println(s.equals(s2)); // true

 

 

 

StringBuffer의 생성자 메서드

너무 많다.. 공식 API 문서를 확인해보자!

StringBuffer를 생성할 때는 기본생성자 말고 길이를 매개변수로 받는 생성자를 선택하자! 

StringBuffer sb = new StringBuffer(100); // 크기가 100인 배열 생성

 

 

(불필요 없이 생기는 배열의 길이 조절 가능)

 

 

StringBuffer append( ): 매개변수로 입력된 값을 문자열로 변환하여 StringBuffer 인스턴스가 저장하고 있는 문자열의 뒤에 덧붙인다.

StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = sb.append(true); // boolean 타입
sb.append('d').append(10.0f);

StringBuffer sb3 = sb.append("ABC").append(123);

sb = "abctrued10.0ABC123"
sb2 = "abctrued10.0ABC123"
sb3 = "abctrued10.0ABC123"

 

 

StringBuffer delete(int start, int end): 시작위치부터 끝 위치 사이에 있는 문자를 제거한다. 단, 끝 위치의 문자는 제외

StringBuffer sb = new StringBuffer("0123456");
StringBuffer sb2 = sb.delete(3,6);

sb = "0126"
sb2 = "0126"

 

 

StringBuffer deleteCharAt(int index): 지정된 위치(index)의 문자를 제거한다.

 

int capacity( ): StringBuffer 인스턴스의 버퍼크기를 알려준다.

 

StringBuffer insert(int pos, 다양한 타입): 두 번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos)에 추가된다.

 

int length( ): StringBuffer 인스턴스에 저장되어 있는 문자열의 길이를 반환한다.

 

StringBuffer replace(int start, int end, String str): 지정된 범위(start ~ end) 의 문자들을 주어진 문자열로 바꾼다.

 

StringBuffer reverse( ): StringBuffer 인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열한다.

 

String toString( ): StringBuffer 인스턴스의 문자열을 String으로 변환

 

String substring(int start, int end): 지정된 범위 내의 문자열을 String으로 뽑아서 반환한다.

 

 

 

StringBuilder

StringBuffer 동기화(데이터  보호)되어 있다. 멀티 쓰레드에 안전(thread-safe)

  • 싱글 쓰레드: 한번에 1개 작업
  • 멀티 쓰레드: 동시에 여러(n개) 작업(카톡 파일보내면서 카톡하기) 

멀티 쓰레드 프로그램이 아닌 경우, 동기화는 불필요한 성능저하

이럴 땐 StringBuffer 대신 StringBuilder를 사용하면 성능 향상

 

 

Math 클래스

수학 관련 static 메서드 집합

iv가 없으니까 객체를 만들필요가 없음

 

round( ): 원하는 소수점 아래 세 번째 자리에서 반올림하기

  • 1. 원래 값에 100을 곱한다.
    • 90.7552 * 100 => 9075.52
  • 2. 위의 결과에 Math.round( )를 사용한다.
    • Math.round(9075.52) => 9076
  • 3. 위의 결과를 다시 100.0 으로 나눈다.
    • 9076 / 100.0 => 90.76 (실수로 나눠야 원하는 소수점 자리까지 나옴)
    • 9076 / 100 => 90.76

static double abs(double a): 주어진 값의 절대값을 반환한다.

 

static double ceil(double a) : 주어진 값을 올림하여 반환한다.

 

static double floor(double b): 주어진 값을 버림하여 반환한다.

 

static double max(double a, double b): 주어진 두 값을 비교하여 큰 쪽을 반환한다.

 

static double min((double a, double b): 주어진 두값을 비교하여 작은 쪽을 반환한다.

 

static double random( ): 0.0 ~ 1.0 범위의 임의의 double 값을 반환한다.(1.0은 범위에 포함하지 않는다.)

 

static double rint(double a): 주어진 double 값과 가장 가까운 정수값을 double형으로 반환한다.(짝수 반올림)

 

static long round(double a): 소수점 첫째 자리에서 반올림한 정수값을 반환한다. 두 정수의 정가운데 있는 값은 항상 큰 정수를 반환

 

참고: round( ) 보다 rint( )이 오차가 좀 더 적음(무조건 올림을 하면 오차가 커지기 때문에).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'복습' 카테고리의 다른 글

[Java 복습] Clendar 클래스  (0) 2024.05.04
[Java 복습] 래퍼(wrapper) 클래스  (0) 2024.05.03
[Java 복습] Object 클래스  (0) 2024.05.03
[Java 복습] hashCode( ), toString( )  (0) 2024.05.03
[Java 복습] 예외처리  (1) 2024.05.02