본문 바로가기

Programming/C#.NET

훈스 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

       

  1. .NET 이란
    1. 차세대 응용 프로그램에 XML Web Services를 만들고 실행하는 것을 지원하는 필수적인 windows 구성 요소
  2. CLI (Common Language Infrastructure)
  3. CLI Languages
    1. Common : VS에서 공식 지원하는 언어
      1. VB.NET, C++/CLI(Managed), F#, J#, Jscript.NET, Windows PowerShell
      2. 예정 등.. 언어
  4. CLI의 골격
    1. C# 컴파일러 -> CLI
    2. VB.NET -> CLI
    3. Others -> CLI
  5. Managed Execution Process
    1. CLS : Common Language Specification 예) System.Int32, System.String, System.Boolean 등 규격(CTS)
    2. MSIL : 중간단계로 번역된 언어
    3. JIT, NGEN : 컴파일러
  6. Value / Reference Type
  7. CLS 지원의 예
    1. [CLSCompliance(true)] // CLS 규격에 맞는 클래스로 만들겠다는 지정 Attribute
    2. Class 클래스명
  8. JIT - 메서드 단위로 작은 단위로 컴파일을 실행 / 그 후는 native와 같은 속도를 나타냄
  9. NGEN - 현재 환경에 최적화된 코드로 작성되어 컴파일 / 다른 환경으로 이동 시 정상적이지 않을 수 있음
  10. NGEN으로 시도한 후 정상적이지 않을 때 JIT로 다시 컴파일이 시도된다.
  11. NGEN이 필요한 이유 : .NET Framework 등이 설치 될 때는 NGEN으로 자신의 PC에 최적화 되어 설치된다.
  12. .NET Framework 설치 폴더의 log 폴더
  13. JIT의 잦은 메소드 컴파일이 성능상의 이슈가 나타나게 된다.
  14. Generic Class<T>의 문제점
    1. Class<T>의 Class<int>와 Class<string>은 각각으로 JIT에서 컴파일 된다.
    2. Generic은 들어오는 T의 타입에 따라 컴파일 된다.
  15. String는 Char[]이기 때문에 stack에 넣을 Value type이지만 Value type처럼 사용할 수 없어(크기 변경에 따른 변화를 관리하기 어려워) Heap에 저장한다.
  16. 하지만 Value 타입처럼 작동하도록 장치가 준비되어 있다.
  17. String의 특징
    1. Immutable : 변하지 않는다
      1. "A" + "B" = "AB" 로 변환되는 것이 아니다. 새로 생성된 "AB"가 된다.
    2. 생성자가 업다
    3. String을 변경시키게 되면 항상 새 객체가 만들어진다
      1. 대안 : System.Text.StringBuilder()를 이용한다
      2. String + string을 이용하지 않는다
    4. Sealed 클래스로 되어있다. : Immutable한 속성을 깨지 않도록 하기 위해

   

차주의 과제

   

  • SQLConnection의 Close()와 Dispose()의 차이가 무엇일까?
  • Using() {}

 

반응형