๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ‘จ๐Ÿพ‍๐Ÿ’ป C++

๊ตฌ์กฐ์ฒด

by eazuooz 2022. 8. 19.

๊ตฌ์กฐ์ฒด

๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋Š” ํ•˜๋‚˜ ์˜ ์ด๋ฆ„์œผ๋กœ ํ•จ๊ป˜ ๊ทธ๋ฃนํ™”๋œ ๋ฐ์ดํ„ฐ ์š”์†Œ ๊ทธ๋ฃน์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์› ์ด๋ผ๊ณ  ํ•˜๋Š” ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ์š”์†Œ ๋Š” ์œ ํ˜•๊ณผ ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ C++์—์„œ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋Š” ๊ตฌ์กฐ ์œ ํ˜•์˜ ์ด๋ฆ„์ด๊ณ  ์ด ๊ตฌ์กฐ ์œ ํ˜• ์„ ๊ฐ€์ง„ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์œ ํšจํ•œ ์‹๋ณ„์ž ์ง‘ํ•ฉ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ด„ํ˜ธ ์•ˆ์— ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๊ฐ€ ์žˆ๋Š” ๋ชฉ๋ก์ด ์žˆ์œผ๋ฉฐ ๊ฐ ๋ฉค๋ฒ„๋Š” ์œ ํ˜•๊ณผ ์ด๋ฆ„์œผ๋กœ ์œ ํšจํ•œ ์‹๋ณ„์ž๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;

type_nameobject_name{}

 

struct product {
  int weight;
  double price;
} ;

product apple;
product banana, melon;

์ด๊ฒƒ์€ ๋ผ๊ณ  ํ•˜๋Š” ๊ตฌ์กฐ ์œ ํ˜•์„ ์„ ์–ธํ•˜๊ณ  product๋‘ ๊ฐœ์˜ ๋ฉค๋ฒ„( weight๋ฐ price, ๊ฐ๊ฐ ๋‹ค๋ฅธ ๊ธฐ๋ณธ ์œ ํ˜•)๋ฅผ ๊ฐ–๋Š” ๊ตฌ์กฐ ์œ ํ˜•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ ์–ธ์€ ์ƒˆ ์œ ํ˜•( product)์„ ๋งŒ๋“  ๋‹ค์Œ ์ด ์œ ํ˜•์˜ ์„ธ ๊ฐ์ฒด(๋ณ€์ˆ˜)๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค . apple, banana๋ฐ melon. ํ•œ ๋ฒˆ product์„ ์–ธ๋˜๋ฉด ๋‹ค๋ฅธ ์œ ํ˜•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ •์˜ ๋ struct๊ณผ ๋ ์„ธ๋ฏธ์ฝœ๋ก ( ;) ์•ž์— ์„ ํƒ์  ํ•„๋“œ object_names๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์กฐ ์œ ํ˜•์˜ ๊ฐœ์ฒด๋ฅผ ์ง์ ‘ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ตฌ์กฐ ๊ฐ์ฒด apple, banana๋ฐ melon๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์œ ํ˜•์ด ์ •์˜๋˜๋Š” ์ˆœ๊ฐ„ ์„ ์–ธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

struct product {
  int weight;
  double price;
} apple, banana, melon;

์ด ๊ฒฝ์šฐ object_names๊ฐ€ ์ง€์ •๋˜๋ฉด ์œ ํ˜• ์ด๋ฆ„( product)์ด ์„ ํƒ ์‚ฌํ•ญ struct์ด type_name๋ฉ๋‹ˆ๋‹ค object_names. ๊ตฌ์กฐ ์œ ํ˜• ์ด๋ฆ„( )๊ณผ ์ด ์œ ํ˜•์˜ ๊ฐ์ฒด( , , ๋ฐ )

๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค . ๋‹จ์ผ ๊ตฌ์กฐ ์œ ํ˜•( )์—์„œ ๋งŽ์€ ๊ฐ์ฒด(์˜ˆ: , ๋ฐ )๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ๊ฒฐ์ •๋œ ๊ตฌ์กฐ ์œ ํ˜•์˜ ์„ธ ๊ฐ์ฒด๊ฐ€ ์„ ์–ธ๋˜๋ฉด( , , ๋ฐ ) ํ•ด๋‹น ๋ฉค๋ฒ„์— ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ตฌ๋ฌธ์€ ๋‹จ์ˆœํžˆ ์ (productapplebananamelonapplebananamelonproduct

applebananamelon.) ๊ฐœ์ฒด ์ด๋ฆ„๊ณผ ๊ตฌ์„ฑ์› ์ด๋ฆ„ ์‚ฌ์ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋Ÿฌํ•œ ์š”์†Œ๋ฅผ ํ•ด๋‹น ์œ ํ˜•์˜ ํ‘œ์ค€ ๋ณ€์ˆ˜์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

