Java

[자바의 정석] 9장 java.lang 패키지

woochii 2023. 7. 23. 19:03
728x90
반응형

1. Object

1-1. Object 클래스

  • 모든 클래스의 최고 조상.
  • 오직 11개의 메서드만을 가지고 있다.
  • notify(), wait() 등은 쓰레드와 관련된 메서드이다.
Object 클래스의 메서드 설명
protected Object clone() 객체 자신의 복사본을 반환한다.
public boolean equals(Object obj) 객체 자신과 객체 obj가 같은 객체인지 알려준다.(같으면 true)
protected void finalize() 객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출된다.
이때 거의 수행되어야하는 코드가 있을 때 오버라이딩 한다.
(거의 사용X)
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)동안 기다리게 한다.
(timeout은 천 분의 1초, nanos는 10⁹ 분의 1초)

 

 

1-2. equals(Object obj) 

  • 객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true, 다르면 false.
  • Object클래스의 equals()는 객체 주소를 비교(참조변수 값 비교)

1-2-1. equals(Object obj)의 오버라이딩

  • 인스턴스 변수(iv)의 값을 비교하도록 equals()를 오버라이딩 해야 한다.

 

1-3. hashCode()

  • 객체의 해시코드(hash code)를 반환하는 메서드
  • Object 클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
  • equals()를 오버라이딩 하면, hashCode()도 오버라이딩 해야 한다.
    -> equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문이다.
  • System.identityHashCode(Object obj)는 Object클래스의 hashCode()와 동일

 

1-4. toString()

  • 객체를 문자열(String)로 변환하기 위한 메서드

2. String

2-1. String 클래스

  • 데이터(char[]) + 메서드(문자열 관련)
  • 내용을 변경할 수 없는 불변(immutable)클래스
  • 덧셈 연산자(+)를 이용한 문자열 결합은 성능이 떨어짐.
    -> 문자열의 결합이나 변경이 잦다면, 내용을 변경 가능한 StringBuffer를 사용

 

2-2. 문자열의 비교

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

str1 == str2 // true
str1.equals(str2) // true
str3 == str4 // false
str3.equals(str4) // true

 

2-3. 문자열 리터럴

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

 

2-4. 빈 문자열("", empty string)

  • 내용이 없는 문자열. 크기가 0인 char형 배열을 저장하는 문자열
  • 크기가 0인 배열을 생성하는 것은 어느 타입이나 가능

 

2-5. String 클래스의 생성자와 메서드

