참조 타입 - 해당되는 글 1건
@차이점
값 타입과 참조 타입의 근본적인 차이점은 데이터가 저장되는 메모리상의 위치이다. 값 타입은 크기가 작고 고정적이기 때문에 스택에 생성되며 참조 타입은 크고 가변적이기 때문에 동적으로 관리되는 힙에 생성된다. 저장 위치의 차이로 인해서 많은 파생 차이점들이 발생하며 관리하는 방법이나 대입 시의 효과 등이 달라진다.
- 값 타입은 선언만 하면 스택에 즉시 생성되므로 선언 직후부터 데이터를 저장하는 용도로 사용할 수 있다. 하지만 참조 타입은 선언에 의해 참조만 생성될 뿐이지 데이터를 저장할 수 있는 실제 메모리가 할당되는 것은 아니므로 선언 즉시 사용할 수 없다. 반드시 new 연산자로 메모리를 할당받아 초기화해야 한다.
- 데이터 저장에 사용된 기억 장소가 파괴되는 시기가 다르다. 값 타입은 변수를 선언한 메서드가 종료될 때나 소속된 객체가 사라질 때 자동으로 파괴된다. 참조 타입은 더 이상 참조하는 변수가 없을 때 가비지 컬렉터에 의해 파괴된다.
- 같은 타입의 변수로 대입할 때의 효과가 다르다. 값 타입은 복사에 의해 완전한 별개의 사본이 생성되며 복사 한 사본과 원본은 별개의 변수이다. 이 상태에서 사본을 변경해도 원본은 원래 값을 그대로 유지하며 원본을 바꿔도 사본이 변경되지는 않는다. 완전히 다른 두개의 변수가 생성되는 것이다. 이에 비해 참조 타입끼리의 대입은 힙에 할당된 데이터를 참조하는 참조자가 하나 더 늘어날 뿐 별도의 메모리가 추가로 할당되는 것은 아니다. 그래서 둘 중 하나를 변경하면 상대쪽도 같이 변경된다.

@변수의 범주
메서드를 호출할 때 인수로 값 타입과 참조 타입을 모두 전달할 수 있다. 인수 전달이란 메서드의 형식 인수에 호출원의 실인수를 대입하는 것이므로 형식 인수와 실인수의 관계는 앞서 연구해 본 바와 같다. 값 타입은 사본이 전달되며 참조 타입은 참조자가 전달되므로 메서드 내에서 형식 인수를 변경할 때의 효과가 다르다. 다음은 C#의 7개의 변수의 범주이다.
- 지역변수: 메서드의 내부 또는 특정한 {} 블록 내에 선언되는 변수이다. 블록 내에서만 사용되며 별도의 초기값 대입이 없으면 쓰레기 값을 가지며 메서드나 블록이 종료되면 자동으로 사라진다. 메서드가 재귀 호출되면 호출될 때마다 새로 생성된다. 정식 명칭은 블록 범위 변수이다.
- 인스턴스 변수: 클래스 선언문 내에 선언되며 클래스 타입의 객체에 소속된다. 객체가 생성될 때 같이 생성되고 객체가 파괴될 때까지 존재한다. 흔히 필드라고 부르는 멤버 변수가 이 범주에 속한다.
- 정적 변수: 클래스 내에 static 키워드와 함께 선언되며 객체가 아닌 클래스에 소속된다. 정적 변수는 객체가 생성되기 전에 이미 존재하며 프로그램이 종료되어야 사라진다. C의 전역 변수와 비슷한 특성을 가지되 클래스에 소속된다는 점이 다르다. C#에서 진정한 의미의 전역변수는 존재하지 않는다.
- 배열 요소: 배열의 한 요소로 생성된다. 배열이 생성될 때 같이 생성되며 배열이 해제될 때 파괴된다. 선언문에 초기값 목록이 있으면 이 목록대로 초기화되며 그렇지 않으면 디폴트값(보통0)으로 초기화된다.
-값 인수: 메서드의 인수로 선언되며 메서드가 호출될 때 생성된다. 호출원에서 전달한 실인수의 값으로 초기화되며 메서드가 리턴할때 파괴된다.
-참조 인수: 값 인수와 같되 앞에 ref라는 키워드를 붙인다. 실인수의 값으로 초기화되지 않고 실인수를 가리키는 참조자로 초기화된다.
- 출력용 인수: 참조 인수와 같되 앞에 out라는 키워드를 붙인다. 참조 인수로 전달되는 실인수는 반드시 초기화되어야 하지만 출력용 인수는 초기화되지 않아도 상관없다. 메서드는 출력용 인수에 값을 담아 호출원으로 돌려보내며 리턴하기 전에 반드시 대입해야 한다.
저작자 표시
신고
Trackback 0 | Comment 0

강군v's Blog is powered by Daum & tistory

 

티스토리 툴바