TIL

[TIL/정처기] 2025/03/27

22년 2회 기출 코드 정리 ✍️22-2-7-JAVA ⚙️보통 switch 문이 문제로 출제되면, break를 생략했을 때의 흐름(fall-through 현상)에 대해 묻는 경우가 많다. 코드 자체는 쉬우니 설명은 추가하지 않겠다. 출력 결과는 -8.22-2-8-C ⚙

2025년 3월 27일5min read

22년 2회 기출 코드 정리 ✍️

22-2-7-JAVA ⚙️

code
public class Test {
    public static void main(String[] args) {
        int i = 3, k = 1;
        switch(i){
            case 1: k++;
            case 2: k -= 3;
            case 3: k = 0;
            case 4: k +=3;
            case 5: k -= 10;
            default: k--;
        }
        System.out.print(k);
    }
}

보통 switch 문이 문제로 출제되면, break를 생략했을 때의 흐름(fall-through 현상)에 대해 묻는 경우가 많다. 코드 자체는 쉬우니 설명은 추가하지 않겠다. 출력 결과는 -8.

22-2-8-C ⚙️

code
#include <stdio.h>

struct A {
    int n;
    int g;
};

main(){
    struct A st[2];
    for(int i = 0; i < 2; i++){
        st[i].n = i;
        st[i].g = i + 1;
    }
    printf("%d", st[0].n + st[1].g);
}

struct A는 int n과 int g 두 멤버를 가진 구조체이다. 구조체 배열의 접근과 각 멤버의 값 활용에 관한 코드이다. 설명은 생략하고자 한다. 출력 결과는 2.

22-2-13-Python ⚙️

code
a = "REMEMBER NOVEMBER"
b = a[0:3] + a[12:16]
c = "R AND %s" % "STR"

print(b+c)

기출문제를 분석하다 보니 파이썬에서는 보통, 문자열 슬라이싱과 문자열 포맷팅의 활용에 관해 이해하고 있는지 묻는 경향이 있다. 설명은 생략한다. 출력 결과는 REMEMBER AND STR.

22-2-15-C ⚙️

code
#include <stdio.h>

int len(char* p);

int main(){
    char* p1 = "2022";
    char* p2 = "202207";
    int a = len(p1);
    int b = len(p2);
    printf("%d", a + b);
}

int len(char* p){
    int r = 0;
    while(*p != '\0'){
        p++;
        r++;
    }
    return r;
}

문자열의 길이를 구하는 함수를 직접 구현한 코드이고, 해당 함수와 포인터를 활용한 문자열 순회에 관한 이해를 묻고 있다. 출력 결과는 10.

22-2-16-C ⚙️

code
#include <stdio.h>

int main() {
    int a[4] = {0, 2, 4, 8};
    int b[3];
    int* p;
    int sum = 0;
    for(int i = 1; i < 4; i++){
        p = a + i;
        b[i - 1] = *p - a[i - 1];
        sum = sum + b[i - 1] + a[i];
    }
    printf("%d", sum);
}

포인터 연산에 관한 코드. 이런 종류의 코드는 어려운 것은 아닌데 변수가 많아서 실수하기 쉽다. i / p / b[i - 1] / sum와 같은 변수들의 변화를 꼼꼼히 기록하면 쉽게 풀어낼 수 있다. 출력 결과는 22.

22-2-17-JAVA ⚙️

code
public class Test {
    public static void main(String[] args) {
        cond obj = new cond(3);
        obj.a = 5;
        int b = obj.func();
        System.out.print(obj.a + b);
    }
}

class cond {
    int a;
    public cond(int a) {
        this.a = a;
    }
    public int func() {
        int b = 1;
        for(int i = 1; i < a; i++)
            b += a * i;
        return a + b;
    }
}

Java에서, 객체의 인스턴스 변수는 public으로 선언되었을 경우 외부에서도 접근 및 수정이 가능하다는 것이 핵심인 코드이다. 따라서 func()에서의 연산은 a는 5, b는 1임을 전제로 수행된다. 출력 결과는 61.

이론 문제 포인트 ✍️

1. 집합 연산자를 이용한 통합 질의 ✅

- 집합 연산자를 사용하여 2개 이상의 테이블의 데이터를 하나로 통합한다

code
SELECT 속성명1, 속성명2, ...
FROM 테이블명

UNION | UNION ALL | INTERSECT |EXCEPT