apple.weight
apple.price
banana.weight
banana.price
melon.weight
melon.price

์ด๋“ค ๊ฐ๊ฐ์€ ์ฐธ์กฐํ•˜๋Š” ๋ฉค๋ฒ„์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. apple.weight, banana.weight, melon.weightare type , intwhile apple.price, are type . ๋‹ค์Œ์€ ๊ตฌ์กฐ ์œ ํ˜•์ด ์ž‘๋™ํ•˜๋Š” ์‹ค์ œ ์˜ˆ์ž…๋‹ˆ๋‹ค.banana.pricemelon.pricedouble

// example about structures
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

struct movies_t {
  string title;
  int year;
} mine, yours;

void printmovie (movies_t movie);

int main ()
{
  string mystr;

  mine.title = "2001 A Space Odyssey";
  mine.year = 1968;

  cout << "Enter title: ";
  getline (cin,yours.title);
  cout << "Enter year: ";
  getline (cin,mystr);
  stringstream(mystr) >> yours.year;

  cout << "My favorite movie is:\n ";
  printmovie (mine);
  cout << "And yours is:\n ";
  printmovie (yours);
  return 0;
}

void printmovie (movies_t movie)
{
  cout << movie.title;
  cout << " (" << movie.year << ")\n";
}

์ด ์˜ˆ์ œ๋Š” ๊ฐœ์ฒด์˜ ๋ฉค๋ฒ„๊ฐ€ ์ผ๋ฐ˜ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฉค๋ฒ„ yours.year๋Š” ์œ ํ˜• ์˜ ์œ ํšจํ•œ ๋ณ€์ˆ˜ int์ด๊ณ  mine.title์œ ํ˜•์˜ ์œ ํšจํ•œ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค string.

๊ทธ๋Ÿฌ๋‚˜ ๊ฐ์ฒด mine๋ฐ yours๋˜ํ•œ ์œ ํ˜•(์œ ํ˜• movies_t)์„ ๊ฐ€์ง„ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‘˜ ๋‹ค printmovie๋‹จ์ˆœํ•œ ๋ณ€์ˆ˜์ธ ๊ฒƒ์ฒ˜๋Ÿผ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๋‘ ๊ตฌ์„ฑ์›์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ์ „์ฒด ๊ตฌ์กฐ๋ฅผ ์ „์ฒด์ ์œผ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™์ผํ•œ ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๊ตฌ์กฐ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

๊ตฌ์กฐ๋Š” ์œ ํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ด๋ธ”์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

// array of structures
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

struct movies_t {
  string title;
  int year;
} films [3];

void printmovie (movies_t movie);

int main ()
{
  string mystr;
  int n;

  for (n=0; n<3; n++)
  {
    cout << "Enter title: ";
    getline (cin,films[n].title);
    cout << "Enter year: ";
    getline (cin,mystr);
    stringstream(mystr) >> films[n].year;
  }

  cout << "\nYou have entered these movies:\n";
  for (n=0; n<3; n++)
    printmovie (films[n]);
  return 0;
}

void printmovie (movies_t movie)
{
  cout << movie.title;
  cout << " (" << movie.year << ")\n";
}

๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ

๋‹ค๋ฅธ ์œ ํ˜•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ตฌ์กฐ์ฒด๋Š” ์ž์ฒด ํฌ์ธํ„ฐ ์œ ํ˜•์œผ๋กœ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

struct movies_t {
  string title;
  int year;
};

movies_t amovie;
movies_t * pmovie;

๋‹ค์Œ amovie์€ ๊ตฌ์กฐ ์œ ํ˜•์˜ ๊ฐœ์ฒด์ด๊ณ  ๋Š” ๊ตฌ์กฐ ์œ ํ˜•์˜ ๊ฐœ์ฒด๋ฅผ movies_t๊ฐ€๋ฆฌํ‚ค๋Š” pmovieํฌ์ธํ„ฐ movies_t์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ ์ฝ”๋“œ๋„ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

pmovie = &amovie;โ€‹



ํฌ์ธํ„ฐ์˜ ๊ฐ’์—๋Š” pmovieobject์˜ ์ฃผ์†Œ๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค amovie.

