19.04.14 객체 소멸자, 객체 비교, 동등 비교 등
-객체 소멸자-
참조하지 않는 배열이나 객체는 쓰레기 수집기(Garbage Collector)가 힙 영역에서 자동적으로 소멸시킨다.
쓰레기 수집기는 객체를 소멸시키기 직전에 마지막으로 객체의 소멸자(finalize())를 실행시킨다.
소멸자는 기본적으로 실행 내용이 없다.
-객체 비교-
Objects.compare(T a,T b, Comparator<T>c) 메소드는 두 객체를 비교자(Comparator)로 비교해서 int값을 리턴한다.
-동등 비교-
Objects.equals (Object a, Object b)는 두 객체의 동등을 비교한다.
특이한 점은 a와 b가 모두 null일 경우 true를 리턴한다는 점이다.
a와 b가 null이 아닌경우는 a.equals(b)의 결과를 리턴한다.
-쓰레기 수집기 (Garbage Collector)-
메모리가 부족하거나 CPU가 한가할때 사용하지 않는 객체를 자동 제거.
-currentTimeMillis(), nanoTime() 메소드-
currentTimeMillis() : 컴퓨터의 시계로 부터 현재 시간을 읽어서 밀리세컨드(1/1000초) 단위의 long값을 리턴
nanoTime() : 컴퓨터의 시계로 부터 현재 시간을 읽어서 나노세컨드(1/10^9초) 단위의 long값을 리턴
-시스템 프로퍼티-
자바를 실행시켰을때 자동 설정되는 시스템의 속성값을 말한다.
(ex 운영체제의 종류, 자바프로그램을 실행시킨 사용자 아이디, 자바 버전, 파일경로 등)
시스템 프로퍼티를 읽어오기 위해서는 System.getProperty() 메소드를 이용하면 된다.
-동적 객체 생성(newlnstance())-
Class 객체를 이용하면 new 연산자를 이용하지 않아도 동적으로 객체를 생성할 수 있다. 이 방법은 코드 작성 시에
클래스 이름을 결정할 수 없고, 런타임 시에 클래스 이름이 결정되는 경우에 사용된다.
-깊은 복제-
깊은 복제란 참조하고 있는 객체도 복제하는 것을 말한다.
-예제 및 출력-
1
2
3
4
5
6
7
8
9
10 |
package com.hs.chap11;
public class Car {
public String model;
public Car(String model) {
this.model = model;
}
}
|
cs |
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 |
package com.hs.chap11;
import java.util.Arrays;
public class Member implements Cloneable {
public String name;
public int age;
public int[] scores;
public Car car;
public Member(String name, int age, int[] scores, Car car) {
this.name = name;
this.age = age;
this.scores = scores;
this.car = car;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// 먼저 얕은 복사를 해서 name, age를 복사한다.
Member cloned = (Member) super.clone();
// scores를 깊은 복제 한다.
cloned.scores = Arrays.copyOf(this.scores, this.scores.length);
// car를 깊은 복제 한다.
cloned.car = new Car(this.car.model);
// 깊은 복제된 Member 객체를 리턴
return cloned;
}
public Member getMember() {
Member cloned = null;
try {
cloned = (Member) clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return cloned;
}
}
|
cs |
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 |
package com.hs.chap11;
public class MemberExample {
public static void main(String[] args) {
// 원본 객체 생성
Member original = new Member("홍길동", 25, new int[] { 90, 90 }, new Car("소나타"));
// 복제 객체를 얻은 후에 참조 객체의 값을 변경
Member cloned = original.getMember();
cloned.scores[0] = 100;
cloned.car.model = "그랜저";
System.out.println("[복제 객체의 필드값]");
System.out.println("name: " + cloned.name);
System.out.println("age: " + cloned.age);
System.out.println("scores: {");
for (int i = 0; i < cloned.scores.length; i++) {
System.out.print(cloned.scores[i]);
System.out.print((i == (cloned.scores.length - 1)) ? "" : ",");
}
System.out.println("}");
System.out.println("car: " + cloned.car.model);
System.out.println();
System.out.println("[원본 객체의 필드값]");
System.out.println("name: " + original.name);
System.out.println("age: " + original.age);
System.out.println("scores: {");
for (int i = 0; i < original.scores.length; i++) {
System.out.print(original.scores[i]);
System.out.print((i == (original.scores.length - 1)) ? "" : ",");
}
System.out.println("}");
System.out.println("car: " + original.car.model);
}
}
|
cs |