JAVA) Object 클래스 - clone 메소드
본문 바로가기
programming/Java

JAVA) Object 클래스 - clone 메소드

by 코딩하는 핑가 2021. 1. 25.
반응형

* 이 포스팅은 hyeonstorage.tistory.com/님의 포스팅과 www.tutorialspoint.com/java/java_object_classes.htm 학습한 뒤 추가로 공부한 후 재정리한 글입니다.

* 2차 가공 및 재배포를 금지합니다.

- 재배포시 출처를 남겨주세요.

* 오탈자 및 잘못된 내용은 댓글달아주세요.

 

0. JAVA 기본 개념

* 자바는 Polymorphism, Inheritance, Encapsulation, Abstraction, Classes, Objects, Instance, Method, Message Passing 의 기능을 가지고 있다.

 

* Object : 객체에는 상태와 동작이 있다. 

- 예 : 개는 꼬리를 흔드는 것, 짖는 것, 먹는 것 등의 상태를 가지고 있다. 그래서 객체는 클래스의 인스턴스다.

 

* Class : 해당 유형의 객체가 지원하는 동작, 상태를 설명하는 템플릿

1. Object 클래스

* Java.lang 패키지

- 자바 프로그램에서 가장 많이 사용되는 패키지

- 자바 프로그램 내에 'import' 문을 사용하지 않아도 자동으로 포함

- java.lang 패키지의 클래스 구조도

출처 : https://hyeonstorage.tistory.com/

 

* Object 클래스

- 자바 API의 모든 클래스와 사용자가 정의한 모든 클래스의 최상위 클래스

- java.lang 패키지 내의 최상위 클래스

- 모든 자바 클래스들은 Object 클래스로부터 상속받음

 

- 주요 메소드

메소드 설명
boolean equals(Object obj) 두 개의 객체가 같은지 비교하여 같으면 true를 같지 않으면 false를 반환
String toString() 현재 객체의 문자열을 반환
protected Object clone() 객체를 복사
protected void finalize() 가비지 컬렉션 직전에 객체의 리소스를 정리할 때 호출
Class getClass() 객체의 클래스형을 반환
int hashCode() 객체의 코드값을 반환
void notify() wait된 스레드 실행을 재개할 때 호출
void wait() 스레드를 일시적으로 중지할 때 호출
void wait(long timeout) 주어진 시간만큼 스레드를 일시적으로 중지할 때 호출
void wait(long timeout, int nanos) 주어진 시간만큼 스레드를 일시적으로 중지할 때 호출


2. Clone()

* Object 클래스에 clone() 메소드가 protected로 정의되어있다.

- 기본적으로 메모리를 복사함

- clone()을 지원하려면 그 클래스는 Cloneable 인터페이스를 implements 해야 함

- clone()을 지원할 클래스라면 Object 클래스에 정의되어있는 protected Object clone() 메서드를 public으로 재정의해서 사용해야 함

 

* 원본 객체의 필드값과 동일한 값을 가지는 새로운 객체를 생성

- 본질적으로 clone 메소드는 또 다른 종류의 생성자나 마찬가지다. 원본 객체에 피해를 주면 안되고, 복제본 객체는 클래스의 불변 규칙을 지켜야함

 

[ 예시 코드 - Deep Copy ]

public class Test{
	public static void main(String[] args) throws CloneNotSupportedException {
    	Parent parent = new Parent();
        
        P.setName("나는 부모의 값");
        Parent child = (Parent) parent.clone();
        
        System.out.println("P의 결과 : " + parent.getName());
        System.out.println("C의 결과 : " + child.getName());
        
        parent.setName("나는 새로운 부모의 값");
        
        System.out.println("P의 결과 : " + parent.getName());
        System.out.println("C의 결과 : " + child.getName());
    
    }
}

[ 결과 ]

P의 결과 : 나는 부모의 값
C의 결과 : 나는 부모의 값
P의 결과 : 나는 새로운 부모의 값
C의 결과 : 나는 부모의 값

 

2-1. 얕은 복사 (Shallow Copy)

* 정의

- 객체를 복사할 때, 해당 객체만 복사하여 새 객체를 생성

- 복사된 객체의 인스턴스 변수는 원본 객체의 인스턴스 변수와 같은 메모리 주소를 참조

- 해당 메모리 주소의 값이 변경되면 원본 객체 및 복사 객체의 인스턴스 변수 값은 같이 변경

출처 : https://yyman.tistory.com

 

public class Test{
	public static void main(String[] args) throws CloneNotSupportedException {
    	Parent parent = new Parent();
        
        P.setName("나는 부모의 값");
        Parent child = Parent;
        
        System.out.println("P의 결과(원본) : " + parent.getName());
        System.out.println("C의 결과(얇은 복사) : " + child.getName());
        
        parent.setName("나는 새로운 부모의 값");
        
        System.out.println("P의 결과(원본) : " + parent.getName());
        System.out.println("C의 결과(얇은 복사) : " + child.getName());
    
    }
}

[ 결과 ]

P의 결과(원본) : 나는 부모의 값
C의 결과(얇은 복사) : 나는 부모의 값

P의 결과(원본) : 나는 새로운 부모의 값
C의 결과(얇은 복사) : 나는 새로운 부모의 값

 

2-2. 깊은 복사 (Deep Copy)

* 정의

- 객체를 복사할 때 해당 객체와 인스턴스 변수까지 복사하는 방식

- 전부를 복사하여 새 주소에 담기 때문에 참조를 공유하지 않는다.

출처 : https://yyman.tistory.com

public class Test{
	public static void main(String[] args) throws CloneNotSupportedException {
    	Parent parent = new Parent();
        
        P.setName("나는 부모의 값");
        Parent child = (Parent) parent.clone();
        
        System.out.println("P의 결과 : " + parent.getName());
        System.out.println("C의 결과 : " + child.getName());
        
        parent.setName("나는 새로운 부모의 값");
        
        System.out.println("P의 결과 : " + parent.getName());
        System.out.println("C의 결과 : " + child.getName());
    
    }
}

[ 결과 ]

P의 결과 : 나는 부모의 값
C의 결과 : 나는 부모의 값
P의 결과 : 나는 새로운 부모의 값
C의 결과 : 나는 부모의 값

 

* 얇은 복사와 깊은 복사 코드 차이

- 얇은 복사 : Parent child = Parent;

- 깊은 복사 : Parent child = (Parent) parent.clone();

반응형

'programming > Java' 카테고리의 다른 글

MyBatis  (0) 2024.01.16
JAVA) MyBatis와 JPA의 차이  (1) 2021.10.05
JAVA) JNDI DB 연결 소스코드  (0) 2021.01.06
JAVA) JDBC 동작 순서 및 DB 연결( 소스코드 포함 ) - 최종  (0) 2021.01.06
JAVA) JDBC, DBCP, JNDI 차이점  (1) 2020.12.31

댓글