← 목록으로

[정처기 필기] 4. 프로그래밍 언어 활용

프로그래밍 언어 활용 - 결합도·응집도 · 데이터 표현·연산자 · 자료형·변수 · 제어문 · C · Java · Python


0. 과목 구조 한눈에 (시험용 지도)

하위 축한 줄 요지시험이 자주 묻는 것
결합도·응집도모듈 간 의존(결합)·모듈 내부 밀도(응집)순서(나쁨→좋음), “낮은 결합·높은 응집” 문장
데이터 표현·연산비트·진법·보수, 연산자 종류·우선순위·결과 타입진법 변환, 2의 보수, 논리/비트 연산 구분
자료형·변수값의 분류, 이름·수명·범위C 저장 클래스, Java 기본형·참조형, Python 동적 타입
제어문·반복분기·반복·분기 대체if/switch, for/while/do-while, break/continue
C포인터·배열·메모리·구조체포인터 연산, 배열-포인터 관계, malloc/free
Java객체지향·예외·문자열상속/다형성, abstract/interface, try-catch-finally
Python들여쓰기·시퀀스·함수///, 슬라이싱, range, 모듈·__name__

1. 결합도(Coupling)와 응집도(Cohesion)

  • 결합도: 모듈 사이가 얼마나 서로 묶여 있는지. 낮을수록 유지보수·재사용에 유리하다고 외운다.
  • 응집도: 모듈 의 요소들이 한 목적에 얼마나 모였는지. 높을수록 바람직하다고 외운다.
  • 시험 문장으로는 **“낮은 결합도, 높은 응집도”**가 정답인 경우가 많다.

1.1 결합도 — 나쁨 → 좋음 (교재에서 흔한 순서)

순서이름요지
1내용(Content)다른 모듈 내부까지 파고드는 식의 강한 의존
2공통(Common)전역 데이터 등을 여러 모듈이 함께 참조
3외부(External)외부의 통신 규약·외부 객체에 맞춰 묶임
4제어(Control)제어 신호·플래그로 상대 동작을 통제
5스탬프(Stamp)구조체 단위로 넘기지만 실제로는 일부만 씀
6자료(Data)필요한 데이터만 인자 등으로 주고받음(상대적으로 가장 양호)
  • 시험 트릭: “결합도가 높을수록 좋다” 같은 문장은 보통 오답.
  • 스탬프 vs 자료: “레코드/구조체 통째로” vs “필요 값만”으로 구분하는 지문이 자주 나온다.

1.2 응집도 — 나쁨 → 좋음 (교재에서 흔한 순서)

순서이름요지
1우연적(Coincidental)연관 없는 코드가 우연히 한 파일/모듈에 있음
2논리적(Logical)비슷한 성격은 같지만, 서로 다른 기능을 분기로 택함
3시간적(Temporal)같은 시점에 실행된다는 이유만으로 묶임
4절차적(Procedural)실행 순서는 맞지만 데이터·목적 연결은 약함
5교환적(Communication)같은 입·출력 데이터를 중심으로 묶임
6순차적(Sequential)앞 단계 출력이 뒤 단계 입력으로 이어짐
7기능적(Functional)하나의 명확한 기능만 담당(가장 이상적)
  • 기능적 응집도가 최상, 우연적 응집도가 최악으로 묶어서 암기하면 된다.

1.3 한 번에 정리

  • 좋은 설계 한 줄: 모듈 안은 단단히(응집↑), 모듈 밖은 느슨히(결합↓).
  • 1과목 설계 범위와 표 내용이 같게 외우면 된다(출제 각도만 다를 뿐 개념은 동일).

2. 데이터 표현과 연산자

2.1 진법과 변환

  • 2진·8진·16진·10진 상호 변환이 기본. 8·16진은 2진 묶음(3비트·4비트)으로 풀고 쓰는 방식이 시험에 잘 맞는다.
  • 10진 소수 → 2진: 유한 소수여도 2진에서는 무한 소수가 될 수 있어 부동소수점 오차 개념과 연결된다.

