Dispose/Finalize 

Dispose/Finalize 차이는 소멸자 호출 여부이다.


.net은 GC(Garbage Collector)에서 메모지(자원)을 관리한다. 개발자가 직접적으로 관리를 원할 경우에 사용하는 것이다.


간단하게 말하자면

Dispose : USING과 호환되며 주로 File, Database 호출 밎 조작할때 사용된다. Dispose에서는 GC에서 지우기는 하지만 소멸자 호출을 하지 않는다. 

차후 GC가 알아서 관리하면서 호출하는 것 같다.


Finalize : Destructor를 호출해서 완전하게 메모리에서 지운다.




좀 더 자세하게 들어가자면 소멸자를 이해하기 전에 객체와 메모리에 대해서 알아야한다.


객체와 메모리

객체 생존 기간

객체는 new 연산자에 의해 메모리를 할당 하고 생성자에 의해 메모리에 있는 객체가 초기화 된다.

반대로 소멸되는 경우에는 먼저 Finalize 메소드를 이용하여 메모리를 초기화 되지 않은 상태로 돌린다.


다음으로 이메모리 공간을 Heap에 반환하는 것이다. 그러므로 객체의 존속기는 new를 이용하여 메모리를 할당받는 순간부터 메모리를 Heap에 반환 할 때 까지이다.



GC(Garbage Collector)

C#의 경우 기존의 C/C++ 처럼(new, delete) 프로그래머가 메모리 관리를 하지 않아도 된다.

CLR에서 자동으로 알아서 소멸 시켜 준다. 또한 C#의 경우 명시적으로 코드상에서 객체를 소멸 할 수 없는 대신 Garbage Collector라는 것을 지원 해 준다. 


Garbage Collector는 메모리에 있는 참조가 끝난 객체를 쓰레기 치우는 것처럼 소멸 시키는 역할을 하는 것 이다. 

메모리가 부족 하다고 판단이 들면 Garbage Collector는 참조되는 않는 객체의 메모리 영역을 청소하여 Heap에 반환을 하는 것이다. 


또한 Garbage Collector는 객체를 오직 한번만 제거해 버리며 참조되고 있지 않은것들만 제거 한다. 프로그래머다 일일이 코드를 통해 기술 했을때의 문제인 객체를 반복해서 소멸 한다든지, 참조되고 있는객체를 소멸한다든지 하는것은 막아 주는 것이다. 

코딩 상에서 Garbage Collector에거 명시적으로 객체를 소멸 시켜 달라고 할 수 있으나 그것은 객체를 소멸 시켜도 된다는 것을 알리는 역할을 할 뿐이지 즉시 작동 하는 것은 아니다.


'Develop > C#' 카테고리의 다른 글

박싱과 언박싱  (0) 2016.12.07
using  (0) 2016.12.01
프로젝트 exe 파일(Release 버전) 생성  (1) 2016.11.15
ListBox items Random 함수 사용  (0) 2016.11.15

박싱과 언박싱

박싱(Boxing)은 포장, 언박싱(Unboxing)은 포장풀기를 뜻한다. 박싱은 값형을 포장에서 참조형처럼 쓰일 수 있도록 해주고, 언박싱은 포장 안에 들어있는 데이터의 포장을 풀어서 값형으로 꺼내주는 일을 한다. 값형을 참조형으로 변환할 필요가 있으면 박싱을 통해 참조형으로 변환해 주고 언박싱을 통해 다시 값형으로 변환하면 된다.


결론부터 말하자면,

박싱을 하면 단순히 참조에 할당하는 것보다 20배까지 시간이 소모되며, 언박싱은 할당에 4배정도 소모된다.
(출처 : MSDN)

박싱과 언박싱에는 많은 시간이 소모된다. 되도록이면 제네릭을 사용해서 박싱과 언박싱이 일어나지 않도록 구성을 해야하며, 어쩔 수 없이 사용하려면 그 타입에 맞는 캐스팅을 해서 오류가 없이 처리해야 한다.


박싱(Boxing)

값타입을 Object 형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 것을 말한다.

기존에 저장된 스택영역에서 힙영역에 값형식을 저장한다.


위에서 int의 값형식을 Object라는 참조형식으로 형변환을 시도한다.  그 목적는 여러가지가 있을 수 있는데,

보통 파라미터로 전달되거나, List<Object> 형식으로 모든 값들을 입력받는 목적으로도 사용될 수 있다.

위의 코드는 메모리상에서 아래와 같이 메모리가 할당이 된다.


스택영역에 있는 i 값이 o로 변환이 되면서 힙영역에 object 형식으로 선언이 되고, 값이 복사 된다.

o는 스택영역에 존재하며 boxed된 i의 주소값을 가지고 있다.


박싱은 보통 암시적으로 되며, 명시적으로도 가능합니다.


언박싱(UnBoxing)
Object 형식에서 값형식으로, 또는 인터페이스 형식에서 해당 인터페이스를 구현하는 값 형식으로 변환하는 것을 말한다.

 

언박싱 과장은 두가지의 절차를 거친다.
1.개체 인스턴스가 지정한 값 형식을 boxing한 값인지 확인
2. 인스턴스의 값을 값 형식 변수에 복사

위의 그림에서 보면, int를 박싱한 o의 객체를 다시 int 타입의 j 값에 넣고 있다.

