본문 바로가기
일상/자기계발&자기개발

[#정보처리기사] 24년 3회 문제"공부"

by 스토리울음 2025. 3. 28.

해당 글은 마크다운 언어로 작성되었습니다.


C언어

Static 키워드와 메모리의 이해

int increment()
{
    static int x = 0;
    x += 2;
    reutrn x;
}
int main()
{
    int x = 1;
    int sum = 0;
    for(int i = 0; i<4; i++)
    {
        x++;
        sum += increment();
    }
    printf("%d", sum);
}
관련 개념 요약: static 지역 변수
  • static은 C언어에서 변수를 초기화할 때 값이 한 번만 설정된다.
  • 함수가 종료되어도 메모리에서 사라지지 않게 한다.
  • 특정 파일 내에서만 사용되도록 제한하는 데 유용한 키워드다.
  • 모듈화캡슐화를 지원한다.
  • 함수나 변수의 수명과 범위를 관리할 수 있다.
항목 설명
저장 위치 데이터 영역 (Data Section)
생존 기간 프로그램 실행 종료 시까지 유지
초기화 딱 한 번만, 이후 값은 유지
사용 목적 함수 호출 간 값 누적, 상태 유지 (ex. 카운터)
저장 클래스 비교표
저장 클래스 키워드 저장 위치 수명 (생존 기간) 접근 범위 초기화 여부 특징
자동 변수 auto (기본값) 스택 함수 실행 중 (지역적) 선언된 블록 내 명시하지 않으면 쓰레기 값 지역 변수 기본
정적 변수 static 데이터 영역 (Data) 프로그램 종료까지 선언된 블록 내 명시 안 하면 0 값이 유지
외부 변수 extern 데이터 영역 프로그램 종료까지 파일 전체 또는 외부 파일 선언만 하고 초기화는 다른 곳에서 다른 파일과 변수 공유 시 사용
레지스터 변수 register CPU 레지스터 or 스택 함수 실행 중 선언된 블록 내 초기화 필요 고속 접근, 주소 연산자(&) 사용 불가
1. 정적 변수 (Static Variable)
(1) 함수 내부에서의 사용
  • 초기화가 한 번만 이루어짐
    • 함수 내부에 선언된 static 변수는 함수가 호출될 때마다 초기화되지 않고, 프로그램 종료까지 값이 유지됩니다.
  • 반복된 호출 시 값이 계속 유지됨
    • 일반적인 지역 변수는 함수가 종료되면 메모리에서 제거되지만, static 변수는 함수 호출 간에 값이 유지됩니다.
  • static int count = 0; 선언은 counter() 함수가 호출될 때마다 값이 초기화되지 않고 유지됩니다. 따라서 count 변수는 함수 호출이 끝나도 값이 사라지지 않고 계속 누적됩니다.
(2) 함수 외부에서의 사용
  • 파일 내에서만 접근 가능
    • 전역변수에 static을 사용하면, 해당 변수는 그 파일 내에서만 접근할 수 있게 제한됩니다.
    • 다른 파일에서 이 변수를 참조할 수 없게 됩니다.
    • 이를 통해 전역 변수의 범위를 제한할 수 있습니다.
2. 정적 함수 (Static Function)
  • static을 함수 앞에 붙이면, 그 함수는 같은 파일 내에서만 접근 가능합니다.
  • 다른 파일에서 이 함수를 호출할 수 없게 됩니다.
  • 모듈화캡슐화에 유리하게 사용됩니다.
3. 정적 변수와 메모리
  • static 변수는 데이터 영역에 저장되며, 프로그램 실행이 끝날 때까지 메모리에 남아있습니다.
  • 반면 일반적인 지역 변수는 스택 영역에 저장되어 함수 호출이 끝나면 메모리에서 사라집니다.
  • 따라서 static 변수는 프로그램이 종료될 때까지 값을 유지합니다.
4. static의 사용 용도 요약
  1. 함수 내에서 static 변수 사용: 함수 호출 간에 값을 유지하고 싶을 때 사용합니다.
  2. 전역 변수에 static 사용: 변수를 다른 파일에서 접근할 수 없게 제한하여 캡슐화를 구현합니다.
  3. static 함수 사용: 특정 파일 내에서만 호출 가능한 함수로, 다른 파일에서 접근할 수 없게 합니다.

구조체

struct Node {
    int value;
    struct Node* next;  
};

void func(struct Node* node) {
    while (node != NULL && node->next != NULL) {
        int t = node->value;
        node->value = node->next->value;
        node->next->value = t;
        node = node->next->next;
    }
}

int main() {
    struct Node n1 = {1, NULL};
    struct Node n2 = {2, NULL};
    struct Node n3 = {3, NULL};

    n1.next = &n3;  
    n3.next = &n2;

    func(&n1);

    struct Node* current = &n1;
    while (current != NULL) {
        printf("%d", current->value);  
        current = current->next;
    }
}
필요한 개념 요약
개념 설명
구조체(struct) 사용자 정의 자료형. 여러 변수(값 + 포인터)를 하나로 묶음
연결 리스트 각 노드가 다음 노드를 가리키는 구조
포인터 접근 node->next(*node).next와 동일
값 교환(swap) int t = a; a = b; b = t; 방식 사용
두 칸씩 이동 node = node->next->next를 통해 짝수 번째 노드 처리 가능
1. 구조체 (Struct)
  • 구조체는 여러 데이터를 하나로 묶어서 관리할 수 있는 자료형입니다.
  • C언어에서 struct 키워드를 사용하여 정의합니다.
  • 예를 들어, struct Nodevalue(정수형)와 next(다음 노드를 가리키는 포인터)를 포함하는 구조체입니다.
2. 포인터
  • 포인터는 메모리 주소를 저장하는 변수입니다.
  • C에서 *를 사용하여 포인터를 선언하고, &를 사용하여 변수의 주소를 참조합니다.
  • 예시: struct Node* nextNode 구조체 타입의 포인터를 나타냅니다.
3. 연결 리스트 (Linked List)
  • 연결 리스트는 각 요소(노드)가 데이터와 다음 노드에 대한 포인터를 포함하는 자료구조입니다.
  • 각 노드는 valuenext라는 두 가지 필드를 가집니다.
  • value는 데이터, next는 다음 노드를 가리킵니다.
  • head 포인터는 첫 번째 노드를 가리키며, 마지막 노드의 nextNULL입니다.
4. while 루프
  • C에서 while 루프는 조건이 참일 때 계속 실행되는 반복문입니다.
  • while 루프를 사용하여 조건이 만족하는 동안 특정 작업을 반복적으로 수행할 수 있습니다.
  • 예시: while (node != NULL && node->next != NULL)는 현재 노드와 그 다음 노드가 있을 때 반복문을 실행합니다.
5. 값 교환 (Swapping)
  • 두 변수의 값을 교환하는 방법은 임시 변수(t)를 사용하는 방식입니다.
  • 예시:
  • int t = node->value; node->value = node->next->value; node->next->value = t;
  • 이 코드는 nodenode->next의 값을 서로 교환하는 역할을 합니다.
6. 포인터 연산
  • 포인터를 사용하여 노드를 순차적으로 이동할 수 있습니다.
  • 예를 들어, node = node->next->nextnode를 두 번째 다음 노드로 이동시키는 코드입니다.

JAVA

배열, equals() 메서드, 향상된 for 문

public class Main {
    static void func(String[] m, int n) {
        for (int i = 1; i < n; i++) {
            if (m[i-1].equals(m[i])) {  
                System.out.print("O");
            } else {
                System.out.print("N");
            }
        }

        for (String mo : m) {
            System.out.print(mo);
        }
    }

    public static void main(String[] args) {
        String[] m = new String[3];
        m[0] = "A";
        m[1] = "A";
        m[2] = new String("A");  
        func(m, 3);
    }
}
1. equals() 메서드 (값 비교)
  • equals()두 객체의 값을 비교하는 메서드야. 이 메서드는 기본적으로 두 객체가 같은 값을 가지고 있다면 true를 반환합니다.
    • 예: new String("A")"A"값이 같기 때문에 equals()로 비교할 때 true가 반환됩니다.
    • == 연산자참조값(메모리 주소)을 비교하는 연산자여서, 객체가 다르면 값이 같아도 false가 반환될 수 있습니다.
2. 배열의 사용
  • 배열 mString[] 타입으로 선언되어, 여러 개의 문자열을 저장할 수 있습니다.
    • 배열은 순차적인 인덱스를 가진 자료구조이므로, m[0], m[1], m[2]와 같이 인덱스로 접근할 수 있습니다.
3. for-each
  • for-each 문을 사용하면 배열의 모든 요소를 순차적으로 처리할 수 있습니다.
  • for (String mo : m) { System.out.print(mo); // 배열의 각 요소를 출력 }
4. String 클래스
  • String 클래스는 자바에서 문자열을 다룰 때 사용하는 불변(immutable) 클래스입니다.
  • 즉, 한 번 생성된 문자열은 수정할 수 없고, 새로운 문자열을 생성할 때마다 새 객체가 만들어집니다.
    • 예: new String("A")는 새로운 String 객체를 생성하는 방식이며, "A"리터럴로 생성된 문자열입니다.
5. 참조와 값 비교
  • 값 비교: equals()를 사용해서 객체의 값이 같은지 비교.
  • 참조 비교: ==를 사용해서 객체가 같은 메모리 주소를 참조하는지 비교.
6. 배열 인덱스
  • 배열의 인덱스는 0부터 시작하므로, m[0], m[1], m[2]는 각각 배열의 첫 번째, 두 번째, 세 번째 요소를 의미합니다.

예외처리

public static void main(String[] args) {
        int sum = 0;
        try {
            func();
        } catch(NullPointerException e) {
            sum = sum + 1;
        } catch(Exception e) {
            sum = sum + 10;
        } finally {
            sum = sum + 100;
        }
        System.out.print(sum);
    }
    static void func() throws Exception {
        throw new NullPointerException();
    }
}
예외(Exception)
  • 프로그램 실행 중 발생할 수 있는 예상치 못한 오류를 의미합니다.
  • 예외가 발생하면 프로그램이 비정상적으로 종료될 수 있습니다.
  • Java에서는 예외를 처리하여 프로그램이 안전하게 실행되도록 할 수 있습니다.
예외 처리(Exception Handling)

Java에서는 try-catch-finally 블록을 사용하여 예외를 처리할 수 있습니다.

try 블록
  • 예외가 발생할 가능성이 있는 코드를 포함합니다.
  • 만약 예외가 발생하면 catch 블록으로 이동합니다.
catch 블록
  • 발생한 예외를 처리하는 역할을 합니다.
  • catch(Exception e)처럼 특정 예외 유형을 지정할 수 있습니다.
  • 여러 개의 catch 블록을 사용할 수 있으며, 가장 먼저 일치하는 블록이 실행됩니다.
finally 블록
  • 예외 발생 여부와 관계없이 무조건 실행되는 블록입니다.
  • 파일 닫기, 네트워크 연결 해제 등 정리(clean-up) 작업에 주로 사용됩니다.

오버라이딩

class B {
    int x = 3;
    int getX() {
        return x * 2;
    }
}

class A extends B {
    int x = 7;
    @Override
    int getX() {
        return x * 3;
    }
}

public class Annotation {
    public static void main(String[] args) {
        B b1 = new A(); 
        A b2 = new A(); 
        System.out.print(b1.getX() + b1.x + b2.getX() + b2.x);
    }
}
1. 메서드 오버라이딩 (@Override)
  • getX()B에서 정의되었지만 A에서 오버라이딩되어 A의 구현이 실행됨 (동적 바인딩).
2. 필드 오버라이딩(X), 필드 숨김(Shadowing)
  • int xBA 모두 정의되었지만, 필드는 동적 바인딩이 적용되지 않음.
  • b1.xB 타입을 따라 Bx = 3을 사용.
3. 업캐스팅(Upcasting)란?
  • 자식 클래스 객체를 부모 클래스 타입으로 변환하는 것을 의미합니다.
  • 명시적 형 변환 없이 자동으로 변환(암시적 변환)됩니다.
  • 부모 타입으로 변환되므로, 부모 클래스의 멤버(필드, 메서드)만 접근 가능합니다.
  • 하지만, 오버라이딩된 메서드는 동적 바인딩에 의해 자식 클래스의 메서드가 호출됩니다.

다형성(Polymorphism) 활용 가능

  • 업캐스팅을 사용하면, 부모 클래스의 변수로 여러 자식 객체를 다룰 수 있음.
  • 메서드 오버라이딩을 활용하여 유연한 코드 작성 가능.

코드 재사용성 증가

  • 부모 클래스 타입의 배열이나 리스트를 이용해 여러 자식 객체를 처리 가능.
4. 다운캐스팅(Downcasting)
  • 업캐스팅된 객체를 다시 자식 타입으로 변환하는 것다운캐스팅(Downcasting)이라고 합니다.
  • 명시적으로 형 변환을 해야 하며((Child)처럼), 런타임 오류가 발생할 수 있으므로 주의가 필요합니다.
최종 정리
  • 메서드는 동적 바인딩(실제 객체 기준)
  • 필드는 참조 타입 기준으로 접근
  • 최종 출력값: 52
업캐스팅 정리
개념 설명
업캐스팅(Upcasting) 자식 객체를 부모 클래스 타입으로 변환 (자동 변환)
동적 바인딩(Dynamic Binding) 업캐스팅 시, 오버라이딩된 메서드는 자식 클래스의 것이 실행됨
부모 멤버만 접근 가능 업캐스팅된 객체는 부모 클래스의 필드/메서드만 사용 가능
다형성 활용 가능 여러 자식 클래스를 하나의 부모 타입으로 다룰 수 있음
다운캐스팅(Downcasting) 업캐스팅된 객체를 다시 자식 타입으로 변환 (명시적 변환 필요)
그래서 중요한 결론

메서드 내부에서 변수 x를 쓰면, "현재 객체"의 x (this.x)를 사용한다.

이게 왜 중요하냐면?

  • 부모 클래스에도 x가 있고
  • 자식 클래스에도 x가 있을 때

메서드가 어디서 정의되었는지는 중요하지 않고,
메서드를 호출한 "객체 인스턴스의 타입"에 따라 this.x가 결정!

헷갈리지 말아야 할 포인트
코드 의미 실제 동작
x this.x 현재 객체의 x 참조 (A 객체면 A.x = 7)
this.x 명시적 현재 객체 필드 A 객체 기준이라면 A.x
b1.x 참조 변수 기준 필드 b1이 B 타입이면 B.x = 3

오버로딩과 제네릭

class Printer
{
    void print(Integer a) {System.out.print("A" + a);}
    void print(Object a) {System.out.print("B" + a);}
    void print(Number a) {System.out.print("C" + a);}
}
public class Generic
{
    public static void main (String[] args)
    {
        new Container<>(0).print();
    }
    public static class Container
    {
        T value;
        public Container(T t) {value = t;}
        public void print() {new Printer().print(value);}
    }
}
기본형 (Primitive Type) + 래퍼 클래스
기본형 타입 크기 기본값 래퍼 클래스 설명
byte 8비트 0 Byte 매우 작은 정수
short 16비트 0 Short 작은 정수
int 32비트 0 Integer 일반적인 정수
long 64비트 0L Long 큰 정수
float 32비트 0.0f Float 단정도 실수 (소수점)
double 64비트 0.0d Double 배정도 실수 (더 정밀한 소수)
char 16비트 '\u0000' Character 문자 1개 (유니코드)
boolean 1비트 false Boolean 참/거짓 논리값
참조형 (Reference Type)
참조형 타입 기본값 설명
String null 문자열 (문자의 나열)
Object null 모든 클래스의 최상위 클래스
Array null 배열 (같은 타입의 여러 값 저장)
사용자 정의 클래스 null 사용자가 만든 데이터 타입 (예: Person)
Enum null 상수 집합 (미리 정의된 값들)
Interface null 메서드만 정의된 틀 (구현은 없음)
Abstract Class null 일부만 구현된 클래스
var (Java 10+) 없음 컴파일 시 타입 자동 추론
중요한 개념 요약
개념 설명
오버로딩 동일한 이름, 다른 매개변수 타입의 메서드가 여러 개 존재 가능
오토박싱 intInteger 자동 변환
제네릭 타입 추론 Container<>(0) 호출 시 T = Integer 추론됨
타입 소거 (Type Erasure) 제네릭 타입은 컴파일 후에 Object로 치환됨
정적 바인딩 vs 동적 바인딩 오버로딩은 컴파일 시점(정적 바인딩)에 결정됨
핵심 정리
구분 오버로딩 제네릭
판단 시점 컴파일 타임 컴파일 타임에 타입 추론, 런타임에는 타입 소거
기반 매개변수 타입/개수 타입 매개변수 (예: T)
호출 우선순위 정확한 타입 → 상위 타입 → Object 타입 추론 후에도 Object로 변하면 정확도 저하 가능성 있음
문제 상황 오버로딩 + 제네릭 → 정확한 메서드 선택 어려움 발생 가능  
오버로딩 (Overloading)
정의:
  • 같은 이름의 메서드를 매개변수의 타입과 개수에 따라 여러 개 정의하는 기법
동작 원리:
  • 컴파일 시점에 어떤 메서드가 호출될지 결정됨 (정적 바인딩)
호출 우선순위:
  1. 정확히 일치하는 타입 (print(Integer))
  2. 더 넓은 범위의 타입 (print(Number))
  3. 가장 일반적인 타입 (print(Object))
제네릭 (Generic)
정의:
  • 클래스나 메서드에서 사용하는 데이터 타입을 매개변수처럼 다루는 기법
  • 타입 안정성과 코드 재사용성 향상을 위해 사용
동작 원리:
  • 컴파일 타임에는 T의 타입을 추론하여 타입 안전성을 확보
  • 런타임에는 TObject로 치환됨 → 이를 타입 소거(Type Erasure)라고 함

Python

24년 3회

데이터 슬라이싱, 음수 인덱싱

def test(lst):
    for i in range(len(lst) // 2):
        lst[i], lst[-i-1] = lst[-i-1], lst[i]
ls = [1,2,3,4,5,6]
test(ls)
print(sum(ls[::2]) - sum(ls[1::2]))
리스트 슬라이싱
lst = [10, 20, 30, 40, 50]
lst[::2]  # → [10, 30, 50] (짝수 인덱스)
lst[1::2] # → [20, 40]     (홀수 인덱스)
  • 문법
  • lst[start:stop:step]
리스트 뒤집기
  • -i-1끝에서 i번째 원소를 의미
  • range(len(lst) // 2)만큼만 반복해서 양 끝끼리 바꿈
  • str[::-1] 또는 lst[::-1] 은 리스트 전체를 한 줄로 뒤집는 표현
  • lst[i], lst[-i-1] = lst[-i-1], lst[i]
리스트의 합
  • 슬라이싱과 조합해서 특정 인덱스의 합을 구할 수 있음
  • sum([1, 2, 3]) # → 6
range 함수와 반복문
  • 리스트의 절반 길이만큼 반복
  • 리스트 양쪽 끝에서 인덱스를 계산할 때 -i-1 패턴 기억
  • for i in range(len(lst) // 2): ...

SQL

없음


개념

24년 3회

LRU 페이지 교체 알고리즘

LRU 페이지 교체 알고리즘에 따른 페이지 부재 횟수를 작성하시오. (프레임 3칸)
[7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1]
페이지 교체 알고리즘

페이지 부재(Page Fault)가 발생했을 때,
메모리에 있는 페이지 중 어떤 것을 제거할지를 결정하는 방식입니다.

  • 가상 메모리 시스템에서 프레임(Frame)이 가득 찼을 때 사용
  • 페이지 부재가 많을수록 성능 저하 → 효율적인 교체가 중요
LRU (Least Recently Used) 알고리즘

가장 오래 전에 사용된 페이지를 교체하는 알고리즘

특징 설명
기본 원리 최근에 사용되지 않은 페이지일수록 앞으로도 사용되지 않을 가능성 ↑
구현 방식 스택, 연결 리스트, 시간 기록 등으로 구현 가능
장점 실제 사용 패턴에 가까워 효율이 높음
단점 구현이 복잡하고 비용이 큼 (시간/공간 오버헤드 발생)
다른 페이지 교체 알고리즘
알고리즘 설명 특징
FIFO (First-In First-Out) 가장 먼저 들어온 페이지 제거 단순하지만 성능 낮음
OPT (Optimal) 앞으로 가장 오랫동안 사용되지 않을 페이지 제거 이론적으로 최적이지만 현실적 구현 불가
LFU (Least Frequently Used) 가장 사용 빈도가 낮은 페이지 제거 LRU와 유사하나, 빈도 기반
Clock (Second Chance) FIFO 변형, 페이지에 사용 비트 제공 효율성과 성능의 균형
요약
  • LRU = "가장 오래 전에 사용된 페이지 제거"
  • FIFO = "먼저 들어온 순으로 제거 (단순)"
  • OPT = "이론상 최적, 현실 불가능"
  • 페이지 부재 수 계산 문제프레임 수 주어짐 + 참조 문자열 분석 필수
  • 최근 기출: "LRU로 처리할 때 페이지 부재 횟수는?"

스머핑

ICMP, 송신 주소를 공격 대상의 IP 주소로 위장하고, 수신 주소를 해당 네트워크 라우터의 브로드캐스트 주소로 설정하는 공격으로 과부화 시키는 기법은? ICMP 패킷을 크게 만들어서 과부화 시키는 죽음의 핑과 같은 서비스 공격 유형이다.
스머핑
  1. 공격자는 공격 대상의 IP 주소로 ICMP Echo Request(핑 요청) 패킷을 보냅니다.
  2. 이 패킷의 수신 주소는 브로드캐스트 주소로 설정됩니다. 즉, 네트워크에 연결된 모든 기기들이 이 패킷을 받게 됩니다.
  3. 브로드캐스트 주소로 보내진 패킷은 네트워크의 모든 장비들이 응답을 하게 되어, 대상 IP 주소로 많은 양의 ICMP Echo Reply(응답) 패킷을 보내게 됩니다.
  4. 이로 인해 공격 대상 시스템은 과부하 상태에 빠지고, 네트워크 트래픽이 폭주하여 서비스 거부(DoS) 상태가 발생합니다.
주요 특징
  • ICMP Echo RequestEcho Reply를 사용하여 대상 시스템을 과부화시키는 공격입니다.
  • 송신 주소를 위장하여 실제 공격자는 감추어지고, 공격은 브로드캐스트를 통해 발생한 패킷을 사용하여 네트워크를 악용합니다.
  • 공격자는 비교적 간단한 방법으로 시스템에 대규모 트래픽을 유발할 수 있어, 서비스가 마비되거나 네트워크 자원을 고갈시키는 데 효과적입니다.
요약
  • Smurfing 공격ICMP를 이용하여 브로드캐스트 주소로 보내는 트래픽을 통해 서비스 거부 공격(DoS)을 수행하는 기법입니다.
  • 죽음의 핑(DoS)처럼 네트워크를 과부화시키는 공격 방식입니다.
관련 공격 유형
공격 이름 설명
스머프 공격 브로드캐스트 + ICMP Echo Request로 과부하
핑 오브 데스(Ping of Death) ICMP 패킷을 비정상적으로 크게 만들어 과부하 발생
Fraggle 공격 스머프 공격과 유사하지만, UDP 프로토콜 사용
요약
  • 스머프 : Echo Request + 브로드캐스트 + IP 스푸핑
    • 키워드: ICMP, 브로드캐스트, 송신지 위조, 서비스 거부
  • 핑 오브 데스 → 과도한 크기의 ICMP 패킷

VPN

인터넷을 통해 장치 간 사설 네트워크 연결을 생성하는 서비스로  장치의 실제 IP 주소를 가상 IP 주소로 대체하고, 데이터를 암호화하고, 데이터를 전 세계 보안 네트워크로 라우팅함으로써 정보를 보호하는 기법
개념 정리
항목 설명
정의 공용 인터넷을 통해 암호화된 사설 네트워크 통신을 가능하게 하는 기술
기능 - 장치 간 가상 연결 생성 - 실제 IP → 가상 IP로 대체 - 데이터 암호화 - 전 세계 네트워크를 통한 보안 라우팅
목적 정보 보안 강화, 프라이버시 보호, 원격지 접속
사용 예시 재택근무, 해외에서 내국 사이트 접속, 공공 와이파이에서 안전한 통신 등
VPN의 핵심 구성 요소
구성 요소 설명
터널링(Tunneling) 데이터를 캡슐화하여 안전하게 전송하는 기술
암호화(Encryption) 전송되는 데이터를 해커가 해독하지 못하도록 암호화
가상 IP 실제 IP 대신 VPN 서버의 IP를 사용해 위치, 정보 숨김
인증(Authentication) 접속 사용자 인증 절차 수행
VPN 관련 기술 예시
프로토콜 설명
IPSec 네트워크 계층 보안 제공 (AH, ESP)
L2TP 계층 2 터널링 프로토콜, IPSec과 함께 사용
SSL VPN 웹 브라우저 기반으로 동작, HTTPS 기반
OpenVPN 오픈소스 기반, 높은 유연성과 보안성 제공
요약
  • VPN = 공용망에서 사설망처럼 안전하게 통신
  • IP 주소 숨김 + 데이터 암호화 + 터널링
  • 프로토콜로는 IPSec, SSL, L2TP, PPTP 등이 있음

디자인 패턴

(         ) 패턴은 객체 간의 상호 작용하는 방법과 책임을 분배하는 방법 에 중점을 두는 디자인 패턴으로 Command, Interpreter, Memento, Observer, Visitor등이 존재한다.
디자인 패턴 개념
  • 반복적으로 발생하는 문제에 대한 검증된 설계 해결책(설계 템플릿)
  • 소프트웨어를 설계할 때 자주 발생하는 문제를 효율적이고 재사용 가능한 방식으로 해결할 수 있도록 정형화한 설계 방식
디자인 패턴 분류
분류 설명 예시
생성(Creational) 패턴 객체 생성 방식에 관련된 패턴 싱글톤, 팩토리 메서드
구조(Structural) 패턴 클래스나 객체의 조합 방식에 관련 어댑터, 데코레이터, 프록시
행위(Behavioral) 패턴 객체나 클래스 간의 행동/책임 분배에 초점 템플릿 메서드, 옵서버, 전략 패턴 등
디자인 패턴 비교표 (요약 정리)
패턴명 분류 목적 주요 키워드 예시
싱글톤 (Singleton) 생성 인스턴스 1개만 생성 전역 인스턴스, static 설정관리, 로그 시스템
팩토리 메서드 (Factory Method) 생성 객체 생성을 서브 클래스에 위임 생성 캡슐화 GUI 버튼, 게임 몬스터
템플릿 메서드 (Template Method) 행위 알고리즘 틀 제공, 세부는 자식 클래스가 구현 공통 로직, 오버라이딩 게임 루프, 요리 레시피
옵서버 (Observer) 행위 상태 변화 시 자동 알림 구독, 이벤트 뉴스 구독, 유튜브 알림
전략 (Strategy) 행위 알고리즘을 런타임에 교체 유연한 교체 정렬 알고리즘, 게임 전략
어댑터 (Adapter) 구조 호환되지 않는 인터페이스 연결 변환기 역할 핀 어댑터, 레거시 시스템
이터레이터 (Iterator) 행위 컬렉션의 요소를 순차적으로 접근 hasNext(), next() 리스트 순회, 반복문
요약
패턴 암기 포인트
싱글톤 "전역 단 하나의 객체"
템플릿 메서드 "틀은 부모, 내용은 자식"
팩토리 "new 대신 공장에게 맡겨라"
옵서버 "구독자에게 자동 알림"
전략 "전략을 바꿔 끼우듯 교체"
어댑터 "안 맞는 인터페이스 연결해줌"
이터레이터 "컬렉션 순회 전담자" (next(), hasNext())

커버리지

1. 코드 내의  분기점이 true 또는 false 평가될 때마다 해당 분기점이 모두 테스트 되는 것을 목표로 한다.   분기점이 모든 가능한 경로로 실행되었는지 확인하는  사용되는 커버리지

2. 코드의 흐름을 여러 갈래로 나누는 조건문 또는 선택문을 의미한다. 예를 들어, if-else 문이나 switch 문에서 조건에 따라 실행 경로가 달라질 때를 의미한다.

3. 개별 조건문 내에 있는 각각의 조건이 true false 모두를 만족하도록 테스트하는 것을 의미한다. 예를 들어, if (A && B)와 같은 구문에서 A와 B가 각각 true false 되는 경우를 테스트하는 것이 목표이다.

(보기)
 조건/결정 커버리지
 결정 커버리지
 조건 커버리지
 분기 커버리지
 변경 조건/결정 커버리지
 문장 커버리지
 다중 조건 커버리지
커버리지
  • 소프트웨어 테스트가 얼마나 철저하게 수행되었는지를 나타내는 지표
  • 즉, 테스트가 소스코드의 어느 정도를 실행시켰는지를 백분율로 표현하는 방식입니다.
커버리지의 목적
  • 테스트 누락 방지
  • 결함 가능성이 높은 부분 식별
  • 테스트의 완전성(철저함)을 측정
  • 품질 보증과 신뢰성 확보
주요 커버리지 종류
커버리지 종류 설명 예시
문장 커버리지 (Statement Coverage) 모든 문장(구문)이 최소 1회 실행되었는지를 확인 if, for, while, return
분기 커버리지 (Branch Coverage) 모든 조건 분기(참/거짓)이 실행되었는지 확인 if문에서 true/false 모두 검사
조건 커버리지 (Condition Coverage) 복합 조건문의 각 조건식의 참/거짓 조합을 테스트 if (A && B)에서 A, B 각각에 대해 테스트
경로 커버리지 (Path Coverage) 가능한 모든 실행 경로를 테스트 루프, 조건, 분기 포함 전체 경로
함수 커버리지 (Function Coverage) 모든 함수가 호출되었는지 확인 모든 함수에 대해 최소 1회 실행
문장 커버리지 (Statement Coverage):
  • 코드 내의 각 문장이 적어도 한 번 실행되도록 테스트하는 커버리지입니다. 즉, 각 분기점이 true 또는 false로 평가될 때마다 해당 문장이 실행되는지 확인하는 것입니다.
분기 커버리지 (Branch Coverage):
  • 코드 내의 각 분기점true 또는 false로 평가되는 경로가 모두 실행되도록 테스트하는 커버리지입니다.
  • 이 커버리지는 if문, switch문 등에서 각 분기점이 모든 가능한 경로로 테스트되었는지를 목표로 합니다.
조건 커버리지 (Condition Coverage):
  • 조건문 내에서 각각의 개별 조건truefalse를 모두 만족하도록 테스트하는 커버리지입니다.
  • 예를 들어, if (A && B)처럼 복합 조건에서 A와 B가 각각 true와 false를 만족하는 경우를 모두 테스트하는 것이 목표입니다.
조건/분기 커버리지 (Condition/Branch Coverage)
  • 조건/분기 커버리지는 조건 커버리지와 분기 커버리지를 결합한 커버리지입니다.
  • 이는 조건문 내의 모든 조건이 true/false 값으로 모두 평가되고, 각 분기점이 모두 실행되는지를 테스트합니다.
경로 커버리지 (Path Coverage)
  • 경로 커버리지는 프로그램 내의 모든 가능한 경로가 테스트되도록 하는 커버리지입니다.
  • 이는 프로그램 흐름 내에서 가능한 모든 경로가 적어도 한 번 실행되도록 테스트하는 것을 의미합니다.

슈퍼키, 외래키, 대체키, 후보키

1. 참조하는 테이블의 기본 키(Primary Key)를 가리키며, 데이터 무결성을 유지하는 데 중요한 역할을 한다.

2.  유일성과 최소성을 모두 갖춘 키이다.

3. 후보키 중에서 기본 키로 선택되지 않은 나머지 키이다.

4. 유일성을 만족시키지만, 최소성은 만족시키지 않는다.


(보기)
㉠ 슈퍼키
㉡ 외래키
㉢ 대체키
㉣ 후보키

개체무결성

(         ) 무결성은 데이터베이스의 테이블에서 기본 키(Primary Key) 값을 반드시 유일하고 NULL이 아니게 유지해야 한다는 규칙을 의미한다.
릴레이션 관련 용어 정리
용어 영어
릴레이션 Relation 테이블 (행과 열로 구성된 데이터 집합)
튜플 Tuple 행(Row), 릴레이션의 한 레코드
속성 Attribute 열(Column), 튜플의 한 항목
도메인 Domain 속성이 가질 수 있는 값의 범위
카디널리티 Cardinality 릴레이션에 존재하는 튜플(행)의 수
디그리 Degree 릴레이션에 존재하는 속성(열)의 수
릴레이션 스키마 Relation Schema 릴레이션의 구조를 정의하는 틀 (속성 이름과 도메인 등 포함)
릴레이션 인스턴스 Relation Instance 특정 시점에 릴레이션에 저장된 실제 데이터의 집합
슈퍼 키 Super Key 튜플을 유일하게 식별할 수 있는 속성들의 집합
후보 키 Candidate Key 최소 조건의 슈퍼 키, 중복되지 않고 최소한의 속성 집합
기본 키 Primary Key 후보 키 중 기본 식별자로 선택된 키, NULL 불가, 중복 불가
대체 키 Alternate Key 후보 키 중에서 기본 키로 선택되지 않은 키
외래 키 Foreign Key 다른 릴레이션의 기본 키를 참조하는 속성(열)
무결성 제약조건 Integrity Constraint 데이터의 정확성, 일관성을 보장하기 위한 규칙
무결성 제약조건 정리 표
무결성 제약조건 영어 이름 설명
개체 무결성 Entity Integrity 기본 키(Primary Key)는 NULL이 될 수 없고, 중복될 수 없음
참조 무결성 Referential Integrity 외래 키(Foreign Key)는 참조하는 릴레이션의 기본 키 값이어야 함 (또는 NULL 허용 시, 해당 기본 키와 관계가 없어도 됨)
도메인 무결성 Domain Integrity 속성의 값은 정의된 도메인(값의 범위)을 벗어나면 안 됨
사용자 정의 무결성 User-Defined Integrity 사용자가 정의한 업무 규칙에 따른 조건 (예: 나이는 0 이상)

URL의 구조

추가적인 질의를 제공하는 부분으로, 웹 서버에 전달할 추가 데이터를 나타낸다.(      )

자원 경로를 나타내며, 서버 상에서 해당 리소스의 위치를 지정한다. (      )

웹 프로토콜을 정의하는 부분으로, 예를 들어 HTTP, FTP 등의 방식을 나타낸다. (      )

호스트와 포트 번호를 나타내는 부분으로, 서버 주소와 함께 포트번호를 나타낸다. (      )

특정 페이지 내의 위치를 가리키며, 문서 내 특정 섹션으로 이동하는 데 사용된다. (      )

(보기)
1 scheme
2 authority
3 path
4 query
5 fragment
url의 구조
  • [스키마]://[호스트명]/[경로]?[쿼리]#[프래그먼트]
1. 스키마(Schema)
  • 스키마는 URL이 어떤 프로토콜을 사용하는지 정의합니다.
  • 보통 HTTPHTTPS 같은 프로토콜이 많이 사용됩니다. 이 부분은 웹 페이지를 가져오는 방법을 지정합니다.
  • 예시: https://HTTPS 프로토콜을 사용하여 안전한 연결을 의미합니다.
  • 예시: ftp://FTP 프로토콜을 사용해 파일을 전송하는 주소입니다.
2. 호스트명(Host)
  • 호스트명은 웹사이트가 존재하는 서버의 주소를 의미합니다.
  • 보통 도메인 이름을 사용하며, 서버의 IP 주소가 될 수도 있습니다. 도메인 이름은 사용자가 쉽게 이해할 수 있도록 기억할 수 있는 이름입니다.
  • 예시: www.example.com 또는 example.com이 호스트명입니다.
  • Authority: 전체적으로, 호스트명포트(및 필요 시 인증 정보)를 포함하는 URL의 부분입니다.
  • authority는 이 호스트명뿐만 아니라 포트 번호, 인증 정보를 포함할 수 있는 URL의 더 넓은 개념입니다.
3. 경로(Path)
  • 경로는 웹 서버에서 요청한 자원의 위치를 정의합니다.
  • 예를 들어, 웹사이트의 특정 페이지나 파일을 나타냅니다. 이것은 서버의 폴더 구조와 비슷한 역할을 합니다.
  • 예시: /products, /images/photo.jpg는 웹 서버에서 특정 파일이나 페이지를 찾을 수 있도록 도와주는 경로입니다.
4. 쿼리(Query)
  • 쿼리는 URL 뒤에 ?로 시작하며, 서버에 전달할 추가적인 정보를 담고 있습니다.
  • 보통 키=값 형태로 데이터가 포함됩니다. 이 부분은 웹 애플리케이션에서 동적 데이터를 전달하는 데 사용됩니다.
  • 예시: ?search=phone&category=electronics는 검색 키워드와 카테고리 정보를 서버로 전달합니다.
5. 프래그먼트(Fragment)
  • 프래그먼트는 URL의 끝에 #으로 시작하는 부분으로, 페이지 내에서 특정 위치로 스크롤을 이동할 때 사용됩니다.
  • 서버에는 전달되지 않으며, 클라이언트(브라우저)에서만 사용됩니다.
  • 예시: #section1은 페이지 내에서 section1이라는 ID를 가진 요소로 이동하는 것을 의미합니다.

Ad-hoc Network (애드혹 네트워크)

중앙 집중식 인프라 없이, 즉 사전 설정된 네트워크 기반 시설이 없이 구성된 자율형 네트워크를 의미합니다. 이러한 네트워크는 노드(주로 무선 장치)가 서로 직접 연결하여 통신하며, 군사 작전 중에 실시간으로 정보를 공유하기 위한 네트워크로 사용된다.
개념 정리
항목 설명
정의 고정된 인프라 없이 노드들이 자율적으로 구성하는 네트워크
구성 방식 노드들이 직접 연결되어 통신 (peer-to-peer 형태)
특징 중앙 제어 없음, 동적으로 구성, 유연하고 빠름
사용 사례 군사 통신, 재난 구조 현장, 이동형 네트워크, 센서 네트워크 등
예시 군대 내 전장 네트워크, 재난 구조 중 소방 장비 간 통신 등
시험 포인트 요약
  • Ad-hoc Network = 중앙 장비 없이 자율적으로 구성
  • MANET, VANET 등은 Ad-hoc의 특수 형태
  • Mesh 구조P2P 통신, 센서 네트워크와 연결해서 출제될 수 있음
  • 군사/재난 상황, 임시 네트워크, 실시간 통신 등의 키워드가 나올 경우 → Ad-hoc 관련 가능성 높음
추가로 나올 수 있는 관련 용어
용어 설명
MANET (Mobile Ad-hoc Network) 이동성이 있는 노드들로 구성된 애드혹 네트워크
VANET (Vehicular Ad-hoc Network) 차량 간 통신을 위한 애드혹 네트워크
센서 네트워크 (Wireless Sensor Network, WSN) 센서 노드들로 구성된 자율적 무선 네트워크
메시 네트워크 (Mesh Network) 각 노드가 다수의 노드와 연결되어 다중 경로 제공
P2P (Peer-to-Peer) 중앙 서버 없이 노드끼리 직접 통신
라우팅 프로토콜 (Ad-hoc Routing Protocols) AODV, DSR, OLSR 등 – 경로를 동적으로 찾기 위한 프로토콜