210115_TIL

hyeojung·2021년 1월 15일
0

TIL

목록 보기
39/62
post-thumbnail

C언어: 구조체

1. 구조체의 정의 및 선언

//type1
struct name { char[20] }; // 구조체 정의
struct name s1; // 구조체 선언 (c++의 경우 struct 생략 가능)

//type2
struct name { char[20] } s1; // 구조체 정의 및 변수 선언
struct name s2; // 또다른 구조체 변수 선언 가능 (c++의 경우 struct 생략 가능)

//type3
struct { char[20] } s1; // 구조체 정의 및 변수 선언
// 이 경우 같은 형식의 또다른 구조체 변수 선언 불가능


//type4
typedef struct { char[20] } name; // 구조체 이름을 사용자 정의형으로 선언
name s1; // 구조체 변수 선언
  • 이때 구조체 내의 변수들의 타입이 꼭 달라야 하는 것은 아님.
  • 구조체 이름은 태그(tag), 구조체를 구성하는 각 변수들은 필드(field)라고 부른다. 필드들이 모여 구조체 멤버(structure members)를 이룸
  • 구조체 필드로 구조체가 들어갈 수 있다. 하지만 자기 자신을 필드로 가질 수는 없고, 자기 자신에 대한 포인터만 필드로 가질 수 있다.

2. 구조체 필드(field)로의 접근

  • 구조체를 정의할 때는 메모리에 바로 구조체에 대한 정보가 저장되지 않는다. 구조체에 대한 변수를 선언해야 메모리에 구조체가 저장된다.
  • s1이라는 구조체 변수의 필드인 x에 대해 접근할 때는 s1.x를 이용한다.
  • 구조체 name의 변수 s1의 필드 x와 변수 s2의 필드 x는 서로 별개이다.
  • 구조체 name에 대한 포인터를 선언할 수 있다. ex) name *ps1 = &s1;
  • *ps1의 필드 x는 (*ps1).x로 접근할 수 있으며 이때 * 연산자보다 . 연산자의 우선순위가 더 높으므로 괄호 필수이다.
  • (*ps1).x와 ps1 -> x는 의미상 같다. (-> 연산자 사용 시)
  • .은 도트 또는 멤버 연산자, ->는 화살표 또는 포인터 멤버 연산자라고 한다.

3. 구조체 배열

  • 구조체들의 배열을 뜻하며, name s1[10]과 같이 선언했다면 s1[0].x와 같이 각 구조체의 필드에 접근할 수 있다.
  • s1 -> x는 s1[0].x와 같다.

4. 구조체 속의 배열

  • name 구조체 내에 int arr[10]이 있고, name s1을 선언했다면 s1의 arr[0]에는 s1.arr[0]으로 접근하면 된다.

5. 구조체 속의 구조체

  • 위에서 이야기했듯 구조체의 필드로 구조체가 올 수 있으나 자기 자신은 필드로 가질 수 없다. (자기 자신에 대한 포인터는 가능)
  • name 구조체 안에 sample 구조체가 s1이라는 이름으로 들어있고 name a1을 선언했다면, a1.s1.x로 x에 접근할 수 있다.

6. 구조체의 초기화

  • 구조체 변수를 선언할 때 배열을 초기화할 때와 같이 초기값을 줄 수 있다.
  • 구조체 내에 정의되어 있는 타입 순서대로 값을 넣어 주어야 한다.
  • C++에서는 구조체 안의 요소들에 기본값을 설정해 줄 수 있으나, C언어에서는 불가능하다.

7. 구조체끼리의 대입

  • 같은 구조체 타입(?)을 가진 구조체 변수끼리는 서로 대입이 가능하다.
  • 구조체 내에 포인터 변수가 있을 경우, 복사 방식에 따라 얕은 복사와 깊은 복사로 나뉘게 된다.
  • 얕은 복사(Shallow Copy): 구조체 내의 포인터 변수가 같은 곳을 가리키도록 그냥 값을 복사해버리는 방식
  • 깊은 복사(Deep Copy): 구조체 내 포인터 변수가 가리키는 위치의 데이터를 다른 곳에 복사한 뒤 그 곳을 가리키도록 하는 방식, 동적 할당을 사용해야 함



C언어: 공용체

1. 공용체 (union)

  • 여러 자료형의 원소들이 공통으로 사용할 수 있는 기억 장소를 정의한다. 그리고 한 번에 하나의 멤버의 값만 저장한다.
  • 구조체와 유사하여, 정의와 선언 방식이 구조체의 4가지 방식과 같으며 연산자도 구조체에서 사용하는 연산자를 그대로 사용한다.
  • 공용체의 이름도 구조체의 이름처럼 하나의 자료형으로 취급한다.
  • 공용체 변수를 선언하면서 초기화할 수 있지만, 첫 요소만 가능하다.
  • 보통 논리적으로 유사한 값에 대해 사용한다.

2. 이름 없는 공용체

  • 공용체에 이름도 지정하지 않고 변수도 선언하지 않은 경우로, 둘 이상의 변수가 같은 기억 장소를 공유하도록 묶어주는 역할만 한다.
  • 이름 없는 공용체 내의 변수들은 다른 지역변수들처럼 사용되므로 지역변수와 이름이 중복되어서는 안 된다.
  • 보통 구조체 안에서 공용체를 사용해야 할 때 사용된다.
  • 전역 또는 네임스페이스 영역에 이름 없는 공용체를 선언할 때는 static 속성으로 선언해야 한다.

3. 열거형

enum rgb { red, green, blue };
// enum 열거형이름 { 내용 };
  • 변수가 가질 수 있는 값들을 나열해 놓은 타입으로, 내부적으로는 상수로 처리된다.
  • 열거형 이름도 하나의 타입으로 취금한다.
  • 열거형의 내용들은 따로 값을 주지 않았을 경우 첫 요소를 0으로 하여 1씩 증가하는 값을 갖는다.
    ex) enum direction { east, west = 3, north, south };이면 east = 0, west = 3, north = 4, south = 5
  • 열거형의 내용이 중복될 수는 없다. (위의 예시에서 east가 두 개일 경우 X)
  • 열거형의 내용이 갖는 값은 중복될 수 있다.
  • 열거형의 장점 : 변수의 의미를 기억하는 것과 이해가 용이

4. 사용자 정의형 (typedef)

typedef int name;
// typedef 기존자료형 새로운이름;
  • 기존의 데이터형에 새로운 이름을 부여하는 것, 자료형의 포인터에 이름을 부여할 수도 있다.



오늘 한 일

  • vscode에서 c언어 개발환경 구축하기
  • jdk 패키지 및 eclipse IDE 설치
  • c언어 이론 공부 시작
  • 객체지향 프로그래밍이랑 자료구조 공부도 해야 하는데 뭐부터 하면 조을까
profile
응애 나 애기 개발자

0개의 댓글