C# 09장. 클래스와 객체
학습 목표 클래스를 정의하는 방법을 이해하고, 작성할 수 있다 객체를 생성하는 방법을 숙지하고, 객체 생성을 응용한다 객체 소멸이 어떻게 이루어지는가 이해한다 가비지 컬렉션이 어떤 역할을 하는지 이해한다
목차 클래스 객체의 생성 객체의 소멸
1. 클래스 클래스의 정의와 접근 지정자
1. 클래스 클래스의 정의 class : 클래스를 나타내는 키워드 중괄호{ } : 클래스의 범위 * 클래스의 끝을 나타내기 위해서 세미콜론(;)은 사용하지는않음 클래스의 정의 클래스의 기본 골격 클래스 멤버 -필드(Field) : 변수 혹은 멤버변수. 객체의 상태정보 저장 -메소드(Method): 객체의 행동특성 정의 -연산자(Operator): 특정기능의 수행을 위한 기호 -상수(Constant): 변하지 않는 값이나 숫자 -생성자(Constructor): 클래스나 구조체의 인스턴스를 생성 혹은 멤버초기화 -속성(Property): 필드와 같이 상태정보를 저장하며 내부적으로 상태에 대한 접근 가능 한 메소드 제공 -인덱서(Indexer): 객체의 배열화 한 형태 -이벤트(Event) : 어떤 사건이 발생하였을때 사용자에게 해당사실을 알려주는 방법 class 클래스명 { //클래스 멤버 } 객체의 생성 9장
클래스 정의(예제) 1. 클래스 은행계좌(클래스) 입금하다( ) 출금하다( ) class BankAccount { (private) decimal balance ; public void Deposit(decimal amount) balance = balance + amount ; } public void Draw(decimal amount) balance = balance – amount ; 은행계좌(클래스) 멤버변수 잔고 메소드 입금하다( ) 출금하다( )
접근지정자 1. 클래스 internal 클래스 A => A.cs 클래스 B => B.cs 접근 지정자 내용 public 외부에 모두 공개할 경우에 사용하는 접근지정자 private 같은 클래스내에서만 접근이 가능. 다른 클래스에서는 접근하지 못함 protected 같은 클래스와 상속관계에 있는 파생 클래스에서만 접근할 수 있음 internal 동일한 물리적 파일 안에 있는 클래스에서만 접근 protected internal protected와 internal의 조합. 같은 물리적 파일안의 파생 클래스 안에서만 접근이 가능 internal 클래스 A => A.cs 클래스 B => B.cs 클래스 A의 멤버중에서 internal로 지정한 멤버는 B 클래스에서 접근하지 못한다.
접근 지정자 예제(생략 시 : private) 1. 클래스 접근 지정자 예제(생략 시 : private) using System; class BankAccount { decimal balance; //public decimal balance; public void Deposit(decimal amount) balance = balance + amount; } public void Draw(decimal amount) balance = balance - amount; class SneakBank public void PeepAccount(BankAccount othersInfo) Console.WriteLine("{0}", othersInfo.balance); private class BankAccount
1. 클래스 접근 지정자 예제 코딩 실습 및 아이콘 확인 더블 클릭
기본 접근 지정자 1. 클래스 기본 접근 지정자 형식 필드(Field) 메소드(Method) 속성(Property) 이벤트(Event) private 클래스 구조체(struct) 열거형(enum) 인터페이스(interface) 위임자(delegate) internal BankAccount 클래스의 변수 balnce는 접근 지정자를 지정하지 않았지만 private로 자동 인식됨.
2. 객체의 생성 객체의 생성 객체의 값 초기화 힙 영역의 메모리 확보 스택 영역의 메모리 사용 메모리에 객체를 만들어서 적재하는 것 new와 생성자(constructor)가 담당 … Date Today = new Date ( ) ; 객체의 값 초기화 힙 영역의 메모리 확보 스택 영역의 메모리 사용
2. 객체의 생성 생성자 객체가 생성될 때 자동으로 호출되는 특별한 메소드 명시적으로 호출할 수 없다, 리턴 타입도 기술하지 않는다 객체를 초기화 하는 역할 생성자는 객체 내부의 메소드 이므로 초기화 가능함.
2. 객체의 생성 Name, Age는 private Main에서 Kim.Age = 25; using System; class CSTest { static void Main() Human Kim; Kim = new Human("KOSTA", 25); Kim.Intro(); //Kim.Age = 25; //이렇게는 접근이 //되지 않는다. } class Human private string Name; private int Age; public Human(string aName, int aAge) Name = aName; Age = aAge; public void Intro() Console.WriteLine("이름:" + Name); Console.WriteLine("나이:" + Age); Name, Age는 private Main에서 Kim.Age = 25; Human(string aName, int aAge) 생성자 * aName의 a Argument의 약어 필드와 인수를 구분하기 위한 것 생성자를 통해 필드를 초기화 하므로 Main에서 필드에 값을 직접 대입할 필요가 없으며 필드를 안전하게 숨길 수 있다.
객체의 생성 2. 객체의 생성 특정한 날짜를 입력으로 받아서 특정한 포맷에 맞게 출력하는 내용 using System; class Date { private int yy; private int mm; private int dd; public void GetDate() Console.WriteLine("{0}년 {1}월 {2}일", yy, mm, dd); } public void SetDate(int year, int month, int day) yy = year; mm = month; dd = day; class ObjectCreating static void Main(string[] args) Date today = new Date(); today.SetDate(2009, 07, 3); today.GetDate(); 특정한 날짜를 입력으로 받아서 특정한 포맷에 맞게 출력하는 내용 날짜 셋팅하는 메소드 호출 및 출력하는 메소드 호출 날짜 넘겨 받아 셋팅하는 메소드 날짜 출력 하는 메소드
2. 객체의 생성 1.Date 클래스 정의 ( 2 개의 메소드) using System; class Date { private int yy; private int mm; private int dd; public void GetDate() Console.WriteLine("{0}년 {1}월 {2}일", yy, mm, dd); } public void SetDate(int year, int month, int day) yy = year; mm = month; dd = day; class ObjectCreating static void Main(string[] args) Date today = new Date(); today.SetDate(2009, 07, 3); today.GetDate(); 1.Date 클래스 정의 ( 2 개의 메소드) 2. 정의된 Date 클래스를 이용하여 today 라는 형식 변수 선언 3. new 라는 키워드를 사용하여 객체(today)의 메모리 할당 4. Date() 형태의 생성자를 통해 객체의 값을 초기화 초기화된 객체(today) 사용 가능 객체의 메소드 사용 가능 - today.SetDate(2007,07,3) - today.GetDate()
Date today = new Date(); 2. 객체의 생성 using System; class Date { private int yy; private int mm; private int dd; public void GetDate() Console.WriteLine("{0}년 {1}월 {2}일", yy, mm, dd); } public void SetDate(int year, int month, int day) yy = year; mm = month; dd = day; class ObjectCreating static void Main(string[] args) Date today = new Date(); today.SetDate(2009, 07, 3); today.GetDate(); Date today = new Date(); 1.Date 클래스 정의 객체를 생성하는 과정 1. Date 클래스는 형식변수 today 선언 2. 메모리 할당 : 키워드 new를 사용해서 힙 영역의 메모리를 할당 3. 생성자에 의한 객체의 값 초기화
생성자 2. 객체의 생성 C#에서는 기본 생성자를 제공한다. 생성자에 의한 초기화 내용 확인 23 라인을 주석 처리하여 확인 using System; class Date { private int yy; private int mm; private int dd; public void GetDate() Console.WriteLine("{0}년 {1}월 {2}일", yy, mm, dd); } public void SetDate(int year, int month, int day) yy = year; mm = month; dd = day; class ObjectCreating static void Main(string[] args) Date today = new Date(); //today.SetDate(2009, 07, 3); today.GetDate(); C#에서는 기본 생성자를 제공한다. 생성자에 의한 초기화 내용 확인 23 라인을 주석 처리하여 확인
생성자의 특징 2. 객체의 생성 클래스명과 생성자명이 같다 반환 값이 없다. void를 의미하지는 않는다 앞의 예에서 처럼 Date()의 예처럼 형태는 메소드와 같지만 실제로 메소드는 아니므로 반환형을 포함하지는 않는다. 기본 생성자의 접근 권한은 public 이다. 기본 생성자의 경우 인자를 포함하지 않는다. 기본 생성자에 의해 객체의 모든 멤버들이 초기화 된다. (숫자형 멤버 : 0, 불리언형 멤버 : false, 참조형 변수 : null
2. 객체의 생성 객체의 멤버 초기 값을 직접 지정하고자 할 경우에는 생성자를 클래스에 직접 정의해 주어야 한다. 생성자의 구현 using System; class Date { private int yy; private int mm; private int dd; public Date() yy = 2004; mm = 1; dd = 1; } public void GetDate() Console.WriteLine("{0}년 {1}월 {2}일", yy, mm, dd); class Constructor static void Main(string[] args) Date today = new Date(); today.GetDate(); 클래스 안에서 생성자(Date()를 구현 객체를 생성할 때 생성자가 호출 되어 클래스의 필드 값을 초기화 시킨다.
this 키워드 2. 객체의 생성 this 키워드는 클래스의 현재 객체를 참조한다 아래 내용을 참조 class Date { private int yy; private int mm; private int dd; public Date( int yy, int mm, int dd) yy = yy; mm = mm; dd = dd; } class Date { private int yy; private int mm; private int dd; public Date( int yy, int mm, int dd) this.yy = yy; this.mm = mm; this.dd = dd; } // 클래스의 yy, 인자의 yy yy,mm,dd는 클래스의 변수 이면서 생성자의 변수 이다. 모호 함 this를 기술 함으로써 명확하게 됨.
생성자 오버로딩 2. 객체의 생성 메소드를 오버로딩해서 사용하는 것처럼 생성자도 여러 가지 형태로 정의해서 사용 <예> … public Date() { this.yy = 2004 ; this.mm = 1 ; this.dd = 1; } public Date( int yy, int mm, int dd) this.yy = yy ; this.mm = mm ; this.dd = dd ; 인자가 없는 형태의 Date 생성자 인자가 있는 형태의 Date 생성자
생성자 오버로딩 2. 객체의 생성 class ConstructorOverload { using System; class Date { private int yy; private int mm; private int dd; public Date() this.yy = 2009; this.mm = 1; this.dd = 1; } public Date(int yy, int mm, int dd) this.yy = yy; this.mm = mm; this.dd = dd; public void GetDate() Console.WriteLine("{0}년{1}월{2}일", yy, mm, dd); class ConstructorOverload { static void Main(string[] args) Date time1 = new Date(); time1.GetDate(); Date time2 = new Date(2009, 12, 25); time2.GetDate(); } 인자 없는 생성자 인자 있는 생성자
2. 객체의 생성 데이터 초기화(초기화 목록) using System; class Date { private int yy; private int mm; private int dd; public Date() this.yy = 2009; this.mm = 1; this.dd = 1; } public Date(int yy, int mm, int dd) this.yy = yy; this.mm = mm; this.dd = dd; public void GetDate() Console.WriteLine("{0}년{1}월{2}일", yy, mm, dd); class ConstructorOverload { static void Main(string[] args) Date time1 = new Date(); time1.GetDate(); Date time2 = new Date(2009, 12, 25); time2.GetDate(); } 인자 없는 생성자 인자 있는 생성자 앞에서 본 이 예제는 생성자 2개가 각 개체의 필들 값을 초기화 하는데 비슷한 역할을 한다. 중복되어 있음. 초기화 목록( 생성자() : this)을 사용하여 간략하게 만들 수 있다.
초기화 목록(Initializer List) 2. 객체의 생성 초기화 목록( Initializer List) 생성자들 사이의 정의가 비슷한 경우 코드를 간략하게 만들기 위해서 사용한다 <예> … public Date() : this (2004, 1, 1) { } public Date( int yy, int mm, int dd) this.yy = yy ; this.mm = mm ; this.dd = dd ; 초기화 목록(Initializer List) 인자가 없는 형태의 생성자 Date()를 사용하면 곧바로 초기화 목록에서 가르키는 생성자를 호출하게 된다. 호출
초기화 목록( Initializer List) 2. 객체의 생성 초기화 목록( Initializer List) using System; class Date { private int yy; private int mm; private int dd; public Date() : this(2009, 1, 1) } public Date(int yy, int mm, int dd) this.yy = yy; this.mm = mm; this.dd = dd; public void GetDate() Console.WriteLine("{0}년{1}월{2}일", yy, mm, dd); class InitializerList { static void Main(string[] args) Date time1 = new Date(); time1.GetDate(); Date time2 = new Date(2009, 12, 25); time2.GetDate(); } 4. 생성자의 구현부는 비워둔다.(7-9행) 생성자(Date())다음에 콜론(;)과 키워드 this를 위치 시킨다. this의 인자 값으로 초기화시키고자 하는 값을 목록으로 나타낸다. (2009.1.1) 여기서 this는 자신의 클래스에 정의된 생성자를 가르킨다. 정수형 인자 세개를 포함하는 형태의 생성자는 ‘Date(int yy, int mm, int dd)’ 이므로 ‘this(2009.1.1)’은 ‘Date(2009,1,1)’ 과 같다. 생성자를 정의할 때 중복되는 부분은 초기화 목록을 사용 해서 많은 부분을 간략하게 만들 수 있다.
초기화 목록( Initializer List) 2. 객체의 생성 초기화 목록( Initializer List) 생성자에서만 앞의 예제와 같은 초기화 목록을 사용할 수 있다. 즉 생성자가 아닌 메소드에서는 초기화 목록을 사용할 수 없다. 자기 자신의 생성자를 호출하는 초기화 목록은 가능하지 않다. 잘못 사용한 예) public Date(int yy, int mm, int dd) : this(2009,12.27) { this.yy = yy; this.mm = mm; this.dd = dd; } 초기화(this(2009.12.27)를 사용하려면 타원 부분을 기술하지 않아야 한다.
초기화 목록( Initializer List) 2. 객체의 생성 초기화 목록( Initializer List) 실행 결과 확인 using System; class Date { private int yy; private int mm; private int dd; public Date() : this(2009, 1, 1) } public Date(int yy, int mm, int dd) this.yy = yy; this.mm = mm; this.dd = dd; public void GetDate() Console.WriteLine("{0}년{1}월{2}일", yy, mm, dd); class InitializerList { static void Main(string[] args) Date time1 = new Date(); time1.GetDate(); Date time2 = new Date(2009, 7, 3); time2.GetDate(); }
초기화 목록( Initializer List) 2. 객체의 생성 초기화 목록( Initializer List) F11 로 프로세스 확인
2. 객체의 생성 상수와 읽기 전용 필드의 초기화 상수와 읽기 전용의 초기화 시점 상수는 컴파일할 때 값이 정해진다. 읽기전용은 런타임할 때 값이 정해진다 이후에는 값이 변경되지 않는다.
2. 객체의 생성 상수와 읽기 전용 필드의 초기화 using System; class BankAccount { private readonly int customerNo; //고객번호 : 읽기 전용은 객체 생성시 초기화 또는 선언 시 private const int interestRate = 10; //이자율 : 상수는 선언 시 초기화 public BankAccount(int customerNo) this.customerNo = customerNo; // interestRate = 15; } public void GetInfo() // customerNo = 1500; // interestRate = 20; Console.WriteLine("고객 번호: {0}", customerNo); Console.WriteLine("이 자 율 : {0} %", interestRate); class ConsoleApplication static void Main(string[] args) BankAccount myAccount = new BankAccount(1500); myAccount.GetInfo(); 이자율은 선언(5행)시 초기화 필요 9행과 14행과 같이 수정하면 컴파일 에러 발생 고객번호는 생성자 (23)부분에서 초기화 필요 13행에서 수정 시 컴파일 에러
구조체에서도 클래스의 생성자와 마찬가지로 생성자를 정의할 수 있다. 2. 객체의 생성 구조체에서 생성자 사용 구조체에서도 클래스의 생성자와 마찬가지로 생성자를 정의할 수 있다. 구조체명과 같은 이름의 생성자를 구조체 안에 구현하면 된다. 구조체에서 생성자를 사용할 때 주의할 점 컴파일러가 기본 생성자를 기본적으로 생성하므로 기본 생성자를 사용자가 직접 정의하지 않는다 protected 접근 지정자를 사용할 수 없다. (파생 클래스를 포함할 수 없기 때문에) 생성자에서는 구조체의 모든 멤버값을 초기화 시켜주어야 한다
구조체에서 생성자 사용 2. 객체의 생성 구조체에 대한 생성자 <예> … struct Point { public int x , y ; public Point ( int x, int y) this.x = x ; this.y = y ; } 구조체에 대한 생성자
구조체에서 생성자 사용 2. 객체의 생성 class StructConstructor { using System; struct Point { public int x; public int y; //public Point() // not allowed //{ // x = 1; // y = 1; //} public Point(int x, int y) this.x = x; this.y = y; } public void GetInfo() Console.WriteLine("(x = {0}, y = {1})", x, y); class StructConstructor { static void Main(string[] args) Point p1 = new Point(); //기본 생성자 사용 p1.GetInfo(); Point p2 = new Point(10, 10); p2.GetInfo(); } 컴파일러가 구조체의 기본 생성자를 자동으로 생성 (왼쪽 6~10행 기술 시 컴파일 에러 발생) 오른쪽 5행에서 컴파일러가 생성한 기본 생성자 사용함 기본 생성자 자동 생성 시, 구조체의 멤버 필드의 모든 값을 0, false, 혹은 null 값으로 초기화 시킨다. 오른쪽 7행은 정의된 생성자(11행~15행)를 오버로딩함 실행 시 입력한 값으로 초기화 할 수 있다.
private 생성자 2. 객체의 생성 생성자를 private로 접근을 제한 시 ? 다른 클래스에서는 객체를 생성하지 못한다. 객체를 생성하지 못하는 private 생성자는 왜 만들어진 것일까? C 에서는 전역변수, 전역 함수 사용 가능(어느 위치에서나 접근이 가능한 변수나 함수) 객체 지향 프로그램에서는 전역변수나 전역 함수를 선언할 수 없다. 단지, 클래스 내에 변수나 메소드를 정의한 후에 객체를 생성해서 사용해야 한다. 객체 지향 프로그램에서는 전역변수 혹은 전역 함수와 같이 객체를 사용하지 않고 변수나 메소드를 사용할 수 있는 방법으로 static 키워드 사용함
static static 키워드의 기능 : static 키워드로 지정된 변수나 메소드가 메모리에 적재된다. 2. 객체의 생성 static static 키워드의 기능 : static 키워드로 지정된 변수나 메소드가 메모리에 적재된다. (객체를 생성하지 않고, 컴파일 할 때 클래스가 메모리에 적재되는 시 점에) 따라서 별도로 객체를 생성하지 않아도 된다. Main 메소드에서 static 키워드를 사용하는 이유 Main 메소드가 static이 아니라면 어딘가에서 Main 메소드를 포 함한 클래스의 객체를 생성한 후에 Main 메소드를 호출해야 한다 . 그렇기 때문에 프로그램의 시작점 역할을 할 수가 없다. 그러므로 프로그램의 시작점 역할을 하는 Main 메소드는 항상 static으로 선언 되어야 한다.
static 키워드 2. 객체의 생성 using System; class Library { static string bookName = "코드북"; static public void GetBookInfo() Console.WriteLine("책이름:{0}", bookName); } class StaticSample static void Main(string[] args) //Library book1 = new Library(); //book1.GetBookInfo(); Library.GetBookInfo(); 클래스 Library에 static(4,5행) 선언함 14,15행과 같이 객체를 생성하지 않아도 된다. 16행과 같이 ‘클래스명.메소드’로 사용 가능 * 객체를 생성하지 않아도 static 으로 선언 했기 때문에, 이미 메모리에 적재 되어 있음.
static 키워드 정의와 private 생성자 2. 객체의 생성 static 키워드 정의와 private 생성자 using System; class Library { static string bookName = "코드북"; private Library() { } static public void GetBookInfo() Console.WriteLine("책이름:{0}", bookName); } class StaticSample static void Main(string[] args) Library book1 = new Library(); //book1.GetBookInfo(); Library.GetBookInfo(); 1. 5행과 같이 private 생성자를 만들면 2. 15행에서와 같이 객체를 생성하면 에러가 난다 불 필요한 객체를 생성하는 것을 막아줌
static 생성자 static 으로 지정된 필드의 초기화는 static 생성자를 사용한다. 2. 객체의 생성 static 생성자 static 으로 지정된 필드의 초기화는 static 생성자를 사용한다. static 생성자의 형태는 일반 형태와 같다. 단지, static 키워드를 추가로 기술한다. static 생성자에 대한 주의할 점 static 생성자에는 접근 지정자를 쓸 수 없다. static 생성자는 일반적인 생성자와 같이 호출하지 않는다. static 생성자는 인자를 포함하지 않는다.
static 생성자 2. 객체의 생성 static 생성자 <예> … class Point { private static int[] data ; static Point() data = new int[1000]; } static 생성자
static 생성자(static 으로 지정된 필드를 초기화 시 사용) 2. 객체의 생성 static 생성자(static 으로 지정된 필드를 초기화 시 사용) using System; class Point { private static int[] data; //static 필드 static Point() //static 생성자 data = new int[1000]; for (int i = 0; i < 1000; i++) data[i] = i; } public static void GetInfo() foreach (int d in data) Console.WriteLine(d); class StaticConstructor { static void Main() Point.GetInfo(); } Point 클래스에 (4행)과 같이 static 필드인 int 형 배열 data 선언 (5행)에서와 같이 static 생성자에서 배열을 초기화(1~999까지) 시킴
3. 객체의 소멸 객체를 생성해서 메모리에 적재했으면 다시 메모리를 해 제해서 다른 객체가 사용할 수 있는 공간 확보 필요 C#에서는 가비지 컬렉션에서 자동으로 해제시킴 객체가 소멸될 때 관련 리소스(파일, 네트워크 등)의 해 제는 소멸자(destructor)가 담당 소멸자의 정의 안에 리소스의 해제와 같이 객체가 소멸 하면서 함께 해야 할 일을 정의함
3. 객체의 소멸 개발자가 의도적으로 객체를 소멸하지 못하게 하려는 이 유: 의도하지 않은 오류 발생 줄이고, 오류가 적은 코드를 작성할 수 있게 하기 위해서
객체 F는 참조되거나 참조하고 있는 것이 없으므로 3. 객체의 소멸 가비지 컬렉션( Garbage Collection) 가비지 컬렉터가 담당 더 이상 사용하지 않는 객체에 대한 소멸작업을 함 객체들 사이에 서로 참조관계가 있으므로 소멸시키지 않음 객체 테이블 A 참조 B 참조 C D 참조 E 객체 F는 참조되거나 참조하고 있는 것이 없으므로 가비지 컬렉터의 소멸대상이 된다. F * 가비지 컬렉터 : 메모리의 힙 영역에 생성된 객체의 정보를 모아 놓은 객체 테이블을 참고해서 객체의 소멸 작업을 한다. - 주기적으로 객체 테이블을 조사한다. - 객체를 소멸 시키기 위해서 명시적으로 가비지 컬렉터를 호출하는 코드를 작성할 수 있다.(그러나, 가비지 컬렉터가 즉시 객체 소멸 작업을 하는 것은 아니다.)
3. 객체의 소멸 소멸자 가비지 컬렉터에 의해 객체가 소멸될 때 해야 하는 정리 작업 을 소멸자에게 명시해주면 C#컴파일러는 Finalize 메소드로 변환한다. Finalize 메소드는 직접 작성이나 직접 호출이 불가능하다. 가비지 컬렉터만이 객체를 소멸할 때 Finalize 메소드를 호출 해서 사용한다.
소멸자 작성시 유의할 점 접근 지정자를 사용하지 않는다 반환 값이 없다. void도 허용하지 않는다 3. 객체의 소멸 소멸자 작성시 유의할 점 접근 지정자를 사용하지 않는다 반환 값이 없다. void도 허용하지 않는다 클래스명과 같지만 시작을 ‘~’로 표시해준다. 인자를 포함하지 않는다.
소멸자 ( Destructor) 3. 객체의 소멸 소멸자 class SourceFile { ~SourceFile() } <예> … class SourceFile { ~SourceFile() } 소멸자
소멸자 ( Destructor) 3. 객체의 소멸 FileStream 을 사용해서 직접 파일을 열고 닫는 예제 FileStream 유틸리티 클래스의 네임 스페이스 :System.IO (6행 ~ 10행): 파일을 열어 FileStream 객체에 저장하는 생성자 구현 (11행~14행) : 소멸자 정의부 실행 시 소멸자에서 정의한 메시지 확인 using System; using System.IO; class SourceFile { private FileStream src; public SourceFile(string name) src = File.Open(name, FileMode.Open); Console.WriteLine("{0}을(를) 엽니다.", src.Name); } ~SourceFile() src.Close(); Console.WriteLine("{0}을(를) 닫습니다.", src.Name); class Destructor static void Main(string[] args) //SourceFile src = new SourceFile("../../Destructor.cs"); SourceFile src = new SourceFile("C:/Temp/Destructor.cs");
3. 객체의 소멸 요약 클래스는 객체에 대한 설계도 역할을 하며 클래스의 구성에는 여덟 가지 클래스 멤버(필드, 메소드, 연산자, 상수, 생성자, 속성, 인덱스, 이벤트)가 있다. 객체를 생성하는 과정은 new 연산자를 통해 메모리를 할당하 고 생성자를 통해 객체의 값을 초기화 시킨다. 기본 생서자는 개발자가 직접 정의하지 않아도 컴파일러에 의 해서 구현되며 모든 값을 각 형식에 맞게 0, false, null로 초기 화 한다.
요약 생성자 오버로딩을 이용하면 개발자가 직접 생성자를 정의해 서 객체의 초기화를 구성할 수 있다. 3. 객체의 소멸 요약 생성자 오버로딩을 이용하면 개발자가 직접 생성자를 정의해 서 객체의 초기화를 구성할 수 있다. 초기화 목록을 사용하면 중복되는 코드를 간략하게 하며 객체 의 초기화에 편리하게 사용할 수 있다. private 생성자는 객체를 생성하지 않고 static 변수나 메소드 를 직접적으로 사용한다.
요약 static 생성자는 static으로 선언된 필드를 초기화하는데 사용 된다. 3. 객체의 소멸 요약 static 생성자는 static으로 선언된 필드를 초기화하는데 사용 된다. 객체의 소멸은 가비지 컬렉터에 의해 자동으로 수행되며, 가 비지 컬렉터는 객체 테이블을 주기적으로 조사해서 더 이상 사용되지 않는 객체의 메모리를 해제하고 반환해준다. 소멸자에 객체가 소멸할 때 정리가 필요한 작업을 정의해주면 객체가 소멸될 때 가비지 컬렉터에 의해 Finalize 메소드가 호 출되어 소멸자의 코드가 구현된다.