2021 정처기 3회 실기 알고리즘 및 총 풀이 해설(오답 위주)

낭만개발자·2021년 10월 17일
1
 class Connection {
     //static 변수라 메모리 값을 인스턴스 생성과 관계없이 공유한다.
    private static Connection _inst = null;
    private int count = 0;

    static public Connection get() {
        if(_inst == null) {
            System.out.println("_inst 변수 null -> Connection 인스턴스 생성");
        _inst = new Connection();
        return _inst; 
        }
        System.out.println("_inst 변수 not null -> return, that means 인스턴스 변수 _inst를 공유함");
        return _inst;
    }
    public void count() { count ++; System.out.println("count값 : " + count);}
    public int getCount() { return count; }
}

class Main {
    public static void main(String[] args) {
        System.out.println("Connection.get 호출 -> conn1 인스턴스 변수 생성");
        Connection conn1 = Connection.get();
        conn1.count();
        System.out.println("Connection.get 호출 -> conn2 인스턴스 변수 생성");
        Connection conn2 = Connection.get();
        conn2.count();
        System.out.println("Connection.get 호출 -> conn3 인스턴스 변수 생성");
        Connection conn3 = Connection.get();
        conn3.count();
        System.out.print("최종 count값 : " + conn1.getCount());
  }
}

문제 : 마지막 행 conn1.getCount()의 값
: 3

해설 : 맞추긴 했는데 올만에 java를 해서 이해를 완전히 못함.
static이란 키워드는 메모리에 한 번 할당되어서 프로그램이 종료 될때에 해제되는 것을 의미함. 따라서 인스턴스를 여러번 생성한다 해서 그 class의 static변수나 메서드들은 걍 새롭게 생성되는게 아니라 계속 메모리를 공유한다는 뜻이다. 그걸 아는지 모르는지가 이 문제의 포인트

따라서 코드를 보면 _inst는 static이므로 Connection.get()을 호출하면 _inst가 null이냐 아니냐의 조건 분기로 들어가는데, null이 되면 인스턴스를 생성하는 것이고, 그렇게 되면 private int count 변수가 0으로 초기화가 된다. 따라서 위 코드는 conn1 에선 인스턴스를 생성했지만 두번째 conn2에 할당할 때는 로그보면 알겠지만, static 변수 _inst를 공유하게 되어 조건 분기에서 if(_inst) 가 true가 된다. 즉 그대로 return 하게 된다.
인스턴스 생성없이 2부터 3까지 인스턴스를 공유하니 count변수도 공유하게 되고 따라서 마지막 conn1.getCount() 부분은 최종 conn3을 생성한 후에 count 값 3이 출력되게 된다.

AAA(Authentication, Authorization, Accounting)

인증(Authentication) 등록된 유저인지 아닌지의 식별
인가(Authorization) 해당 유저가 권한이 무엇인지, 어디까지 권한이 있는지 권한 식별
과금(Accounting) 리소스 사용에 대한 정보를 수집하고 관리

ARP Spoofing

ARP Spoofing 공격은 로컬 네트워크(LAN)에서 사용하는 ARP 프로토콜의 허점을 이용하여 자신의 MAC(Media Access Control) 주소를 다른 컴퓨터의 MAC인 것처럼 속이는 공격이다

c의 이중포인터

#include <stdio.h>

int main()
{
    int *numPtr1;     // 단일 포인터 선언
    int **numPtr2;    // 이중 포인터 선언
    int num1 = 10;

    numPtr1 = &num1;    // num1의 메모리 주소 저장 
    numPtr2 = &numPtr1; // numPtr1의 메모리 주소 저장

    printf("%p\n", *numPtr2);    //printf()의 서식지정자 p는 포인터의 메모리 주소를 출력해준다
                                 //서식지정자의 다른 것이 들어가면 아래처럼 경고 메시지를 뿜는다.
                                 // output : 0x7ffdcef3b3f4

    //printf("%d\n", *numPtr2);  numPtr2에는 int포인터의 주소값이 있는데 왜 decimal 형식으로 출력하느냐 라고 경고 메시지가 뜬다
    //printf("%x\n", *numPtr2);                                   왜 16진수 형식으로 출력하느냐 라고.. char나 다른것도 똑같음. 

    printf("%d\n", **numPtr2);   //output :10
    return 0;
}

이번 시험 전반적으로 알고리즘이 어려웠다고 한다. 이중포인터도 아직까지 실무선 본적도 없었는데 어떻게 때려 맞추긴 했는데 정확히 의미가 몰라서 정리한다.
위에는 이중포인터의 예제이며 출처(https://dojang.io/mod/page/view.php?id=279)
numPtr2 이중포인터로 선언되었는데 이중포인터란 쉽게 말해 포인터가 한번더 포인터를 참조하는, 즉 2중으로 포인팅 하는 변수를 말한다.
그래서 위 소스를 보면 numPtr2에 포인터의 참조연산자(값 반환하는것) 출력해보면 참조 값이 나오는데 이게 정수나 숫자면 printf("%d", *numPtr2)로 해도 문제없이 출력이 될텐데, 주소값이라서 만약 위의 형식처럼 printf를 할려하면 경고가 나온다.
그래서 프린트 하려면 printf("%p", *numPtr2)를 해줘야 하는데, p는 포인터 주소를 출력해주는 지정자라고 한다.

*numPtr2를 하게 해주면 결국 도달한 곳은 &numPtr1의 주소값 까지이다.
**numPtr2 처럼 한번더 포인터 참조연산자를 써줘야 &numPtr1이 가진 레퍼런스 쪽으로 한번더 도달하기 땜에 num1에 할당했던 10을 출력할 수 있게 된 것이다.

즉 이번 시험에 나온 문제로 가보면

#include <stdio.h>
  
int main(){
        int *arr[3];
        int a = 12, b = 24, c = 36;
        arr[0] = &a;
        arr[1] = &b;
        arr[2] = &c;

        printf(""%d\n"", *arr[1] + **arr + 1);

}"

인데 중간에 **arr 을 설명하자면, *arr은 단순 포인터라 arr[0] 즉 배열 한 요소의 값이 나오겠지만, arr은 arr[0]이 할당 받은 a의 값이 나오게 된다
따라서
arr은 12가 된다.

profile
낭만닥터와 슬의를 보고 저런 개발자가 되어야 겠다고 꿈꿔봅니다.

0개의 댓글