ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [모각코] 2회차 - JAVA 복사생성자(Copy Constructor)
    학교생활/22-2 '모여서 각자 코딩' 2022. 10. 12. 20:53
    728x90

    객지프 헬퍼로서 광부 문제를 풀다가..

    코드를 이쁘게 짜기 위해 Pair Object 를 만들고..

    더 이쁘게 짜기 위해 copy constructor 까지 만들다가..

     

    c++ 에서 배운거 자바로 복습이나 해볼려구요

     

    final class A{
        int a;
    
        public A(int a){
            this.a = a;
        }
    
        public A(A a){
            this.a = a.a;
        }
    
        public int getA() {
            return a;
        }
    }

     

    class A 에 기본적인 constructor 와 copy constructor 를 만들어줌

     

    A a = new A(10);
    System.out.println(a.getA()); // 10
    
    A a_copyA = new A(a);
    System.out.println(a_copyA.getA()); // 10

     

    A a_copyA 는 객체 A a 를 복사함

     

    a_copyA 는 a 를 shallow copy 했을까요 deep copy 했을까요

     

     

     

     

    얕.복인지 깊.복인지 모를 a.copyA 의 필드 int a 값을 20으로 바꿔 봅시다

    a_copyA.a = 20; 
    System.out.println(a.getA()); // 10
    System.out.println(a_copyA.getA()); // 20

     

    a.getA() 는 10, a_copyA.getA() 는 20 으로 솔플하네요

     

    깊은 복사가 되었습니다!!

     

    https://taeinsoft.com/java/java-deep-shallow-copy/ 에서의

    """

    int, float, double과 같은 기초 변수 이외의 모든 참조변수는 new 연산자를 이용하여 객체를 새로 생성하고, 내용물을 복사하게 만들어야 합니다.

    """

    에서 int는 shallow copy 일 것같은 '=' 으로도 깊은 복사가 되는게 맞나? 라는 궁금증이 풀렸습니다.

     

     

     

     

     

     

    이번엔 반대로 a.a 의 값을 바꿔도 a_copy.a 의 값이 바뀌지 않는지 어디한번 봅시다

    a.a = 100;
    System.out.println(a.getA()); // 100
    System.out.println(a_copyA.getA()); // 20

    네 안바뀐다고 하네요

     

     

     

     

     

    A a_copy 객체를 A a 의 필드값으로 업데이트 해봅시다

    a_copyA = new A(a);
    System.out.println(a_copyA.getA()); // 100

    네 되었다고 하네요

     

     

     

     

     


    자바에서 .clone() 은 모종의 이유로

    오버라이딩해서 메서드를 재정의 라는 것을 추천하지 않습니다.

     

    따라서 copy constructor 로 구현하는 것을 추천합니다.

     

    라는 것을 이번에 광부 풀면서 알게됨

    지식+1

    따봉

     

     

     

     

    728x90
Designed by Tistory.