9. java.lang패키지와 유용한 클래스

KOO HEESEUNG·2021년 10월 1일
0

Java의 정석

목록 보기
4/8
post-thumbnail

1. Object 클래스

모든 클래스의 최고 조상. 멤버변수 없이 11개의 메서드만 보유.

Object클래스의 메서드설명
protected Object clone()객체 자신의 복사본 반환
public boolean equals(Object obj)자신과 obj가 같은 객체인지 비교(같으면 true)
protected void finalize()객체 소멸시 자동 호출.(거의 사용 안함.)
public Class getClass()객체 자신의 클래스 정보를 담고 있는 Class 인스턴스 반환
public int hashCode()객체 자신의 해시코드 반환
public String toString()객체 자신의 정보를 문자열로 반환
public void notify()객체 자신을 사용하려고 기다리는 쓰레드 하나를 깨움
public void notifyAll()객체 자신을 사용하려고 기다리는 모든 쓰레드 깨움
public void wait()
public void wait(long timeout)
public void wait(long timeout, int nanos)
다른 쓰레드가 notify()나 notifyAll() 호출할 때까지 현재 쓰레드를 기다리게 한다.(timeout, nanos로 지정하지 않으면 무한히 대기)

1-1. equals()

객체 자신과 매개변수로 주어진 객체를 비교한다. 같으면 true를 반환한다.

객체의 주소를 비교하기 때문에, 주소가 같아야 같은 객체라고 할 수 있다.

서로 다른 두 객체는 항상 주소가 다르기 때문에, 인스턴스 변수(iv)의 값을 비교하도록 equals()를 오버라이딩 하여 모든 iv값이 같으면 두 객체가 같다는 결과를 반환하도록 오버라이딩하여 사용한다.

1-2. hashCode()

객체의 해시코드를 반환하는 메서드. Object 클래스의 hashCode()는 객체 주소를 int로 변환해서 반환한다.

해시코드

객체의 지문. 서로 다른 두 객체는 절대 같은 해시코드를 가질 수 없다.

두 객체가 같다면, 해시코드도 같아야 하기 때문에, equals()를 오버라이딩하면, hashCode()도 함께 오버라이딩해야 한다.

1-3. toString()

객체를 문자열로 변환하는 메서드.

객체는 인스턴스 변수(iv)의 집합이기 때문에 객체를 문자열로 변환한다는 것은 iv값을 문자열로 변환한다는 것과 같다. 따라서 일반적으로 인스턴스 변수에 저장된 값들을 문자열로 표현하기 위해 오버라이딩하여 사용한다.


2. String 클래스

문자열을 다루기 위한 클래스. 데이터(char[]) + 메서드.

내용을 변경할 수 없다. 문자열을 결합하는 등 변경하는 경우, 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열이 담긴 String 객체가 생성되는 것이다. 따라서 문자열 결합, 추출 등의 내용 변경이 잦은 경우, 내용 변경이 가능한 StringBuffer 클래스를 사용하는 것이 성능상 유리하다.

2-1. 문자열 리터럴

문자열 리터럴은 프로그램 실행시 자동으로 생성된다.

같은 내용의 문자열 리터럴은 하나만 만들어지고, 참조변수들이 해당 주소를 공유한다. String 객체의 내용을 변경할 수 없으므로, 주소를 공유해도 아무런 문제가 없다.

2-2. 문자열 비교

문자열 생성 방법은 크게 두가지. 문자열 리터럴 지정과 String 클래스 생성자 사용이다.

// (1) 문자열 리터럴 지정
String a = "A";
String b = "A";

// (2) 생성자 사용
String a = new String("A");
String b = new String("A"); 

위 예제에서 (2)의 경우 항상 새로운 문자열을 생성한다. (1)은 "A"라는 문자열이 딱 1번 만들어져, 해당 객체의 주소를 참조변수 a와 b가 동시에 참조한다.(성능상 1을 추천)

따라서 (1)의 경우, a == b를 했을 때와 a.equals(b)를 했을 때 모두 true를 반환하지만, (2)는 a==b를 했을 때는 false를, a.equals(b)를 했을 때는 true를 반환한다.

2-3. 빈 문자열

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

null보다는 빈 문자열로 초기화하는 것이 좋다.

