LostCatBox

Java 배우기 CH09

Word count: 1.1kReading time: 6 min
2022/12/23 Share

Object클래스

  • 모든 클래스의 최고 조상 오직 11개의 메서드만을 가지고 있다.
  • notify(), wait()등은 쓰레드와 관련된 메서드다
  • getClass()는 자동으로 만들어지며, 객체 자신의 클래스 정보를 담고있는 Class인스턴스를 반환한다(=객체정보==설계도 정보)

Untitled

equals()

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

Untitled

  • 따라서 equals() 의도대로 사용하고싶다면 오버라이딩 필수
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Ex9_1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);

if (v1.equals(v2))
System.out.println("v1과 v2는 같습니다.");
else
System.out.println("v1과 v2는 다릅니다.");
} // main
}

class Value {
int value;

Value(int value) {
this.value = value;
}

public boolean equals(Object obj) {
// return this ==obj; // 주소비교. 서로다른 객체는 항상거짓.
// 참조변수의 형변환 전에는 반드시 instanceof로 확인해야함!
if (!(obj instanceof Value)) {
return false;
}
Value v = (Value) obj;

return this.value == v.value;
}
}

equals(Object obj)의 오버라이딩

  • 인스턴스 변수(iv)의 값을 비교하도록 equals()를 오버라이딩해야한다.
  • cv는 객체마다공통, iv는 객체마다다름

Untitled

hashCode()

  • 객체의 해시코드(hashCode())를 반환하는 메서드
  • Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
    객체의 주소를 int로 반환하여! 객체의 지문 역할함

네이티브(native) 메서드: OS의 메서드(C언어)

  • equals()를 오버라이딩하면, hashCode()로 오버라이딩해야한다.
    • 원래 둘다 주소를 가지고 판단함!!.
    • iv를 가지고 판단원할경우 오버라이딩 둘다해야함
  • equals()의 결과가 true인 두 객체의 해시코드는 같아야하기 때문이다.( 무조건 equals()와 hashCode() 결과는 같아야함. 무조건)
  • System.identityHashCode(Object obj)
    Object클래스의 hashCode()동일
    객체마다 다른 해시코드 반환

toString(), to String()의 오버라이딩

  • toString()
    객체를 문자열(String)으로 변환하기 위한 메서드
  • 원래의 toString()의 정의는 다음과같다

Untitled

  • 하지만 문자열에서 비교시 유용하지못하다.
  • 객체는 iv의 모음인데,
    객체를 문자열로 변환한다== iv를 문자열로 변환 개념이 더 자연스러움
  • 따라서 다음과같이 toString오버라이딩

Untitled

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import java.util.Objects;

class Card {
String kind;
int number;

Card() {
this("SPADE", 1);
}

Card(String kind, int number) {
this.kind = kind;
this.number = number;
}

//Object클래스의 toString()을 오버라이딩
public String toString() {
return "kind:"+ kind +",number:"+number;

}
public boolean equals(Object obj) {
if(!(obj instanceof Card))
return false;

Card c = (Card)obj;

// kind는 String이므로 반드시 equals()사용하
return this.kind.equals(c.kind) && this.number == c.number;
}
//equal()를오버라이딩했으므로 hashCode()도 오버라이딩 해야함
// int hash() 함수 가변인자라서 호출시 지정하는 값개수 상관없
public int hashCode() {
return Objects.hash(kind, number);
}
}

class Ex9_4 {
public static void main(String[] args) {
Card c1 = new Card();
Card c2 = new Card();

// 같은 카드라고 인식 필요하므로 toString() 오버라이딩 필

System.out.println(c1.toString());
System.out.println(c2.toString());
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());


//equals()도 오버라이딩 필요함.
if (c1.equals(c2))
System.out.println("오 같");
else
System.out.println("오 틀리");
}
}
  • equals ()오버라이딩 하면 반드시 hashCode()도 결과동일하도록 오버라이딩해야함

String 클래스

  • String클래스 = 데이터(char[])+ 메서드(문자열 관련)