메서드 / 설명 예제 결과
String(String s) String s = new String("Hello"); s = "Hello"
주어진 문자열(s)를 갖는 String 인스턴스를 생성한다.
String(char[] value) char[] c = {'H', 'e', 'l', 'l', 'o'};
String c = new String(c);
s = "Hello"
주어진 문자열(value)를 갖는 String 인스턴스를 생성한다.
String(StringBuffer buf) StringBuffer sb = new StringBuffer("Hello");
String s = new String(sb);
s = "Hello"
StringBuffer 인스턴스가 갖고 있는 문자열과 같은 내용의 String 인스턴스를 생성한다.
char charAt(int index) String s = "Hello";
String n = "0123456";
char c = s.charAt(1);
char c2 = n.charAt(1);
c = 'e'
c2 = '1'
지정된 위치(index)에 있는 문자를 알려준다.
(index는 0부터 시작)
int compareTo(String str) int i = "aaa".compareTo("aaa");
int i2 = "aaa".compareTo("bbb");
int i3 = "bbb".compareTo("aaa");
i = 0
i2 = -1
i3 = 1
문자열(str)과 사전 순서로 비교한다.
같으면 0을, 사전순으로 이전이면 음수를, 이후면 양수를 반환한다.
String concat(String str) String s = "Hello";
String s2 = s.concat(" World");
s2 = "Hello World"
문자열(str)을 뒤에 덧붙인다.
boolean contains(CharSequence s) String s = "abcdefg";
boolean b = s.contains("bc");
b = true
지정된 문자열(s)이 포함되었는지 검사한다.
boolean endsWith(String suffix) String file = "Hello.txt";
boolean b = file.endsWith("txt");
b = true
지정된 문자열(suffix)로 끝나는지 검사한다.
boolean equals(Object obj) String s = "Hello";
boolean b = s.equals("Hello");
boolean b2 = s.equals("hello");
b = true
b2 = false
매개변수로 받은 문자열(obj)과 String 인스턴스의 문자열을 비교한다. obj가 String이 아니거나 문자열이 다르면 false를 반환한다.
boolean equalsIgnoreCase(String str) String s = "Hello";
boolean b = s.equalsIgnoreCase("HELLO");
boolean b2 = s.equalsIgnoreCase("hello");
b = true
b2 = true
문자열과 String 인스턴스의 문자열을 대소문자 구분없이 비교한다.
int indexOf(int ch) String s = "Hello";
int idx1 = s.indexOf('o');
int idx2 = s.indexOf('k');
idx1 = 4
idx2 = -1
주어진 문자(ch)가 문자열에 존재하는지 확인하여 위치(index)를 알려준다. 못찾으면 -1을 반환한다.(index는 0부터 시작)
int indexOf(int ch, int pos) String s = "Hello";
int idx1 = s.indexOf('e', 0);
int idx2 = s.indexOf('e', 2);
idx1 = 1
idx2 = -1
주어진 문자(ch)가 문자열에 존재하는지 지정된 위치(pos)부터 확인하여 위치(index)를 알려준다. 못찾으면 -1을 반환한다.
int indexOf(String str) String s = "ABCDEFG";
int idx = s.indexOf('CD');
idx = 2
주어진 문자열이 존재하는지 확인하여 그 위치(index)를 알려준다. 없으면 -1을 반환한다.
int lastIndexOf(int ch) String s = "java.lang.Object";
int idx1 = s.lastIndexOf('.');
int idx2 = s.indexOf('.');
idx1 = 9
idx2 = 4
지정된 문자 또는 문자 코드를 문자열의 오른쪽 끝에서부터 찾아서 위치(index)를 알려준다.
못찾으면 -1을 반환한다.
int lastIndexOf(String str) String s = "java.lang.java";
int idx1 = s.lastIndexOf('java');
int idx2 = s.indexOf('java');
idx1 = 10
idx2 = 0
지정된 문자열을 인스턴스의 문자열 끝에서부터 찾아서 위치(index)를 알려준다. 못찾으면 -1을 반환한다.
int length() String s = "Hello";
int length = s.length();
length = 5
문자열의 길이를 알려준다.
String[] split(String regex) String animals = "dog, cat, bear";
String[] arr = animals.split(",");
arr[0] = "dog"
arr[1] = "cat"
arr[2] = "bear"
문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환한다.
String[] split(String regex, int limit) String animals = "dog, cat, bear";
String[] arr = animals.split(",", 2);
arr[0] = "dog"
arr[1] = "cat, bear"
문자열을 지정된 분리자(regex)로 나누어 문자열배열에 담아 반환한다. 단, 문자열 전체를 지정된 수(limit)로 자른다.
boolean startWith(String prefix) String s = "java.lang.Object";
boolean b = s.startWith("java");
boolean b2 = s.startWith("lang");
b = true
b2 = false
주어진 문자열(prefix)로 시작하는지 검사한다.
String substring(int begin)
String substring(int begin, int end)
String s = "java.lang.Object";
String c = s.substring(10);
String p = s.substring(5, 9);
c = "Object"
p = "lang"
주어진 시작위치(begin)부터 끝 위치(end)범위에 포함된 문자열을 얻는다. 이 때, 시작 위치의 문자는 범위에 포함되지만, 끝 위치의 문자는 포함되지 않는다.
String toLowerCase() String s = "Hello";
String s1 = s.toLowerCase();
s1 = "hello"
String 인스턴스에 저장되어있는 모든 문자열을 소문자로 변환하여 반환한다.
String toUpperCase() String s = "Hello";
String s1 = s.toUpperCase();
s1 = "HELLO"
String 인스턴스에 저장되어있는 모든 문자열을 대문자로 변환하여 반환한다.
String trim() String s = "    Hello World.   ";
String s1 = s.trim();
s1 = "Hello World"
문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을 없앤 결과를 반환한다. 이때 문자열 중간에 있는 공백은 제거되지 않는다.
static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(int i)
static String valueOf(long l)
static String valueOf(float f)
static String valueOf(double d)
static String valueOf(Object o)
String b = String.valueOf(true);
String c = String.valueOf('a');
String i = String.valueOf(100);
String l = String.valueOf(100L);
String f = String.valueOf(10f);
String d = String.valueOf(10.0);
b = true
c = "a"
i = "100"
l = "100"
f = "10.0"
d = "10.0"
지정된 값을 문자열로 변환하여 반환한다.
참조변수의 경우, toString()을 호출한 결과를 반환한다.

 