String str = ""; // 문자열은 빈 문자열로 초기화.
char c = ' '; // 문자는 공백으로 초기화.

2-4. 생성자와 메서드

메서드설명
String(String s)
String(char[] value)
String(StringBuffer buf)
생성자. 매개변수에 넣은 값을 문자열로 변환하여 생성한다.
char charAt(int index)지정된 위치(index)에 있는 문자 1개를 반환한다.
int compareTo(String str)두 문자열을 사전순으로 비교한다. 같으면 0, 왼쪽이 작으면 음수, 오른쪽이 작으면 양수를 반환한다.
정렬에 사용된다.
String concat(String str)뒤에 지정한 문자열(str)을 덧붙인다.
boolean contains(CharSequence s)지정된 문자열(s)이 포함되었는지 검사한다. 포함되었을 경우, true 반환.
boolean startsWith(String prefix)
boolean endsWith(String suffix)
지정된 문자열로 시작/끝나는지 확인한다.
boolean equals(Object obj)매개변수 문자열 obj과 내용을 비교한다. obj가 String이 아니거나, 문자열이 다르면 false.
int indexOf(int ch)
int indexOf(int ch, int pos)
int indexOf(String str)
주어진 문자(ch)나 문자열(str)이 문자열에 존재하는지 확인하여 위치를 반환한다. 없으면 -1.
pos로 검색 시작 위치를 지정해줄 수 있다.
int lastIndexOf(int ch)
int lastIndexOf(String str)
지정된 문자(ch) 혹은 문자열(str)을 맨 끝에서부터 찾아서 위치를 반환한다.
int length()문자열의 길이를 반환한다.
String[] split(String regex)
String[] split(String regex, int limit)
문자열을 지정한 분리자(regex)로 나누어 문자열 배열에 담아 반환한다.
지정한 개수(limit)만큼 나눌 수도 있다.
String substring(int begin)
String substring(int begin, int end)
주어진 시작위치(begin)부터 끝 위치(end) 범위에 포함된 문자열을 반환한다. end를 지정하지 않으면, 시작위치부터 문자열 끝까지를 반환한다. end의 문자는 포함되지 않는다.(begin <= x < end)
String toLowerCase()
String toUpperCase()
모든 문자열을 소문자/대문자로 변환한다.
String toString문자열을 반환한다.
String trim()문자열 양쪽 끝의 공백을 제거한다.
static String valueOf(기본형)
static String valueOf(Object obj)
기본형을 문자열로 변환한다.
참조형일 경우, toString()을 호출한 결과를 반환한다.

join()과 StringJoiner

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

2-5. 문자열과 기본형간의 변환

숫자를 문자열로 변환하는 방법

  • 기본형 + ""(빈 문자열)
  • String.valueOf(숫자);

빈 문자열을 사용하는 것이 더 편리하고, valueOf()를 사용할 경우, 속도가 더 빠르다는 장점이 있다.

문자열을 기본형으로 변환하는 방법

  • parseInt(문자열), parseDouble(문자열), parseBoolean(문자열) .... ;
  • valueOf(문자열);

2-6. StringBuffer 클래스

String과 달리 가변 클래스. String처럼 내부적으로 문자형 배열(char[])을 갖고 있다.

메서드

메서드설명
StringBuffer()
StringBuffer(int length)
StringBuffer(String str)
생성자 참고
StringBuffer append(기본형)
StringBuffer append(Object obj)
StringBuffer append(String str)
매개변수 값을 문자열로 변환하여 뒤에 덧붙인다.
int capacity()
int length()
각각 버퍼의 크기와 버퍼에 담긴 문자열 길이를 알려준다.
char charAt(int index)지정된 위치(index)에 있는 문자를 반환한다.
StringBuffer delete(int start, int end)start <= x < end 범위의 위치에 있는 문자를 제거한다.
StringBuffer deleteCharAt(int index)지정된 위치(index)에 있는 문자 1개를 제거한다.
StringBuffer insert(int pos, 기본형)
StringBuffer insert(int pos, Object obj)
StringBuffer insert(int pos, String str)
두번째 매개변수 값을 문자열로 반환하여 지정된 위치(pos)에 추가한다.
StringBuffer replace(int start, int end, String str)start <= x < end 범위의 문자들을 str로 바꾼다.
StringBuffer reverse()문자열 순서를 뒤집는다.
void setCharAt(int index, char ch)지정된 위치(index)의 문자를 주어진 문자(ch)로 바꾼다.
void setLength(int newLength)newLength 길이로 문자열 길이를 변경한다. 길이를 늘리는 경우, 빈 공간을 널문자 '\u0000'로 채운다.
String toString()StringBuffer를 String으로 변환한다.
String substring(int start)
String substring(int start, int end)
지정된 범위 내의 문자열을 뽑아서 반환한다. end 없으면 문자열 끝까지.

