반도체/C++

C#과 C++의 객체 지향 개념 차이

Clair_de_Lune 2024. 8. 1. 15:08
728x90

1. 클래스와 구조체

  • C++: C++에서는 클래스와 구조체가 있으며, 둘 다 사용자 정의 데이터 타입을 정의할 수 있습니다. 기본적으로 구조체의 멤버는 public이고, 클래스의 멤버는 private입니다. 또한, C++에서는 구조체도 메서드와 접근 제어를 가질 수 있습니다.
  • C#: C#에서는 클래스와 구조체가 있지만, 구조체는 값 타입(value type)으로, 클래스는 참조 타입(reference type)입니다. 구조체는 주로 간단한 데이터 구조에 사용되며, 메서드와 속성을 가질 수 있지만, 상속은 지원하지 않습니다.

2. 접근 제어자

  • C++: C++에서는 public, private, protected 접근 제어자를 사용하여 멤버의 접근 수준을 지정합니다. 기본 접근 수준은 클래스에서는 private, 구조체에서는 public입니다.
  • C#: C#에서도 동일한 접근 제어자를 사용하지만, internal이라는 추가적인 접근 제어자가 있습니다. internal은 같은 어셈블리 내에서만 접근할 수 있습니다.

3. 상속

  • C++: C++에서는 다중 상속(multiple inheritance)을 지원합니다. 즉, 하나의 클래스가 여러 부모 클래스로부터 상속받을 수 있습니다. 하지만, 이는 복잡성을 증가시킬 수 있습니다.
  • C#: C#에서는 단일 상속(single inheritance)만 지원합니다. 즉, 클래스는 하나의 부모 클래스만 가질 수 있지만, 인터페이스를 통해 다중 상속을 구현할 수 있습니다.

4. 메서드 오버로딩과 오버라이딩

  • C++: C++에서는 메서드 오버로딩과 오버라이딩이 가능합니다. 메서드 오버라이딩을 위해 virtual 키워드를 사용해야 합니다. 기본적으로 메서드는 오버라이딩되지 않으며, 명시적으로 virtual로 선언해야 합니다.
  • C#: C#에서도 메서드 오버로딩과 오버라이딩이 가능합니다. 오버라이딩할 메서드는 virtual로 선언하고, 자식 클래스에서 override 키워드를 사용하여 오버라이드합니다. C#은 기본적으로 메서드 오버라이딩을 지원합니다.

5. 생성자와 소멸자

  • C++: C++에서는 생성자와 소멸자를 정의할 수 있으며, 소멸자는 객체의 생명 주기가 끝날 때 호출됩니다. C++는 메모리 관리를 수동으로 해야 하며, 따라서 메모리 누수에 주의해야 합니다.
  • C#: C#에서도 생성자는 정의할 수 있지만, 소멸자는 Finalize 메서드로 구현됩니다. C#은 가비지 컬렉션(garbage collection)을 통해 메모리를 자동으로 관리하므로, 메모리 누수의 위험이 상대적으로 적습니다.

6. 인터페이스와 추상 클래스

  • C++: C++에서는 pure virtual function을 사용하여 추상 클래스를 정의할 수 있으며, 인터페이스는 명시적으로 제공되지 않지만, 순수 가상 함수를 사용하여 비슷한 기능을 구현할 수 있습니다.
  • C#: C#에서는 interface 키워드를 사용하여 명시적인 인터페이스를 정의할 수 있습니다. 추상 클래스도 abstract 키워드를 사용하여 정의할 수 있습니다. C#의 인터페이스는 다중 상속을 지원합니다.

7. 프로퍼티

  • C++: C++에서는 클래스의 멤버 변수를 직접적으로 접근할 수 있으며, 프로퍼티 개념이 명확하게 정의되어 있지 않습니다. 주로 getter와 setter 메서드를 사용하여 접근합니다.
  • C#: C#에서는 프로퍼티(property)라는 개념이 도입되어, 필드에 대한 접근을 더 쉽게 할 수 있습니다. 프로퍼티를 사용하면 필드를 직접 접근하는 것처럼 보이지만, 내부적으로 getter와 setter 메서드가 호출됩니다.

이러한 차이점들은 C#과 C++의 객체 지향 프로그래밍 접근 방식에 영향을 미치며, 각 언어의 특성과 사용 용도에 따라 적절한 선택이 필요합니다.

728x90