|
|||||||||
1. 구조체정의 및 선언 레코드는 C에서 구조체로 표현된다. 여러분이 프로그램에서 구조체를 생성하기 위해서 다음 두 과정을 거친다.
이것은 여러분이 지금까지 변수를 선언해온 방식과 약간 다르다. int, double, char 등과 같은 단순 변수의 경우나 배열의 경우에도 타입을 새롭게 정의하지는 않고, 단지 두 번째의 항목만을 통해서 변수가 선언되었다.
2.1 구조체 타입 정의 구조체 타입에 대한 정의는 구조체를 구성하는 필드들을 명세하고, 각 필드에 타입을 연관시키는 것으로 이루어진다. 다음은 구조체 타입을 정의하기 위한 형식이다. 여기서 필드-선언은 구조체의 한 필드를 정의하는 것이며, 변수 선언의 형식으로 이루어진다. 타입-이름은 새롭게 정의된 구조체의 타입 이름을 나타낸다. typedef와 struct는 키워드이다. struct를 통해서 구조체 타입을 정의하며, typedef를 통해서 정의된 구조체 타입에 이름을 부여한다. 이렇게 부여된 구조체 타입 이름은 C의 기본 데이터 타입과 마찬가지로 변수를 선언하는데 사용될 수 있다. 다음은 1장에서 다룬 학생 성적 레코드에 대한 구조체 타입을 정의한다. 위의 코드는 새로운 구조체 타입을 정의하고, 이 타입에 scoreType의 이름을 부여하는 두가지 행동을 명세한다. 이 두 가지 행동은 구분되어 표현될 수 있다. 다음은 struct를 사용하여 새로운 구조체 타입을 정의한다. 여기서 score는 구조체의 태그로서 구조체 타입의 식별자로서 역할한다. 다음은 typedef를 사용하여 정의된 구조체 타입에 대해서 타입 이름을 부여한다.
구조체 타입을 정의하는 두 가지 방법 모두 통용되나, 여기서는 한 문장으로 구조체 타입을 정의하고, 이 타입에 이름을 부여하는 첫 번째 방법을 선호한다.
2.2 구조체 변수 선언 이제 여러분은 새로운 구조체 타입을 정의하였다. 다음 단계는 이 구조체 타입에 대한 변수를 선언하는 것이다. 구조체 타입에 대한 변수 선언은 다른 일반 변수와 그 형식이 같다. 다음은 위에서 정의한 구조체 타입 scoreType에 대한 변수를 선언한다.
위 구조체 변수 선언 결과로, 다음의 기억공간이 할당되어 s의 변수와 연관된다. 이 기억공간은 레코드에
포함된 모든 필드에 대한 기억공간들로 구성된다. ![]() 여러분은 구조체 타입 이름을 사용하지 않고서 구조체 변수를 선언할 수 있다. 이러한 방법은 구조체 타입을 정의하였으나, 이 타입에 이름을 부여하지 않은 경우에 사용될 수 있다. 다음은 그 예이다. 위에서 태그가 score인 구조체 타입이 먼저 정의되고, 다음에 s를 이 구조체 타입의 변수로 선언하고 있다. 여기서 "strut score"가 구조체 타입으로 사용되는 것을 알 수 있다. 위의 구조체 변수 선언을 구조체 타입 정의와 함께 표현할 수 있다. 다음은 그 예이다. 또한, 구조체 타입이 단지 한 곳에서만 사용된다면, 다음과 같이 구조체의 태그를 명시하지 않을 수 있다. 위의 경우에, 정의된 구조체 타입을 식별할 수 있는 태그가 명시되어 있지 않으므로, 다른 곳에서
사용될 수 없을 것이다.
2. 필드 선택 구조체의 특정 필드를 참조하기 위해서 다음 형식이 사용된다. 여기서 구조체-변수 다음에 오는 점(.)을 도트(dot)라 부른다. 위의 식을 "구조체-변수 도트 필드-이름"으로 읽는다. 예를 들면, s.name은 "s 도트 name"으로 읽으며, 구조체의 name 필드를 참조한다.
3. 초기화
이러한 초기화는 앞에서 4개의 배정문을 사용하여 초기화하는 것과 동일한 효과를 갖는다. |
4. 배정문
위의 코드에서 첫 번째 문장이 다음과 같이 작성될 수 없음을 여러분은 알아야 한다.
위와 같은 배정문은 컴파일시에 오류가 발생할 것이다. 12주차
6장에서 다루었듯이, C의 배열 이름은 포인터이나, 다른 주소값을 배정받을 수 없는 상수라는 사실을 유의하라.
5. 예제 다음 프로그램 14-1은 표 14-1의 학생 성적 리스트를 구조체 타입의 성적 레코드에 읽어들여서 출력한다. 이를 위해서, 먼저 성적 레코드 타입을 위한 구조체를 정의하고, 이 구조체의 변수를 선언한다. 다음에, 구조체의 필드 선택을 통해서 레코드의 각 필드에 사용자로부터 값을 읽어들인다. 이름과 학점 입력은 scanf() 대신에 각각 gets()와 getchar()을 사용하여 표현했음을 유의하라. 물론, scanf()로도 작성 가능하나, gets()나 getchar()를 사용하는 것이 프로그램의 이해도를 더 높이고 오류를 줄이는데 더 나은 방법이다. |
위의 프로그램에서, 성적을 입력받은 문장 다음에 표현된 "getchar();"의 문장을 눈여겨보라. 여러분은 이 문장이 왜 작성되었는지 의아하게 생각할 것이다. 그러나 이 문장을 생략된다면, 프로그램이 제대로 동작하지 않을 것이다. 예를 들면, "getchar();"의 문장이 생략된 다음의 코드를 생각해보자.
프로그램 14-1을 위의 코드로 수정하여 실행시켰을 때, 다음의 프롬프트에 대한 사용자의 입력을 생각해보자.
이때 사용자가 95.7을 입력하고, 다음에 엔터 키
프로그램 14_1에 표현된 "getchar();"는 이와 같은 역할을 수행하기 위해서 포함되었다. 그 결과로, s.grade에 사용자가 원하는 문자가 입력될 수 있다. |
|
|