클래스와 구조체의 차이
이 질문은 내가 면접을 보러다니던 당시 받았던 질문들이며 내가 제대로 답하지 못했다고 생각하는 것이다. 이 문제에 대해 더 공부하고 잊지 않기 위해 여기에 써둔다.
- Q. 클래스가 무엇인가?
- A. 같은 성질을 같은 데이터와 함수들의 집합체이다.
- Q. 그럼 구조체 역시도 데이터와 함수를 가질 수 있다. 클래스와 동일하게 구조체로도 만들 수 있는데 왜 클래스를 사용하는가?
- A. 클래스는 상속이 가능하지만 구조체는 불가능하다.
- Q. 구조체 안에 구조체를 넣을 수 있지 않는가?
- A. 그렇다.
이 질문에 난 대답을 제대로 못했다. 생각해보니 구조체와 클래스는 비슷한 점이 많은 것 같은데 정확히 차이점을 찾아본 적이 없었다.
검색엔진 등을 통해 구조체와 클래스의 차이점을 찾아본 결과는 다음과 같다.
- 클래스와 구조체는 데이터타입을 생성한다는 점에서 유사하다.
- 구조체는 기본접근자가 public인데 클래스의 기본접근자는 private이다.
- 구조체는 데이터의 초기화가 불가능하지만 클래스는 데이터의 초기화가 가능하다.
- 구조체는 데이터의 value가 복사되지만 클래스는 데이터의 reference가 복사된다. 따라서 클래스는 얕은 복사가 일어나고 구조체는 깊은 복사가 일어난다.
- 구조체는 상속해줄 수도 상속 받을 수도 없다.
- 구조체를 그럼에도 사용하는 이유는 참조의 낭비를 막을 수 있으며 데이터에 직접 접근하기 때문에 속도가 더 빠르다.
- 구조체는 함수의 재정의가 안된다.
제일 중요한 점은 reference/value 복사의 차이가 아닌가 싶다. 이에 대한 설명은 http://rintiantta.blog.me/40114721626 에 가장 잘 나와있다. 이 코드를 보면 이해가 한번에 되는 것 같다.
클래스의 경우에는 어떤 클래스의 타입을 가지는 A객체를 만들고 B라는 객체가 A객체와 동일하게 복사한 다음, A객체의 값을 변경하면 B객체의 값도 변경된다. (reference 즉, 메모리주소가 복사되므로)
구조체의 경우에는 어떤 구조체의 타입을 가지는 A객체를 만들고 B라는 객체가 A객체와 동일하게 복사한 다음, A객체의 값을 변경하면 B객체의 값은 변경되지 않는다. (value, 즉, 값 자체가 복사되므로 B객체의 값은 변경되지 않는다.)