생성자

배열은 길이 변경이 불가하기 때문에, 공간이 부족할 경우 다음과 같은 과정을 거쳐야 한다:

  1. 새로운 배열 생성
  2. 새로운 배열에 기존 배열 내용 복사
  3. 참조 변경

이러한 과정이 자주 발생하면 성능이 떨어지기 때문에 StringBuffer 사용시 저장될 문자열의 길이를 고려하여 충분히 여유있는 크기로 지정하는 것이 좋다.

StringBuffer(); // 버퍼 길이를 지정하지 않으면, 버퍼 크기 16
StringBuffer(int length); // length 길이의 버퍼 생성.
StringBuffer(String str); // str 길이 + 16 크기의 버퍼 생성.

StringBuilder

StringBuffer는 동기화되어 있기 때문에 멀티 쓰레드에 안전하지만, 싱글 쓰레드인 경우, 성능만 떨어뜨린다.

이때는 동기화되어 있지 않은 StringBuilder를 사용하는 것이 성능 향상에 도움이 된다.

StringBuilder와 StringBuffer는 동기화 여부 외에는 완전히 동일하다고 볼 수 있다.


3. Math 클래스

수학 관련 static 메서드의 집합 (메서드밖에 없기 때문에 다 static 메서드)

메서드

전부 static이기 때문에 static 생략하고 적을 것임.

메서드설명
double abs(double a)
float abs(float f)
int abs(int i)
long abs(long l)
매개변수 값의 절대값 반환
double ceil(double a)
double floor(double a)
매개변수 값 올림/내림하여 반환
double max(double a, double b)
float max(float a, float b)
int max(int a, int b)
long max(long a, long b)
매개변수 a, b 중 큰 값 반환
double min(double a, double b)
float min(float a, float b)
int min(int a, int b)
long min(long a, long b)
매개변수 a, b 중 작은 값 반환
double random()0.0 ~ 1.0 범위의 임의의 값 반환
double rint(double a)매개변수 값 반올림하여 반환.
rint와 round의 차이 = rint는 짝수 반올림.(n.5값은 짝수 반환)
long round(double a)
long round(float f)
매개변수 값 반올림하여 정수 반환.

4. 래퍼 클래스

기본형 값을 감싸는 클래스. 8개의 기본형을 객체로 다루기 위해 사용.

모든 숫자 래퍼 클래스의 조상인 Number 클래스에 속함.

4-1. 문자열을 숫자로 변환

문자열 -> 기본형문자열 -> 래퍼 클래스
byte b = Byte.parseByte("100");
short s = Short.parseShort("100");
int i = Integer.parseInteger("100");
long l = Long.parseLong("100");
float f = Float.parseFloat("3.14");
double d = Double.parseDouble("3.14");
Byte b = Byte.valueOf("100");
Short s = Short.valueOf("100");
Integer i = Integer.valueOf("100");
Long l = Long.valueOf("100");
Float f = Float.valueOf("3.14");
Double d = Double.valueOf("3.14");
  • 래퍼 클래스 -> 문자열 : toString() 사용

  • n진법 문자열을 숫자로 변환하는 방법 : parseInt(문자열, 진수)

    • 16진법에서는 'A~F'의 문자도 허용하므로 'Integer.parseInt("FF", 16)'과 같은 코드가 가능하지만, 이 경우 진법을 생략하면 10진수로 간주하므로, NumberFormatException 발생.

4-2. 오토박싱 & 언박싱

JDK 1.5 부터 오토박싱과 언박싱의 도입으로 기본형과 참조형간 연산이 가능해졌다.

  • 오토박싱 : 기본형을 래퍼 클래스로 변환
  • 언박싱 : 래퍼 클래스를 기본형으로 변환

0개의 댓글