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의 생성자
배열은 길이 변경불가. 공간이 부족하면 새로운 배열을 생성해야 한다.
과정
- 새로운 배열을 생성한다(x2)
- 내용을 복사한다.
- 참조를 변경한다.
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 |