2.2 음의 정수 — 2의 보수(가장 흔한 설명)

  • n비트에서 양의 정수 x를 음으로 나타낼 때, 2의 보수는 보통 **2^n - x**로 구한다는 설명이 교재에 많다.
  • 특징: **가장 왼쪽 비트(MSB)**가 부호에 쓰이는 방식으로 설명되는 경우가 많다.
  • 연산: 덧셈기 하나로 양수·음수 덧셈을 처리한다는 장점이 지문으로 나온다.

2.3 실수 — 부동소수점(개념만)

  • 대략 부호 + 지수 + 가수(맨티사) 형태로 넓은 범위를 표현하지만, 정밀도 한계가 있다.
  • “실수를 부동소수점에 넣으면 항상 원본과 100% 동일”류 문장은 오답인 경우가 많다.

2.4 문자 표현

  • ASCII: 영문·숫자·제어문자 중심의 전통적 부호 체계(1바이트에 가깝게 다루는 설명이 많음).
  • 유니코드: 전 세계 문자를 포괄하는 문자 집합; 실제 저장·전송은 UTF-8, UTF-16 같은 인코딩으로 설명된다.

2.5 연산자 — 공통으로 묻는 구분

구분예시(언어마다 기호는 조금 다름)시험 포인트
산술+, -, *, /, %정수 나눗셈 vs 실수 나눗셈(특히 C, Python3)
관계(비교)==, !=, <, >결과는 보통 참/거짓(또는 0/비0)
논리C/Java: && `
비트& ` ^ ~ << >>`
대입=우선순위가 낮다는 식의 설명이 나오기도 함
복합 대입+=, -=연산+대입을 한 번에
증감++, --(C/Java)전위·후위 표현식 값 차이가 C에서 특히 출제

2.6 우선순위·결합성

  • 암기보다는 괄호 ()로 의도를 밝힌다가 실무·시험 모두 안전하다.
  • 시험에서 자주 건드리는 부분: 비트 연산 vs 관계 연산 vs 논리 연산이 한 식에 섞인 경우 괄호 없이 풀기 문제.

3. 자료형과 변수

3.1 공통 개념

  • 자료형: 값의 집합과 그 값에 허용되는 연산을 규정한다고 보면 된다.
  • 변수: 이름(식별자), 기억 장소, 수명·범위(scope), 가시성이 함께 묻는다.
  • 상수: 실행 중 변하지 않는 값을 고정할 때 사용(const, final, 대문자 스네이크 케이스 관례 등).

3.2 C 언어 관점

  • 기본형: char, short, int, long(환경에 따라 크기 차이 이슈), float, double 등.
  • unsigned: 부호 없이 양의 범위를 넓힘; 음수 표현은 하지 않는다는 설명이 정답인 경우가 많다.
  • 저장 클래스(storage class): auto, register, static, extern — 시험에서는 static의 의미(지역이면 수명 연장, 전역/함수면 내부 연결성 등 교재 정의)가 자주 나온다.
  • typedef: 새 타입을 만드는 것이 아니라 기존 타입에 별칭을 붙이는 것.

3.3 Java 관점

  • 기본형(primitive): byte, short, int, long, float, double, char, boolean비객체, 지정된 메모리 크기로 설명되는 편.
  • 참조형(reference): 클래스·배열·인터페이스 등, 객체의 위치를 참조한다고 설명된다.
  • 래퍼 클래스: Integer 등 — 컬렉션에 넣거나 null이 필요할 때 등장.
  • 지역 변수는 사용 전 초기화가 필요하다는 식의 규칙이 출제된다(필드와 구분).

3.4 Python 관점

  • 동적 타입: 실행 시점에 객체에 타입이 붙는다는 설명이 일반적이다.
  • 이름과 객체: 변수명은 **객체를 가리키는 이름(레퍼런스)**에 가깝다고 이해하면 a = b 이후의 동작을 설명하기 쉽다.
  • 불변(immutable) 객체: int, str, tuple 등 — “수정”이 아니라 새 객체를 가리키게 되는 그림이 자주 나온다.

4. 제어문과 반복문

4.1 선택(분기)

  • if / else if / else: 조건식은 불리언/참·거짓으로 평가(C는 0이 거짓, 비0이 참).
  • switch(C/Java): 정수·열거·문자열(Java)교재가 허용하는 타입만 가능하다는 제한이 출제된다.
  • break: switch에서 fall-through를 끊는다. 의도적으로 생략하는 패턴도 있으나 시험은 빠뜨린 실수 쪽을 더 자주 낸다.

4.2 반복

문법특징(시험용)
while선(先) 검사 — 0번 이상 실행
do-while(C/Java)후(後) 검사 — 최소 1번 실행
for초기식·조건식·증감식을 한 덩어리로 두기 좋음
for-each(Java 확장)Iterable·배열 순회에 편리
for ... in(Python)시퀀스·이터러블 순회
  • break: 가장 가까운 반복문(또는 switch)을 빠져나감.
  • continue: 다음 반복으로 점프(C/Java는 while/for에서 증감 위치 차이 문제로 나올 수 있음).

4.3 중첩·가독성

  • 다중 루프에서 break어느 루프를 빠져나가는지 헷갈리면, 교재 기준으로 가장 안쪽부터 매칭한다고 외운다.

5. C 언어

5.1 포인터

  • 주소를 담는 변수. *선언에서는 “포인터”, 에서는 역참조(간접 참조).
  • &: 변수의 주소.
  • 포인터 연산: p+1다음 요소로 이동(타입 크기만큼 증가)한다는 설명이 핵심.

5.2 배열과 포인터

  • 배열 이름은 **대부분의 식에서 첫 요소를 가리키는 포인터로 승격(decay)**된다는 설명이 나온다(예외: sizeof 배열 등 교재가 적는 경우).
  • **a[i]**는 ***(a+i)**와 같은 의미로 설명된다.

5.3 문자열

  • 문자 배열 또는 char*가 가리키는 문자열 리터럴 형태.
  • 널 종료 문자 '\0' — 길이 계산·출력 함수 동작의 전제.

5.4 함수

  • **선언(프로토타입)**과 정의 분리, return, 매개변수는 값 복사가 기본.
  • static 함수: **파일 범위(내부 연결)**로 제한된다는 설명이 자주 나온다.

5.5 메모리 할당

  • malloc / calloc / realloc / free: 영역, free 누락·이중 해제는 오답·결함 지문으로 나온다.

5.6 구조체

  • struct: 서로 다른 타입을 묶은 레코드형.
  • . vs ->: 값 타입 vs 포인터를 통한 접근.

5.7 전처리기

  • #include, #define 매크로, #if 계열컴파일 이전 단계에서 처리된다는 설명이 정답인 경우가 많다.

6. Java

6.1 클래스·객체·캡슐화

  • 클래스 = 필드 + 메서드 틀, new로 인스턴스 생성.
  • 접근 제어자: private, default(패키지), protected, public캡슐화와 자주 연결된다.

6.2 상속·다형성

  • extends: 단일 상속. implements: 인터페이스 다중 구현.
  • super: 부모 생성자·부모 멤버 호출. this: 현재 객체 참조.
  • 오버라이딩: 시그니처 동일·동적 바인딩. 오버로딩: 이름 같고 매개변수 목록 다름.

6.3 abstractinterface

  • abstract 클래스: 미완성 메서드를 둘 수 있음(인스턴스 생성 제한).
  • interface: 추상 메서드·상수 중심의 계약(버전에 따라 디폴트 메서드 등이 추가된다는 설명은 “최근 언어 변화” 정도로만 잡으면 된다).

6.4 예외 처리

  • try-catch-finally: finally거의 항상 실행된다는 문장이 자주 나온다(교재가 적는 예외: System.exit 등은 시험에서 보통 배제).
  • throws: 호출자에게 책임 전가. throw: 예외 인스턴스 던짐.

6.5 문자열

  • String 객체는 **불변(immutable)**이라는 설명이 출제된다 — 덧붙이기 연산이 반복되면 비효율이라는 흐름으로 **StringBuilder/StringBuffer**가 등장한다.

6.6 배열·컬렉션(개념 수준)

  • 배열 길이 고정, ArrayList는 가변 리스트 같은 대비가 자주 나온다.

7. Python

7.1 기본 문법

  • 블록은 들여쓰기로 구분 — 탭/스페이스 혼용은 오류로 이어질 수 있다는 지문이 나온다.
  • : 뒤에 블록이 이어진다(if, for, def 등).

7.2 산술 연산 — 시험에서 자주 걸리는 부분

  • /: 실수 나눗셈(Python 3). //: 바닥 나눗셈(몫, 타입은 피연산자에 따라 달라질 수 있음).
  • **: 거듭제곱.

7.3 시퀀스

  • 리스트는 가변, 튜플은 불변 — 키로 쓰기, 함수 인자 불변 보장 같은 문제와 연결된다.
  • 슬라이싱 [start:stop:step]: stop은 포함 안 됨이 핵심.

7.4 딕셔너리·집합

  • dict: 키-값 매핑, 키는 해시 가능해야 한다는 설명이 나온다.
  • set: 중복 제거, 순서 보장 여부는 버전·구현 이야기가 있으므로, 시험은 “중복 불가” 중심으로 잡는 편이 안전하다.

7.5 함수·모듈

  • def, return 없으면 None 반환.
  • 기본 인자는 정의 시점에 한 번 평가된다는 함정(가변 기본값 리스트)이 가끔 출제된다.
  • if __name__ == "__main__":: 직접 실행할 때만 테스트 코드 실행 — 모듈로 import될 때는 실행되지 않게 하려는 관용구.

7.6 객체 비교

  • ==: 값 동등(내용이 같게 정의된 경우). is: 동일 객체(정체성)"a" is "a" 같은 최적화 이야기보다는, 지문이 의도한 구분을 보면 된다.

8. 시험 포인트(암기 체크)

  • 결합도는 자료 결합도가 가장 덜 나쁨, 응집도는 기능적이 가장 좋음순서 뒤집기 오답을 조심한다.
  • 논리 연산비트 연산 기호(&& vs & 등)를 헷갈리면 안 된다.
  • C는 포인터·배열 관계, 2의 보수, malloc/free, static의 이중 의미가 세트로 자주 나온다.
  • Java는 오버로딩 vs 오버라이딩, String 불변, **예외 흐름(finally)**이 반복된다.
  • Python은 / vs //, 슬라이스 끝 미포함, __name__ 가드, 가변 기본 인자를 묶어서 본다.
  • 전처리기는 컴파일 전, 링크는 목적 파일 결합 같은 번역 단계 구분은 C·공통 컴파일 이론과 연결해 암기한다.

9. 스스로 검토할 때 쓰는 오답 노트(빈칸)

  1. 응집도가 가장 높은 것은 (   ) 응집도이다.
  2. 결합도가 가장 낮은(상대적으로 바람직한) 것은 (   ) 결합도이다.
  3. C에서 힙 메모리를 반환하는 함수는 (   ) 이다.
  4. Java에서 메서드 이름은 같고 매개변수만 다른 것을 (   ) 이라 한다.
  5. Python 3에서 바닥 나눗셈 연산자는 (   ) 이다.
번호정답
1기능적
2자료
3free
4오버로딩
5//