개념 정리 1 : 클래스 vs 구조체

김정환·2024년 9월 27일
0

클래스 class

데이터와 메서드를 하나로 묶는 사용자 정의 타입.
여러 정보를 사용하여 하나의 목적이나 책임을 위한 기능을 담은 것.

특징

  • 참조형 (Reference Type) : 메모리 영역 중 힙(Heap)에 저장된다.
    • 인스턴스는 힙에 저장되고, 이 저장된 데이터를 참조만 한다. (얕은 복사)
    • 메모리 할당과 해제가 복잡하고 GC에 의해 메모리 관리가 이루어진다.
  • 확장 가능 : 상속 및 다형성, 의존성 주입

구조체 struct

하나 이상의 변수들을 묶어서 그룹으로 만드는 사용자 정의 자료형.
여러 종류의 자료형을 담은 것. 여러 정보를 담은 것.

클래스가 있는데 왜 써야하지?

  • 기존 C언어에서는 class가 없어서 struct를 사용했고, C언어와 호환을 위해서 struct를 사용한다.
  • 지금은 이런 단순한 이유 말고 메모리 관리에 용이하다는 부분에서 계속 사용되고 있다.
    • 일반적으로 클래스보다 가볍고 빠르다.
    • 데이터를 저장하고 전달하는데 효과적이다.
    • 스택에 저장되기 때문이다.

특징

  • 값형 (Value Type) : 메모리 영역 중 스택(Stack)에 저장된다.
    • 어떤 구조체를 만들고 다른 변수에 대입하면 값이 복사된다. (깊은 복사)
    • 메모리 할당과 해제가 간단하고 빠르다.
    • 힙 메모리를 사용하지 않아 GC에 부하가 생기지 않는다.
    • 단, 구조체의 크기가 너무 커지거나, 구조체 인스턴스를 불필요하게 많이 생성하면 스택 메모리가 과도하게 사용될 수 있다. (스택 오버플로우 발생)
  • 생성자, 프로퍼티, 멤버 변수, 멤버 메서드, 이벤트 사용 가능
  • 상속 불가
    • 상속은 불가능한데 interface 구현은 가능하다.

클래스 vs 구조체

  • 구조체는 작은 크기의 데이터 저장이나 단순한 데이터 구조에 적합
  • 클래스는 더 복잡한 객체를 표현하고 다양한 기능을 제공

적절히 균형있게 사용한다...

MS 공식 문서

고려사항

  1. 형식 차이 : 값 형식 vs 참조 형식
  2. 메모리 사용량 : 박싱 vs 언박싱
  3. 전달 방식 : 깊은 복사 vs 얕은 복사

(내용 중) 경험상 프레임워크에 있는 대부분의 형식은 클래스여야한다.
그러나 값 형식의 특성으로 인해 구조체를 사용하는 것이 더 적절한 상황이 있다.

  • 형식의 인스턴스가 작고
  • 일반적으로 수명이 짧거나
  • 일반적으로 다른 개체에 포함되는 경우

클래스 대신 구조체를 정의하는 것이 좋습니다.

사용하지 않아야 하는 경우

형식이 다음 특성을 모두 갖지 않는 한 구조체를 정의하지 마세요.

  • 이는 기본 형식(int, double 등)과 유사한 단일 값을 논리적으로 나타냅니다.
  • 인스턴스 크기는 16바이트 미만입니다.
  • 이는 변경이 불가능합니다.
  • 자주 boxing할 필요는 없습니다.

추가 비교


인터페이스 interface

클래스가 가져야할 메서드, 프로퍼티를 명시해주는 것.

  • 클래스에 규칙 / 규격을 적용할 수 있다.
    • 클래스들의 공통된 사용을 위한 약속
    • 유사한 기능들을 가진 클래스들을 interface를 통해서 공통점을 묶어줄 수 있다.
  • 인터페이스를 상속받은 클래스는 명시된 사항을 반드시 구현해주어야 한다.
  • 단, 공통된 사용을 위함이지 단일 클래스를 위해서 인터페이스를 구현하진 않는다.
    • 전제가 서로 다른 두 클래스의 공통 기능을 묶어 통일된 사용을 위한 것이므로.
  • 다중 상속 가능

추상 클래스 abstract

인터페이스의 성격을 지닌 클래스.
클래스가 지녀야할 메서드, 프로퍼티를 명시해줄 수 있고
이렇게 명시한 사항은 하위 클래스에서 반드시 구현해야한다.
추상 클래스로 인스턴스를 만들 수는 없기 때문에 하위 클래스에서 상속해서 사용해야한다.

추가로 추상 클래스 내에서도 메서드 구현 및 선언이 가능하다.

  • 단일 상속
profile
사파 개발자

0개의 댓글