Untitled

  • 내용을 변경할 수 없는 불변(immutable) 클래스
    문자열 결합시, 새로운 객체가 만든후 가르키는 곳이 달라짐
  • 새로운 객체를 만드는 경우 성능이 떨어짐!
  • 문자열의 결합이나 변경이 잦다면, 내용을 변경가능한 StringBuffer를 사용

Untitled

문자열의 비교

  • String str = “abc”와 String str = new String(”abc”) 차이 비교

Untitled

  • String str1 = “abc”에서 리터럴 “abc”의 주소는 하나이며, 참조변수가 이 객체의 주소를 가짐.
  • 문자열은 어차피 바꿀수없는 존재이므로 리터럴을 쓰는게 사용하는 객체가 늘어나지 않아좋다.
  • new 연산자를 활용하면 항상 새로운 객체가 만들어짐
  • 문자열은 비교시 항상 equals()를 활용하자(=iv를 비교!)
    (’==’는 주소비교)

문자열 리터럴

  • 문자열 리터럴은 프로그램 실행시 자동으로 생성된다.
    (constant pool에 저장)(상수저장소)
  • class는 원래 new를 해야하지만 String클래스는 특이함
  • 같은 내용의 문자열 리터럴은 하나만 만들어진다.

Untitled

빈 문자열(””,empty string)

  • 내용이 없는 문자열. 크기가 0인 char형 배열을 저장하는 문자열
1
String str = ""; //str을 빈 문자열로 초기화
  • 길이가 0인 배열을 생성하는 것은 어느 타입이나 가능
1
2
char[] chArr = new char[0]; //길이가 0인 char 배열
int[] iArr = {}; // 길이가 0인 int배열
  • 문자(char)와 문자열(String)의 초기화
    초기화는 빈문자열, 공백으로 하자!

Untitled

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

String클래스의 생성자와 메서드(1/5)

Untitled

String클래스의 생성자와 메서드(2/5)

Untitled

String클래스의 생성자와 메서드(3/5)

Untitled

String클래스의 생성자와 메서드(4/)

Untitled

String클래스의 생성자와 메서드(5/5)

Untitled

문자열, 기본형 변환

join()과 StringJoiner

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

Untitled

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

Untitled

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

Untitled

종합

  • 문자열 → 기본형 시 클래스 마다 valueof로 가능함. (new)

Untitled

StringBuffer 클래스(문자열을 저장&다루기)

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

Untitled

  • 그러나, String과 달리 내용을 변경할 수 있다.(mutable)

Untitled

  • 배열은 길이 변경불가, 공간이 부족하면 새로운 배열 생성해야함(3단계)
  1. 새로운 배열 길이로 생성
  2. 내용 복사
  3. 참조 변경
  • StringBuffer는 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해야함

Untitled

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

Untitled

StringBuffer의 생성자와 메서드(1/4)

Untitled

StringBuffer의 생성자와 메서드(2/4)

Untitled

StringBuffer의 생성자와 메서드(3/4)

Untitled

StringBuffer의 생성자와 메서드(4/4)

Untitled

예제

Untitled

StringBuilder, Math클래스

StringBuilder

  • StringBuilder는 동기화 X
  • StringBuffer는 동기화 되어있다.
    멀티 쓰레드에 안전(thread-safe)

싱글 쓰레드= 한번에 1개 작업
멀티 쓰레드= 한번에 n개 작업 >>데이터 공유됨>> 데이터 보호가 필요하다

  • 멀티 쓰레드 프로그램이 아닌경우, 동기화는 불필요한 성능저하
    이럴 땐 StringBuffer대신 StringBuilder를 사용하면 성능향상

Untitled

Math클래스

  • 수학관련 static메서드의 집합
  • 상수는 두개 포함되어있다. E(자연로그 밑), PI(원주율)
  • round()로 원하는 소수점 아래 세 번째 자리에서 반올림(사용법 숙지!!!)

Untitled

Math클래스의 메서드(1/2)

Untitled

