String 클래스
자바의 문자열은 java.lang 패키지의 String 클래스의 객체이다.
String 클래스에서는 문자열 생성, 추출, 비교, 찾기, 분리, 변환 등의 메소드를 제공한다.
- String 객체 생성자
문자열 리터럴은 String 객체로 자동 생성되지만, String 생성자를 이용해 직접 String 객체를 만드는 방법도 존재한다.
Ex. String str1 = "Hi"; 도 되고 String str2 = new String("Hi"); 도 된다.
String 생성자의 매개값으로는 다양한 값이 올 수 있다. 파일의 내용을 읽거나, 네트워크를 통해 받은 테이터는 보통 byte[ ] 배열형식인데, 이를 문자열로 변환하기 위해 생성자의 매개값으로 byte[ ] 배열을 넘겨준다. 이때, 문자열 객체로 생성할 시작점과 길이를 옵션으로 지정해줄 수 있다.
Ex. 키보드로부터 바이트 배열을 읽는 경우, 엔터키를 누를 때 리턴되는 바이트는 제외하고 문자열로 변환해야 하는데, 이때 길이를 '길이-2'로 지정할 수 있다.
public class ByteToStringExample {
public static void main(String[] args) {
// 바이트 배열
byte[] bytes = {72, 101, 108, 108, 111, 32, 74, 97, 118, 97};
// 배열 전체를 String 객체로 생성
String str1 = new String(bytes);
// 배열의 offset(6) 인덱스 위치부터 length(4)만큼 String 객체로 생성
String str2 = new String(bytes, 6, 4);
System.out.println(str1); // Hello Java
System.out.println(str2); // Java
}
}
- String 클래스의 메소드
알고리즘 문제에서 문자열 처리할 때 많이 마주칠 메소드 들이다.
리턴 타입 | 메소드 이름(매개변수) | 설명 |
char | charAt(int index) | 특정 위치의 문자열을 char 타입으로 리턴한다. |
boolean | equals(Object anObject) | 두 문자열을 비교한다. |
byte[ ] | getBytes() | bytes[ ] 배열로 리턴한다. |
byte[ ] | getBytes(Charset charset) | 주어진 문자셋으로 인코딩한 bytes[ ] 배열을 리턴한다. |
int | indexOf(String str) | 문자열 내에서 주어진 문자열의 위치를 리턴한다. |
int | length() | 문자열의 길이를 리턴한다. |
String | replace(CharSequence target, CharSequence replacement) | target 부분을 replacement로 대치한 새로운 문자열을 리턴한다. |
String | substring(int beginIndex) | beginIndex위치에서 끝까지 잘라낸 문자열을 리턴한다. |
String | substring(int beginIndex, int endIndex) | beginIndex위치에서 endIndex까지 잘라낸 문자열을 리턴한다. |
String | toLowerCase() | 알파벳 소문자로 변환하여 리턴한다. |
String | toUpperCase() | 알파벳 대문자로 변환하여 리턴한다. |
String | trim() | 앞뒤 공백을 제거한 문자열을 리턴한다. |
String | valueOf(int i) valueOf(double d) |
숫자를 문자열로 리턴한다. (cf. 반대 : parseInt() 등) |
- 문자 추출 : charAt(int index)
index에 해당하는 위치의 문자열을 char 타입으로 리턴한다.
public class CharAtExample {
public static void main(String[] args) {
String sns = "010329-4444444";
char sex = sns.charAt(7);
switch(sex) {
case '1':
case '3': System.out.println("남성입니다"); break;
case '2':
case '4': System.out.println("여성입니다"); break;
}
// sex가 char 이므로 "1"이 아니라 '1'이여야 함
}
}
- 바이트 배열로 변환 : getBytes( )
문자열을 바이트 배열로 변환해야 하는 경우가 있다.
네트워크로 문자열을 전송하거나, 문자열을 암호화할 때 문자열을 바이트 배열로 변환해야 한다.
① byte[ ] bytes = "문자열".getBytes(); 시스템의 기본 문자셋으로 인코딩된 바이트를 리턴한다.
② byte[ ] bytes = "문자열".getBytes("문자셋"); 특정 문자셋으로 인코딩된 바이트를 리턴한다.
이때, 두번째 메소드는 잘못된 문자셋 값을 매개값으로 줄 경우 예외가 발생할 수 있으므로, 예외 처리가 필요하다.
바이트 배열을 문자열로 변환(디코딩)할 때는 new String 생성자의 매개값으로 바이트 배열을 넘겨서 변환이 가능하다.
public class getBytesExample {
public static void main(String[] args) {
String str = "안녕하세요";
// 시스템 기본 문자셋으로 인코딩과 디코딩
byte[] bytes1 = str.getBytes(); // string -> byte[] : 인코딩
System.out.println("bytes1.length: "+bytes1.length);
String str1 = new String(bytes1); // byte[] -> string : 디코딩
System.out.println("bytes1->String: "+str1);
// EUC-KR 문자셋으로 인코딩과 디코딩
try {
byte[] bytes2 = str.getBytes("EUC-KR");
System.out.println("bytes2.length: "+bytes2.length);
String str2 = new String(bytes2, "EUC-KR");
System.out.println("bytes2->String: "+str2);
} catch (UnsupportedEncodingException e){
e.getMessage();
}
}
}
- 문자열 찾기 : indexOf( )
매개변수로 주는 문자열의 위치를 알려주는 메소드이다. 문자열이 포함된 경우 시작 인덱스를, 포함되지 않은 경우 -1을 리턴한다.
-1을 리턴했다는 것은 해당 문자열이 없다는 뜻이므로 문자열의 포함 여부를 검사할 때 자주 사용된다.
public class indexOfExamle {
public static void main(String[] args) {
String str = "혼자 공부하는 자바";
if(str.indexOf("자바")!=-1) { // indexOf가 -1인지로 포함 여부를 알 수 있음
System.out.println("자바에 관련된 책이군요");
} else {
System.out.println("자바와 관련 없는 책이군요");
}
}
}
Wrapper 클래스
프로그램에 따라 기본 타입의 데이터를 객체로 취급해야 하는 경우가 있다. 예를 들어, 메소드의 인수로 객체 타입만이 요구되면, 기본 타입의 데이터를 그대로 사용할 수는 없다. 이때에는 기본 타입의 데이터를 먼저 객체로 변환한 후 작업을 수행해야 한다. 또한 컬렉션 프레임워크에서도 기본 타입값을 객체로 관리하므로 기본 타입 데이터를 객체로 바꿔주는 클래스가 필요하다.
이렇게 8개의 기본 타입에 해당하는 데이터를 객체로 포장해 주는 클래스를 포장 클래스(Wrapper class)라고 한다. 포장 클래스는 각각의 타입에 해당하는 데이터를 인수로 전달받아, 해당 값을 가지는 객체로 만들어 준다.
이때 포장하는 기본 타입의 값은 외부에서 변경할 수 없다. 따라서 내부의 값을 변경하고 싶다면, 새로운 포장 객체를 만들어야 한다.
▶ 박싱(Boxing)과 언박싱(Unboxing)
기본 타입의 값을 포장 객체로 만드는 과정을 박싱,
포장 객체에서 기본 타입의 값을 얻어내는 과정을 언박싱이라고 한다.
⭐ 정리 : 기본타입 → 포장 객체 (박싱) / 포장객체 → 기본타입 (언박싱)
박싱하는 방법
① 포장 클래스 생성자의 매개값으로 기본 타입 값을 전달
Integer obj = new Integer(100);
② 포장 클래스의 valueOf 메소드 매개값으로 기본 타입 전달
Integer obj = Integer.valueOf(100);
언박싱하는 방법
각 포장 클래스마다 가지고 있는 '기본타입+Value( )' 메소드를 호출
int i = obj.intValue();
▶ 자동 박싱과 언박싱
이렇게 명시적으로 박싱, 언박싱을 하지 않아도 자동으로 박싱과 언박싱이 일어나는 경우가 있다.
자동 박싱은 포장 객체에 기본 타입을 대입할 때 발생한다.
자동 언박싱은 기본 타입에 포장 객체를 대입하거나, 기본 타입과 포장 객체를 연산하는 경우 발생한다.
public class WrapperExample {
public static void main(String[] args) {
// 박싱
Integer num1 = new Integer(100); // 어째선지 caution 발생
Integer num2 = Integer.valueOf(100);
// 언박싱
int num3 = num1.intValue();
// 자동 박싱
Integer num4 = 100;
// 자동 언박싱
int num5 = Integer.valueOf(100);
System.out.println(num4+num5);
}
}
참고 : http://www.tcpschool.com/java/java_api_wrapper
▶ 포장 객체의 비교
(복습) 기본 타입과 참조 타입의 차이
기본타입 - stack에 값을 저장한다.
참조타입 - heap에서 객체가 생성되고 stack에는 주소가 저장된다.
포장 객체는 참조 타입이므로 ==를 사용하면 내부의 값이 같은지가 아닌, 같은 주소를 참조하는지가 조사된다.
따라서 equals를 사용하여 내부 값을 비교해야 한다.
Math 클래스
Math 클래스에서 제공하는 메소드는 모두 정적 메소드이므로 객체 생성 없이 Math 클래스 + 도트 + 메소드로 바로 사용할 수 있다.
Math 클래스에서는 기본적인 메소드를 많이 제공하는데, 대부분 아는 것들이라 중요하다 느끼는 것만 정리했다.
1. 난수 생성
double d = Math.round()로 [0,1)에 해당하는 난수를 얻을 수 있다.
여기에 N을 곱하고 M을 더한 후 int로 강제 형변환하면, M~M+N-1 사이의 임의의 정수를 생성할 수 있다.
2. 반올림
Math.round( ) 메소드는 항상 소수 첫번째 자리에서 반올림하여 정수값을 리턴한다.
따라서, 원하는 소수 자리수에서 반올림되길 원한다면, 반올림할 자릿수가 소숫점 첫번째 자리가 되게 10^n을 곱한 후, 다시 10^n을 나눠주면 된다.
public class MathExample {
public static void main(String[] args) {
// Math 클래스에 메소드를 바로 사용할 수 있다.
// 난수 생성
int lotto = (int)(Math.random()*45)+1;
// 소숫점 두자리에서 반올림
double d = 42.195;
d*=10;
d = Math.round(d);
d/=(double)10;
System.out.println(d); // 42.2
}
}
'JAVA > 혼공자' 카테고리의 다른 글
[혼공자] Chapter 12-1 멀티 스레드 (1) | 2022.08.15 |
---|---|
[혼공자] Chapter 11-2 java.util 패키지 (0) | 2022.08.15 |
[혼공자] Chapter 11-1 java.lang 패키지 (Object, System, Class) (1) | 2022.08.13 |
[혼공자] Chapter 10. 예외처리 (1) | 2022.08.09 |
[혼공자] Chapter 09-2 익명 객체 (1) | 2022.08.08 |