[C++] Struct 와 Class 차이 살펴보기.

2017. 7. 11. 19:28공부 자료

[C++] Struct 와 Class 차이 살펴보기.


지난 포스트에 이어 계속해서 C++ 공부중에 있던 도중, 예전부터 Struct를 햇갈려 했었기에, 개념부터 잡고 가야겠다는 생각이 들었습니다. 예전에 개인 프로젝트도 Struct에 대한 개념 없이 마구잡이로 사용하다가 망했던 이력도 있어 이번 기회에 글을 쓰게 되었습니다. 
이번에 살펴 볼 내용은 다음과 같습니다.

1. Class / Struct 를 함수 인자로 넘겨서 사용하기.
2. Class / Struct 의 복사와 주솟값의 변화 확인.
3. Class / Struct 를 함수 결과로 반환받아 사용하기.


결론부터 이야기하자면 "Class와 Struct는 모두 Call By Value 이다." 입니다. 이에 대한 결과는 아래에서 서술하도록 하겠습니다만, 간단히 말하면 int나 char 같은 기본 Type과 같은 결과를 가진다는 것 입니다.


살펴본 코드는 다음과 같습니다.



그럼 하나하나 보면서 확인 해 보도록 하겠습니다.


먼저 omok.cpp 에는 전 포스트에서 보였던 omok 을 구현하기 위한 파일들이 존재합니다. 


이번에 사용한 Location Class는 그저 int형 변수 x, y 가 선언되어 있고, GetX(), GetY()로 접근 가능하도록 만들어둔 2차원 좌표 Class 라고 생각하면 됩니다. 


생성자로는 기본 생성자와 x, y를 받아들여 생성 가능한 생성자가 있습니다.


또한 이러한 Class와 비슷한 역할을 하는 Point 라는 이름의 구조체를 비교를 위해서 선언하였습니다.


이러한 구조체와 Class를 가지고 print 하는 함수와 각 좌표에 2씩 더해주는 함수를 만들었습니다. 이러한 함수들은 위에서 말한 인자로 넘겨 받기와 반환하기를 확인하는 데에 사용됩니다.



1. Class / Struct 를 함수 인자로 넘겨서 사용하기.
이를 확인하기 위해서 printLocation 과 printPoint 함수를 사용합니다. 또한 class 와 struct 를 선언하여 각각의 함수 인자로 넘겨주어 사용합니다. 이는 2번과 3번에서 또 확인 가능합니다.

2. Class / Struct 의 복사와 주솟값의 변화 확인.
기본적인 출력 함수인 cout으로 원래와 복사 한 / 복사 된 후의 주솟값을 모두 출력하여 확인합니다.

1, 2를 통합한 코드는 다음과 같습니다.

* Class에서 복사를 하는 = 의 연산자가 실행되면, 기본적으로 Deep Copy 가 이루어지며 이는 기본 복사 생성자에 의해 진행되는 결과입니다.


3. Class / Struct 를 함수 결과로 반환받아 사용하기.

이를 확인하기 위해서 addLocation, addPoint 함수를 사용합니다. 1, 2번과 같은 방식으로 코드를 진행합니다. 코드는 다음과 같습니다.


4. 이외에도 class 와 struct 값 자체가 가지고 있는 것이 무엇인가 궁금하여 cout으로 출력해보려고 했습니다.


결론적으로 결과는 다음과 같습니다. 사용한 컴퓨터 환경은 리눅스 Ubuntu 16.04 이며, g++ 컴파일러를 통해 컴파일하였습니다.


1, 2의 결과입니다.

[ 사진 1 : 1, 2 결과 ]


주솟값이 변하지 않고, 대입하면 그대로 값들이 바뀌어 저장 되는 것 또한 볼 수 있습니다. 주솟값이 복사되는 JAVA와는 다른 결과가 보여 흥미로웠습니다.


3의 결과입니다.

[ 사진 2 : 3 결과 ]


역시 주솟값은 변하지 않지만, 넘겨준 변수는 바뀌지 않고, return 으로 value를 잘 받아들이는 것을 알 수 있습니다.


잘 생각 해 보아야 하는 것은 addPoint() 나 addLocation() 함수에서 사용한 변수의 주솟값은 Struct_z 나 Class_z 의 주솟값과 다르고 변수의 값만 같은 것 입니다. 


Linked List 같이 주솟값이 같아야하는 것이 중요한 코딩에서는 반환 형태와 인자 형태를 Node *로, 받을 때에 Node * 하여 주솟값을 하나의 Value 처럼 넘겨주는 것이 중요 할 것이라고 생각됩니다.


4의 결과는 당연하다싶지만, >> 연산자에 이러한 값이 정의가 되어어있지 않다는 에러가 났습니다. 이는 printf로 출력 할 수 있을 것이라 생각됩니다. 또한 예상으로는 &Class나 & Struct 와 다를바 없을 것이라고 생각됩니다. 


후에 주솟값에 관한 의문이 생긴다면 마지막에 언급한 Linked List 를 Class와 Struct 로 구현하여 어떤 차이가 있는지 한 번 체크 해 보고 싶습니다.