자격증 정복/임베디드기사(기능사)

임베디드기사 필기 13 — 임베디드 소프트웨어 ② 프로그래밍(C언어·포인터·엔디안·OOP)

올드 IT직장인 2026. 8. 17. 08:37

임베디드기사 필기 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·블랙박스·화이트박스·럼바우로 이어갑니다!

반응형