클래스 class
데이터와 메서드를 하나로 묶는 사용자 정의 타입.
여러 정보를 사용하여 하나의 목적이나 책임을 위한 기능을 담은 것.
특징
- 참조형 (Reference Type) : 메모리 영역 중 힙(Heap)에 저장된다.
- 인스턴스는 힙에 저장되고, 이 저장된 데이터를 참조만 한다. (얕은 복사)
- 메모리 할당과 해제가 복잡하고 GC에 의해 메모리 관리가 이루어진다.
- 확장 가능 : 상속 및 다형성, 의존성 주입
구조체 struct
하나 이상의 변수들을 묶어서 그룹으로 만드는 사용자 정의 자료형.
여러 종류의 자료형을 담은 것. 여러 정보를 담은 것.
클래스가 있는데 왜 써야하지?
- 기존 C언어에서는 class가 없어서 struct를 사용했고, C언어와 호환을 위해서 struct를 사용한다.
- 지금은 이런 단순한 이유 말고 메모리 관리에 용이하다는 부분에서 계속 사용되고 있다.
- 일반적으로 클래스보다 가볍고 빠르다.
- 데이터를 저장하고 전달하는데 효과적이다.
- 스택에 저장되기 때문이다.
특징
- 값형 (Value Type) : 메모리 영역 중 스택(Stack)에 저장된다.
- 어떤 구조체를 만들고 다른 변수에 대입하면 값이 복사된다. (깊은 복사)
- 메모리 할당과 해제가 간단하고 빠르다.
- 힙 메모리를 사용하지 않아 GC에 부하가 생기지 않는다.
- 단, 구조체의 크기가 너무 커지거나, 구조체 인스턴스를 불필요하게 많이 생성하면 스택 메모리가 과도하게 사용될 수 있다. (스택 오버플로우 발생)
- 생성자, 프로퍼티, 멤버 변수, 멤버 메서드, 이벤트 사용 가능
- 상속 불가
- 상속은 불가능한데 interface 구현은 가능하다.
클래스 vs 구조체
- 구조체는 작은 크기의 데이터 저장이나 단순한 데이터 구조에 적합
- 클래스는 더 복잡한 객체를 표현하고 다양한 기능을 제공
적절히 균형있게 사용한다...
MS 공식 문서
고려사항
- 형식 차이 : 값 형식 vs 참조 형식
- 메모리 사용량 : 박싱 vs 언박싱
- 전달 방식 : 깊은 복사 vs 얕은 복사
(내용 중) 경험상 프레임워크에 있는 대부분의 형식은 클래스여야한다.
그러나 값 형식의 특성으로 인해 구조체를 사용하는 것이 더 적절한 상황이 있다.
- 형식의 인스턴스가 작고
- 일반적으로 수명이 짧거나
- 일반적으로 다른 개체에 포함되는 경우
클래스 대신 구조체를 정의하는 것이 좋습니다.
사용하지 않아야 하는 경우
형식이 다음 특성을 모두 갖지 않는 한 구조체를 정의하지 마세요.
- 이는 기본 형식(int, double 등)과 유사한 단일 값을 논리적으로 나타냅니다.
- 인스턴스 크기는 16바이트 미만입니다.
- 이는 변경이 불가능합니다.
- 자주 boxing할 필요는 없습니다.
추가 비교
인터페이스 interface
클래스가 가져야할 메서드, 프로퍼티를 명시해주는 것.
- 클래스에 규칙 / 규격을 적용할 수 있다.
- 클래스들의 공통된 사용을 위한 약속
- 유사한 기능들을 가진 클래스들을 interface를 통해서 공통점을 묶어줄 수 있다.
- 인터페이스를 상속받은 클래스는 명시된 사항을 반드시 구현해주어야 한다.
- 단, 공통된 사용을 위함이지 단일 클래스를 위해서 인터페이스를 구현하진 않는다.
- 전제가 서로 다른 두 클래스의 공통 기능을 묶어 통일된 사용을 위한 것이므로.
- 다중 상속 가능
추상 클래스 abstract
인터페이스의 성격을 지닌 클래스.
클래스가 지녀야할 메서드, 프로퍼티를 명시해줄 수 있고
이렇게 명시한 사항은 하위 클래스에서 반드시 구현해야한다.
추상 클래스로 인스턴스를 만들 수는 없기 때문에 하위 클래스에서 상속해서 사용해야한다.
추가로 추상 클래스 내에서도 메서드 구현 및 선언이 가능하다.