์ด์ œ ํฌ์ธํ„ฐ์™€ ๊ตฌ์กฐ๋ฅผ ํ˜ผํ•ฉํ•˜๊ณ  ์ƒˆ๋กœ์šด ์—ฐ์‚ฐ์ž์ธ ํ™”์‚ดํ‘œ ์—ฐ์‚ฐ์ž( ->)๋ฅผ ๋„์ž…ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// pointers to structures
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

struct movies_t {
  string title;
  int year;
};

int main ()
{
  string mystr;

  movies_t amovie;
  movies_t * pmovie;
  pmovie = &amovie;

  cout << "Enter title: ";
  getline (cin, pmovie->title);
  cout << "Enter year: ";
  getline (cin, mystr);
  (stringstream) mystr >> pmovie->year;

  cout << "\nYou have entered:\n";
  cout << pmovie->title;
  cout << " (" << pmovie->year << ")\n";

  return 0;
}

ํ™”์‚ดํ‘œ ์—ฐ์‚ฐ์ž( ->)๋Š” ๋ฉค๋ฒ„๊ฐ€ ์žˆ๋Š” ๊ฐœ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์™€ ํ•จ๊ป˜ ๋…์ ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์—ญ์ฐธ์กฐ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค. ์ด ์—ฐ์‚ฐ์ž๋Š” ํ•ด๋‹น ์ฃผ์†Œ์—์„œ ์ง์ ‘ ๊ฐœ์ฒด์˜ ๊ตฌ์„ฑ์›์— ์•ก์„ธ์Šคํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ ์˜ˆ์—์„œ:

pmovie->title

๋ชจ๋“  ๋ชฉ์ ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

(*pmovie).title

pmovie->title๋ฐ ๋‘ ํ‘œํ˜„์‹ ๋ชจ๋‘ (*pmovie).title์œ ํšจํ•˜๋ฉฐ title๋ผ๋Š” ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ๋ฉค๋ฒ„์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค pmovie. ํ™•์‹คํžˆ ๋‹ค์Œ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

*pmovie.title

์ด๋Š” ๋‹ค์Œ๊ณผ ๋‹ค์†Œ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

*(pmovie.title)

title์ด๊ฒƒ์€ ๊ตฌ์กฐ์ฒด ๊ฐ์ฒด์˜ ๊ฐ€์ƒ ํฌ์ธํ„ฐ ๋ฉค๋ฒ„๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์— ์ ‘๊ทผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ( ํฌ์ธํ„ฐ ์œ ํ˜•์ด ์•„๋‹ˆ๊ธฐ pmovie๋•Œ๋ฌธ์— ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค). title๋‹ค์Œ ํŒจ๋„์€ ํฌ์ธํ„ฐ ๋ฐ ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ„์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์ž์˜ ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ์„ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค.

ํ‘œํ˜„ํ‰๊ฐ€๋˜๋Š” ๊ฒƒ๋™๋“ฑํ•œ

Expression What is evaluated Equivalent
a.b b๊ฐœ์ฒด์˜ ๊ตฌ์„ฑ์›a  
a->b b๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„a (*a).b
*a.b b๊ฐ์ฒด์˜ ๋ฉค๋ฒ„๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’a *(a.b)

์ค‘์ฒฉ ๊ตฌ์กฐ

๊ตฌ์กฐ์ฒด๋Š” ๊ตฌ์กฐ์ฒด์˜ ์š”์†Œ ์ž์ฒด๊ฐ€ ๋˜ ๋‹ค๋ฅธ ๊ตฌ์กฐ์ฒด๊ฐ€ ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ค‘์ฒฉ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

struct movies_t {
  string title;
  int year;
};

struct friends_t {
  string name;
  string email;
  movies_t favorite_movie;
} charlie, maria;

friends_t * pfriends = &charlie;

์ด์ „ ์„ ์–ธ ์ดํ›„์—๋Š” ๋‹ค์Œ ํ‘œํ˜„์‹์ด ๋ชจ๋‘ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

charlie.name
maria.favorite_movie.title
charlie.favorite_movie.year
pfriends->favorite_movie.year

'๐Ÿ“ Development Study > ๐Ÿ‘จ๐Ÿพโ€๐Ÿ’ป C++' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํด๋ž˜์Šค(1)  (0) 2022.08.19
๊ธฐํƒ€ ๋ฐ์ดํ„ฐ ํƒ€์ž…  (0) 2022.08.19
๋™์  ๋ฉ”๋ชจ๋ฆฌ  (0) 2022.08.19
ํฌ์ธํ„ฐ  (0) 2022.08.19
๋ฌธ์ž์—ด  (0) 2022.08.19

๋Œ“๊ธ€