class MyClass
{
// 필드(데이터)
private int myField;
// 프로퍼티
public int MyProperty { get; set; }
// 생성자
public MyClass(int fieldValue)
{
myField = fieldValue;
}
// 메서드(동작)
public void DisplayValue()
{
Console.WriteLine("Value: " + myField);
}
}
MyClass obj1 = new MyClass(10);
MyClass obj2 = obj1; // obj2와 obj1은 같은 객체를 참조
class ParentClass
{
public void ShowMessage()
{
Console.WriteLine("Parent class method");
}
}
class ChildClass : ParentClass
{
public void ShowChildMessage()
{
Console.WriteLine("Child class method");
}
}
class Animal
{
public virtual void Speak()
{
Console.WriteLine("Animal speaks");
}
}
class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("Dog barks");
}
}
class Person
{
public string Name;
public int Age;
public void PrintInfo()
{
Console.WriteLine("Name: " + Name);
Console.WriteLine("Age: " + Age);
}
}
Person p = new Person();
p.Name = "John";
p.Age = 30;
p.PrintInfo(); // 출력: Name: John, Age: 30
class Person
{
public string Name; // 외부에서 자유롭게 접근 가능
private int Age; // 같은 클래스 내부에서만 접근 가능
protected string Address; // 같은 클래스 내부와 상속받은 클래스에서만 접근 가능
}
class Player
{
// 필드 선언
private string name;
private int level;
}
class Player
{
// 필드
private string name;
private int level;
// 메서드
public void Attack()
{
// 공격 동작 구현
}
}
Player player = new Player(); // Player 클래스의 인스턴스 생성
player.Attack(); // Attack 메서드 호출
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}");
}
}
Person person1 = new Person(); // 디폴트 생성자 호출
Person person2 = new Person("John", 25); // 매개변수를 받는 생성자 호출
class Person
{
private string name;
public Person(string newName)
{
name = newName;
Console.WriteLine("Person 객체 생성");
}
~Person()
{
Console.WriteLine("Person 객체 소멸");
}
}
[접근 제한자] [데이터 타입] 프로퍼티명
{
get
{
// 필드를 반환하거나 다른 로직 수행
}
set
{
// 필드에 값을 설정하거나 다른 로직 수행
}
}
class Person
{
private string name;
private int age;
public string Name
{
get { return name; }
set { name = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
}
Person person = new Person();
person.Name = "John"; // Name 프로퍼티에 값 설정
person.Age = 25; // Age 프로퍼티에 값 설정
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
class Person
{
private string name;
private int age;
public string Name
{
get { return name; }
private set { name = value; }
}
public int Age
{
get { return age; }
set
{
if (value >= 0)
age = value;
}
}
}
Person person = new Person();
person.Name = "John"; // 컴파일 오류: Name 프로퍼티의 set 접근자는 private
person.Age = -10; // 유효성 검사에 의해 나이 값이 설정되지 않음
[접근 제한자] [데이터 타입] 프로퍼티명 { get; set; }
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person person = new Person();
person.Name = "John"; // 값을 설정
person.Age = 25; // 값을 설정
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}"); // 값을 읽어 출력
class Utility
{
public static int Add(int a, int b)
{
return a + b;
}
}
// 정적 메서드 호출
int result = Utility.Add(3, 4);
// File1.cs
partial class MyClass
{
public void Method1() { }
}
// File2.cs
partial class MyClass
{
public void Method2() { }
}
interface IMyInterface
{
void MethodA();
}
class MyClass : IMyInterface
{
public void MethodA()
{
Console.WriteLine("MethodA 구현");
}
}
구조체는 가벼운 데이터 그룹을 다룰 때 적합하며, 클래스는 더 복잡한 데이터 및 동작을 다루는 데 적합합니다. 각기 다른 상황에 맞게 적절한 타입을 선택하는 것이 중요합니다.
int a = 5;
int b = a; // b는 5를 가지며, a와는 독립적
a = 10; // a의 값만 변경, b는 여전히 5
class MyClass
{
public int Value;
}
MyClass obj1 = new MyClass();
obj1.Value = 5;
MyClass obj2 = obj1; // obj2는 obj1을 가리킴
obj1.Value = 10; // obj1의 값을 변경하면 obj2의 값도 변경됨
C++와 C#의 클래스는 기본적인 구조는 비슷하지만, 메모리 관리, 상속 방식, 다형성 구현 등에서 중요한 차이점이 있음. 아래에서 두 언어의 클래스 차이를 몇 가지 주요 항목을 중심으로 설명하겠음
// C++
class MyClass {
int x; // private
};
// C#
class MyClass {
int x; // private
}
// C++
class MyClass
{
public:
MyClass() { cout << "Constructor" << endl; }
~MyClass() { cout << "Destructor" << endl; }
};
int main()
{
MyClass* obj = new MyClass(); // 생성
delete obj; // 수동으로 해제
return 0;
}
// C#
class MyClass
{
public MyClass() { Console.WriteLine("Constructor"); }
~MyClass() { Console.WriteLine("Destructor"); }
}
class Program
{
static void Main()
{
MyClass obj = new MyClass(); // 가비지 컬렉터가 자동으로 해제
}
}
C++ : 다중 상속을 지원 함. 하나의 클래스가 여러 클래스로부터 상속받을 수 있음. 하지만 다중 상속은 복잡성을 증가시킬 수 있기 때문에 신중히 사용해야 함
C# : 다중 상속을 지원하지 않으며, 오직 단일 상속만 가능합니다. 하지만 인터페이스는 여러 개 구현할 수 있음
// C++ 다중 상속
class A { };
class B { };
class C : public A, public B { }; // 다중 상속 가능
// C# 단일 상속과 다중 인터페이스 구현
interface IA { }
interface IB { }
class C : IA, IB { } // 다중 인터페이스 구현 가능
C++ : 다형성을 구현하려면 기본적으로 가상 함수(virtual functions)를 사용.
파생 클래스에서 부모 클래스의 메서드를 재정의하려면, 부모 클래스 메서드에 virtual 키워드를 붙여야 하며, 파생 클래스에서는 override 키워드 없이도 재정의할 수 있음
C# : 다형성도 가상 메서드로 구현되지만, override 키워드를 반드시 사용해야 함.
메서드를 가상 메서드로 만들기 위해 부모 클래스에서는 virtual, 파생 클래스에서는 override를 명시적으로 지정해야 함
// C++
class Base
{
public:
virtual void Speak()
{
cout << "Base class" << endl;
}
};
class Derived : public Base
{
public:
void Speak() override
{
cout << "Derived class" << endl;
}
};
// C#
class Base
{
public virtual void Speak()
{
Console.WriteLine("Base class");
}
}
class Derived : Base
{
public override void Speak()
{
Console.WriteLine("Derived class");
}
}
// C++ 추상 클래스
class Shape
{
public:
virtual void Draw() = 0; // 순수 가상 함수
};
// C# 인터페이스
interface IShape
{
void Draw(); // 구현 없음
}
C++ : C++에는 property라는 개념이 없으며, 직접 변수를 선언하거나 getter/setter 함수를 사용해야 함 참고링크
C# : 프로퍼티(property)를 통해 클래스 멤버 변수에 접근할 수 있으며, 이를 통해 데이터 접근을 캡슐화할 수 있습니다.
// C# 프로퍼티 예시
class MyClass
{
private int _value;
public int Value
{
get { return _value; }
set { _value = value; }
}
}
C++ : 이벤트와 델리게이트를 직접 지원하지 않으며, 대신 함수 포인터나 객체 지향적인 방식으로 이벤트 시스템을 구현해야 함
C# : 델리게이트(delegate)와 이벤트(event)라는 특별한 구문을 지원하여, 이벤트 기반 프로그래밍을 쉽게 구현할 수 있음
// C# 델리게이트와 이벤트
public delegate void MyDelegate();
class MyClass {
public event MyDelegate OnChange;
}