Practice makes perfect

[JAVA] Object 클래스 본문

빅데이터/JAVA

[JAVA] Object 클래스

kerpect 2020. 5. 17. 00:15
728x90
반응형
SMALL

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 가 반환되지만 강제형변환을 통해서 참조변수에 담도록 해줍니다.

 

 

 

 // org 가 implements Cloneabl 되어 있으면 true 값으로 복사가 되고, 그렇지 않으면 clone으로 부터 예외를 발생시키도록 되어 있다.(보안을 확실하게 하기 위함이다.)
  } // 반환형은 Object 이므로 최종적으로 Object가 반환되지만 강제형변환 하여 참조변수에 담아준다.
// CloneNotSupportedException 예외에 대한 처리할 수 있는 try / catch 문으로 감싸줘야지 수행할 수 있다.
    // clone 은 인스터스에 대한 복사를 한다. (Point)
 // 복사 하기 위해서는 허락을 받아야 하는데, 허용한다는 의미로 class Point implements Cloneable 넣어준다.  = Cloneable 는 이름만 가진 interface 이다.
 // 다른 method이 들어 있지 않은 interface  표시용으로 사용(이름만 가지고 있는 interface)

 

org 가 implements Cloneabl 되어 있으면 true 값으로 복사가 되고, 그렇지 않으면 clone으로 부터 예외를 발생시키도록 되어 있다.(보안을 확실하게 하기 위함이다.)
    // org 가 implements Cloneabl 되어 있으면 true 값으로 복사가 되고, 그렇지 않으면 clone으로 부터 예외를 발생시키도록 되어 있다.(보안을 확실하게 하기 위함이다.)
  } // 반환형은 Object 이므로 최종적으로 Object가 반환되지만 강제형변환 하여 참조변수에 담아준다.
    // org 가 implements Cloneabl 되어 있으면 true 값으로 복사가 되고, 그렇지 않으면 clone으로 부터 예외를 발생시키도록 되어 있다.(보안을 확실하게 하기 위함이다.)
  } // 반환형은 Object 이므로 최종적으로 Object가 반환되지만 강제형변환 하여 참조변수에 담아준다.

 

728x90
반응형
LIST