객체 지향 시스템에서 어디에서 클래스보다 (C 스타일) 구조체를 선택해야합니까?


9

C와 대부분의 다른 언어는 struct구조 (또는 비슷한 방식으로)를 만드는 키워드를 제공합니다 . 이것들은 클래스와 같은 단순화 된 관점에서 (적어도 C에서는) 있지만 다형성, 상속, 메소드 등은 없습니다.

C 스타일 구조체를 사용하여 객체 지향 (또는 다중 패러다임) 언어를 생각하십시오. 수업에서 어디를 선택 하시겠습니까? 이제는 클래스가 목적을 대체하는 것처럼 OOP와 함께 사용될 것이라고 생각하지 않지만 객체 지향 프로그램의 클래스와 어떤 상황에서 클래스보다 선호되는 상황이 있는지 궁금합니다. 그런 상황이 있습니까?


어떤 언어를 사용하고 있습니까? 무엇을 출판하고 있습니까? Java를 제외한 대부분의 최신 OO 언어는 어떤 방식 으로든 속성을 지원합니다.
케빈 클라인

답변:


16

일부 책에서 상태 전달 객체와 기능 제공 객체 사이에는 차이가 있습니다. 정확한 용어는 소스마다 다릅니다. 그러나 일반적으로 전자는 많은 필드와 간단한 getters-setter 쌍 (및 생성자)을 갖는 것으로 구별됩니다.

명시 적으로 "직렬화 가능"으로 표시된 클래스의 경우 Java에서 특히 일반적입니다.

멤버를 직접 숨길 필요가 없다고 생각하는 경우 (예 : 중첩 유형의 경우)이 클래스가 구조체로 가장 적합하다고 주장합니다.


1
Robert C Martin은이를 Clean Code 에서 "데이터 전송 객체"라고 부릅니다 .
user16764

5

C에는 클래스가 없으므로 struct데이터를 묶는 방법도 있습니다. C ++에서 상속 및 멤버 액세스가 기본적으로 아닌 struct라는 class점을 제외하고 는 동일 합니다. C #에도 일종의 이지만 C #에 대해 언급 할만 큼 충분하지 않습니다. Common Lisp는 언어 차이를 고려하여 가능한 한 C처럼 작동 하는 형식 을 가지며 Common Lisp Object System 클래스와 다릅니다.publicprivatestructdefstructstruct

그러나 관련 데이터 번들과 실제 클래스 간에는 개념상의 차이가 있으며 C ++ struct에서는 종종 데이터 번들에 class사용되는 반면 자체 동작이있는 객체에 사용됩니다. 지침으로, classa는 클래스 불변성과 같이 유용한 것으로 말할 수있는 것을 나타내는 반면, struct실제로는 다른 값에 크게 의존하지 않는 데이터 값과 더 느슨하게 결합됩니다.


6
a struct와 a 의 차이점은 classC #에서 더 중요합니다. 가장 큰 것은 a struct가 값 유형이고 a class가 참조 유형이라는 것입니다. struct내용이 16 바이트 이상이면 if를 사용하지 않는 것이 좋습니다 .
Carson63000

0

매우 기본적인 수준에서 구조체와 순수한 데이터 클래스 (속성 접근 자와는 다른 기능이없는 클래스)의 차이점은 무엇입니까?

메모리 풋 프린트 외에는 아무것도 없습니다.


0

허용 된 답변이 좋습니다. 그냥 추가하고 싶습니다 ....

때로는 클래스 안에 메소드를 넣는 것이 좋습니다. 다른 경우에는 구조체 / 클래스가 매개 변수로 전달되는 외부 함수를 사용하는 것이 좋습니다 (OOP 스타일을 수행하더라도).

클래스 안에 메소드를 넣을 때의 예 : Rectangle.CaclulateArea ()

클래스 외부에 함수를 넣을 때의 예 : Canvas.Draw (Rectangle rect)

Rectangle 안에 Draw ()를 넣을 수 있으며 작동합니다. 그러나 그리기는 계층에 따라 다릅니다. 서버 쪽이 아니라 클라이언트 쪽을 그립니다. Draw ()는 서버에도 존재하지 않는 것이 좋습니다. 그러나 "CalculateArea ()"는 계층과 독립적이며 사각형의 진정한 특성이므로 멤버 메서드로 포함하는 것이 좋습니다.


0

나에게 큰 차이점은 클래스 불변성 이 있는지 여부 입니다.

다른 말로하면 : 어느 시점에서나 어떤 필드로든 값을 자유롭게 바꿀 수 있습니까? 그렇다면 구조체입니다. 그렇지 않은 경우 클래스입니다.

구조체의 일반적인 예는 X 및 Y 멤버 만있는 2D 점으로, 모든 값을 가질 수 있고 서로 독립적입니다. 공개 액세스가 허용됩니다.

클래스의 예는 문자 배열에 대한 포인터와 길이 필드의 조합입니다. 길이는 포인터의 값에 따라 다르므로 구조체가 아니어야합니다. 필드는 개인용이어야하며 액세스는 클래스를 변경하지 못하도록 setter 및 getter를 거쳐야합니다.


0

1) 네트워크 struct: 유선을 통해 전송되는 구조.

보다 일반적이고 공식적으로 POD, 사소한, 표준 레이아웃 또는 관련 개념이어야하는 모든 클래스. 예제와 함께 이러한 개념에 대한 훌륭한 설명은 이 답변을 참조하십시오 (C ++ 11에 해당).

2) 펑터 (특히 술어)는 다음과 같은 함수로 전달 std::remove_if됩니다. 달리 말하면, 클래스와 유사 std::binary_function하거나 상속받은 클래스 등 .

3) 메타 프로그래밍 개념. 대중 constexpr및 / 또는 대중만을 포함 할 수있다 typedef.

편집 : 참고 :이 답변은 C ++ 클래스 대 구조체에 적용됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.