ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [정보처리기사 실기] 과목6 - 프로그래밍 언어 활용, 오답노트
    CS/정보처리기사 2023. 7. 15. 00:04
    반응형

     

    Chapter ① 기본 문법 활용하기

     

    • 거품 정렬 C언어 코드
    #include <stdio.h>
    
    void main() {
    	int i, j; // 이중 for문을 위한 변수 i, j
        int temp; // 임시 저장 변수
        int a[5] = {75, 95, 85, 100, 50}; // 정렬되지 않은 배열
        
        for(i=0; i<4; i++) { // (요소의 개수 - 1) 만큼 반복
        	for(j=0; j<4-i; j++) { // (요소의 개수 - i) 만큼 반복
            	if(a[j] > a[j + 1]) { // 현재 요소의 값과 다음 요소의 값을 비교하여 큰 값을 다음 요소로 보냄
                	temp = a[j];
                    a[j] = j[j+1];
                    a[j+1] = temp;
                }
            }
        } 
        
        for(i=0; i<5; i++) {
        	printf("%d ", a[i]); // 0번째에서 4번째 값을 출력: 50 75 85 95 100
        } 
    }

     


     

    • Switch case문의 break가 없는 자바 코드
    public class Soojebi {
    	public static void main(String[] args) {
        	int i = 3;
            int k = 1;
            
            switch(i){ // i가 3이므로 case 3으로 이동
            	case 0:
                case 1:
                case 2:
                case 3: k = 0; // case 3에서 k = 0을 실행
                case 4: k += 3; // break가 없으므로 k += 3 실행(k는 3)
                case 5: k-= 10; // break가 없으므로 k -= 10 실행(k는 -7)
                default: k--; // break가 없으므로 k-- 실행(k는 -8)
            }
            
            System.out.print(k); // k가 저장하고 있는 값인 -8을 출력
        }
    }

     


     

    • 세트 파이썬 코드

            세트는 집합이므로 출력 순서가 상관없다.

    a = {'일본', '중국', '한국'} # a라는 세트형 변수에 '일본', '중국', '한국'을 초기화
    a.add('베트남') # '베트남'이라는 값을 추가
    a.add('중국') # '중국'이라는 값을 추가하는데 이미 '중국'이 존재하므로 무시
    a.remove('일본') # '일본'이라는 값을 제거
    a.update({'홍콩', '한국', '태국'}) # update를 통해 '홍콩', '한국', '태국'을 추가하는데, '한국'은 이미 있으므로 '홍콩', '태국'이 추가됨
    print(a) # 세트 값을 출력 : 홍콩 태국 한국 중국 베트남

     


     

    • 식별자 표기법

    ▼ 변수 설정 기법

    표기법 설명
    카멜 표기법
    (Camel Case)
    - 식별자 표기 시에 여러 단어가 이어지면 첫 단어 시작만 소문자로 표시하고, 각 단어의 첫 글자는 대문자로 지정하는 표기법
      예) inputFunction
    파스칼 표기법
    (Pascal Case)
    - 식별자 표기 시에 여러 단어가 이어지면 각 단어의 첫 글자는 대문자로 지정하는 표기법
      예) InputFunction
    스네이크 표기법
    (Snake Case)
    - 식별자 표기 시에 여러 단어가 이어지면 단어 사이에 언더바를 넣는 표기법
      예) input_function
    헝가리안 표기법
    (Hungarian Case)
    - 식별자 표기 시 두어에 자료형을 붙이는 표기법
    - 식별자 표기 시에 int형일 경우 n, char형일 경우 c, 문자열일 경우 sz를 붙임
      예) nScore → 정수형

     


     

    • 반복문 자바 코드
    public class Soojebi{
    	public static void main(String[] args) {
        	int i=0;
            int sum=0;
            
            while(i<10) { 
            	i++; // 처음에 i가 0인 상태에서 i++을 만나게 되면 i가 1이 되고, 
                if(i%2==1) // i%2==1은 참이 되어
                	continue; // continue를 실행한다
                sum += i; // i가 1인 상태에서 i++을 만나게 되면 i는 2가 되고, i%2==1은 거짓이 되어 sum += i를 실행하게 된다.
            } // 이런 패턴으로 i가 10이 될때까지 반복적으로 sum에 짝수들을 더한다.
            System.out.println(sum); // i가 2,4,6,8,10일 때 더해진 30이 출력된다.
        }
    }

     


     

    • C++에서 생성자
    • 생성자는 일반적으로 클래스의 멤버 변수를 초기화하거나 클래스를 사용하는 데 필요한 설정이 필요한 경우 사용한다.
    • C++, 자바에서는 클래스 명과 동일한 메서드명을 가지고, 반환 값이 없다.

     


     

    • 10진수를 2진수로 변환하는 자바 코드
    class Soojebi {
    	public static void main (String[] args) {
        	// 십진수 n을 a의 배열을 이용해 2진수 값으로 저장한 후 출력하는 프로그램이다.
        	int[]a = new int[8];
            int i=0;
            int n=10;
            
            while( ① ) { // a[i++] 을 보면 while문이 a의 갯수인 8번 이내로 반복해야 한다. 그렇기 위해서는 i<8 또는 i<=7로 동작시키면 된다.
            	a[i++] = ②; // while문 안에서는 a[i]에는 0과 1의 값만을 넣어야 한다.(a는 2진수 값을 저장하기 때문에 0과 1만 넣어야 함)
                n /= 2; // n을 2로 나눴을 때 나머지가 이진수 변환하는데 필요로 하는 값이므로 ②에는 n%2을 넣거나 비트 연산자를 사용한 n&1을 넣으면 된다.
            }
            
            for(i=7; i>=0; i--) { // a[7] 번지부터 a[0] 번지 순으로 출력하기 때문에 a[0] 번지가 1의 자리가 된다.
            	System.out.print(a[i]);
            }
        }
    }

     


     

    • 리스트 파이썬 코드
    lol=[[1, 2, 3], [4, 5], [6, 7, 8, 9]]
    print(lol[0]) # lol[0]이라고 하면 첫 번째 행이 모두 출력된다: [1, 2, 3]
    print(lol[2][1]) # lol[2][1]은 세 번째 행의 두 번째 요소가 출력된다: 7
    for sub in lol: # 이중 for문인데, lol에서 행의 갯수만큼 반복한다.
    	for item in sub: # 안쪽 for문은 sub 안에 있는 요소만큼 반복한다.
        	print(item, end='') # sub 안의 요소들이 item이고, 안쪽 반복문이 반복될 때마다 하나씩 출력한다: 123 \n 45 \n 6789)
        print() # 행에 있는 값들을 다 출력하고 한 줄 개행한다.

     


     

    • 포인터 C언어 코드
    #include <stdio.h>
    void main() {
    	char *p = "KOREA"; // p라는 포인터에 KOREA라는 저장공간이 할당된 곳을 가리키게 된다. (문자열은 마지막에 NULL이라는 값이 자동으로 생성됨)
        printf("%s\n", p); // 포맷 스트링이 %s로 되어 있어 p주소부터 NULL을 만날 때까지 문자열 값을 읽어 출력한다.: KOREA
        printf("%s\n", p+3); // 포맷 스트링이 %s로 되어 있어 p+3라고 지정하면 p+3부터 NULL을 만날 때까지 문자열 값을 읽어 출력한다.: EA
        printf("%c\n", *p); // 포맷 스트링이 %c로 되어 있어 p가 가리키는 (*p)의 문자 값을 읽어 출력한다.: K
        printf("%c\n", *(p+3)); // 포맷 스트링이 %c로 되어 있어 (p+3)가 가리키는 *(p+3)의 문자 값을 읽어 출력한다.: E
        printf("%c\n", *p+2); // 포맷 스트링이 %c로 되어 있어 p가 가리키는 (*p)의 값인 K에 +2를 했으므로 다다음 문자를 출력한다.: R
    }

     


     

    • 오버라이딩 자바 코드
    class Parent {
    	public int compute(int num) {
        	if(num <= 1) return num;
            return compute(num-1)+compute(num-2);
        }
    }
    
    class Child extends Parent {
    	public int compute(int num) {
        	if(num <= 1) return num;
            return compute(num-1)+compute(num-3); // num
        }
    }
    // num이 4일 때 if문이 거짓이므로 compute(3) + compute(1)을 반환한다.
    // num이 3일 때 if문이 거짓이므로 compute(2) + compute(0)을 반환한다.
    // num이 2일 때 if문이 거짓이므로 compute(1) + compute(-1)을 반환한다.
    // num이 1일 때 if문이 참이므로 1을 반환하고, num이 -1일 때 if문이 참이되어 -1을 반환하므로 1+(-1)은 0이 된다.
    // compute(3)은 compute(2) + compute(0)이었는데, compute(2)는 0이고, compute(0)도 0이므로 0이 된다.
    // compute(4)는 compute(3) + compute(1)이었는데, compute(3)은 0이고, compute(1)은 1이므로 최종 출력값은 1이 된다.
    
    class Soojebi{
    	public static void main(String[] args) {
        	Parent obj = new Child(); // obj는 Child 인스턴스를 가지고 있다.
            System.out.print(obj.compute(4)); // Child에 있는 compute 함수가 실행된다.(오버라이딩)
        }
    }

     


     

    • 리스트 파이썬 코드
    class Soojebi: # Soojebi 클래스를 선언하고 리스트 li를 초기화한다.
    	li = ["Seoul", "Kyeonggi", "Inchon", "Daejeon", "Daegu", "Pusan"]
        
    s = Soojebi() # Soojebi() 클래스 객체 s를 생성한다.
    str01 = '' # str01은 ''로 초기화한다.
    for i in s.li: # s.li만큼 반복한다.
    	str01 = str01 + i[0] # str01에 i[0](리스트의 맨 앞글자)를 계속 더한다.
        
    print(str01) # 출력결과: SKIDDP

     


     

    • 구조체 포인터 C언어 코드
    #include <stdio.h>
    struct Soojebi { // 크기가 10인 char 타입의 name 필드와 정수형 변수 age를 가지는 Soojebi라는 구조체를 선언한다.
    	char name[10];
        int age;
    };
    
    void main() {
    	struct Soojebi s[] = {"Kim", 28, "Lee", 38, "Seo", 50, "Park", 35}; // Soojebi형 구조체 배열 s를 선언하고 필드를 초기화한다.
        struct Soojebi *p; // 구조체 포인터 타입의 변수 p를 선언한다.
        p = s; // p에 s의 주솟값을 대입한다. 배열의 경우 배열명은 주솟값을 의미한다.
        p++; // 포인터 값을 1 증가시킨다.
        printf("%s\n", p->name); // 출력결과: Lee
        printf("%d\n", p->age); // 출력결과: 38
        // p의 1 증가로 s[1] 번째에 있는 name과 age를 출력한다.
    }

     


     

    • 시프트 연산자 파이썬 코드
    a=100
    i=0
    result=0
    for i in range(1, 3): # i가 1부터 2까지 동작
    	result = a >> i # i가 1일 때 a >> i는 100 >> 1이므로 result 에는 50이 저장됨(2진수 비트로 오른쪽 한번 이동때마다 2로 나누기, 반대는 2로 곱하기)
        				# i가 2일 때 a >> i는 100 >> 2이므로 result 에는 25가 저장됨
        result += 1 # result 값에 1을 증가시키므로 26이 됨
        
    print(result) # 결과값 출력: 26

     


     

    • static 메서드 자바 코드

    .       객체 생성 없이 메서드를 사용하기 위해서는 static이라는 키워드를 사용하여 메서드를 선언한다.

    public class Soojebi {
    	public static void main(String[] args) {
        	System.out.print(Soojebi.check(1));
        }
        
        _______ String check(int num) { // 정답: static
        	return (num >= 0) ? "positive" : "negative";
        }
    }
    
    // 출력값: positive

     


     

    • 비트 연산자 자바 코드

    ▼ 비트 연산자: 0과 1의 각 자리에 대한 연산을 수행하는 연산자

    연산자 내용
    & 두 값을 비트로 연산하여 같은 비트의 값이 모두 1이면 해당 비트 값이 1이 되고, 그렇지 않으며 0이 되는 연산자(AND 연산자)
    | 두 값을 비트로 연산하여 같은 비트의 값이 하나라도 1이면 해당 비트 값이 1이 되고, 그렇지 않으면 0이 되는 연산자(OR 연산자)
    ^ 두 값을 비트로 연산하여 같은 비트의 값이 서로 다르면 해당 비트 값이 1이 되고, 그렇지 않으면 0이 되는 연산자(XOR 연산자)
    ~ 모든 비트의 값을 반대로 바꾸는 반전 기능을 하는 연산자(NOT 연산자)

    ※ '=='는 두 값을 비교할 때 사용하는 연산자

     

    public class Soojebi {
    	public static void main(String[] args) {
        	int a = 3, b = 4, c = 3, d = 5;
            if((a == 2 | a == c) & !(c > d) & (1 == b ^ c != d)) { // 비트 연산 결과로 1이 되어 참이므로 실행한다.
            	a = b + c; // a는 7이 된다.
                if(7 == b ^ c != a) { // 비트 연산 결과로 1이 되어 참이므로 실행한다.
                	System.out.println(a); // a 값을 출력한다.: 7
                }
                else {
                	System.out.println(b);
                }
            }
            else {
            	a = c + d;
                if(7 == c & d != a) {
                	System.out.println(a);
                }
                else {
                	System.out.println(d);
                }
            }
        }
    }

     


     

    • 포인터 배열 C언어 코드
    #include <stdio.h>
    void main() {
    	int *arr[3]; // arr라는 포인터 배열 선언
        int a = 12, b = 24, c = 36;
        arr[0] = &a; // arr[0]에 a 변수의 주솟값을 저장
        arr[1] = &b; // arr[1]에 b 변수의 주솟값을 저장
        arr[2] = &c; // arr[2]에 c 변수의 주솟값을 저장
        
        printf("%d\n", *arr[1] + **arr + 1);
        // arr[1]에 b변수의 주솟값이 저장되어 있으므로 *arr[1]은 b변수의 값인 24가 되고,
        // **arr은 *arr[0]과 같으므로 a 변수의 값인 12가 되어 24+12+1을 더한 결과값이 출력
        // 출력값: 37
    }

        **arr은 *(*arr)과 같고, *arr은 arr[0]과 같으므로 **arr은 *arr[0]으로 바꿀 수 있다.

     


     

    • 구조체 포인터 C언어 코드
    #include <stdio.h>
    struct Soojebi {
    	char name[20];
        int os, db, hab1, hab2;
    };
    
    void main() {
    	struct Soojebi s[3] = {{"데이터1", 95, 88}, {"데이터2", 84, 91}, {"데이터3", 86, 75}}; // 크기가 3인 Soojebi 구조체 배열 변수 s를 선언하고 초기화 함
        struct Soojebi *p; // 구조체 포인터 변수 p를 선언함
        
        p = &s[0]; // s[0]의 주소를 가져오기 위해 '&'를 붙이고 p에 대입하여 주솟 값을 가리키게 함
        (p+1)->hab1 = (p+1)->os+(p+2)->db; // (p+1)->os 값 84와 (p+2)->db 값 75를 합한 159를 (p+1)->hab1 변수에 대입함
        (p+1)->hab2 = (p+1)->hab1 + p->os + p->db; // (p+1)->hab1 변숫값 159와 p->os 값은 95, p->db 값 88을 합한 값 342를 (p+1)->hab2에 대입함
        
        printf("%d\n", (p+1)->hab1 + (p+1)->hab2); // 위에서 구한 두 값을 합한 결과값을 출력함: 501
    }

     


     

    • break 없는 switch case문 C언어 코드
    #include <stdio.h>
    void main() {
    	int a = 5;
        int s = 0;
        
        switch(a/2) { // a가 5이므로 5/2=2.5이지만, C언어에서는 정수/정수는 정숫값이 나오므로 소수점은 버림 처리되어 2가 된다.
        	case 2: s++; // case 2로 들어가게 되어, s++가 실행되어, s는 1이 된다.
            case 3: a += s; // break가 없으므로 case 3이 실행된다. a는 6이 된다.
            default: a++; // a++이 실행되면서 a는 7이 된다.
        }
        
        printf("%d %d", s, a); // 출력결과: 1 7
    }

     


     

    • 복합 대입 연산 C언어 코드
    #include <stdio.h>
    void main() {
    	int a = 2;
        int b = 5;
        int c = 3;
        
        b /= a; // b = b/a;와 동일하며, 5를 2로 나누면 2.5이지만 정수와 정수를 연산ㄴ하면 정수이므로 소수점은 버림이 되어 b는 2가 됨
        c %= a; // c = c%a;와 동일하며, 3을 2로 나눴을 때 나머지는 1이 되므로 c는 1이 됨
        
        printf("%d %d", b, c); // 출력결과: 2 1
    }

     


     

    • break없는 switch case문 자바 코드
    public class Soojebi {
    	public static void main(String[] args) {
        	int k = 10;
            int a = 3;
            
            switch(k++) { // k=10이므로 case10으로 가고, ++에 의해 k 값이 11이 된다. 만약 ++k였다면 ++에 의해 값이 11이 된 후에 case11로 이동하게 된다.
            	case 10: a += 2; // a는 5가 된다.
                case 11: a *= k; // break가 없으므로 a+=k가 실행되어 k는 11이므로 a는 55가 된다.
                case 8: break; // break를 만나 탈출하게 된다.
                case 9: a %= 2;
            }
            System.out.println(a); // 55출력
            System.out.println(k); // 11출력
        }
    }

     


     

    • 논리 연산자 C언어 코드
    #include <stdio.h>
    void main() {
    	int i = 3, j = 4;
        
        printf("%d", 2 && 3); // 참이므로 1 출력, 개행문자 없음!
        printf("%d", i<2 || j<3); // 거짓이므로 0 출력
        // 출력값: 10
    }

     


     

    • 증감 연산자 자바 코드
    public class Soojebi {
    	public static void main(String[] args) {
        	int x = 5, y = 0, z = 0;
            y = x++; // x를 먼저 y에 대입한 후에 x가 1 증가됨(x=6, y=5, z=0)
            z = --x; // x를 1 감소시킨 후에 z에 대입(x=5, y=5, z=5)
            System.out.println(x + ", " + y + ", " + z); // 출력결과: 5, 5, 5
        }
    }

     


     

    • 생성자, 오버라이딩 자바 코드
    class A {
    	private String s;
        A() {}
        A(String s) {
        	this.s = s + "A";
        }
        public void fn(String s) {
        	System.out.println(this.s + s);
        }
    }
    
    class B extends A {
    	private String s;
        B(String s) {
        	this.s = s + "B"; // "Hello"와 "B"를 합쳐서 "HelloB"를 this.s에 저장한다.
        }
        public void fn(String s) {
        	System.out.println(this.s + s); // 클래스 변수 s에 저장된 "HelloB"와 매개변수로 받은 "Hi"를 합쳐서 출력한다.: HelloBHi
        }
    }
    
    public class Soojebi {
    	public static void main(String[] args) {
        	A a = new B("Hello"); // new B("Hello")라는 생성자에 String이 매개변수로 들어가 있으므로 B(String s)가 호출된다.
            a.fn("Hi"); // 오버라이딩된 B 클래스의 fn을 호출한다.
        }
    }

     


     

    • 재귀함수 C언어 코드
    #include <stdio.h>
    int fn(int n) {
    	if (n<=0)
        	return 1;
        else
        	printf("%d ", n);
            
        fn(n-1); // fn(5)가 실행되면 if문은 거짓이 되어, else문의 printf가 실행되며 5가 출력되고 fn(4)가 호출된다.
        		 // 재귀함수이므로 이런 패턴으로 1씩 작아지면 1이 출력되고 0이 실행됐을 때 1을 반환하고 함수가 끝난다.
    }
    
    int main() {
    	fn(5); // 출력결과: 5 4 3 2 1
        return 0;
    }

     


     

    • 배열 포인터 C언어 코드
    #include <stdio.h>
    int main(int argc, char *argv[]) {
    	int a[2][2] = {{11, 22}, {44, 55}}; // 2x2 크기의 정수형 배열 변수 a를 선언과 동시에 초기화
        int i, sum = 0; // i와 sum에 동시에 0을 대입함
        int *p;
        p = a[0]; // 정수형 포인터 변수 p에 배열 a[0]의 주솟값을 대입함
        for(i = 1; i < 4; i++) // i는 1부터 3까지 반복 수행함
        	sum += *(p+i); // *(p+1)는 22, *(p+2)는 44, *(p+3)는 55이며, 더한 값을 변수에 대입함
        printf("%d", sum); // 출력결과: 121
        return 0;
    }

     

     

    Chapter ② 언어 특성 활용하기

     

    • 명령형 언어 개념
    • 컴퓨터에 저장된 명령어들이 순차적으로 실행되는 프로그래밍 방식
    • 절차형 언어라고도 불림
    • 예) - FORTRAN, COBOL, PASCAL, C

     


     

    • 함수형 언어 개념
    • 수학적 수식과 같은 함수들로 프로그램을 구성하여 호출하는 방식
    • 예) - LISP

     


     

    • 모듈과 패키지
    구성 설명 예시
    모듈(Module) 전역변수, 함수 등을 모아둔 파일 import 모듈명
    패키지(Package) 모듈을 디렉터리 형식으로 구조화한 라이브러리 import 패키지명.모듈명

     


     

    • strcat 함수 C언어 코드
    #include <stdio.h>
    #include <string.h>
    void main() {
    	char str[50] = "nation";
        char *p2 = "alter";
        strcat(str, p2); // p2가 가리키고 있는 문자열을 str 변수에 이미 저장된 "nation" 뒤에 붙여 str에 저장
        printf("%s", str); // 출력결과: nationalter
    }

     

     

    Reference

     

    2022 수제비 정보처리기사 실기 (1권+2권 합본세트) - YES24

    NCS 기반으로 재구성한 합격비법서로 NCS 기반 반영 문제(예상문제, 단원종합문제, 모의고사, 2021년 기출문제)를 수골하였다. 2022년 합격을 위한 NCS 기반 모의고사, 궁극의 암기비법(두음 쌤)과 학

    www.yes24.com

     

     

     

    반응형
Designed by Tistory.