2-6. join()과 StringJoiner

  • join()은 여러 문자열 사이에 구분자를 넣어서 결합한다.
String animals = "dog, cat, bear";
String[] arr = animals.split(",");  // 문자열을 ','를 구분자로 나눠서 배열에 저장
String str = String.join("-", arr); // 배열의 문자열을 '-'로 구분해서 결합
System.out.println(str);            // dog-cat-bear

3. StringBuffer

3-1. StringBuffer 클래스

  • String처럼 문자형 배열(char[])을 내부적으로 가지고 있다.
  • 그러나, String과 달리 내용을 변경할 수 있다. (mutable)

 

3-2. StringBuffer의 생성자

  • 배열은 길이 변경불가. 공간이 부족하면 새로운 배열을 생성해야 한다.
  • StringBuffer는 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해야 한다.
public StringBuffer(int length) {
    value = new char[length];   // 크기 지정
    shared = false;
}

public StringBuffer() {
    this(16);                   // 버퍼의 크기를 지정하지 않으면 버퍼의 크기는 16이 된다.
}

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

 

3-3. StringBuffer의 변경

  • StringBuffer는 String과 달리 내용 변경이 가능하다.
  • append()는 지정된 내용을 StringBuffer에 추가 후, StringBuffer의 참조를 반환한다.
StringBuffer sb = new StringBuffer("abc");
sb.append("123");   // sb의 내용 뒤에 "123"을 추가한다.

StringBuffer sb2 = sb.append("ZZ");
System.out.println(sb);    // abc123ZZ
System.out.println(sb2);   // abc123ZZ

 

3-4. StringBuffer의 비교

  • StringBuffer는 equals()가 오버라이딩 되어있지 않다.(주소 비교)
  • StringBuffer를 String으로 변환한 후에 equals()로 비교해야 한다.

 

3-5. StringBuffer 클래스의 메서드

메서드 / 설명 예제 결과
StringBuffer() StringBuffer sb = new StringBuffer(); sb = ""
16문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스를 생성한다.
StringBuffer(int length) StringBuffer sb = new StringBuffer(10); sb = ""
지정된 개수의 문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스를 생성한다.
StringBuffer(String str) StringBuffer sb = new StringBuffer("Hi"); sb = "Hi"
지정된 문자열 값(str)을 갖는 StringBuffer 인스턴스를 생성한다.
StringBuffer append(boolean b)
StringBuffer append(char c)
StringBuffer append(char[] str)
StringBuffer append(double d)
StringBuffer append(float f)
StringBuffer append(int i)
StringBuffer append(long l)
StringBuffer append(Object obj)
StringBuffer append(String str)
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = sb.append(true);
sb.append('d').append(10.0f);

StringBuffer sb3 = sb.append("ABC")
                                     .append(123);
