Post

[C#] 클래스와 객체

[C#] 클래스와 객체

클래스와 객체


클래스

객체를 생성하기 위한 템플릿 또는 설계도 역할을 하며 속성(필드)과 동작(메소드)을 가진다.

  • Class 구조
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    class Player
    {
      public string Name;
      public int atk;
      public int def;
    
      public void PrintInfo()
      {
          Console.WriteLine("Name: " + Name);
          Console.WriteLine("Atk: " + atk);
          Console.WriteLine("Def: " + def);
      }
    }
    

구조체 vs 클래스
구조체와 클래스는 모두 사용자 정의 형식을 만드는 데 사용될 수 있다.
구조체는 값 형식이며, 스택에 할당되고 복사될 때 값이 복사된다.
클래스는 참조 형식이며, 힙에 할당되고 참조로 전달되므로 성능 측면에서 다소 차이가 있다.
구조체는 상속을 받을 수 없지만 클래스는 단일 상속 및 다중 상속이 가능하다.
구조체는 작은 크기의 데이터 저장이나 단순한 데이터 구조에 적합하며, 클래스는 더 복잡한 객체를 표현하고 다양한 기능을 제공하기 위해 사용된다.

생성자와 소멸자

클래스는 생성자와 소멸자라는 특별한 종류의 메서드를 가질 수 있다. 생성자는 클래스의 인스턴스를 생성할 때 호출되는 메서드이며, 소멸자는 클래스의 인스턴스가 메모리에서 해제될 때 호출되는 메서드이다.

  • 1) 생성자 (Constructor)
    1. 생성자란?
      • 생성자는 객체가 생성될 때 호출되는 특별한 메서드입니다.
      • 클래스의 인스턴스(객체)를 초기화하고, 필요한 초기값을 설정하는 역할을 수행합니다.
      • 생성자는 클래스와 동일한 이름을 가지며, 반환 타입이 없습니다.
      • 객체를 생성할 때 new 키워드와 함께 호출됩니다.
    2. 생성자의 특징
      • 객체를 초기화하는 과정에서 필요한 작업을 수행할 수 있습니다.
      • 생성자는 여러 개 정의할 수 있으며, 매개변수의 개수와 타입에 따라 다른 생성자를 호출할 수 있습니다. 이를 생성자 오버로딩이라고 합니다.
      • 기본적으로 매개변수가 없는 디폴트 생성자가 클래스에 자동으로 생성되지만, 사용자가 직접 정의한 생성자가 있는 경우 디폴트 생성자가 자동으로 생성되지 않습니다.
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        
          class Person
          {
              private string name;
              private int age;
                    
              public void PrintInfo()
              {
                  Console.WriteLine($"Name: {name}, Age: {age}");
              }
          }
                    
          Person person1 = new Person();
        

        ```csharp class Person { private string name; private int age;

      // 매개변수가 없는 디폴트 생성자 public Person() { name = “Unknown”; age = 0; }

      // 매개변수를 받는 생성자 public Person(string newName, int newAge) { name = newName; age = newAge; }

      public void PrintInfo() { Console.WriteLine($”Name: {name}, Age: {age}”); } }

      1
      2
      3
      
        ```csharp
        Person person1 = new Person();                     // 디폴트 생성자 호출
        Person person2 = new Person("John", 25);           // 매개변수를 받는 생성자 호출
      
  • 2) 소멸자 (Destructor)
    1. 소멸자란?
      • 소멸자는 객체가 소멸되는 시점에서 자동으로 호출되는 특별한 메서드입니다.
      • 객체의 사용이 종료되고 메모리에서 해제될 때 자동으로 호출되어 필요한 정리 작업을 수행합니다.
      • 클래스와 동일한 이름을 가지며, 이름 앞에 ~ 기호를 붙여 표현합니다.
      • 소멸자는 반환 타입이 없고 매개변수를 가질 수 없습니다.
      • C#에서는 가비지 컬렉터(Garbage Collector)에 의해 관리되는 메모리 해제를 담당하므로, 명시적으로 소멸자를 호출하는 것은 일반적으로 권장되지 않습니다.
    2. 소멸자의 역할
      • 자원 해제: 파일 핸들, 네트워크 연결, 데이터베이스 연결 등의 외부 리소스를 사용한 경우, 소멸자를 통해 해당 리소스를 해제할 수 있습니다.
      • 메모리 해제: 객체가 사용한 메모리를 해제하고 관련된 자원을 정리할 수 있습니다.
      • 로깅 및 디버깅: 객체가 소멸되는 시점에 로깅 작업을 수행하거나 디버깅 정보를 기록할 수 있습니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
      class Person
      {
          private string name;
        
          public Person(string newName)
          {
              name = newName;
              Console.WriteLine("Person 객체 생성");
          }
        
          ~Person()
          {
              Console.WriteLine("Person 객체 소멸");
          }
      }
    

객체

객체는 클래스의 인스턴스이다. 즉 실체화된 형태라고 할 수 있다.

1
Player p = new Player();

모양을 찍어내는 틀이 있다고 치면 해당 틀은 클래스(Class)이다. 그리고 그 틀을 이용하여 생성된 모형이 객체라고 생각하면 된다.

객체지향 프로그래밍 특징

  1. 캡슐화 (Encapsulation):
    • 관련된 데이터와 기능을 하나의 단위로 묶는 것을 의미한다.
    • 클래스를 사용하여 데이터와 해당 데이터를 조작하는 메서드를 함께 캡슐화하여 정보를 은닉하고, 외부에서 직접적인 접근을 제한함으로써 안정성과 유지보수성을 높힌다.
  2. 상속 (Inheritance):
    • 상속은 기존의 클래스를 확장하여 새로운 클래스를 만드는 메커니즘이다.
    • 부모 클래스(상위 클래스, 슈퍼 클래스)의 특성과 동작을 자식 클래스(하위 클래스, 서브 클래스)가 상속받아 재사용할 수 있다.
    • 코드의 중복을 줄이고, 클래스 간 계층 구조를 구성하여 코드의 구조화와 유지보수를 용이하게 한다.
  3. 다형성 (Polymorphism):
    • 다형성은 하나의 인터페이스나 기능을 다양한 방식으로 구현하거나 사용할 수 있는 능력을 의미한다.
    • 하나의 메서드 이름이 다양한 객체에서 다르게 동작할 수 있도록 하는 것으로, 오버로딩과 오버라이딩을 통해 구현된다.
    • 유연하고 확장 가능한 코드 작성을 가능하게 하며, 코드의 가독성과 재사용성을 높힌다.
  4. 추상화 (Abstraction):
    • 추상화는 복잡한 시스템이나 개념을 단순화하여 필요한 기능에 집중하는 것을 의미한다.
    • 클래스나 인터페이스를 사용하여 실제 세계의 개념을 모델링하고, 필요한 부분에 대한 명세를 정의한다.
    • 세부 구현 내용을 감추고 핵심 개념에 집중함으로써 코드의 이해와 유지보수를 용이하게 한다.
  5. 객체 (Object):
    • 객체는 클래스로부터 생성된 실체로, 데이터와 해당 데이터를 조작하는 메서드를 가지고 있다.
    • 객체는 상태(데이터)와 행동(메서드)을 가지며, 실제 세계의 개체나 개념을 모델링한다.
    • 객체들 간의 상호작용을 통해 프로그램이 동작하고, 모듈화와 재사용성을 높힌다.
This post is licensed under CC BY 4.0 by the author.