Java/java

java :) clone()메소드( + interface Cloneable)

euncheol kim 2022. 3. 13. 19:54

goal

clone() 메서드에 대해서 이해한다.

 


1] clone() 메소드

  • clone()메소드는 해당 인스턴스를 복제하여, 새로운 인스턴스를 생성해 반환한다.
  • 하지만, Object클래스의 clone()메소드는 단지 필드의 값만을 복사하므로, 필드의 값이 배열이나 인스턴스면 제대로 복제할 수 없다.
  • 따라서 이러한 경우에는 해당 클래스에서 clone() 메소드를 오버 라이딩하여, 복제가 제대로 이루어지도록 재정의한다.

 

1. 예제 코드

출처 : http://www.tcpschool.com/java/java_api_object

 

package first_package;

import java.lang.Cloneable;
import java.util.ArrayList;

class Car implements Cloneable{
    private String modelName;
    private ArrayList<String> owners = new ArrayList<String>();

    public String getModelName() {return this.modelName;}
    public void setModelName(String modelName) {this.modelName = modelName;}

    public ArrayList getOwners() {return this.owners;}
    public void setOwners(String ownerName) {this.owners.add(ownerName);}

    public Object clone() {
        try {
            Car clonedCar = (Car)super.clone();
            //clonedCar.owners = (ArrayList)owners.clone();

            return clonedCar;
        } catch(CloneNotSupportedException ex) {
            ex.printStackTrace();
            return null;
        }
    }

}


public class clonePractice {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Car car01 = new Car();

        car01.setOwners("홍길동");
        car01.setModelName("아반떼");
        System.out.println(car01.getModelName() + car01.getOwners());

        Car car02 = (Car)car01.clone();
        car02.setOwners("이순신");
        System.out.println("car01 객체 : " + car01.getModelName() + car01.getOwners());
        System.out.println("car02 객체 : " + car02.getModelName() + car02.getOwners());


    }

}

 

2. 텍스트로 보는 클래스 가시화

  1. 내 맘대로 알아보기 위한 가시화
    • 추후에 UML에 대해서 포스팅할 예정 (UML과 전혀 관계없다. 내 맘대로 가시화 했을 뿐...)
클래스명 상속관계

변수(멤버변수)


메소드
clonePractice   Car01 : Car
Car02 : Car
 
Car interface :: Cloneable      -modelName: String
-owners: ArrayList<string>      
+getModelName() : String
+setModelName(modelName: String): void
+getOwners(): ArrayList
+setOwners(ownerName: String): void
+clone(): Object .... overriding

 

3. 출력 결과

  • 19번째 라인이 주석인 경우 :
  • 19번째 라인의 주석을 풀 경우 :
  • image

4. 설명

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

java :) generic method  (0) 2022.03.14
java :) generic class의 이해  (0) 2022.03.13
java :) interface  (0) 2022.03.13
java :) 20220311 java 복습  (0) 2022.03.11
java :) 참조변수 캐스팅이 안 되는 경우  (0) 2022.03.09