언박싱을 할 때 다른 타입으로 하거나, 해당 타입보다 작은 범위로 변환을 하려면 오류(InvalidCastException)가 발생 한다. 이때는 미리 같은 타입인지를 먼저 확인하는 절차를 거쳐야한다. is 연산자를 이용해서 미리 같은 타입인지 확인 후에 캐스팅을 해야 안전하다.


박싱과 언박싱 사용 예제






'Develop > C#' 카테고리의 다른 글

Dispose/Finalize  (0) 2016.12.08
using  (0) 2016.12.01
프로젝트 exe 파일(Release 버전) 생성  (1) 2016.11.15
ListBox items Random 함수 사용  (0) 2016.11.15

using

using 의 사용 용법은 2가지가 있다.


1.지시문(Directive)


다른 네임스페이스에 정의된 타입을 Import 하거나, 네임스페이스에 대한 별칭을 만들때 사용한다.


2.문장(Statement) 


개체의 범위를 정의할때 사용한다. 그 범위를 벗어나면 자동으로 Dispose 된다.


File이나 Font, DB Connection 관련 클래스들은 관리되자 않는 리소스에 액세스 한다. 다 사용후 적절하게 Dispose해서 자원을

반납해야 한다. 하지만 종종 Dispose를 하지 않아서 리소스가 낭비되거나 DB Connection 같은 것을 Open만하고 Close하지 않으면

문제가 발생한다. 


이때, 일일이 Close하지 않고 Using을 이용하면 그 범위를 벗어나면 자동으로 Dispose 되서 관리가 쉬워진다.




위처럼 Connection을 Using 구문으로 사용하면 {} 범위를 벗어나면 자동으로 Dispose가 된다.

using 문은 개체의 메서드를 호출하는 동안 예외가 발생하는 경우에도 Dispose가 호출되도록 한다. 

try 블록 내에 개체를 배치한 다음 finally 블록에서 Dispose를 호출해도 동일한 결과를 얻을 수 있다. 



using문을 사용한 리소스 관리는, 좋고 나쁨을 따질수 있는 선택적인 사항이 아니라, 반드시 숙지하고 활용해야 할 사항이다. 

 

기본적으로 닷넷은 가비지 컬렉터에 의해서 모든 리소스를 자동으로 관리한다고 소개하였고 실제로도 그렇다. 하지만 중요한 맹점이 하나 있는데, 닷넷 프레임워크 외부의 비관리 영역상의 자원에 대해서는 해당되는 부분이 없다. 파일 핸들, 메모리 핸들, 데이터베이스 연결, 소켓 핸들, 스레드 핸들, 세마포어 등의 모든 비관리 자원들에 해당되는 것이다.

 

단순히 가비지 컬렉터에 의하여 처리되기를 기다린다면 이들 자원들은 사용량이 집중될 경우 고갈되어 시스템에 문제가 생길 수 있다. 따라서 이를 사전에 예방하고 효율적으로 관리하기 위해서 명시적인 소멸자를 직접 구현할 수 있는데, 이것이 IDisposable 인터페이스를 통해서 가능하다.

 

본디, IDisposable 인터페이스로 소거를 시도하기 위해서는 아래와 같은 모양의 문법을 사용한다.



'Develop > C#' 카테고리의 다른 글

Dispose/Finalize  (0) 2016.12.08
박싱과 언박싱  (0) 2016.12.07
프로젝트 exe 파일(Release 버전) 생성  (1) 2016.11.15
ListBox items Random 함수 사용  (0) 2016.11.15

프로젝트 exe 파일(Release 버전) 생성


1. 속성 변경 후 빌드할 것이므로 솔루션 정리  


2. 프로젝트 속성 창



3. 속성 응용 프로그램 탭

  - 대상 프레임워크(3.5/4) 버전 선택

  - 출력 형식 : Window 응용 프로그램



4. 빌드 탭으로 이동

  - 구성 : Release

  - 플랫폼 대상 : Any CPU 또는 x86(솔직히 요즘 다 64bit라서 상관없다)

변경 완료 후 Ctrl + S 로 저장



5. 솔루션 다시 빌드



6. 일괄빌드 

  - 일괄 빌드 후 exe 파일 추출 예정



7. exe 파일 추출

  - Release 부분 체크박스 체크 후 빌드



8. 프로젝트가 저장된 폴더로 이동

  - workspace로 이동

  - 따로 지정하지 않았다면 C:\Users\사용자명\문서\Visual Studio\Projects\해당프로젝트명\bin폴더\Release 폴더\프로젝트명.exe 



'Develop > C#' 카테고리의 다른 글

Dispose/Finalize  (0) 2016.12.08
박싱과 언박싱  (0) 2016.12.07
using  (0) 2016.12.01
ListBox items Random 함수 사용  (0) 2016.11.15

ListBox items Random 함수 사용


간단하게 매칭하는 시스템을 설계 중에 어떻게 매칭을 시킬까 고민하다가 리스트 박스를 사용하기로 했다.


ListBox에 아이템들을 담고 아이템들을 랜덤하게 분류하여 기준이 되는 데이터 리스트 박스 와 랜덤함수를 돌린 리스트 박스를 비교하여 매칭하기로 했다



리스트박스에 담아 랜덤함수를 돌린 코드는 다음과 같다.




'Develop > C#' 카테고리의 다른 글

Dispose/Finalize  (0) 2016.12.08
박싱과 언박싱  (0) 2016.12.07
using  (0) 2016.12.01
프로젝트 exe 파일(Release 버전) 생성  (1) 2016.11.15

+ Recent posts