본문 바로가기
C/코딩도장

[코딩도장] Unit 48. 구조체 사용하기

by 단월໒꒱ 2021. 8. 7.

1. 구조체 사용하기

프로그램을 만들다 보면 변수 한두 개로는 처리하기 복잡하고 비효율적인 상황이 발생한다.

이런 상황에서, 관련 정보를 하나의 의미로 묶어 자료를 체계적으로 관리하기 위해서 구조체를 사용할 수 있다.

 

구조체는 struct로 정의한다.

아래는 인적 정보를 표현한 구조체이며, struct Person은 Person 구조체를 정의한다는 뜻이다.

 

struct Person {

      char name[20]; /

      int age; 

      char address[100];

};

 

 

2. 구조체를 만들고 사용하기

구조체는 위에서 말했듯이 struct로 정의한다.

 

struct 구조체이름 {

       자료형 멤버이름;

};

 

구조체는 정의만 해서는 사용할 수 없기 때문에 변수로 선언해서 사용해야 한다.

struct 구조체이름 변수이름;

 

 

 

구조체는 보통 main 함수 바깥에서 정의한다.

만약 함수 안에 구조체를 정의하면 해당 함수 안에서만 구조체를 사용할 수 있기 때문이다.

 

구조체 안에 들어있는 변수를 멤버라고 하는데, 위의 코드에서는 name, age, address가 멤버이다.

점(.)을 이용해서 구조체 멤버에 접근하여 값을 할당하는데 숫자형은 = 으로 값을 할당할 수 있지만 문자열은 strcpy 함수를 이용해서 값을 할당한다.

strcpy 함수는 한 변수에 문자열 값을 넣어줄 때 사용하는데, strcpy(문자열 변수, "문자열 내용"); 꼴로 사용한다.

 

위의 코드에서는 구조체의 정의와 선언을 따로 해주었다.

 

아래는 구조체의 정의와 선언을 같이 해주는 내용이다.

 

 

이처럼 닫는 중괄호와 세미콜론 사이에 변수를 지정해주면 구조체를 정의하는 동시에 변수를 선언할 수 있다.

 

3. typedef로 struct 키워드 없이 구조체 선언하기

구조체 변수를 선언할 때 struct를 생략하고 싶으면 typedef로 구조체를 정의하면서 별칭(alias)을 지정해주면 된다.

 

typedef struct 구조체이름 {

         자료형 멤버이름;

} 구조체별칭;

 

여기서 구조체 이름과 구조체 별칭은 같아도 상관없다.

하지만 이 강의에서는 구조체 이름은 앞에 _를 붙여서 구분하도록 했다.

 

typedef로 구조체의 별칭을 만들었으면 변수는 구조체별칭 변수이름; 형식으로 선언한다.

 

 

이처럼 구조체를 정의할 때 맨 앞에 typedef를 붙여주고 구조체를 정의한 뒤 }와 ; 사이에 구조체 별칭을 지정하면 된다.

위의 경우 _Person이라는 구조체를 정의하면서 구조체 별칭을 Person으로 하겠다는 뜻이다.

위에서 이미 말했듯 구조체 변수 선언은 struct를 생략하고 구조체별칭 변수이름; 형식으로 하면 된다.

 

구조체 별칭으로 선언한 변수도 구조체 멤버에 접근할 때는 점(.)을 사용한다.

 

만약 구조체 별칭을 사용하지 않고 구조체 이름으로 변수를 선언하고 싶으면 struct 구조체이름 변수이름; 형식으로 선언하면 된다.

즉, struct 구조체이름 변수이름; 이랑 구조체별칭 변수이름;은 완전히 같다는 소리이다.

 

4. 익명 구조체 사용하기

typedef 구조체 별칭을 정의할 때 매번 구조체 이름을 지정해주는 것이 번거로울 수 있다.

이때, 익명 구조체를 사용하면 구조체 이름을 지정하지 않아도 된다.

 

typedef struct {

        자료형 멤버이름;

} 구조체별칭;

 

이렇게 typedef struct 뒤에 올 구조체 이름을 생략할 수 있다.

변수는 구조체별칭 변수이름; 형식으로 선언하면 된다.

 

 

 

위의 코드처럼 typedef struct 뒤에 올 구조체 이름을 지정하지 않고 바로 중괄호를 열어주면 된다.

이때, 반드시 구조체 별칭을 지정해줘야 한다.

 

