[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)
- 생성자란?
- 생성자는 객체가 생성될 때 호출되는 특별한 메서드입니다.
- 클래스의 인스턴스(객체)를 초기화하고, 필요한 초기값을 설정하는 역할을 수행합니다.
- 생성자는 클래스와 동일한 이름을 가지며, 반환 타입이 없습니다.
- 객체를 생성할 때 new 키워드와 함께 호출됩니다.
- 생성자의 특징
- 객체를 초기화하는 과정에서 필요한 작업을 수행할 수 있습니다.
- 생성자는 여러 개 정의할 수 있으며, 매개변수의 개수와 타입에 따라 다른 생성자를 호출할 수 있습니다. 이를 생성자 오버로딩이라고 합니다.
- 기본적으로 매개변수가 없는 디폴트 생성자가 클래스에 자동으로 생성되지만, 사용자가 직접 정의한 생성자가 있는 경우 디폴트 생성자가 자동으로 생성되지 않습니다.
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)
- 소멸자란?
- 소멸자는 객체가 소멸되는 시점에서 자동으로 호출되는 특별한 메서드입니다.
- 객체의 사용이 종료되고 메모리에서 해제될 때 자동으로 호출되어 필요한 정리 작업을 수행합니다.
- 클래스와 동일한 이름을 가지며, 이름 앞에 ~ 기호를 붙여 표현합니다.
- 소멸자는 반환 타입이 없고 매개변수를 가질 수 없습니다.
- C#에서는 가비지 컬렉터(Garbage Collector)에 의해 관리되는 메모리 해제를 담당하므로, 명시적으로 소멸자를 호출하는 것은 일반적으로 권장되지 않습니다.
- 소멸자의 역할
- 자원 해제: 파일 핸들, 네트워크 연결, 데이터베이스 연결 등의 외부 리소스를 사용한 경우, 소멸자를 통해 해당 리소스를 해제할 수 있습니다.
- 메모리 해제: 객체가 사용한 메모리를 해제하고 관련된 자원을 정리할 수 있습니다.
- 로깅 및 디버깅: 객체가 소멸되는 시점에 로깅 작업을 수행하거나 디버깅 정보를 기록할 수 있습니다.
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)이다. 그리고 그 틀을 이용하여 생성된 모형이 객체라고 생각하면 된다.
객체지향 프로그래밍 특징
- 캡슐화 (Encapsulation):
- 관련된 데이터와 기능을 하나의 단위로 묶는 것을 의미한다.
- 클래스를 사용하여 데이터와 해당 데이터를 조작하는 메서드를 함께 캡슐화하여 정보를 은닉하고, 외부에서 직접적인 접근을 제한함으로써 안정성과 유지보수성을 높힌다.
- 상속 (Inheritance):
- 상속은 기존의 클래스를 확장하여 새로운 클래스를 만드는 메커니즘이다.
- 부모 클래스(상위 클래스, 슈퍼 클래스)의 특성과 동작을 자식 클래스(하위 클래스, 서브 클래스)가 상속받아 재사용할 수 있다.
- 코드의 중복을 줄이고, 클래스 간 계층 구조를 구성하여 코드의 구조화와 유지보수를 용이하게 한다.
- 다형성 (Polymorphism):
- 다형성은 하나의 인터페이스나 기능을 다양한 방식으로 구현하거나 사용할 수 있는 능력을 의미한다.
- 하나의 메서드 이름이 다양한 객체에서 다르게 동작할 수 있도록 하는 것으로, 오버로딩과 오버라이딩을 통해 구현된다.
- 유연하고 확장 가능한 코드 작성을 가능하게 하며, 코드의 가독성과 재사용성을 높힌다.
- 추상화 (Abstraction):
- 추상화는 복잡한 시스템이나 개념을 단순화하여 필요한 기능에 집중하는 것을 의미한다.
- 클래스나 인터페이스를 사용하여 실제 세계의 개념을 모델링하고, 필요한 부분에 대한 명세를 정의한다.
- 세부 구현 내용을 감추고 핵심 개념에 집중함으로써 코드의 이해와 유지보수를 용이하게 한다.
- 객체 (Object):
- 객체는 클래스로부터 생성된 실체로, 데이터와 해당 데이터를 조작하는 메서드를 가지고 있다.
- 객체는 상태(데이터)와 행동(메서드)을 가지며, 실제 세계의 개체나 개념을 모델링한다.
- 객체들 간의 상호작용을 통해 프로그램이 동작하고, 모듈화와 재사용성을 높힌다.