Practice makes perfect
[JAVA] Object 클래스 본문
Object 클래스
- java.lang 패키지에 포함합니다.
- 모든 클래스의 수퍼 클래스 입니다.
- 모든 클래스에 강제 상속합니다.
- 모든 객체가 공통으로 가지는 객체의 속성을 나타내는 메소드 보유하고 있습니다.
예시)
class Point {
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class ObjectPropertyEx {
public static void print(Object obj) {
System.out.println(obj.getClass().getName()); // 클래스 이름
System.out.println(obj.hashCode()); // 해시 코드 값
System.out.println(obj.toString()); // 객체를 문자열로 만들어 출력
System.out.println(obj); // 객체 출력
}
public static void main(String [] args) {
Point p = new Point(2,3);
print(p);
}
}
출력값:
Point
366712642
Point@15db9742
Point@15db9742
● String toString()
: 객체를 문자열로 변환하며 , Object 클래스에 구현된 toString()이 반환하는 문자열 입니다.
class Point {
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public String toString() {
return "Point(" + x + "," + y + ")";
}
}
public class ToStringEx {
public static void main(String [] args) {
Point p = new Point(2,3);
System.out.println(p.toString());
System.out.println(p); // p는 p.toString()으로 자동 변환
System.out.println(p + "입니다."); // p.toString() + "입니다"로 자동 변환
}
}
결과값 :
Point(2,3)
Point(2,3)
Point(2,3)입니다.
Point 클래스에 Point 객체를 문자열로 리턴하는 toString() 메소드를 작성하였습니다.
p.toString(); 과 p(); 이 동일하게 출력됩니다. (Point 객체를 문자열로 리턴하는 toString() 작성)
● finalize 메소드
: 인스턴스가 완전히 소멸되기 직전 호출되는 메소드로서, Object 클래스의 멤버이므로 모든 인스턴스에는 이 메소드가 존재합니다.
finalize : heap에 담긴 인스턴스를 소멸하기 직전에 호출되는 명령어입니다. 마지막으로 구현하고 싶은 기능을 사용하고 인스턴스가 소멸되는데 java가 자동으로 finalize 를 호출하는 그 메서드를 override 해서 마지막 기능을 수행합니다.
package Object_Class.exam01;
class MyName /*extends Object*/{
String name;
MyName(String name){
this.name = name;
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println(name + "이/가 소멸되었습니다.");
}
위의 코드를 소스코드로 활용하여 아래의 Main method에 fianlize method 를 실행 보겟습니다.
package Object_Class.exam01;
public class ObjectFinalize {
public static void main(String[] args) {
System.out.println("프로그램 시작.");
MyName obj1 = new MyName("인스턴스1");
obj1 = null;
System.gc();
// garbage collection
- interupt할 시간이 되지 않았더라도 소멸할 인스턴스가 있는지 찾으러 갑니다.
/*
출력 값:
프로그램 시작.
프로그램 종료.
인스턴스1이/가 소멸되었습니다.
System.runFinalization();
먼저 프로그램이 종료 되지 않고 finalize가 수행되도록 한다.
/*
프로그램 시작.
인스턴스1이/가 소멸되었습니다.
프로그램 종료.
*/
System.out.println("프로그램 종료.");
}
}
프로그램은 순차적으로 진행되는데 주기적으로 참조 변수들을 관찰하여 참조변수에 null 값이 수행된 것이 있는지 확인합니다. 인스턴스를 바라보는 참조 변수가 여러개가 있는지 일정시간 동안 확인을 하고 확실해지면 소멸시키게 됩니다.
그렇기 때문에 System.gc(); 결과 값이 다르게 나올 수 있습니다.
System.runFinalization(); 을 사용하여 먼저 프로그램이 종료 되지 않고 finalize 가 수행되도록 합니다.
● equals method
: java에서 인스턴스간의 내용비교를 목적으로 만들어놓은 메소드로, Object 클래스에 equals 메소드를 정의해 놓았습니다.
● clone method
: Object 클래스에 인스턴스의 복를 목적으로 만들어놓은 메소드로, 이 메소드는 Cloneable 인터페이스를 구현하는 클래스의 인스터스에서만 호출이 될 수 있습니다.
package Object_Class.exam03;
class Point implements Cloneable{
private int xPos;
private int yPos;
Point(int x, int y){
this.xPos = x;
this.yPos = y;
}
public void showPosition(){
System.out.printf("( %d , %d )\n", xPos, yPos);
}
@Override
protected Object clone() throws CloneNotSupportedException { // 모든 자료형들이 복사 될 수 있기 떄문에 최상위 부모 class 인 Object 로 관리하도록 범용적으로 만들기 위해서 자료형이 Object 이다.
return super.clone();
// return super.clone(); heap 영역에 복사해서 만들어둔 clone 내용의 주소값이 return 된다.
}
}
CloneNotSupportedException 예외에 대한 처리할 수 있는 try / catch 문으로 감싸줘야지 수행할 수 있습니다.
복사 하기 위해서는 허락을 받아야 하는데, 허용한다는 의미로 class Point implements Cloneable 넣어줍니다.
= Cloneable 는 이름만 가진 interface 입니다.
package Object_Class.exam03;
public class ObjectClone {
public static void main(String[] args) {
Point org = new Point(3,5);
Point copy = null;
System.out.println(org);
// 출력 값 : exam04.Point@15db9742
// (해시코드: 일련번호)toString method 에 의해서 출력된 값.
try {
copy = (Point)org.clone();
org.showPosition();
copy.showPosition();
} catch (CloneNotSupportedException e) {
System.out.println("예외 발생");
}
}
}
org 가 implements Cloneable 되어있으면 true 값으로 복사가 되고, 그렇지 않으면 clone 으로 부터 예외를 발생시키도록 되어 있습니다. 이는 보안을 확실하게 하기 위함입니다.
여기서 clone의 반환형이 Object이므로 최종적으로 Object 가 반환되지만 강제형변환을 통해서 참조변수에 담도록 해줍니다.
} // 반환형은 Object 이므로 최종적으로 Object가 반환되지만 강제형변환 하여 참조변수에 담아준다.
// clone 은 인스터스에 대한 복사를 한다. (Point)
// 복사 하기 위해서는 허락을 받아야 하는데, 허용한다는 의미로 class Point implements Cloneable 넣어준다. = Cloneable 는 이름만 가진 interface 이다.
// 다른 method이 들어 있지 않은 interface 표시용으로 사용(이름만 가지고 있는 interface)
} // 반환형은 Object 이므로 최종적으로 Object가 반환되지만 강제형변환 하여 참조변수에 담아준다.
} // 반환형은 Object 이므로 최종적으로 Object가 반환되지만 강제형변환 하여 참조변수에 담아준다.
'빅데이터 > JAVA' 카테고리의 다른 글
[JAVA] Calendar 클래스, Date 클래스 , Random 클래스 (0) | 2020.05.17 |
---|---|
[JAVA] Wrapper 클래스 (0) | 2020.05.17 |
[JAVA] 예외처리 (0) | 2020.05.15 |
[JAVA] Abstract 클래스, Interface (0) | 2020.05.13 |
[JAVA] 메서드 오버라이딩(Method Overriding) , Instanceof연산자 (0) | 2020.05.07 |