sb = "abctrued10.0ABC123"
sb2 = "abctrued10.0ABC123"
sb3 = "abctrued10.0ABC123"
매개변수로 입력된 값을 문자열로 변환하여 StringBuffer 인스턴스가 저장하고 있는 문자열의 뒤에 덧붙인다.
int capacity() StringBuffer sb = new StringBuffer(100);
sb.append("abcd");
int bufferSize = sb.capacity();
int stringSize = sb.length();
bufferSize = 100
stringSize = 4
StringBuffer 인스턴스의 버퍼크기를 알려준다.length()는 버퍼에 담긴 문자열의 길이를 알려준다.
char charAt(int index) StringBuffer sb = new StringBuffer("abc");
char c = sb.charAt(2);
c = 'c'
지정된 위치(index)에 있는 문자를 반환한다.
StringBuffer delete(int start, int end) StringBuffer sb = new StringBuffer("01234");
StringBuffer sb2 = sb.delete(2, 3);
sb = "014"
sb2 = "014"
시작위치(start)부터 끝 위치(end) 사이에 있는 문자를 제거한다. 단 끝 위치의 문자는 제외
StringBuffer deleteCharAt(int index) StringBuffer sb = new StringBuffer("01234");
sb.deleteCharAt(3);
sb = "0124"
지정된 위치(index)의 문자를 제거한다.
StringBuffer insert(int pos, boolean b)
StringBuffer insert(int pos, char c)
StringBuffer insert(int pos, char[] str)
StringBuffer insert(int pos, double d)
StringBuffer insert(int pos, float f)
StringBuffer insert(int pos, int i)
StringBuffer insert(int pos, long l)
StringBuffer insert(int pos, Object obj)
StringBuffer insert(int pos, String str)
StringBuffer sb = new StringBuffer("01234");
sb.insert(2, '.');
sb = "01.234"
두 번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos)에 추가한다. pos는 0부터 시작
int length() StringBuffer sb = new StringBuffer("01234");
int length = sb.length();
length = 5
StringBuffer 인스턴스에 저장되어 있는 문자열의 길이를 반환한다.
StringBuffer replace(int start, int end, String str) StringBuffer sb = new StringBuffer("01234");
sb.replace(1, 3, "AB")
sb = "0AB4"
지정된 범위(start~end)의 문자들을 주어진 문자열로 바꾼다. end위치의 문자는 범위에 포함되지 않는다.
StringBuffer reverse() StringBuffer sb = new StringBuffer("01234");
sb.reverse();
sb = "43210"
StringBuffer 인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열한다.
void setCharAt(int index, char ch) StringBuffer sb = new StringBuffer("01234");
sb.setCharAt(2, 'o');
sb = "01o34"
지정된 위치의 문자를 주어진 문자(ch)로 바꾼다.
void setLength(int newLength) StringBuffer sb = new StringBuffer("01234");
sb.setLength(3);

StringBuffer sb2 = new StringBuffer("01234");
sb2.setLength(10);
String str = sb2.toString().trim();

sb = "012"
sb2 = "01234     "
str = "01234"
지정된 길이로 문자열의 길이를 변경한다.
길이를 늘리는 경우에 나머지 빈 공간을 널문자 '\u0000'로 채운다.
String toString() StringBuffer sb = new StringBuffer("01234");
String str = sb.toString()
str = "01234"
StringBuffer 인스턴스의 문자열을 String으로 변환
String subString(int start)
String subString(int start, int end)
StringBuffer sb = new StringBuffer("01234");
String str = sb.substring(1);
String str2 = sb.substring(1,3);
str = "1234"
str2 = "12"
지정된 범위 내의 문자열을 String으로 뽑아서 반환한다. 시작위치(start)만 지정하면 시작위치부터 문자열 끝까지 뽑아서 반환한다.

 

 

3-6. StringBuilder 클래스

  • StringBuffer는 동기화되어 있다. 멀티 쓰레드에 안전(thread-safe)
  • 멀티 쓰레드 프로그램이 아닌 경우, 동기화는 불필요한 성능 저하
    이럴 땐 StringBuffer 대신 StringBuilder를 사용하면 성능 향상

4. Math

4-1. Math 클래스

  • 수학 관련 static메서드의 집합
public static final double E = 2.7182818284... // 자연로그
public static final double PI = 3.1415926535... // 원주율

4-2. Math 클래스의 메서드

