2014년 2월 20일 목요일

[C#객체소멸자]객체소멸자, Dispose, Finalize, ~소멸자, 닷넷C#소멸자,DeConstructor,C#/WPF/닷넷WPF/ASP.NET/ADO닷넷/닷넷교육/닷넷강좌학원/닷넷공부/닷넷책/닷넷객체지향교육 객체와 메모리 * 객체 생존 기간 객체는 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에거 명시적으로 객체를 소멸 시켜 달라고 할 수 있으나 그것은 객체를 소멸 시켜도 된다는 것을 알리는 역할을 할 뿐이지 즉시 작동 하는 것은 아니다. * 소멸자의 사용 - Finalize 메소드 객체가 Garbage Collector에 의해 소멸되는 시점에 호출되는 함수 이다. 이곳에 파일을 닫는 다든지, DB접속을 종료 한다든지 하는 일들을 명시 할 수 있다. Finalize 메소드를 구현 하면 C# 컴파일러가 컴파일시 finalization Queue에 이 객체가 등록되고 Garbage Collector가 작동되면 객체를 소멸하기 전에 Finalize 메소드를 호출하는 것이다. - 소멸자 사용방법 Finalize 메소드 대신에 소멸자(~생성자)를 이용 할 수 있으며 컴파일을 하게 되면 소멸자를 Finalize 메소드로 바꾸어 놓게 된다. 즉 C#에서 소멸자와 Finalize 메소드는 같은 의미라고 보면 된다. 소멸자의 경우 항상 접근권한이 public 이 되어야 하므로 별도로 접근 지시자를 지정하지 못하도록 되어 있다. 또한 매개변수도 받을 수 없다. * System.CG 클래스 Garbage Collector가 작동 하기 전에 리소스를 해제 할려고 하면 어떻게 할까? 아니다... 이경우 IDisposal 인터페이스이Dispose 메소드를 구현해 주고 사용자가 이메소드를 호출하면 직접 리소스를 해제 할 수 있다. 물론 Disposal 메소드안에 리소스를 정리하는 코드를 기술하면 된다. 민약 리소스를 해제 하는 코드가 소멸자에도 있고 Dispoase에도 있으면 코드가 중복된다. 소멸자에서도 Dispose 메소드를 호출 함으로서 리소스의 해제가 가능하다. 만약 Dispose 메소드를 이용하여 리소스를 해제 하였다면 Finalize 메스에서는 리소스를 해제 핮 않아도 된다. 이런경우 System.GC 클래스의 SuppressFinalize 메소드를 호출하여 Finalize 메소드가 호출되지 않게 설정 할 수 있다. 결국 아래의 소스와 같은 구조가 될것이다. using System; class Test : IDisposable { private bool isDispose = false; ... ~Test() { if (!isDispose) { Dispose(); } } public void Dispose() { isDispose = true; // 이 부분에서 리소스를 정리 한다. // 참고로 GC.Collect() 메소드는 Garbage Collector가 Finalize를 호출하게 하는 메소드 이다. GC.SuppressFinalize(this); //Finalize 메소드를 소멸자에서 호출 안하도록 설정 } } [예제] using System; class Garbage : IDisposable{ private bool isDispose = false; private string name; public Garbage(string name) { this.name = name; Console.WriteLine("{0}객체 생성됨...", this.name); } ~Garbage() { if (!isDispose) { Dispose(); } } public void Dispose() { isDispose = true; //... 리소스를 해제함... Console.WriteLine("{0}객체의 리소스 해제 OK...", name); GC.SuppressFinalize(this); } } class GarbageTest1 { static void Main() { Garbage g1 = new Garbage("1번객체"); Garbage g2 = new Garbage("2번객체"); Garbage g3 = new Garbage("3번객체"); Garbage g4 = new Garbage("4번객체"); g1.Dispose(); GC.SuppressFinalize(g2); } } ====================================================================== using System; using System.ComponentModel; class Garbage : IDisposable { private bool isDispose = false; private Component component = new Component(); private string name; public Garbage(string name) { this.name = name; Console.WriteLine("{0}객체 생성됨...", this.name); } ~Garbage() { if (!isDispose) { Dispose(); } } public void Dispose() { isDispose = true; Console.WriteLine("{0}객체의 리소스 해제 OK...{1}", name, component); component.Dispose(); //this=null; component=null; GC.SuppressFinalize(this); } } class GarbageTest1 { static void Main() { Garbage g1 = new Garbage("1번객체"); g1.Dispose(); GC.SuppressFinalize(g1); } } [출처] 오라클자바커뮤니티 - http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecCsharp&wr_id=135 자바 오라클/빅데이터 아이폰/안드로이드 닷넷/WPF 표준웹/HTML5 채용/취업무료교육 초보자코스 [기업100%환급]Spring ,MyBatis,Hibernate실무과정 총 5일 40시간 02-24 [기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 총 5일 40시간 03-03 Spring3.X, MyBatis, Hibernate실무과정 총 12일 36시간 03-03 자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 총 24일 72시간 03-14 [주말저녁]자바기초에서JSP,Servlet,Ajax,jQUERY,스프링,마이바티스,하이버네이트 총 18일 72시간 02-22 자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 총 10일 70시간 03-01 Spring3.X, MyBatis, Hibernate실무과정 총 5일 35시간 03-09 [기업100%환급]SQL기초에서 Schema Object까지 총 5일 40시간 02-24 [기업100%환급]PL/SQL,ORACLE HINT,TUNING 총 5일 40시간 03-03 SQL초보에서실전전문가까지 총 18일 54시간 03-10 SQL초보에서실전전문가까지 총 8일 56시간 03-01 [주말저녁]SQL기초에서 Schema Object까지 총 10일 40시간 03-01

[C#객체소멸자]객체소멸자, Dispose, Finalize, ~소멸자, 닷넷C#소멸자,DeConstructor,C#/WPF/닷넷WPF/ASP.NET/ADO닷넷/닷넷교육/닷넷강좌학원/닷넷공부/닷넷책/닷넷객체지향교육


객체와 메모리

* 객체 생존 기간
객체는 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에거 명시적으로 객체를 소멸 시켜 달라고 할 수 있으나 그것은 객체를 소멸 시켜도 된다는 것을 알리는 역할을 할 뿐이지 즉시 작동 하는 것은 아니다.


* 소멸자의 사용

- Finalize 메소드
  객체가 Garbage Collector에 의해 소멸되는 시점에 호출되는 함수 이다. 이곳에 파일을 닫는 다든지, DB접속을 종료 한다든지 하는 일들을 명시 할 수 있다. Finalize 메소드를 구현 하면 C# 컴파일러가 컴파일시 finalization   Queue에 이 객체가 등록되고 Garbage Collector가 작동되면 객체를 소멸하기 전에 Finalize 메소드를 호출하는 것이다.

- 소멸자 사용방법

  Finalize 메소드 대신에 소멸자(~생성자)를 이용 할 수 있으며 컴파일을 하게 되면 소멸자를 Finalize 메소드로 바꾸어  놓게 된다. 즉 C#에서 소멸자와 Finalize 메소드는 같은 의미라고 보면 된다. 소멸자의 경우 항상 접근권한이 public  이 되어야 하므로 별도로 접근 지시자를 지정하지 못하도록 되어 있다. 또한 매개변수도 받을 수 없다.


* System.CG 클래스

Garbage Collector가 작동 하기 전에 리소스를 해제 할려고 하면 어떻게 할까? 아니다... 이경우 IDisposal 인터페이스이Dispose 메소드를 구현해 주고 사용자가 이메소드를 호출하면 직접 리소스를 해제 할 수 있다. 물론 Disposal 메소드안에 리소스를 정리하는 코드를 기술하면 된다. 민약 리소스를 해제 하는 코드가 소멸자에도 있고 Dispoase에도 있으면 코드가 중복된다. 소멸자에서도 Dispose 메소드를 호출 함으로서 리소스의 해제가 가능하다. 만약 Dispose 메소드를 이용하여  리소스를 해제 하였다면 Finalize 메스에서는 리소스를 해제 핮 않아도 된다. 이런경우 System.GC 클래스의  SuppressFinalize 메소드를 호출하여 Finalize 메소드가 호출되지 않게 설정 할 수 있다. 결국 아래의 소스와 같은 구조가 될것이다.

using System;
class Test : IDisposable {
private bool isDispose = false;
...
~Test() {
if (!isDispose) {
Dispose();
}
}

public void Dispose() {
isDispose = true;
// 이 부분에서 리소스를 정리 한다.
// 참고로 GC.Collect() 메소드는 Garbage Collector가 Finalize를 호출하게 하는 메소드 이다.
GC.SuppressFinalize(this);    //Finalize 메소드를 소멸자에서 호출 안하도록 설정
}
}

[예제]
using System;
class Garbage : IDisposable{
private bool isDispose = false;
private string name;

public Garbage(string name) {
this.name = name;
Console.WriteLine("{0}객체 생성됨...", this.name);
}

~Garbage() {
if (!isDispose) {
Dispose();
}
}

public void Dispose() {
isDispose = true;
//... 리소스를 해제함...
Console.WriteLine("{0}객체의 리소스 해제 OK...", name);
GC.SuppressFinalize(this);
}
}

class GarbageTest1 {
static void Main() {
Garbage g1 = new Garbage("1번객체");
Garbage g2 = new Garbage("2번객체");
Garbage g3 = new Garbage("3번객체");
Garbage g4 = new Garbage("4번객체");

g1.Dispose();
GC.SuppressFinalize(g2);
}
}

======================================================================

using System;
using System.ComponentModel;

class Garbage : IDisposable
{
private bool isDispose = false;
private Component component = new Component();
private string name;

public Garbage(string name) 
{
this.name = name;
Console.WriteLine("{0}객체 생성됨...", this.name);
}

~Garbage() 
{
if (!isDispose) 
{
Dispose();
}
}

public void Dispose() 
{
isDispose = true;

Console.WriteLine("{0}객체의 리소스 해제 OK...{1}", name, component);
component.Dispose();
//this=null;
component=null;
GC.SuppressFinalize(this);
}
}

class GarbageTest1 
{
static void Main() 
{
Garbage g1 = new Garbage("1번객체");
g1.Dispose();
GC.SuppressFinalize(g1);
}
}

댓글 없음:

댓글 쓰기