훈스 C# 스터디 5주차 - CLR의 동작 , 메모리 관리, Boxing, UnBoxing, Generic
글 작성자: 써니루루
어제(2009-03-10) 훈스 C# 스터디 5주차 - CLR의 동작 , 메모리 관리, Boxing, UnBoxing, Generic에 관한 내용으로 한국 Microsoft 5층에서 조별 발표와 김시원 멘토님의 세미나가 있었습니다.
아래는 그 내용을 개인적으로 정리한 내용입니다.
조별 과제 발표
- A조 Boxing과 UnBoxing
-
C#의 데이터 형식은 값 & 참조 형식이 있다.
- 값 형식은 스택값이 저장된다.
- 참조형식은 힙에 데이터가 그의 위치를 참조하는 위치를 스택에서 기억한다.
-
예)
- int i = 123;
- object o = i; // boxing
- int j = (int)i; // unboxing
-
예) ArrayList, Generic List<T>
- B조 Boxing과 UnBoxing
- Boxing : val 타입을 ref 타입으로 변경하는 행위를 말함
- UnBoxing : ref 타입을 val 타입으로 변경
- Generic : C++의 템플릿과 비슷
- 성능 저하와 형식 불안정성의 단점을 극복하기 위해 새롭게 추가된 언어적 특징
-
형식의 안정성을 받는다
- C조 Boxing과 UnBoxing & Generic
- 값 타입 과 참조 타입이 서로 형 변환을 가능하게 만들어주는 기법
-
Boxing : 값 타입의 값을 참조 타입 형식으로 힙 영역에 저장하게 됨
- Data의 Type은 Object에서 상속받아 시작되기 때문에 가능하다
- 메모리 공간의 낭비 초래
- ArrayList를 사용하여 낭비됨
-
Boxing Unboxing이 일어나지 않도록 하려면?
- 모두 참조 타입으로 만들자 : 안된다
- Generic을 사용한다.
-
Generic : Type independent 한 코드를 작성하도록 함
- D조 Boxing과 Unboxing
- Boxing : value 타입 변수를 object형 힙 메모리에 할당
- Unboxing : object형식을 value타입으로 다시 반환
- 결과적으로 값타입을 힙영역에 저장하게된다
-
ILDASM 통해 본 Boxing의 표현
- 예) ArrayList.Add(int 3) -> box라고 명시적으로 나타납니다.
-
코드 예
-
성능 예
- 원인 : Boxing, unboxing을 통해 서로 다른 영역의 두개의 저장공간이 생김으로 인해 동기화 되지 못한 값을 가지게 된다
- 결론 : 서로 다른 메모리 영역에 저장되어 있는 복사된 값이므로 둘 중 한가지만 사용하도록 해야 한다.
- 이는 Non-generic의 단점
CLR의 동작 , 메모리 관리김시원 멘토 - ASP / ASP.NET MVP
-
-
.NET 이란
- 차세대 응용 프로그램에 XML Web Services를 만들고 실행하는 것을 지원하는 필수적인 windows 구성 요소
- CLI (Common Language Infrastructure)
-
CLI Languages
-
Common : VS에서 공식 지원하는 언어
- VB.NET, C++/CLI(Managed), F#, J#, Jscript.NET, Windows PowerShell
- 예정 등.. 언어
-
-
CLI의 골격
- C# 컴파일러 -> CLI
- VB.NET -> CLI
- Others -> CLI
-
Managed Execution Process
- CLS : Common Language Specification 예) System.Int32, System.String, System.Boolean 등 규격(CTS)
- MSIL : 중간단계로 번역된 언어
- JIT, NGEN : 컴파일러
- Value / Reference Type
-
CLS 지원의 예
- [CLSCompliance(true)] // CLS 규격에 맞는 클래스로 만들겠다는 지정 Attribute
- Class 클래스명
- JIT - 메서드 단위로 작은 단위로 컴파일을 실행 / 그 후는 native와 같은 속도를 나타냄
- NGEN - 현재 환경에 최적화된 코드로 작성되어 컴파일 / 다른 환경으로 이동 시 정상적이지 않을 수 있음
- NGEN으로 시도한 후 정상적이지 않을 때 JIT로 다시 컴파일이 시도된다.
- NGEN이 필요한 이유 : .NET Framework 등이 설치 될 때는 NGEN으로 자신의 PC에 최적화 되어 설치된다.
- .NET Framework 설치 폴더의 log 폴더
- JIT의 잦은 메소드 컴파일이 성능상의 이슈가 나타나게 된다.
-
Generic Class<T>의 문제점
- Class<T>의 Class<int>와 Class<string>은 각각으로 JIT에서 컴파일 된다.
- Generic은 들어오는 T의 타입에 따라 컴파일 된다.
- String는 Char[]이기 때문에 stack에 넣을 Value type이지만 Value type처럼 사용할 수 없어(크기 변경에 따른 변화를 관리하기 어려워) Heap에 저장한다.
- 하지만 Value 타입처럼 작동하도록 장치가 준비되어 있다.
-
String의 특징
-
Immutable : 변하지 않는다
- "A" + "B" = "AB" 로 변환되는 것이 아니다. 새로 생성된 "AB"가 된다.
- 생성자가 업다
-
String을 변경시키게 되면 항상 새 객체가 만들어진다
- 대안 : System.Text.StringBuilder()를 이용한다
- String + string을 이용하지 않는다
- Sealed 클래스로 되어있다. : Immutable한 속성을 깨지 않도록 하기 위해
-
차주의 과제
- SQLConnection의 Close()와 Dispose()의 차이가 무엇일까?
- Using() {}
댓글
이 글 공유하기
다른 글
-
ADO.NET for SQLite
ADO.NET for SQLite
2009.03.27 -
iTunes Programming - SelectedTracks
iTunes Programming - SelectedTracks
2009.03.24 -
Different with ArrayList, List<T> – Boxing, None Boxing
Different with ArrayList, List<T> – Boxing, None Boxing
2009.03.10 -
정규표현식(Regular Expression) Href URL 캡쳐(Capture)
정규표현식(Regular Expression) Href URL 캡쳐(Capture)
2009.03.02