SELECT 속성명1, 속성명2, ...
FROM 테이블명

[ORDER BY 속성명 [ASC | DESC]];

- ``UNION``: 두 SELECT문의 조회 결과를 통합하여 모두 출력, 중복된 행은 한 번만 출력함(합집합)

- ``UNION ALL``: 두 SELECT문의 조회 결과를 통합하여 모두 출력, 중복된 행도 그대로 출력함(합집합)

- ``INTERSECT``: 두 SELECT문의 조회 결과 중 공통된 행만 출력(교집합)

- ``EXCEPT``: 첫 번째 SELECT문의 조회 결과에서 두 번째 SELECT문의 조회 결과를 제외한 행을 출력(차집합)

2. OUTER JOIN ✅

조인은 따로 묶어서 정리할 예정

3. 소프트웨어 개발 보안 요소 ✅

- ``기밀성(Confidentiality)``: 시스템 내의 정보와 자원은 인가된 사용자에게만 접근이 허용되고, 정보가 전송 중에 노출되더라도 데이터를 읽을 수 없음

- ``무결성(Integrity)``: 시스템 내의 정보는 오직 인가된 사용자만 수정할 수 있음

- ``가용성(Availability)``: 인가받은 사용자는 시스템 내의 정보와 자원을 언제라도 사용할 수 있음

=> 여기까지가 보안의 3대 요소

- ``인증(Authentication)``: 시스템 내의 정보와 자원을 사용하려는 사용자가 합법적인 사용자인지를 확인하는 모든 행위

- ``부인 방지(NonRepudiation)``: 데이터를 송신, 수신한 자가 해당 사실을 부인할 수 없도록 증거를 제공함

4. SQL 삽입 ✅

- SQL을 삽입하여 내부 데이터베이스 서버의 데이터를 유출 및 변조하고 관리자 인증을 우회하는 보안 약점, 동적 쿼리에 사용되는 입력 데이터에 예약어 및 특수문자가 입력되지 않게 필터링 되도록 설정하여 방지할 수 있음

5. 개인키 암호화 기법 ✅

- Private Key Encryption, 동일한 키로 데이터를 암호화하고 복호화하는 암호화 기법 - 대칭 암호 기법 또는 단일키 암호화 기법이라고도 함 - 암호화와 복호화 속도가 빠름 - 관리해야 할 키의 수가 많음 - 스트림 암호화 방식과 블록 암호화 방식이 있음

- ``스트림 암호화 방식``: 평문과 동일한 길이의 스트림을 생성하여 비트 단위로 암호화 하는 방식(LFSR / RC4 / TKIP)

- ``블록 암호화 방식``: 한 번에 하나의 데이터 블록을 암호화 하는 방식(DES, SEED, AES, ARIA, IDEA, Skipjack)

6. IDEA ✅

- IDEA(International Data Encryption Algorithm), 스위스의 라이(Lai)와 메시(Messey)가 1990년에 개발한 PES를 개선한 알고리즘

- 블록 길이는 64비트, 키 길이는 128비트

7. Skipjack ✅

- 국가 안전 보장국(NSA)에서 개발한 암호화 알고리즘 - 클리퍼 칩(Clipper Chip)이라는 IC 칩에 내장되어 있음 - 블록 길이는 64비트, 키 길이는 80비트 - 주로 음성 통신 장비에 삽입되어 음성 데이터를 암호화 함

8. DES ✅

- Data Encryption Standard, 1975년 미국 NBS에서 발표한 개인키 암호화 알고리즘 - 블록 길이는 64비트, 키 길이는 56비트, 16회의 라운드를 수행함 - DES를 세 번 적용하여 보안을 더욱 강화한 3DES(Triple DES)가 있음

9. AES ✅

- Advanced Encryption Standard, 2001년 미국 표준 기술 연구소(NIST)에서 발표한 개인키 암호화 알고리즘 - DES의 한계를 느낀 NIST에서 공모한 후 발표 - 블록 크기는 128비트, 키 길이에 따라 AES-128, AES-192, AES-256으로 분류됨

10. TKIP ✅

- Temporal Key Integrity Protocol, 기존의 무선 랜 보안 프로토콜인 WEP의 취약성을 보완한 데이터 보안 프로토콜 - 암호 알고리즘의 입력 키 길이를 128비트로 늘리고 패킷당 키 할당, 키값 재설정 등의 키 관리 방식을 개선