[정처기 필기] 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 abstract와 interface
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. 스스로 검토할 때 쓰는 오답 노트(빈칸)
- 응집도가 가장 높은 것은 ( ) 응집도이다.
- 결합도가 가장 낮은(상대적으로 바람직한) 것은 ( ) 결합도이다.
- C에서 힙 메모리를 반환하는 함수는
( )이다. - Java에서 메서드 이름은 같고 매개변수만 다른 것을 ( ) 이라 한다.
- Python 3에서 바닥 나눗셈 연산자는
( )이다.
| 번호 | 정답 |
|---|---|
| 1 | 기능적 |
| 2 | 자료 |
| 3 | free |
| 4 | 오버로딩 |
| 5 | // |