C# 복습하기 6) 클래스

 

종료자

 - 클래스 이름 앞에 ~붙이는 형태로 구현 가능 (C++과 동일)

 - 그러나 구현하지 않는 편이 좋음.

  1) 명시적으로 구현되어 있으면 GC가 object로부터 상속받은 Finalize() 메서드를 클래스의 족보를 타고 올라가며 호출하여 성능의 저하를 가져올 확률이 높음

  2) 언제 GC가 수거해갈지 예측할 수 없음 

class MyClass()
{
    public MyClass()
    {
        // 생성자
    }
    
    public ~MyClass()
    {
        // 종료자
    }
}

 

얕은 복사

 - 참조형식으로 복사한 것. 같은 힙 공간을 가리키고 있다.

 

깊은 복사

 - 별도의 힙 공간에 객체를 복사한 것.

 - 보통은 별도로 프로그래머가 구현한다.

 

this() 생성자

 - 생성자를 오버 로딩하여 구현할 때, this()를 사용하여 코드의 중복을 피할 수 있다.

class MyClass
{
    int a, b, c;
    
    public MyClass()
    {
        this.a = 1234;
        Console.WriteLine("A");
    }

    public MyClass(int b) : this()
    {
        this.b = b;
        Console.WriteLine("B");
    }
    
    public MyClass(int b, int c) : this(b)
    {
        this.c = b;
        Console.WriteLine("C");
    }
}

 - 중요한 것은 A, B, C의 호출 순서이다.

 - 마지막의 MyClass(int b, int c)로 생성했을 경우 로그에는 A -> B -> C 순으로 출력됨!

 

접근 한정자

 internal  같은 어셈블리에 있는 코드에서만 public 으로 접근 가능.
 다른 어셈블리에 있는 코드에서는 private와 같은 수준.
 protected internal  같은 어셈블리에 있는 코드에서만 protected로 접근 가능.
 다른 어셈블리에 있는 코드에서는 private와 같은 수준.
 private protected  같은 어셈블리에 있는 클래스에서 상속받은 클래스 내부에서만 접근 가능.

 

한정자

 sealed  클래스의 상속이 불가능하도록 함.

 

형 변환 연산자

 is  객체가 해당 형식에 해당하는지 여부를 bool로 반환함
 as  형 변환을 함. 일반적인 형식 변환 연산자는 실패시 예외가 발생하지만
 as는 실패시 참조값이 null이 됨.
object a;

MyClass temp = a as MyCalss;
if(temp != null)
    temp.SomeMethod();

 

확장 메서드

 - 기존 클래스의 기능을 확장하는 기법

 - static 메서드를 선언하고, 첫 번째 매개 변수를 this로 선언하며, 그 첫 번째 매개변수의 형식(클래스)이 확장됨.

public static class StClass
{
    public static void Method(this MyClass a)
    {
        // MyClass 의 기능이 확장됨
    }
}

public class MyClass
{

}

public class OtherClass()
{
    void Start()
    {
        MyClass temp = new MyClass();
        temp.Method(); // 확장 메소드인 'Method'가 원래 MyClass의 메소드인 것 처럼 사용 가능
    }
}

 

클래스와 구조체 비교

 - 구조체 또한 메서드를 가질 수 있기 때문에 많은 부분에서 클래스와 비슷하다.

 - 구조체는 값 형식이기 때문에 스택에 할당되고, 블록이 끝나는 지점의 메모리에서 사라진다.

 특징  클래스  구조체
 키워드  class  struct
 형식  참조 형식  값 형식
 복사  얕은 복사(Shallow Copy)  깊은 복사(Deep Copy)
 인스턴스 생성  new 연산자와 생성자 필요  선언만으로도 생성
 생성자  매개 변수 없는 생성자 선언 가능  매개 변수 없는 생성자 선언 불가능
 상속  가능  모든 구조체는 System.Object 형식을 상속하는 System.ValueType으로부터 직접 상속받음

 - 구조체는 값 형식이기 때문에 할당 연산자를 통해 모든 필드가 그대로 복사된다.

MyStruct a;
a.MyField1 = 1;
a.MyField2 = 2;

MyStruct b;
b = a; // 값으로 할당함
b.MyField1 = 3; // a의 값에는 영향을 주지 않는다. 

 

클래스와 객체, 인스턴스

 - 클래스(Class)는 객체를 만들기 위한 틀. 변수와 메소드를 가진다. (청사진)

 - 객체(Object)는 클래스가 구현할 대상.

 - 인스턴스(Instance)는 클래스가 구현화되어 메모리에 할당된 구체적인 실체.

 

댓글

Designed by JB FACTORY