이렇게 익명 구조체를 사용할 경우, 구조체 변수는 구조체 별칭으로 선언해주고 구조체 멤버에 접근할 때는 점(.)을 이용해서 접근하면 된다.

 

 

#퀴즈

1. 다음 중 구조체를 정의할 때 사용하는 키워드는?

  답  ->  c. struct

 

2. 다음 구조체를 정의할 때 필요한 코드를 고르세요.

   ____ Person {

           char name[20];

           int age;

           char address[100];

   ____

  답  ->  c. struct, };

 

3. 다음 중 구조체 별칭을 정의할 때 사용하는 키워드는?

  답  ->  d. typedef

 

4. 다음과 같이 구조체 이름 없이 정의하는 구조체를 무엇이라 부르나요?

   typedef struct {

            char name[20];

            int age;

            char address[100];

   } Person;

  답  ->  익명 구조체

 

 

 

# 연습문제 1 : 좌표 구조체 정의하기

[문제]

 

[코드 및 결과]

 

 

[설명]

주어진 struct를 이용해서 구조체 Point2D를 정의했다.

구조체 Point2D는 좌표 x, y를 표현하고 좌표의 자료형이 int형이라고 했으므로 int x; int y;를 구조체 멤버로 넣어줬다.

다음으로 구조체 변수를 선언해주었고 좌표 x에 10의 값이 들어가도록 p1.x에 10이란 값을 할당해주었다.

 

 

# 연습문제 2 : typedef로 좌표 구조체 정의하기

[문제]

 

[코드 및 결과]

 

 

[설명]

10번째 줄에서 변수를 선언할 때 struct가 없고 바로 Point2D p1;으로 선언을 했으므로 Point2D가 구조체 별칭임을 알 수 있다.

그러므로 구조체를 정의해줄 때 구조체 별칭 Point2D를 지정해주고 위의 1번 문제와 마찬가지로 구조체 멤버로 int x와 int y를 넣어줬다.

12번째 줄에서 p1.x에서 알 수 있듯, 변수이름이 p1임을 이용해서 변수를 선언해주고 좌표 y가 20이란 값을 갖도록 값을 할당했다.

 

 

# 연습문제 3 : 익명 구조체로 좌표 구조체 정의하기

[문제]

 

[코드 및 결과]

 

 

[설명]

3번째 줄에서 typedef struct 후에 바로 중괄호를 열어 구조체를 정의했으므로 구조체 이름이 없는 익명 구조체임을 알 수 있다.

10번째 줄에서 Point2D p1; 을 통해 구조체 별칭이 Point2D라는 것도 알아낼 수 있으므로 빈 칸에 들어갈 내용은 중괄호를 닫고 Point2D라는 구조체 별칭을 지정해주는 내용이다.

 

 

# 심사문제 1 : 자동차 계기판 구조체 선언하기

[문제]

 

[코드 및 결과]

 

 

[설명]

3~9번째 줄을 보면 구조체를 별칭 없이 일반적인 방법으로 정의하고 있음을 알 수 있다.

아래의 printf 함수 안에 있는 내용을 보면 변수가 d1임도 알 수 있다.

위의 내용들을 조합하여 struct Dashboard d1; 으로 구조체를 선언했다.

그리고 각각의 구조체 멤버들을 출력하려면 값을 할당해야하기 때문에 d1.speed, d1.fuel 이런식으로 접근하여 하나하나 값을 입력해줬다.

fuel의 경우 F라는 문자를 입력해야 해서 strcpy를 사용해야하나 했지만 제시된 코드에는 string.h 헤더파일이 포함되어 있지 않았고 F 한 글자였기 때문에 'F'로 넣어주니 무사히 입력되었다.

 

 

# 심사문제 2 : 자동차 계기판 구조체 정의하기

[문제]

 

[코드 및 결과]

 

 

[설명]

14번째 줄에서 struct를 생략하고 구조체 변수를 선언한 것으로 보아 이 구조체에 별칭을 지정해야겠다고 생각했다.

익명 구조체로 정의해도 문제될 건 없지만 여기서는 구조체 이름을 지정해주었다.

이렇게 구조체 이름과 구조체 별칭을 지정해준 뒤, 구조체의 멤버들은 아래에 써져있는 숫자의 형태나 문자를 보고 각각의 자료형들을 생각하여 선언했다.

 

 

댓글