메서드 / 설명 예제 결과
static double abs(double a)
static float abs(float f)
static int abs(int f)
static long abs(long f)
int i = Math.abs(-10);
double d = Math.abs(-10.0);
i = 10
d = 10.0
주어진 값의 절대값을 반환한다.
static double ceil(double a)
double d = Math.ceil(10.1);
double d2 = Math.ceil(-10.1);
double d3 = Math.ceil(10.000015);
d = 11.0
d2 = -10.0
d3 = 11.0
주어진 값을 올림하여 반환한다.
static double floor(double a)
double d = Math.floor(10.8);
double d2 = Math.floor(-10.8);
d = 10.0
d2 = -11.0
주어진 값을 버림하여 반환한다.
static double max(double a, double b)
static float max(float a, float b)
static int max(int a, int b)
static long max(long a, long b)
double d = Math.max(9.5, 9.50001);
int i = Math.max(0, -1);
d = 9.50001
i = 0
주어진 두 값을 비교하여 큰 쪽을 반환한다.
static double min(double a, double b)
static float min(float a, float b)
static int min(int a, int b)
static long min(long a, long b)
double d = Math.min(9.5, 9.50001);
int i = Math.min(0, -1);
d = 9.5
i = -1
주어진 두 값을 비교하여 작은 쪽을 반환한다.
static double random()
double d = Math.random();
int i = (int)(Math.random()*10)+1;
0.0 <= d < 1.0
1 <= i < 11
0.0~1.0 범위의 임의의 double값을 반환한다.
(1.0은 범위에 포함되지 않는다.)
static double rint(double a) double d = Math.rint(1.2);
double d2 = Math.rint(2.6);
double d3 = Math.rint(3.5);
double d4 = Math.rint(4.5);
d = 1.0
d2 = 3.0
d3 = 4.0
d4 = 4.0
주어진 double값과 가장 가까운 정수값을 double형으로 반환한다. 단, 두 정수가 정가운데 있는 값(1.5, 2.5, 3.5 등)은 짝수를 반환.
static long round(double a)
static long round(float a)
long l = Math.round(1.2);
long l2 = Math.round(2.6);
long l3 = Math.round(3.5);
long l4 = Math.round(4.5);
double d = 90.7552
double d2 = Math.round(d*100)/100.0;
l = 1
l2 = 3
l3 = 4
l4 = 5
d = 90.7552
d2 = 90.76
소수점 첫째자리에서 반올림한 정수값(long)을 반환한다. 두 정수의 정가운데 있는 값은 항상 큰 정수를 반환.

5. 래퍼(wrapper) 클래스

5-1. 래퍼클래스

  • 8개의 기본형을 객체로 다뤄야할 때 사용하는 클래스
public final class Integer extends Number implements Comparable {
    ...
    private int value; //기본형을 감싸고 있음
    ...
}
기본형 래퍼클래스 생성자 활용 예
boolean Boolean Boolean(boolean value)
Boolean(String s)
Boolean b = new Boolean(true);
Boolean b2 = new Boolean("true");
char Character Character(char value) Character c = new Character('a');
byte Byte Byte(byte value)
Byte(String s)
Byte b = new Byte(10);
Byte b2 = new Byte("10");
short Short Short(short value)
Short(String s)
Short s = new Short(10);
Short s2 = new Short("10");
int Integer Integer(int value)
Integer(String s)
Integer i = new Integer(100);
Integer i2 = new Integer("100");
long Long Long(long value)
Long(String s)
Long l = new Long(100);
Long l2 = new Long("100");
float Float Float(double value)
Float(float value)
Float(String s)
Float f = new Float(1.0);
Float f2 = new Float(1.0f);
Float f3 = new Float("1.0f");
double Double Double(double value)
Double(String s)
Double d = new Double(1.0);
Double d2 = new Double("1.0");

 

5-2. Number 클래스

  • 모든 숫자 래퍼 클래스의 조상

 

5-3. 오토박싱 & 언박싱

  오토박싱  
  ---------->  
int                                                  Integer
  <----------  
  언박싱  
  • JDK1.5 이전에는 기본형과 참조형간의 연산이 불가능
  • 기본형의 값을 객체로 자동변환하는 것을 오토박싱, 그 반대는 언박싱
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(10);                // 오토박싱. 10 -> new Integer(10)

int value = list.get(0);     // 언박싱. new Integer(10) -> 10

 


References

https://github.com/castello/javajungsuk_basic

 

GitHub - castello/javajungsuk_basic: 자바의 정석 기초편 관련 자료입니다.

자바의 정석 기초편 관련 자료입니다. Contribute to castello/javajungsuk_basic development by creating an account on GitHub.

728x90
반응형