... | ... | @@ -1083,4 +1083,33 @@ class Program |
|
|
깊은 복사와 얕은 복사의 차이는 대입할 때 나타난다. 깊은 복사는 값 타입의 경우에 메모리가 똑같이 복사되서 값의 변경이 있더라도 서로 영향을 미치지 않는다. 반면 얕은 복사는 참조 타입의 경우라 참조 주소만을 복사한다. 그래서 값의 변경이 일어나면 다른 곳에서도 원치 않는 값의 변경이 있을 수 있다.
|
|
|
|
|
|
깊은 복사는 메모리를 복사하기 때문에 그런 경우를 막을 수 있지만, 크기가 큰 메모리 같은 경우엔 그 크기 단위로 복사하기 때문에 부담을 줄 수 있다.
|
|
|
단면 |
|
|
반면에 얕은 복사는 참조 주소값만 복사하면 되므로 그 부분에선 더 좋은 성능을 보여준다.
|
|
|
|
|
|
**구조체와 클래스를 선택하는 기준**
|
|
|
1. 일반적으로 모든 사용자 정의 타입은 클래스로 구현한다.
|
|
|
2. 깊은/얕은 복사의 차이가 민감한 타입은 선택적으로 구조체로 구현한다.
|
|
|
3. 참조 형식은 나중에 배울 GC에 의해 관리받게 된다. 따라서 참조 형식을 사용하는 경우 GC에 부담이 되는데 이런 부하를 피해야 하는 경우에는 구조체를 선택한다.
|
|
|
|
|
|
#### ref 예약어
|
|
|
* 값에 의한 호출 : 메서드의 인자 전달 시 변수의 스택 값이 복사되어 전달되는 것을 말한다.
|
|
|
* 참조에 의한 호출 : 해당 변수의 스택 값을 담고 있는 주소 자체가 전달되는 것을 말한다.
|
|
|
|
|
|
그래서 참조에 의한 호출이 얕은 복사와 비슷해 보이지만 차이점은 얕은 복사는 스택 내에 새로운 공간을 할당하고 그 공간이 같은 주소를 가리키고 있다는 것이고, 참조에 의한 호출은 동일한 공간을 참조한다는 점이 다르다. 그림을 보면 차이점이 확실히 드러난다.
|
|
|
|
|
|
다음은 얕은 복사와 참조에 의한 호출을 비교한 그림이다.
|
|
|
얕은 복사에 대한 그림이다.
|
|
|

|
|
|
|
|
|
참조에 의한 호출에 대한 그림이다.
|
|
|

|
|
|
|
|
|
>ref 인자로 전달하려는 변수는 new나 null이나 그 외의 어느 값이든 초기화가 되어야 전달이 가능하다.
|
|
|
|
|
|
#### out 예약어
|
|
|
1. out으로 지정된 인자에 넘길 변수는 초기화하지 않아도 된다. 초기화돼 있어도 out 인자를 받는 메서드에서는 그 값을 사용할 수 없다.
|
|
|
2. out으로 지정된 인자를 받는 메서드는 반드시 변수에 값을 넣어서 반환해야 한다.
|
|
|
|
|
|
결국 ref 예약어는 기존 변수를 메서드 내에서 수정하려 할 때 사용하고, out 예약어는 메서드 내에서 수정된 값을 반환하려 할 때 사용한다.
|
|
|
|
|
|
#### 열거형
|
|
|
|