나만의 자료 형을 만들 수 있다. C는 int, float, char 등의 자료 형을 제공한다. 때로 이들과 다른 나만의 형이 필요할 때가 있다. 학생 레코드 이름, 학번, 주소, 성적 등으로 구성된다. 2차원 상의 한 점 x와 y 좌표로 구성된다. struct를 이용하면, 관련된 데이터를 한 묶음으로 취급할 수 있다.
7.1 struct 도형 그리기 예제 이 선언에서 x와 y는 별개의 변수 관련이 있기 때문에 바로 옆에 선언하고 같이 사용할 뿐 떨어져 선언해도 문법적으로 문제 없다. 단지 스타일이 나빠질 뿐이다. 이 상황에서 관련 있는 x와 y를 어떤 틀로 묶으면 편리하다. struct가 그 역할을 한다.
struct를 사용하면, 라인 1-4에서 point라는 새로운 형 선언 라인 6은 point 형의 변수 p 선언 변수 p는 x와 y라는 멤버 변수를 가진다. 멤버 변수에 접근하기 위해서는 . 연산자를 사용한다. (라인 8-9)
구조 형의 배열을 사용하는 예
구조 형은 중첩될 수 있다.
동적 메모리 사용하는 예 (메모리를 낭비하지 않기 위해)
구조 형 변수의 연산 대입 허용, 비교는 허용 안됨 선언하며 초기화 가능
7.2 구조와 함수 아래 코드가 제대로 작동할까? (C 언어는 값에 의한 호출임을 염두에 두고 생각해 보자.)
앞의 코드는 제대로 작동하지 않는다. 포인터를 사용해야 제대로 작동한다.
매개 변수 값을 변경하지 않는 경우, 포인터를 사용하지 않아도 된다. 예, 직사각형 그리기 하지만 아래 코드는 비효율적이다. 왜? (포인터를 사용하는) 아래 코드가 더 효율적이다.
예제 프로그램을 공부해 보자. 직사각형 그리기 프로그램 [7.1]
create_rectangle()과 make_rectangle()은 구조 형 반환
해 보자.
연습 문제
7.3 typedef와 enum typedef는 어떤 형의 별칭을 만들 때 사용
typedef로 만든 형은 원래 형과 똑 같은 방식으로 사용 가능 함수 반환 형, 주소 연산자 &, sizeof 연산자, 캐스트 연산자 등
enum 형 변수의 값이 몇 종류로 제한되는 경우에 사용 예를 들어, 사원이 속한 부서가 영업, 개발, 기획, 재정인 경우 값 배정 규칙 보통 첫 문자 또는 전체를 대문자로 한다. (많은 프로그래머들이 인정하는 관습을 따르면 좋은 스타일의 프로그램이 된다.)
연습 문제
7.3 데이터베이스 사원 정보 검색 서비스 프로그램을 만들기로 하자. 사원 레코드는 이름, 사번, 부서, 전화번호, 근무평점의 다섯 필드 (레코드 집합이 데이터베이스가 됨) 이때 struct를 사용함이 현명
사원 레코드 char *를 String으로 부서는 enum 형으로 레코드는 struct 형으로
7.4.1 레코드 개수를 아는 경우
두 가지 검색 기능: 이름 검색과 사번 검색 편의성이 높을 수록 좋은 프로그램 (프로그래머가 약간 수고하면 된다.)
함수 keyword_type()이 검색 방식을 자동으로 구별해 준다.
연습 문제
7.4.1 레코드 개수의 자동 계산 앞에서는 프로그래머가 레코드 개수를 세어 프로그램 안에 적어 주었다. 이런 번거로운 일은 기계에게 맡겨라! (특히 레코드 개수가 자주 변하는 경우, 더욱 번거로움)
레코드 개수를 명시적으로 계산하지 않는 프로그램도 가능하다. 마지막에 NULL 레코드를 두어 끝 표시
연습 문제
7.5 프로그래밍 연습: 캔버스에 도형 그리기 캔버스에 여러 종류의 도형을 그려보자. (그림판과 비슷)
주요 자료 구조
main()과 함수 원형들
캔버스 초기화
도형을 읽어 들여 배열에 저장하는 함수 read_diagram() 약간의 생각이 필요하다. 어디에 어떻게 저장할 것인가? 포인터 배열과 동적 메모리 할당을 이용하여 메모리 낭비를 방지하기로 하자.
연습 문제