๐Ÿค”ย ์–•์€ ๋ณต์‚ฌ

๊ฐ์ฒด์— ์ €์žฅ๋œ ๊ฐ’์„ ๋ณต์ œ

Untitled

๐Ÿค”ย ๊นŠ์€ ๋ณต์‚ฌ

๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Œ๋ฅผ ๋ณต์ œ

Untitled



public class Circle implements Cloneable{
    private Point point;
    private double radius;

    public Circle(Point point, double radius) {
        this.point = point;
        this.radius = radius;
    }

    public Point getPoint() {
        return point;
    }

    public double getRadius() {
        return radius;
    }

    public void setPoint(Point point) {
        this.point = point;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    @Override
    public Circle clone() {
        try {
            return (Circle) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }

    public Circle shallowCopy() {
        return clone();
    }

    public Circle deepCopy() {
        return new Circle(new Point(point.getX(), point.getY()), radius);
    }
}

public class Point{
    private int x;
    private int y;

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
  1. ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜๋ฉด ๋‘˜ ๋‹ค false ์ž…๋‹ˆ๋‹ค.
public class ShallowCopy {
    public static void main(String[] args) {
        Circle circle = new Circle(new Point(1, 1), 2.0);
        Circle copy = circle.shallowCopy();
        System.out.println(circle == copy);
    }
}
public class DeepCopy {
    public static void main(String[] args) {
				Circle circle = new Circle(new Point(1, 1), 2.0);
        Circle copy = circle.deepCopy();
        System.out.println(circle == copy);
		}
}
  1. new Point(2, 2) ๋กœ ์ƒˆ ์ฐธ์กฐ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ์–•์€๋ณต์‚ฌ๋ฅผ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
public class ShallowCopy {
    public static void main(String[] args) {
        Circle circle = new Circle(new Point(1, 1), 2.0);
        Circle copy = circle.shallowCopy();
        circle.setRadius(3.0);
        circle.setPoint(new Point(2, 2));
        System.out.println(circle.getRadius());
        System.out.println(circle.getPoint().getX()+", "+circle.getPoint().getY());
        System.out.println(copy.getRadius());
        System.out.println(copy.getPoint().getX()+", "+copy.getPoint().getY());
    }

}

public class DeepCopy {
    public static void main(String[] args) {
        Circle circle = new Circle(new Point(1, 1), 2.0);
        Circle copy = circle.deepCopy();
        circle.setRadius(3.0);
        circle.setPoint(new Point(2, 2));
        System.out.println(circle.getRadius());
        System.out.println(circle.getPoint().getX()+", "+circle.getPoint().getY());
        System.out.println(copy.getRadius());
        System.out.println(copy.getPoint().getX()+", "+copy.getPoint().getY());
    }
}
  1. radius๋Š” double(primitive type)์ด๋ฏ€๋กœ ๊ฐ’์ด ๋ณต์‚ฌ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
public class ShallowCopy {
    public static void main(String[] args) {
        Circle circle = new Circle(new Point(1, 1), 2.0);
        Circle copy = circle.shallowCopy();
        circle.setRadius(3.0);
        circle.getPoint().setX(2);
        circle.getPoint().setY(2);
        System.out.println(circle.getRadius());
        System.out.println(circle.getPoint().getX()+", "+circle.getPoint().getY());
        System.out.println(copy.getRadius());
        System.out.println(copy.getPoint().getX()+", "+copy.getPoint().getY());
    }

}
-----
3.0
2, 2
2.0
2, 2
-----
public class DeepCopy {
    public static void main(String[] args) {
        Circle circle = new Circle(new Point(1, 1), 2.0);
        Circle copy = circle.deepCopy();
        circle.setRadius(3.0);
        circle.getPoint().setX(2);
        circle.getPoint().setY(2);
        System.out.println(circle.getRadius());
        System.out.println(circle.getPoint().getX()+", "+circle.getPoint().getY());
        System.out.println(copy.getRadius());
        System.out.println(copy.getPoint().getX()+", "+copy.getPoint().getY());
    }
}
-----
3.0
2, 2
2.0
1, 1
-----