C언어 구조체

구조체

  • 구조체는 이미 정의된 서로 다른 자료형(int, char, double 등의 변수와 배열, 포인터, 구조체도 포함됨)들을 구성 요소로 하여 새로운 자료형을 만드는 것임
  • 그룹핑하면 프로그래밍하기 편리한 자료들을 하나로 묶는 것임
  • 배열을 사용하면 동일한 자료형 만을 한꺼번에 관리할 수 있지만 구조체는 상이한 자료형들을 한 묶음으로 관리할 수 있음
#include <iostream>
struct Man{ //구조체 Man 생성
    int age; //나이
    double weight; //무게
    int getAge(){return age;}; C에서는 함수를 못 넣지만 C++ 에서는 가능.
    
    std::string name; //이름
};
int main() {
    int x = 10;
    std::cout << x << std::endl;

    //struct Man chan; c언어에서는 struct를 쓰지 않으면 오류 발생
    Man chan = {1, 3.5, "none"}; //중괄호로 초기값을 지정할 수 있다.
    std::cout << chan.age << "  " << chan.weight <<std::endl;
    
    chan.age = x; //나이 변경
    chan.weight = 20.5; //무게 변경
    chan.name = "chan"; //이름 변경
    std::cout << chan.name << "  " << chan.age << "  " << chan.weight <<std::endl;

    return 0;
}

구조체 예제

구조체 멤버의 참조와 연산

  • 구조체 변수가 자신의 멤버(name, age, weight)를 접근하기 위해서는 "."이나 "->"을 사용
  • 일반 구조체 변수의 멤버 접근
    • 구조체_변수.멤버명;
    • 점 연산자, 도트 연산자(dot operator), 지정 연산자, 멤버 지정 연산자(membership operator)
  • 구조체 포인터 변수의 멤버 접근
    구조체_포인터_변수->멤버명;
    화살표 연산자(arrow operator), 간접 멤버 연산자(indirect membership operator)

클래스와 차이점?

  • C++는 단 한가지만 다르다.
  • 접근 제어 속성(public, private)을 생략했을때 구조체(struct)는 public이 기본, 클래스(class)는 private가 기본이다.

문득 든 생각

  • 간접 참조 멤버 연산자를 사용하는 이유가 뭘까?
    • 포인터를 사용하기 때문인건 사실
    • 하지만 굳이 구분할 필요가 있을까?
    • 구글링을 해본 결과는 아레와 같다.
  • 실제로 멤버에 접근하는 연산자는 총 3개로 ":",".","->"가 있다.
  • :는 클래스의 멤버거나 네임스페이스인 경우 "a::b"처럼 사용
  • .은 그냥 구조체의 멤버인 경우 "a.b"처럼 사용
  • ->는 원래 "(*a).b"의 약어라고 한다(!), 허나 추가로 유일하게 오버로딩을 가진다고 한다.

하나 찾으면 끝일줄 알았는데 일이 늘었다...추가로 오버로딩을 검색 해 봐야겠다
출처: https://stackoverflow.com/questions/4984600/when-do-i-use-a-dot-arrow-or-double-colon-to-refer-to-members-of-a-class-in-c

출처 : Smile Han C언어 강의 - Youtube