2021. 1. 25. 07:45ㆍ개발/C#
변수는 접근제한자를 통해 캡슐화 과정을 수행한다. / 변수는 자료형 타입에 따라 각각 다른 크기를 가진다.
int, bool, char 등의 자료형은 값 타입 / string, class 객체 등의 자료형은 참조 타입
값 타입 같은 경우 (int a = 10; / int b = 20;)
스택에 a라는 변수가 위치하는 곳에 10이라는 값이 들어간다.
a의 메모리 주소를 0xA, b의 메모리 주소를 0xB라고 했을 때,
b = a; 를 진행하면
b의 값은 a와 같이 10이 되지만, 주소는 복사되지 않기 때문에
주소는 그대로 0xA, 0xB가 된다.
-----------------------------------------------------------------------
참조 타입 같은 경우, (string a = "안녕하세요"; / string b = "또만났네요";)
스택에 a의 메모리 주소를 0xA, b의 메모리 주소를 0xB라고 했을 때,
b = a;를 진행하면
b에 a에 들어있는 힙의 주소값을 복사한다.
a 스택 공간에 있는 값 (힙의 주소),
b 스택 공간에 있는 값 (힙의 주소)이 같은 힙의 주소를 가리킨다.
메서드 내부에서 값을 변경하는 형태의 값에 의한 전달은
스택의 주소 (변수) 에 값을 넣게 되므로, 스택이 제거 되면 그 값은 없어지기 때문에
외부에 값을 변경시키지 못하지만,
메서드 내부에서 값을 변경하는 형태의 참조에 의한 전달은
실제 데이터가 위치하는 힙의 주소에 값을 넣게 되므로,
힙은 가비지 컬렉터가 동작하기 전까지 제거 되지 않기 때문에,
외부에 값을 변경시킬 수 있다.
ref , out 키워드를 사용하면 값에 의한 전달을 참조에 의한 전달로 만들 수 있다.
ref는 변수를 전달하기 전에 초기화해야한다.
'개발 > C#' 카테고리의 다른 글
# 델리게이트 (Delegate / 대리자) & 콜백 함수 (0) | 2021.01.25 |
---|---|
# Static (정적) 메서드 (0) | 2021.01.25 |
# Invoke() (인보크 메서드) (0) | 2021.01.25 |
# summary (메서드 등에 설명 붙이기) (0) | 2021.01.25 |
# 이벤트에 이벤트 핸들러를 등록하기 (0) | 2021.01.25 |