본문 바로가기

C++/C, C++, STL

클래스(class)와 구조체(struct)의 차이

이 문서의 내용

    구조체(struct)클래스(class)는 C++에서 데이터 집합을 정의하고 저장하기 위한 목적으로 사용됩니다.

    struct Man
    {
    	char name[100];
    	int age;
    }
    
    class Woman
    {
    	char name[100];
    	int age;
    }

    둘의 역할은 비슷하면서도 차이점이 존재하는데 이어지는 섹션에서 하나씩 살펴보도록 하겠습니다.

    디폴트 접근 제한자의 차이

    디폴트 접근 제한자는 접근 제한자를 명시하지 않은 멤버 변수, 멤버 함수에 대해서 컴파일러가 생성하는 기본적인 접근 제한자입니다.

    C++에서는 자바와 마찬가지로 디폴트 접근 제한자가 존재합니다.

    struct Man
    {
    	char name[100];		// public
    	int age;		// public
    }

    우선 struct에서 디폴트 접근 제한자는 public입니다. 이는 자바의 interface가 갖는 디폴트 접근 제한자와 동일합니다.

    class Woman
    {
    	char name[100];		// private
    	int age;		// private
    }

    class에서의 디폴트 접근 제한자는 private입니다. 마찬가지로 자바의 class가 갖는 디폴트 접근 제한자와 동일합니다.

    struct에서의 함수 선언

    C++의 struct는 함수 선언이 가능합니다. 사실 C의 struct에서도 함수 선언이 가능하지만, 함수 포인터를 사용해야하는 문제로 일반적인 용법은 아닙니다.

    반면 C++에서는 일반적인 class의 멤버 함수와 동일한 문법으로 선언 할 수 있습니다.

    struct Human
    {
    	char name[100];
    	int age;
    
    	void printInfo()
    	{
    		std::cout << name << ", " << age;
    	}
    }

    디폴트 접근 제한자 외에 차이점은 없다

    그 외 C++의 struct는 class와의 차이점이 없습니다.

    필드와 메소드가 동일한 struct와 class를 정의하고 컴파일 결과를 디버깅하면 어셈블리 코드가 완전히 동일한 것을 확인 할 수 있습니다.

    물론 디폴트 접근 제한자의 차이도 접근 제한자를 명시적으로 사용하게 되면 문제되지 않습니다.

    더보기

    결론적으로 문법 상의 사소한 차이-디폴트 접근 제한자가 존재하지만 그 외에는 완전히 동일합니다.

    그럼에도 불구하고 C++의 struct는 단순한 데이터 집합을 표현하기 위한 컨테이너의 목적으로 사용됩니다.

    이는 C의 struct에서 이어지는 관습적인 구분이라고 볼 수 있으나, 일반적인 용법에 벗어나는 방식으로 struct와 class를 혼용 할 필요는 없어보입니다.

    정리 및 복습

    • struct디폴트 접근 제한자는 public입니다. 이는 자바의 interface와 같습니다.
    • class디폴트 접근 제한자는 private입니다. 이는 자바의 class와 동일합니다.
    • struct에서도 함수 선언이 가능하며 그 외 struct와 class가 갖는 차이점은 없습니다.
    • 하지만 관습적인 구분에 따라서 여전히 struct를 데이터 집합 표현의 목적으로 사용하는 것이 좋습니다.