Math클래스의 메서드(2/2)

  • rint는 rounderen 은 짝수가 되도록 반올림종류중하나.
  • round가 원래알고있는 흔한 반올림

Untitled

래퍼클래스와 넘버 클래스

래퍼(wrapper) 클래스

  • 8개의 기본형을 객체로 다뤄야할 때 사용하는 클래스
    (=기본형값을 감싸는 클래스)

Untitled

  • 예제

Untitled

Number클래스

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

Untitled

문자열을 숫자로 변환하기

  • 문자열을 숫자로 변환하는 다양한 방법
  • 래퍼클래스 >> intValue() >> 기본형 전환 가능!!! 꼭 확인하기
    (intValue(), longValue() 이런형식으로 각 래퍼클래스에서 사용가능
  • 다양한 방법!
    (특히 래퍼클래스를 그대로 기본형 변수에 담아도바로 기본형으로 변환가능함)

Untitled

  • 만약 문자열로 모두 바꾸고 싶다면
    String str = b.toString();
    toString()활용하기
  • n진법의 문자열을 (10진수)숫자로 변환하는 방법

Untitled

오토박싱 & 언박싱

  • int >>> Integer로 바꿔줌 오토박싱 (기본형 >>래퍼클래스)(자동)
  • int <<< Integer 로 바꿔줌 언박싱 (기본형<<래퍼클래스)(자동)
  • JDK 1.5이전에는 기본형과 참조형간의 연상이 불가능
  • 언박싱 예시

Untitled

  • 오토박싱 예시

Untitled

  • ArrayList에는 원래는 객체로만 넣어야함.. 하지만 이제는 기본형으로 써도 컴파일러가 자동으로 객체전환하여 넣어준다. 꺼낼때도 자동
  • 아래와 같이 기본형과 참조형 간의 자동변환가능
    (컴파일 전의 코드로 꼭활용하기)
    (원칙적으로는 안되지만, 컴파일러가 오토박싱, 언박심 해줌)

Untitled

CATALOG
  1. 1. Object클래스
    1. 1.1. equals()
      1. 1.1.1. equals(Object obj)의 오버라이딩
    2. 1.2. hashCode()
    3. 1.3. toString(), to String()의 오버라이딩
  2. 2. String 클래스
    1. 2.1. 문자열의 비교
    2. 2.2. 문자열 리터럴
    3. 2.3. 빈 문자열(””,empty string)
    4. 2.4. String클래스의 생성자와 메서드
      1. 2.4.1. String클래스의 생성자와 메서드(1/5)
      2. 2.4.2. String클래스의 생성자와 메서드(2/5)
      3. 2.4.3. String클래스의 생성자와 메서드(3/5)
      4. 2.4.4. String클래스의 생성자와 메서드(4/)
      5. 2.4.5. String클래스의 생성자와 메서드(5/5)
    5. 2.5. 문자열, 기본형 변환
      1. 2.5.1. join()과 StringJoiner
      2. 2.5.2. 숫자를 문자열로 바꾸는 방법
      3. 2.5.3. 문자열을 숫자로 바꾸는 방법
      4. 2.5.4. 종합
    6. 2.6. StringBuffer 클래스(문자열을 저장&다루기)
      1. 2.6.1. StringBuffer의 생성자와 메서드(1/4)
      2. 2.6.2. StringBuffer의 생성자와 메서드(2/4)
      3. 2.6.3. StringBuffer의 생성자와 메서드(3/4)
      4. 2.6.4. StringBuffer의 생성자와 메서드(4/4)
      5. 2.6.5. 예제
  3. 3. StringBuilder, Math클래스
    1. 3.1. StringBuilder
    2. 3.2. Math클래스
      1. 3.2.1. Math클래스의 메서드(1/2)
      2. 3.2.2. Math클래스의 메서드(2/2)
  4. 4. 래퍼클래스와 넘버 클래스
    1. 4.1. 래퍼(wrapper) 클래스
    2. 4.2. Number클래스
  5. 5. 문자열을 숫자로 변환하기
  6. 6. 오토박싱 & 언박싱