본문 바로가기

프로그래밍 언어/C#

[C# 문법] - 클래스

  • 모든 클래스는 복합 데이터 형식이며 복합 데이터 형식은 참조 형식
  • 생성자와 소멸자
    • 생성자는 인스턴스의 멤버들을 초기화 할 수 있는 가장 좋은 메서드
    • 소멸자는 인스턴스가 소멸할 때 호출되는 메소드. 즉, 가비지 컬렉터가 인스턴스를 소멸시킬 때 호출됨. 단, 호출 타이밍을 알 수 없기 때문에 사용하는것이 바람직하지는 않다.
  • static 은 프로그램 전체에서 사용할 변수에 할당하는것이 바람직하다.
  • 얕은 복사와 깊은 복사
    • 얕은 복사 : 객체를 복사할 때 참조만 복사하는 것. 그래서 값을 변경하면 원본과 복사본 모두의 값이 변경됨.
    • 깊은 복사 : 객체를 복사해 별도의 힙 공간에 보관하는것. 즉, 값 변경이 독립적으로 일어남.
    • C# 의 경우 자동으로 깊은 복사를 해주는 기능은 없고, 커스텀해서 사용해야함.
  • 접근 한정자 ( private , public , protected, internal, protected internal )
    • private : 클래스 내부에서만 접근가능
    • public : 클래스 내,외부에서 모두 접근가능
    • protected : 상속된 클래스에서만 접근가능
    • internal : 같은 어셈블리 내에서만 접근가능 ( 프로젝트 )
    • protected internal : 같은 어셈블리 내에서만 protected 로 접근 가능
      ![[Pasted image 20240221222819.png]]
  • 상속
    • 상속을 이용하면 클래스의 재활용이 가능하다.
    • Base 클래스를 이용하면 Derived 클래스에서 Base 클래스의 자원을 사용할 수 있다. 단, private 자원은 제외.
    • base 키워드를 이용하면 Base 클래스에 접근이 가능하다.
    • Base 클래스의 생성자 또한 base() 의 형식으로 호출이 가능하다.
    • sealed 키워드를 사용하면 해당 클래스의 상속은 불가능하다.
    • is 와 as 를 사용하면 참조 형식간 형식변환에 유용하다.
      • is : 객체가 해당 형식에 해당하는지 검사하여 bool 값을 반환
      • as : 형식 변환 연산자와 동일한 기능이나, 실패할 경우 예외를 던지는것이 아닌 null 을 던짐. -> 안전하다.
    • 함수 재정의 ( 오버라이딩 ) 을 이용하면 Derived 클래스에서 Base 클래스의 함수를 입맛대로 사용할 수 있다. 단, Base 클래스의 함수는 virtual 로 한정되어야 한다. -> 다형성 확보
    • 함수의 정의에 new 키워드를 이용하면 메소드 숨기기가 가능하다.
    • 오버라이드 함수의 sealed 키워드를 사용하면 함수 재정의의 재정의는 막아둘 수 있다.
  • 중첩 클래스
    • 클래스 내부의 클래스를 말함. 자신이 속한 클래스의 멤버에 자유롭게 접근이 가능 ( private 포함 )
    • 중첩 클래스의 사용 이유는?
      • 클래스 외부의 공개하고 싶지 않은 형식을 만들고싶을때
      • 현재의 클래스의 일부분임을 보여주고 싶을때
  • 분할 클래스
    • 클래스를 나누어 작성할 수 있는 기능
    • partial 키워드를 이용하여 사용.
    • 한 클래스의 길이가 너무 길어질 때 혹은 클래스 내부에서 기능을 세분화하고 싶을때 사용하면 유용하다.
  • 확장 메소드
    • 기존 클래스의 기능을 확장시킬 수 있는 기능.
    • 확장 메소드가 존재하는 클래스와 확장 메소드 둘 모두 static 으로 선언해야하며, 확장 메소드이 첫번째 매개변수는 this 키워드가 붙어야함.
public static class StringExtensions
{
    public static string Reverse(this string str)
    {
        char[] charArray = str.ToCharArray();
        Array.Reverse(charArray);
        return new string(charArray);
    }
}

class Program
{
    static void Main()
    {
        string original = "hello";
        string reversed = original.Reverse();
        Console.WriteLine(reversed); // Output: "olleh"
    }
}

  • 구조체
    • 구조체는 클래스와 비슷하지만 다른 성격의 복합 데이터 형식임.
    • 가장 큰 차이는 구조체는 참조 형식이 아닌 값 형식으로, 인스턴스의 깊은 복사가 가능하다는 점. 또한 new 연산자 없이 선언만으로 생성이 가능함. 다만, 매개변수가 없는 생성자는 생성할 수 없다.