임베디드기사 필기 13 — 임베디드 소프트웨어 ② 프로그래밍(C언어·포인터·엔디안·OOP)
임베디드기사 필기 13 — 임베디드 소프트웨어 ② 프로그래밍(C언어·포인터·엔디안·OOP)
4과목 [4-2] 프로그래밍 파트입니다.
캡슐화 결합도 함정, 엔디안, calloc, %p 형식은 반복 출제돼요.
C언어 기초
기억 클래스 ⭐⭐
auto — 지역 변수 기본값, 쓰레기값으로 초기화
extern — 다른 소스 파일의 전역 변수 참조
static — 함수 종료 후에도 값 유지, 0으로 자동 초기화
register — CPU 레지스터에 저장 요청
⚠️ "internal variables" → 기억 클래스 아님!
printf 형식 지정자 ⭐
%c — 문자
%s — 문자열
%d — 10진 정수
%u — 부호 없는 10진 정수
%o — 8진수
%x — 16진수
%f — 부동소수점
%p — 포인터 값(변수의 주소) ⭐
⚠️ "포인터 값 출력 형식" → %p
기출 문제
Q. 부호 없는 10진 정수를 출력하는 형식은?
A. %u
Q. 변수의 주소(포인터 값)를 출력하는 형식은?
A. %p
포인터 ⭐⭐
int a = 10;
int *p = &a; // p는 a의 주소
*p // a의 값 (역참조)
// 배열과 포인터
int arr[5];
int *p = arr;
*(p+1) == p[1] // 같은 의미!
엔디안 (Endianness) ⭐⭐
빅 엔디안 (Big-Endian)
→ MSB가 낮은 주소에 저장
→ int a = 0x01020304;
char *p = (char *)&a;
*p → 0x01 (MSB!)
리틀 엔디안 (Little-Endian)
→ LSB가 낮은 주소에 저장
→ unsigned short k = 0x1234;
unsigned char *p = (unsigned char *)&k;
*p → 0x34 (LSB!)
기출 문제
Q. Big-endian에서 int a=0x01020304를 1바이트 포인터로 캐스팅해 첫 바이트 출력?
A. 0x01 (MSB가 낮은 주소)
Q. Little-endian에서 unsigned short k=0x1234를 1바이트 포인터로 캐스팅해 첫 바이트 출력?
A. 0x34 (LSB가 낮은 주소)
동적 메모리 할당 ⭐⭐
malloc(size) — 초기화되지 않은 메모리 할당 (쓰레기값)
calloc(n, size) — 0(NULL)으로 초기화된 메모리 할당 ⭐
realloc(ptr, size) — 이미 할당된 메모리 크기 재조정
원본 포인터(ptr) 값은 그대로 유지
free(ptr) — 메모리 해제
⚠️ "calloc vs malloc 차이" → calloc은 0으로 초기화!
기출 문제
Q. NULL로 초기화된 힙 메모리를 할당하는 함수는?
A. calloc (malloc은 초기화 안 됨)
구조체 / 공용체 / 열거체
struct (구조체)
→ 서로 다른 자료형 멤버를 묶음
→ 각 멤버 독립 메모리 → 전체 크기 = 멤버 합
→ 변수: . 연산자 / 포인터: -> 연산자
union (공용체)
→ 모든 멤버가 같은 메모리 공유
→ 전체 크기 = 가장 큰 멤버 크기
→ 한 멤버 변경 시 다른 멤버도 영향
enum (열거체)
→ 정수 상수들의 집합
→ 초기값 없으면 0부터 순차 할당
객체지향 프로그래밍 (OOP) ⭐⭐⭐
4대 원리
캡슐화 (Encapsulation):
데이터와 연산을 하나로 묶고 내부 구현 숨김
결합도(Coupling) 낮아짐 + 응집도(Cohesion) 높아짐
⚠️ "캡슐화하면 결합도가 높아진다" → 오답! (낮아짐)
상속 (Inheritance):
상위 클래스의 속성·연산을 하위 클래스가 물려받음
코드 재사용성 향상
다형성 (Polymorphism):
하나의 메시지에 대해 객체마다 다르게 응답하는 성질
⚠️ 다형성의 정의 = "하나의 메시지에 대해 객체에 따라 다른 방법으로 응답"
추상화 (Abstraction):
추상화 3종류: 자료 추상화 / 기능 추상화 / 제어 추상화
⚠️ "상속 추상화"는 추상화의 종류가 아님!
정보 은폐:
목적: 고려되지 않은 영향(side effect)을 최소화하기 위해
클래스 = 하나 이상의 유사 객체를 묶어 공통 특성을 표현한 데이터 추상화
기출 문제
Q. 캡슐화에 대한 설명으로 옳지 않은 것은?
A. "결합도가 높아진다" — 캡슐화는 결합도를 낮춤!
Q. 다형성의 가장 적절한 설명은?
A. 하나의 메시지에 대해 객체에 따라 다른 방법으로 응답할 수 있는 것
Q. 추상화의 종류가 아닌 것은?
A. 상속 추상화 (자료/기능/제어 추상화만 존재)
C++ 객체지향
생성자(Constructor)
→ 객체 생성 시 자동 호출, 초기화
→ 반환값 없음
→ 오버로딩 가능 (매개변수 다르게)
소멸자(Destructor)
→ 객체 소멸 시 자동 호출
→ 매개변수 없음, 오버로딩 불가
가상함수(virtual function)
→ 다형성 구현의 핵심
→ 파생 클래스에서 재정의(오버라이딩) 가능
순가상함수(pure virtual)
→ virtual 함수명() = 0;
→ 추상 클래스 (객체 생성 불가)
비트 연산 (임베디드 필수)
특정 비트 SET: x |= (1 << n)
특정 비트 CLEAR: x &= ~(1 << n)
특정 비트 TOGGLE: x ^= (1 << n)
시프트: n<<1 = n*2 / n>>1 = n/2
💡 실무에서는?
임베디드 보안 장비 펌웨어 개발에서 빅/리틀 엔디안 변환이 필수예요.
네트워크 패킷이 빅 엔디안(Network Byte Order)을 사용하는데,
ARM 칩이 리틀 엔디안이면 htonl()/ntohl() 함수로 변환이 필요해요.
캡슐화/다형성은 보안 드라이버 설계 시 인터페이스 분리 원칙으로 그대로 씁니다.
핵심 정리
✅ 기억클래스: auto/extern/static/register ("internal" 없음!)
✅ %p = 포인터 값(주소) 출력
✅ %u = 부호없는 10진 정수
✅ Big-endian: 첫바이트=MSB (0x01)
✅ Little-endian: 첫바이트=LSB (0x34)
✅ calloc = 0으로 초기화 / malloc = 쓰레기값
✅ 캡슐화 = 결합도↓ 응집도↑ ("결합도↑" 오답!)
✅ 다형성 = 하나의 메시지에 객체마다 다르게 응답
✅ 추상화 종류: 자료/기능/제어 ("상속추상화" 없음!)
✅ 생성자=오버로딩가능 / 소멸자=오버로딩불가
다음 편에서는 개발방법론 — UML·블랙박스·화이트박스·럼바우로 이어갑니다!