C언어: 구조체
1. 구조체의 정의 및 선언
struct name { char[20] };
struct name s1;
struct name { char[20] } s1;
struct name s2;
struct { char[20] } s1;
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 };
- 변수가 가질 수 있는 값들을 나열해 놓은 타입으로, 내부적으로는 상수로 처리된다.
- 열거형 이름도 하나의 타입으로 취금한다.
- 열거형의 내용들은 따로 값을 주지 않았을 경우 첫 요소를 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;
- 기존의 데이터형에 새로운 이름을 부여하는 것, 자료형의 포인터에 이름을 부여할 수도 있다.
오늘 한 일
- vscode에서 c언어 개발환경 구축하기
- jdk 패키지 및 eclipse IDE 설치
- c언어 이론 공부 시작
- 객체지향 프로그래밍이랑 자료구조 공부도 해야 하는데 뭐부터 하면 조을까