13장 특이한 데이터형
목차
- 13.1 구조체
- 13.2 포인터
- 13.3 전역 데이터
13장에서는 특이한 데이터형에 대해 다룬다. 구조체, 포인터, 전역 데이터에 대해 다루는데 일반적으로 잘 사용되지 않는 부분일 수도 있다. 포인터 같은 경우는 자바, C# 등의 언어에서는 에러 발생 위험이 높아 제공하지 않는 형이고, 구조체의 경우 내가 아는 한 C와 C++에서만 사용한다. 전역 데이터는 사용하지 않는 것을 추천하는 것을 많이 들어봤을 것이다. 전역 데이터를 사용해야하는 상황이 생길 경우 어떻게 사용하는지에 대해 설명하고 있다.
13.1 구조체
"구조체"라는 용어는 서로 다른 형의 집합으로 구성된 데이터를 의미한다. C와 C++의 struct와 마이크로소프트 비주얼 베이직의 Structure를 다룬다.
구조체를 사용하는 이유
- 데이터 관계를 이해하기 쉽게 하기 위해서 구조체를 사용하라.
- 데이터 블록에 대한 작업을 단순화하기 위해서 구조체를 사용하라.
- 매개변수 목록을 단순화하기 위해서 구조체를 사용한다.
- 유지보수를 줄이기 위해서 구조체를 사용한다.
구조체를 사용하면 여러가지 이점을 얻을 수 있다. 가장 인상깊게 본 부분은 연관있는 데이터를 한 데 묶어서 사용할 수 있어서 데이터의 흐름을 보다 알기 쉽게 파악할 수 있고, 매개변수를 전달할 때도, 만약 연관된 매개변수라면 구조체를 사용해 구조체 자체를 전달하는 것이 훨씬 작성과 유지보수, 이해하기에도 도움이 될 것이다. 아래 코드에서 이 부분에 대한 예시를 보여주자면
만약 구조체를 사용하지 않고, 직원의 이름, 주소, 생년월일 데이터를 매개변수로 넣어야 할 경우
int getSalary(string name, string address, string birthDate);
이처럼 표현해야 할 것이다.
하지만 만약 직원의 이름, 주소, 생년월일을 가지고 있는 직원 구조체가 있을 경우
struct Employee {
string name,
string address,
string birthDate
};
int getSalary(Employee employee);
이렇게 간단하게 전달할 수 있을 것이다.
13.2 포인터
포인터 사용은 최신 프로그래밍에서 오류를 유발할 가능성이 가장 높은 분야 중 하나다. 자바와 C#, 비주얼 베이직과 같은 최신 언어가 포인터 데이터형을 제공하지 않을 정도로 문제가 심각하다. 포인터 사용은 본질적으로 복잡하고 포인터를 제대로 사용하려면 컴파일러의 메모리 관리 체계를 확실하게 이해해야 한다. 일반적으로 많이 발생하는 보안상의 문제점, 특히 버퍼 오버런이 잘못된 포인터의 사용으로 인한 것임이 밝혀졌다.
포인터 사용 팁
- 포인터 연산을 루틴이나 클래스에 고립시켜라.
- 포인터를 선언과 동시에 정의하라.
- 포인터를 할당된 곳과 같은 영역에서 삭제하라.
- 포인터를 사용하기 전에 검사하라.
- 포인터가 참조하는 변수를 사용하기 전에 검사하라.
- 손상된 메모리를 검사하는 인식표 필드를 사용하라.
- 명시적으로 중복 추가하라.
- 여분의 포인터 변수를 사용하라.
- 그림을 그려라.
- 링크드 리스트에 있는 포인터를 올바른 순서로 삭제하라.
- 임시 메모리를 할당하라.
- 쓰레기를 확실하게 삭제하라.
- 포인터를 삭제하거나 해제한 다음 널로 설정하라.
- 변수를 삭제하기 전에 잘못된 포인터를 검사하라.
- 포인터 할당을 추적하라.
- 포인터 문제를 피하기 위해 커버 루틴을 작성하라.
C++를 사용할 경우 포인터를 사용하는 것보다 별칭(&)을 사용하는 것을 추천한다.
13.3 전역 데이터
전역 데이터를 사용할 때 발생하는 일반적인 문제점
- 전역 변수에 대한 부주의한 변경
- 전역 데이터의 기괴하고 이상한 별칭 문제
- 전역 데이터의 재진입 코드 문제
- 전역 데이터로 인한 코드 재사용 문제
- 전역 데이터와 관련된 불확실한 초기화 순서 문제점
- 전역 데이터로 인해 손상되는 모듈화와 지적인 관리 용이성
전역 데이터를 사용하는 이유
- 전역적인 값의 보관
- 이름 상수의 역할
- 열거형 흉내 내기
- 매우 자주 사용되는 데이터의 사용을 능률화
전역 데이터가 필요한 상황이라면 접근 루틴을 고려해 볼 필요가 있다. 접근 루틴은 추상 데이터형을 구현하고 정보 은닉을 이루기 위한 핵심 기법이다. 완전한 추상 데이터형을 사용하고 싶지는 않더라도 접근 루틴을 사용해 데이터에 대한 제어를 집중시키고 변경으로부터 자신을 보호할 수 있다.
접근 루틴을 사용할 때 유의할 점은 모든 전역 데이터를 한 곳에 몰아넣지 않는 것이다. 이는 추상형을 깨뜨릴 수 있고, 접근 루틴을 사용하는 장점을 많은 부분 없앨 수 있다.