프로그래밍 공부

전체 글 700

카테고리 설명
프로그래밍 공부하는 블로그
  • 윈도우 API를 사용하여 창을 띄우고 그곳에 이미지를 출력할 수 있다. #include #include #include LRESULT CALLBACK WndProc(HWND handle, UINT message, WPARAM wparam, LPARAM lParam); int APIENTRY WinMain( // 운영체제에서 필요할 때 호출되는 함수 HINSTANCE hInstance, // 윈도우의 창의 실체를 말한다. 창을 띄우는 자체에 대한 식별자 를 말한다. HINSTANCE prevInstace, // 이전에 대한 정보값. LPSTR lpszCmdParam, // 문자열. 형식. 헝가리안 표기법 을 사용한다. int nCmdShow // cmd : 명령프롬프트.[ command window ] 화..

  • 윈도우 API Microsoft Windows 운영체제에서 개발자가 응용프로그램을 작성할 때 사용하는 응용프로그램 인터페이스(Application Programming Interface)이다. 이 API는 Windows 운영체제와 상호작용을 하기 위한 기능을 제공하며, 응용프로그램이 하드웨어 파일시스템 그리고 그래픽등의 리소스에 접근하고 조작할 수 있도록 해준다. 이러한 윈도우 API의 동작방식은 일반적인 함수처럼 동작하며, 다음과 같이 이루어진다. 메시지 -> 메시지큐 -> 메시지 루프 -> 윈도우 프로시저 메시지 ( Message ) 윈도우간의 통신에 사용되는 데이터 구조 응용 프로그램이나 운영체제로 부터 이벤트에 대한 알림을 받거나 작업을 요청, 응답 받는데 사용된다. 메시지 큐 ( Message ..

  • 윈도우 API Microsoft Windows 운영체제에서 개발자가 응용프로그램을 작성할 때 사용하는 응용프로그램 인터페이스(Application Programming Interface)이다. 이 API는 Windows 운영체제와 상호작용을 하기 위한 기능을 제공하며, 응용프로그램이 하드웨어 파일시스템 그리고 그래픽등의 리소스에 접근하고 조작할 수 있도록 해준다. 이러한 윈도우 API의 동작방식은 일반적인 함수처럼 동작하며, 다음과 같이 이루어진다. 메시지 -> 메시지큐 -> 메시지 루프 -> 윈도우 프로시저 메시지 ( Message ) 윈도우간의 통신에 사용되는 데이터 구조 응용 프로그램이나 운영체제로 부터 이벤트에 대한 알림을 받거나 작업을 요청, 응답 받는데 사용된다. 메시지 큐 ( Message ..

  • 30. Iterator 에 대한 설명으로 올바르지 않은 것은? 컨테이너의 요소에 접근하기 위해 사용 된다. Iterator와 같은 경우 컨테이너에 해당되는 개념이다. 요소를 순회할 때 ++, --, +, *, - 연산자를 사용한다. 컨테이너와 저장된 데이터의 타입에 상관없이 알고리즘을 사용할 수 있게 해준다. 체크답 : 2 Iterator는, 컨테이너에 해당되는 개념이 아니라 컨테이너에 접근하는 방법이다. 컨테이너에 해당되는 개념. 이라는 설명을 틀리다고 판단하였다. 오답?. 컨테이너에 접근하는 방법을 컨테이너에 해당되는 개념 이라고 판단할 수 있는가? 답 : 4? 컨테이너와 저장된 데이터의 타입에 상관없이 알고리즘을 사용할 수 있게 해준다. 라는 항목이 가장 올바르지 않다. 라고 판단했다. 저장된 데이..

  • 41일차 오답정리 답 틀린것들 재확인 확인 답은 초록색 으로 표기 10. 깊은 복사와 얕은 복사에 대한 설명으로 올바르지 않은 것은? 얕은 복사는 맴버들의 값만을 복사하는 개념이다. 깊은 복사는 맴버들의 값 만이 아닌 공간 자체를 복사하는 개념이다. 깊은 복사를 작성할 때 모든 공간에 대하여 복사를 하여야 한다. 얕은 복사는 값만을 복사하면 되기 때문에 복사대입연산만으로도 충분하다. 체크답 : 4 얕은복사 시, 객체관계에서는 ( class 또는 struct ) 시 얕은복사를 실시할 때. 복사대입연산 만으로는 부족할 수 있다고 판단. 경우에 따라서는 오퍼레이터 또는 객체 내부의 함수를 사용하여 복사하여야 할 수 있다고 생각하였다. 오답. 오퍼레이팅 하는것으로. 기본복사대입연산으로 보는가? 답 : 2 깊은 ..

  • 50문제 중 34문제 정답. 68점 오답정리. 16문제. [ 파란색 = 내가 체크한 답. 빨간색 = 정답. ] 1. Cpp 함수의 선언 중 오류가 나타나는 것은 무엇인가? void Func(auto param): void Func(int* param = new int()); void (*func) (int, int); void* Func(const int* const param); 체크답 : 2 매개변수에 동적할당을 한 적이 없어서 고름. 오답. 매개변수로 동적할당을 해도 큰 이상이 없다. 답 : 1 매개변수는 auto 선언을 할 수 없다. 매개변수는 함수저장공간에 저장될 때 데이터가 할당되기 때문에. 형식을 동적으로 지정해줄 수 없다. 정적으로 변수를 지정해주어야 한다. 4. 참조자에 관한 설명 중 올..

작성일
2023. 6. 15. 23:04
작성자
WDmil
728x90

윈도우 API를 사용하여 창을 띄우고 그곳에 이미지를 출력할 수 있다.

 

#include <Windows.h>
#include <cassert>
#include <string>

LRESULT CALLBACK WndProc(HWND handle, UINT message, WPARAM wparam, LPARAM lParam);
int APIENTRY WinMain( // 운영체제에서 필요할 때 호출되는 함수
	HINSTANCE hInstance, // 윈도우의 창의 실체를 말한다. 창을 띄우는 자체에 대한 식별자 를 말한다.
	HINSTANCE prevInstace, // 이전에 대한 정보값.
	LPSTR lpszCmdParam, // 문자열. 형식. 헝가리안 표기법 을 사용한다.
	int nCmdShow // cmd : 명령프롬프트.[ command window ] 화면에 어떤식으로 나타낼 것인가. 문자열형태로 나타낼것인가 를 표시한것.
	// 위 항목들은 작성하지 않아도 자동으로 들어간다. nullptr 같은 느낌
)
{
	WNDCLASSA wnd_class; // A : ASCII 윈도우에 지정할것 이라는 의미.

	wnd_class.cbClsExtra = 0;
	wnd_class.cbWndExtra = 0; // 확장된 공간을 사용할 것 인가.
	wnd_class.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH)); // 백그라운드 색상을 어떻게 사용할 것 인가.
	wnd_class.hCursor = LoadCursor(nullptr, IDC_CROSS); // 커서 모양을 십자가 모양으로 사용하겠다. 라는 의미.
	wnd_class.hIcon = LoadIcon(nullptr, IDI_ERROR); // 프로그램 실행했을 때 작업표시줄에 나타나는 아이콘 모양을 ERROR로 표시할것 이다.
	wnd_class.hInstance = hInstance;
	wnd_class.lpfnWndProc = WndProc; // 윈도우의 포인터와 함수펑션을 연결해주는 역할
	wnd_class.lpszClassName = "First Window"; // 파일화 시켰을 때, 클래스 이름을 정의해주는것.
	wnd_class.lpszMenuName = nullptr; // 메뉴바 를 이야기한다.
	wnd_class.style = CS_HREDRAW | CS_VREDRAW; // 수평 또는 수직이 바뀌었을 때 다시그려준다는 의미.

	RegisterClassA(&wnd_class); // 위 클래스 항목들을 레지스터에 등록하여 이름으로 찾아쓸 수 있다.

	HWND hwnd = CreateWindowA
	(
		"First Window",
		"Hello, Window!",
		WS_OVERLAPPEDWINDOW, // 스타일 중 하나. 여러개중 하나 선택하여 사용가능.
		0, 
		0,
		1080,
		720,
		nullptr, // 윈도우의 부가창을 만드는 것.
		nullptr, // 메뉴
		hInstance,
		nullptr
	); // 화면을 구성하였다.
    
    assert(hwnd != nullptr);

	ShowWindow(hwnd, nCmdShow);
	ShowCursor(TRUE);

	MSG message;
	ZeroMemory(&message, sizeof(MSG)); // 윈도우 메모리 초기화 방식.
    
    	while (GetMessage(&message, nullptr, 0, 0))
	{
		TranslateMessage(&message);
		DispatchMessage(&message);
	}

	DestroyWindow(hwnd); // 윈도우 창 날리기
	UnregisterClassA("First Window", hInstance); // 윈도우 창을 해제해준다.

	return 0;
}

LRESULT CALLBACK WndProc(HWND handle, UINT message, WPARAM wParm, LPARAM lParam)
{
	static POINT position;
	static POINT start;
	static POINT end;
	static BOOL is_clicked = FALSE; // 마우스 클릭 여부 확인.
	
	static RECT rect1 = { 100, 100, 200, 200 };
	static RECT rect2 = { 300, 300, 400, 400 };
	static BOOL is_intersect = FALSE;
	
	switch (message) // 들어온 메세지 처리하는 부분.
	{
    case WM_CLOSE:
	case WM_DESTROY:
		PostQuitMessage(0); // 메세지에 0 이 들어오면서 윈도우를 종료해준다. 문제가 없으면 0 있으면 1이 리턴된다.
		break;
	default:
		return DefWindowProcA(handle, message, wParm, lParam); // 처리 안한게 있는 상태라면 이곳으로 리턴시킨다.
	}

	return 0;
}

위 코드가 기본적으로  1080 / 720 사이즈의 윈도우 창을 띄워주는 코드이다.

 

여기에서 WndProc 의 함수를 수정하여. 다양한 구성을 시도할 수 있다.

 

다음 밑 부터 작성된 코드는

switch (message)

{

의 밑

case WM_CLOSE: 의 위 에 위 코드를 삽입하여 출력해보면

 

다음과 같은 결과가 나타난다.


기본 텍스트 출력하기.

	case WM_LBUTTONDOWN :
	{
		std::string str = "Mouse Clicked!!";

		HDC hdc = GetDC(handle); // GetDc : 화면과 관련된 디바이스 컨텍스트 핸들을 얻어오려는 것. [ HDC : handle to Device Context 윈도우 운영체제 그래픽작업 수행해주는 것. ]
		// 핸들을 사용해서 관련 상수를 얻어와야함.
		// 원 삼각형 사각형 등을 그릴 수 있게 하기위해 받아온다.
		TextOutA(hdc, 500, 300, str.c_str(), str.length());
		ReleaseDC(handle, hdc); // 핸들을 반환해준다.
	}
	break;
	case WM_PAINT: // 윈도우가 다시 그려질 때 발생하는 메세지. 처음 생성시. 움직여서 가려질 때 다시출력해주어야 하는데, 그때 호출이 된다.
	{
		std::string str = "WM_PAINT message occurred!!";

		PAINTSTRUCT ps;
		HDC hdc = BeginPaint(handle, &ps); // 그리기 시작할 때 불러옴
		TextOutA(hdc, 500, 350, str.c_str(), str.length());

		EndPaint(handle, &ps);
	}
	break;

 

위 코드를 설명해보자. case WM_LBUTTONDOWN 의 경우. UINT의 값을 받아온 message임으로.

 

윗부분 코드 줄 중 wnd_class.lpfnWndProc 에 WndProc이 들어감으로. 

정의 피킹으로 위치참조를 해보면, 다음과 같이. CALLBACK* WNDPROC 형태로 함수포인터 로 사용됨을 확인할 수 있다.

 

즉, 입력값을 참조하여 인터럽트가 일어났을 경우, switch의 case를 전부 참조하여. 해당되는 case에 대한 코드를 실행하게 만드는 것이라고 이해하면 된다.

 

다음으로 넘어가면. WM_LBUTTONDOWN. 그러니까 마우스의 왼쪽버튼을 다운 시켰을 때. 동작한다.

string 형태의 str 변수를 생성하고 " Mouse Clicked!! " 이라는 문장을 삽입한다.

 

그 후 HDC 형태의 hdc 변수를 생성하고. 매개변수로 받아온 HWND를 GetDC 함수를 사용하여

HDC에서 불필요한 HWND값을 절삭하고 HDC 형태의 hdc 변수에 복사대입한다.

 

그 후, TextOutA 함수를 사용해서 x위치 500 y위치 300 의 위치에 string 형태의 str을 c타입의 char 배열로 변환한 뒤, 배열사이즈를 입력하여 문자열을 출력한다는 것을 hdc의 주소에 기입해준다.

 

ReleaseDC를 통해 handle를 참조하여 hdc의 핸들을 os에 반환해준다.

 

WM_PAINT 을 통해 Switch로 윈도우가 다시 그려질 때 갱신하여 해당됨으로 출력해준다.

string 형태의 str을 선언하여 WM_PAINT message occurred!! 를 str에 문자열을 기입해준다.

 

PAINTSTRUCT 형태의 ps를 선언한다.

 

HDC 형의 hdc를 선언하여, BeginPaint를 사용하여 handle을 참조하여 ps를 hdc에 복사대입한다.

 

TextOutA 를 통하여, hdc의 주소값의 x500 y350에 해당하는 위치에 str의 문자열을 대입한다.

 

그리고 ps를 할당해제 해준다.

 

위와같은 코드열을 읽어보면 출력문이 나타난다.


키보드 인풋으로 문자 이동하기

	case WM_KEYDOWN:
		if	(wParm == VK_UP) position.y -= 10;
		else if (wParm == VK_DOWN) position.y += 10;
		if	(wParm == VK_RIGHT) position.x += 10;
		else if (wParm == VK_LEFT) position.x -= 10;

		InvalidateRect(handle, nullptr, TRUE); // 잔상없이 움직일 수 있도록 만들었다. 화면을 다 날렸다가 다시 표시하라.
		break;

	case WM_PAINT:
	{
		PAINTSTRUCT ps;
		HDC hdc = BeginPaint(handle, &ps);
		TextOut(hdc, position.x, position.y, "♥", 2);
		EndPaint(handle, &ps);
		break;
	}

위와 같이 키보드의 십자방향키 를 통해 좌표를 변경해줄 수 있다.


마우스의 좌표를 표시한다.

	case WM_MOUSEMOVE: // 마우스 움직임
		position.x = LOWORD(lParam); // 마우스 이벤트 lParam값을 16비트로 추출한다. 
		position.y = HIWORD(lParam); // 마우스 이벤트로 y좌표를 얻어온다. 16비트로

		InvalidateRect(handle, nullptr, TRUE);
		break;
	case WM_PAINT:
	{
		std::string str = "";
		str += std::to_string(position.x); // 정수를 문자열로 변경시켜준다.
		str += ", ";
		str += std::to_string(position.y); // 정수를 문자열로 변경시켜준다.

		PAINTSTRUCT ps;
		HDC hdc = BeginPaint(handle, &ps);
		TextOutA(hdc, position.x, position.y, str.c_str(), str.length());

		//Line
		MoveToEx(hdc, 100, 100, nullptr);
		LineTo(hdc, 500, 500);

		//도형
		Rectangle(hdc, 500, 500, 600, 600);
		Ellipse(hdc, 300, 300, 400, 400);

		EndPaint(handle, &ps);

	}
	break;

위치 좌표에 대한 값을 출력해준다.


그림판 처럼 그림을 그릴 수 있다.

	case WM_LBUTTONDOWN: // 좌클릭 했을 때 그려짐
		position.x = LOWORD(lParam);
		position.y = HIWORD(lParam);
		is_clicked = TRUE;
		break;

	case WM_MOUSEMOVE:
		if (is_clicked)
		{
			HDC hdc = GetDC(handle);
			MoveToEx(hdc, position.x, position.y, nullptr);
			position.x = LOWORD(lParam);
			position.y = HIWORD(lParam);
			LineTo(hdc, position.x, position.y); // 선 그려주기
			ReleaseDC(handle, hdc);
		}
		break;

	case WM_LBUTTONUP:
		is_clicked = FALSE;
		break;


드래그 하여 사각형을 그린다.

	case WM_LBUTTONDOWN:
		start.x = LOWORD(lParam);
		start.y = HIWORD(lParam);
		is_clicked = TRUE;
		break;

	case WM_MOUSEMOVE:
		if (is_clicked)
		{
			end.x = LOWORD(lParam);
			end.y = HIWORD(lParam);
			InvalidateRect(handle, nullptr, TRUE);
		}
		break;
	case WM_LBUTTONUP:
		is_clicked = FALSE;
		break;

	case WM_PAINT:
	{
		PAINTSTRUCT ps;
		HDC hdc = BeginPaint(handle, &ps);

		HPEN cur_pen = CreatePen(PS_DASH, 1, RGB(0, 255, 0));
		HPEN old_pen = static_cast<HPEN>(SelectObject(hdc, cur_pen)); // 생성 정보를 다시 담아준다.

		HBRUSH cur_brush = CreateSolidBrush((RGB(100, 4, 25)));
		HBRUSH old_brush = static_cast<HBRUSH>(SelectObject(hdc, cur_brush));

		Rectangle(hdc, start.x, start.y, end.x, end.y);
		SelectObject(hdc, old_pen);
		DeleteObject(cur_pen);

		SelectObject(hdc, old_brush);
		DeleteObject(cur_brush);

		EndPaint(handle, &ps);
	}
		break;

 

728x90
작성일
2023. 6. 14. 21:41
작성자
WDmil
728x90

윈도우 API

 

Microsoft Windows 운영체제에서 개발자가 응용프로그램을 작성할 때 사용하는

응용프로그램 인터페이스(Application Programming Interface)이다.

 

이 API는 Windows 운영체제와 상호작용을 하기 위한 기능을 제공하며, 응용프로그램이 하드웨어

파일시스템 그리고 그래픽등의 리소스에 접근하고 조작할 수 있도록 해준다.


이러한 윈도우 API의 동작방식은 일반적인 함수처럼 동작하며, 다음과 같이 이루어진다.

 

메시지 -> 메시지큐 -> 메시지 루프 -> 윈도우 프로시저


  • 메시지 ( Message )
    • 윈도우간의 통신에 사용되는 데이터 구조
    • 응용 프로그램이나 운영체제로 부터 이벤트에 대한 알림을 받거나 작업을 요청, 응답 받는데 사용된다.
  • 메시지 큐 ( Message Queue)
    • 메시지의 데이터구조를 큐 형태로 보관하는 컨테이너
    • FIFO (선입선출) 구조로 이루어지며, 이벤트에 대한 알림을 받았을때 등 메시지를 대기시키는 컨테이너이다.
  • 메시지 루프 ( Message loop )
    • 메시지를 윈도우 시스템에서 받아온 후, 해당되는 메시지를 알맞은 처리과정으로 전달하는 루프문.
    • while를 통해 구현된다.
  • 윈도우 프로시저 ( WIndow Procedure )
    • 받아온 메시지를 원하는 데이터값으로 처리하기 위한 코드 를 말한다.
    • 메시지에 해당하는 동작을 수행하고 필요한 경우, 조작이나 업데이트 등을 작업하는 코드뭉치이다.

윈도우 함수를 사용하여, 데이터를 처리하게 되는데.

 

이러한 함수를 사용하기 위해 문자열 타입을 지정해주어야 한다.

 

문자열 타입은 다음과 같다.


  1. LPSTR (Long Pointer To a String)
    • LPSTR은 가변적 문자열 데이터를 가리키는 포인터 이다.
    • long pointer str = char*
    • 해당 포인터를 통해 문자열 데이터를 수정하거나 복사, 변경 작업을 수행한다.
    • 주로 ANSI 문자열을 처리하는데 사용된다. [ ANSI 문자열은 1바이트로 각 문자를 표현, 영어 및 일부 특수문자를 표현할 수 있다. ]
  2. LPCSTR ( Long Pointer To a Const String )
    • LPCSTR은 읽기 전용 상수 문자열 데이털르 가리키는 상수 포인터 이다.
    • long pointer const str = const char*
    • 해당 포인터를 통해 문자열 데이터를 수정할 수 없다. 그럼으로 읽기전용으로만 사용되기에. 안전하게 문자열 참조가 가능하다.
    • 주로 ANSI 문자열을 처리하는데 사용되며, 읽거나 출력하는 작업에 활용된다.
  3. LPWSTR ( Long Pointer To a Wide String )
    • LPWSTR은 가변적인 유니코드 문자열 데이터를 가리키는 포인터 이다.
    • long pointer string = wchar_t*
    • 해당 포인터를 통해 문자열 데이터를 수정하고, 복사 변경 하는 작업을 수행할 수 있다.
    • 주로 유니코드 문자열을 처리하는데 사용되며, 다국어 문자 및 특수문자를 수정, 읽기, 출력 작업에 활용된다.
  4. LPCWSTR ( Long Pointer To a Const Wide String )
    • LPCWSTR은 읽기 전용 상수 유니코드 문자열 데이터를 가리키는 상수 포인터 이다.
    • long pointer const string = const wchar_t*
    • 해당 포인터를 통해 문자열 데이터를 수정할 수 없다. 그럼으로 읽기전용으로만 사용되기에. 안전하게 문자열 참조가 가능하다.
    • 주로 유니코드 문자열을 처리하는데 사용되며, 읽거나 출력하는 작업에 활용된다.

이러한 윈도우 API는 다음과 같은 스텍 정리구조를 가진다.

  • STD_CALL
    • 호출당한 함수에서 스텍을 정리한다.
728x90

'컴퓨터 용어 정리' 카테고리의 다른 글

Device Context  (0) 2023.07.13
Delta_Time  (0) 2023.06.21
STL_AdapterContainer  (0) 2023.05.28
STL_AssociativeContainer  (0) 2023.05.28
STL_SequnceContainer  (0) 2023.05.28
작성일
2023. 6. 14. 21:39
작성자
WDmil
728x90

윈도우 API

 

Microsoft Windows 운영체제에서 개발자가 응용프로그램을 작성할 때 사용하는

응용프로그램 인터페이스(Application Programming Interface)이다.

 

이 API는 Windows 운영체제와 상호작용을 하기 위한 기능을 제공하며, 응용프로그램이 하드웨어

파일시스템 그리고 그래픽등의 리소스에 접근하고 조작할 수 있도록 해준다.


이러한 윈도우 API의 동작방식은 일반적인 함수처럼 동작하며, 다음과 같이 이루어진다.

 

메시지 -> 메시지큐 -> 메시지 루프 -> 윈도우 프로시저


  • 메시지 ( Message )
    • 윈도우간의 통신에 사용되는 데이터 구조
    • 응용 프로그램이나 운영체제로 부터 이벤트에 대한 알림을 받거나 작업을 요청, 응답 받는데 사용된다.
  • 메시지 큐 ( Message Queue)
    • 메시지의 데이터구조를 큐 형태로 보관하는 컨테이너
    • FIFO (선입선출) 구조로 이루어지며, 이벤트에 대한 알림을 받았을때 등 메시지를 대기시키는 컨테이너이다.
  • 메시지 루프 ( Message loop )
    • 메시지를 윈도우 시스템에서 받아온 후, 해당되는 메시지를 알맞은 처리과정으로 전달하는 루프문.
    • while를 통해 구현된다.
  • 윈도우 프로시저 ( WIndow Procedure )
    • 받아온 메시지를 원하는 데이터값으로 처리하기 위한 코드 를 말한다.
    • 메시지에 해당하는 동작을 수행하고 필요한 경우, 조작이나 업데이트 등을 작업하는 코드뭉치이다.

윈도우 함수를 사용하여, 데이터를 처리하게 되는데.

 

이러한 함수를 사용하기 위해 문자열 타입을 지정해주어야 한다.

 

문자열 타입은 다음과 같다.


  1. LPSTR (Long Pointer To a String)
    • LPSTR은 가변적 문자열 데이터를 가리키는 포인터 이다.
    • long pointer str = char*
    • 해당 포인터를 통해 문자열 데이터를 수정하거나 복사, 변경 작업을 수행한다.
    • 주로 ANSI 문자열을 처리하는데 사용된다. [ ANSI 문자열은 1바이트로 각 문자를 표현, 영어 및 일부 특수문자를 표현할 수 있다. ]
  2. LPCSTR ( Long Pointer To a Const String )
    • LPCSTR은 읽기 전용 상수 문자열 데이털르 가리키는 상수 포인터 이다.
    • long pointer const str = const char*
    • 해당 포인터를 통해 문자열 데이터를 수정할 수 없다. 그럼으로 읽기전용으로만 사용되기에. 안전하게 문자열 참조가 가능하다.
    • 주로 ANSI 문자열을 처리하는데 사용되며, 읽거나 출력하는 작업에 활용된다.
  3. LPWSTR ( Long Pointer To a Wide String )
    • LPWSTR은 가변적인 유니코드 문자열 데이터를 가리키는 포인터 이다.
    • long pointer string = wchar_t*
    • 해당 포인터를 통해 문자열 데이터를 수정하고, 복사 변경 하는 작업을 수행할 수 있다.
    • 주로 유니코드 문자열을 처리하는데 사용되며, 다국어 문자 및 특수문자를 수정, 읽기, 출력 작업에 활용된다.
  4. LPCWSTR ( Long Pointer To a Const Wide String )
    • LPCWSTR은 읽기 전용 상수 유니코드 문자열 데이터를 가리키는 상수 포인터 이다.
    • long pointer const string = const wchar_t*
    • 해당 포인터를 통해 문자열 데이터를 수정할 수 없다. 그럼으로 읽기전용으로만 사용되기에. 안전하게 문자열 참조가 가능하다.
    • 주로 유니코드 문자열을 처리하는데 사용되며, 읽거나 출력하는 작업에 활용된다.

이러한 윈도우 API는 다음과 같은 스텍 정리구조를 가진다.

  • STD_CALL
    • 호출당한 함수에서 스텍을 정리한다.

다음은 윈도우 API를 활용하여 빈 화면을 출력하는 코드 예시 이다.

#include <Windows.h>
#include <cassert>
/*
	API : application program interface
	윈도우를 표현하기 위해 사용하는 함수 들의 인터페이스 를 윈도우 API 라고 한다.

	int main은 콘솔을 띄우는 창.
	윈도우 API는 int APIENTRY WinMain 이라고 사용한다.
	
	솔루션 설정 -> 고급 -> 문자집합 -> 멀티바이트 문자집합 으로 변경한다.
	링커 -> 시스템 -> 하위시스템 -> 콘솔 에서 창 으로 변경

*/

LRESULT CALLBACK WndProc(HWND handle, UINT message, WPARAM wparam, LPARAM lParam);

// ENTRY : 여기서부터 진입한다. , WinMain : 윈도우에서 main으로 사용한다.
int APIENTRY WinMain( // 운영체제에서 필요할 때 호출되는 함수
	HINSTANCE hInstance, // 윈도우의 창의 실체를 말한다. 창을 띄우는 자체에 대한 식별자 를 말한다.
	HINSTANCE prevInstace, // 이전에 대한 정보값.
	LPSTR lpszCmdParam, // 문자열. 형식. 헝가리안 표기법 을 사용한다.
	int nCmdShow // cmd : 명령프롬프트.[ command window ] 화면에 어떤식으로 나타낼 것인가. 문자열형태로 나타낼것인가 를 표시한것.
	// 위 항목들은 작성하지 않아도 자동으로 들어간다. nullptr 같은 느낌
)
{
	WNDCLASSA wnd_class; // A : ASCII 윈도우에 지정할것 이라는 의미.

	wnd_class.cbClsExtra = 0;
	wnd_class.cbWndExtra = 0; // 확장된 공간을 사용할 것 인가.
	wnd_class.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH)); // 백그라운드 색상을 어떻게 사용할 것 인가.
	wnd_class.hCursor = LoadCursor(nullptr, IDC_CROSS); // 커서 모양을 십자가 모양으로 사용하겠다. 라는 의미.
	wnd_class.hIcon = LoadIcon(nullptr, IDI_ERROR); // 프로그램 실행했을 때 작업표시줄에 나타나는 아이콘 모양을 ERROR로 표시할것 이다.
	wnd_class.hInstance = hInstance;
	wnd_class.lpfnWndProc = WndProc; // 윈도우의 포인터와 함수펑션을 연결해주는 역할
	wnd_class.lpszClassName = "First Window"; // 파일화 시켰을 때, 클래스 이름을 정의해주는것.
	wnd_class.lpszMenuName = nullptr; // 메뉴바 를 이야기한다.
	wnd_class.style = CS_HREDRAW | CS_VREDRAW; // 수평 또는 수직이 바뀌었을 때 다시그려준다는 의미.

	RegisterClassA(&wnd_class); // 위 클래스 항목들을 레지스터에 등록하여 이름으로 찾아쓸 수 있다.

	HWND hwnd = CreateWindowA
	(
		"First Window",
		"Hello, Window!",
		WS_OVERLAPPEDWINDOW, // 스타일 중 하나. 여러개중 하나 선택하여 사용가능.
		0, 
		0,
		1080,
		720,
		nullptr, // 윈도우의 부가창을 만드는 것.
		nullptr, // 메뉴
		hInstance,
		nullptr
	); // 화면을 구성하였다.
	
	assert(hwnd != nullptr);

	ShowWindow(hwnd, nCmdShow);
	ShowCursor(TRUE);

	MSG message;
	ZeroMemory(&message, sizeof(MSG)); // 윈도우 메모리 초기화 방식.

	while (GetMessage(&message, nullptr, 0, 0))
	{
		TranslateMessage(&message);
		DispatchMessage(&message);
	}

	DestroyWindow(hwnd); // 윈도우 창 날리기
	UnregisterClassA("First Window", hInstance); // 윈도우 창을 해제해준다.

	return 0;
}

LRESULT CALLBACK WndProc(HWND handle, UINT message, WPARAM wparam, LPARAM lParam)
{
	static POINT position;
	static POINT start;
	static POINT end;
	static BOOL is_clicked = FALSE; // 마우스 클릭 여부 확인.
	
	static RECT rect1 = { 100, 100, 200, 200 };
	static RECT rect2 = { 300, 300, 400, 400 };
	static BOOL is_intersect = FALSE;
	
	switch (message) // 들어온 메세지 처리하는 부분.
	{
	case WM_LBUTTONDOWN:
		MessageBoxA(nullptr, "Helo, WIndow!", "ERROR!!" , MB_OKCANCEL);
		break;
	case WM_CLOSE:
	case WM_DESTROY:
		PostQuitMessage(0); // 메세지에 0 이 들어오면서 윈도우를 종료해준다. 문제가 없으면 0 있으면 1이 리턴된다.
		break;
	default:
		return DefWindowProcA(handle, message, wparam, lParam); // 처리 안한게 있는 상태라면 이곳으로 리턴시킨다.
	}

	return 0;
}

728x90
작성일
2023. 6. 13. 23:12
작성자
WDmil
728x90

30. Iterator 에 대한 설명으로 올바르지 않은 것은?

  1. 컨테이너의 요소에 접근하기 위해 사용 된다.
  2. Iterator와 같은 경우 컨테이너에 해당되는 개념이다.
  3. 요소를 순회할 때 ++, --, +, *, - 연산자를 사용한다.
  4. 컨테이너와 저장된 데이터의 타입에 상관없이 알고리즘을 사용할 수 있게 해준다.

체크답 : 2

Iterator는, 컨테이너에 해당되는 개념이 아니라 컨테이너에 접근하는 방법이다.

컨테이너에 해당되는 개념. 이라는 설명을 틀리다고 판단하였다.

 

오답?. 컨테이너에 접근하는 방법을 컨테이너에 해당되는 개념 이라고 판단할 수 있는가?

 

답 : 4?

컨테이너와 저장된 데이터의 타입에 상관없이 알고리즘을 사용할 수 있게 해준다. 라는 항목이 가장 올바르지 않다. 라고 판단했다. 저장된 데이터타입에 무조건 상관이 없는가? iterator에 요소순환 시 객체의 operator 가 존재하지 않다면, 요소순환이 힘들것이라 판단.

 

진짜답 3

Iterator 에서 + 와 -  사용이 안된다? 사용할 수 있지만, 일반적인 방법이 아님으로 고려하지 않는다?

요소 순회를 생각해야한다. 전체 순환하면서 특정 위치의 값을 확인하는것이다.

말장난 식으로 생각하면 될것이다.


 

728x90
작성일
2023. 6. 9. 02:28
작성자
WDmil
728x90

41일차 오답정리 답 틀린것들 재확인

확인 답은 초록색 으로 표기


10. 깊은 복사와 얕은 복사에 대한 설명으로 올바르지 않은 것은?

  1. 얕은 복사는 맴버들의 값만을 복사하는 개념이다.
  2. 깊은 복사는 맴버들의 값 만이 아닌 공간 자체를 복사하는 개념이다.
  3. 깊은 복사를 작성할 때 모든 공간에 대하여 복사를 하여야 한다.
  4. 얕은 복사는 값만을 복사하면 되기 때문에 복사대입연산만으로도 충분하다.

체크답 : 4

얕은복사 시, 객체관계에서는 ( class 또는 struct ) 시 얕은복사를 실시할 때. 복사대입연산 만으로는 부족할 수 있다고 판단. 경우에 따라서는 오퍼레이터 또는 객체 내부의 함수를 사용하여 복사하여야 할 수 있다고 생각하였다.

 

오답. 오퍼레이팅 하는것으로. 기본복사대입연산으로 보는가?

 

답 : 2

깊은 복사는 공간 자체를 복사하는 것 이 아닌 공간을 새로 할당하고. 값을 복사하는 개념이다.

 

진짜 답 3

깊은 복사를 실시할 때, 모든 공간에 대하여 복사를 하면 좋지만, 모든 공간에 대한 복사를 하면 좋지만,

꼭 모든 모든 공간에 대하여 복사를 하여야 하는것 은 아니다.

말장난


22. 순수 가상함수에 대한 설명으로 올바른것은?

  1. 객체지향의 4대 속성 중 상속성에 가장 가까운 기술이다.
  2. 함수 뒤에 =0; , pure , abstract 를 작성하여 선언한다.
  3. 순수 가상함수 를 하나 이상 가지고있는 클래스를 인터페이스 라고 한다.
  4. 파생 클래스에서 재정의하지 않을 시 해당 파생 클래스를 상속받은 파생 클래스에서 정의한다면 문제가 없다.

체크답 : 3

순수 가상함수가 있을 경우, 상속받을 때. 가상함수를 무조건 재선언해주어야 하기 때문에. 인터페이스 라고 생각했음.

 

오답. 순수 가상함수로만 이루어져 있을 때 인터페이스 라고 한다.

 

답 : 2

함수 뒤에 0 과 pure 와 abstract 라고 표시하면. 가상함수 라고 인식한다.

 

진짜답 1

애초에 상속성이 없다면, 순수가상함수는 존재할 수 없기 때문에, 가장 가까운 기술이다. 라고 하는것이 맞다.


27. 연관 컨테이너에 대한 설명으로 올바르지 않은 것은?

  1. Key 와 Value 를 쌍으로 가지고 있는 형태이다.
  2. 자료 탐색이 빠른 것이 장점이다.
  3. set, Multi Map, map 등이 있다.
  4. 데이터의 삽입 속도가 빠르다.

체크답 : 1

set은 Key를 value로 쓰기에, Key만 가지고 있다고 생각함.

 

오답?. Key = value로 보아야 하는가, Key만 존재한다고 보아야 하는가? 쌍으로 가지고 있다고 판단 할 수 있는가?

 

답 : 4

연관 컨테이너 는 정렬과 중복탐색이 이루어져야 하기 때문에, 삽입속도가 느리다.

 

Set은 Key와 Value를 쌍으로 가지고 있는 형태라고 본다.


 

728x90
작성일
2023. 6. 6. 20:35
작성자
WDmil
728x90

50문제 중 34문제 정답. 68점

 

오답정리. 16문제.

[ 파란색 = 내가 체크한 답. 빨간색 = 정답. ]


1. Cpp 함수의 선언 중 오류가 나타나는 것은 무엇인가?

  1. void Func(auto param):
  2. void Func(int* param = new int());
  3. void (*func) (int, int);
  4. void* Func(const int* const param);

체크답 : 2

매개변수에 동적할당을 한 적이 없어서 고름.

 

오답. 매개변수로 동적할당을 해도 큰 이상이 없다.

 

답 : 1

매개변수는 auto 선언을 할 수 없다.

매개변수는 함수저장공간에 저장될 때 데이터가 할당되기 때문에. 형식을 동적으로 지정해줄 수 없다.

정적으로 변수를 지정해주어야 한다.

 


4. 참조자에 관한 설명 중 올바르지 않은 것은?

  1. 참조자는 참조하고 있는 객체를 변경하는 것이 가능하다.
  2. 변수에 또 하나의 별명을 지정해주는 기능이다.
  3. 선언과 동시에 초기화를 진행해야 한다.
  4. 변수의 주소를 저장하는 것이 아닌 공간 자체를 참조하는 기능이다.

체크답 : 3

선언과 동시에 초기화를 진행해야 하나, 위 답안에서 답이 없는것 같아 판별하기 힘들었다.

 

오답. 참조자는 선언과 동시에 초기화를 해야한다.

 

답 : 1

참조자는 참조하고 있는 객체를 [ 다른 객체로 ] 변경하는 것이 가능하다.

라고 작성해야 문항이 올바르게 인식된다.

 

객체를 변경하는것 이 A -> B 일때, A -> C로 가리키는 별칭을 바꾸는 것이 안된다는 의미.


10. 깊은 복사와 얕은 복사에 대한 설명으로 올바르지 않은 것은?

  1. 얕은 복사는 맴버들의 값만을 복사하는 개념이다.
  2. 깊은 복사는 맴버들의 값 만이 아닌 공간 자체를 복사하는 개념이다.
  3. 깊은 복사를 작성할 때 모든 공간에 대하여 복사를 하여야 한다.
  4. 얕은 복사는 값만을 복사하면 되기 때문에 복사대입연산만으로도 충분하다.

체크답 : 4

얕은복사 시, 객체관계에서는 ( class 또는 struct ) 시 얕은복사를 실시할 때. 복사대입연산 만으로는 부족할 수 있다고 판단. 경우에 따라서는 오퍼레이터 또는 객체 내부의 함수를 사용하여 복사하여야 할 수 있다고 생각하였다.

 

오답. 오퍼레이팅 하는것으로. 기본복사대입연산으로 보는가?

 

답 : 2

진짜 답 3

깊은 복사는 공간 자체를 복사하는 것 이 아닌 공간을 새로 할당하고. 값을 복사하는 개념이다.


11. this pointer 에 대한 설명으로 옳은 것은?

  1. 설계도의 주소를 가리키는 포인터 이다.
  2. 클래스 작성의 함수 정의부에서만 사용이 가능하다.
  3. 호출된 객체를 기준으로 컴파일러가 this 를 추가한다.
  4. this pointer 에는 delete 를 사용할 수 없다.

체크답 : 1

설계도의 주소가 객체의 주소로 착각함.

 

오답. 설계도가 아닌 객체의 주소를 참조하기 때문에, 설계도의 주소 라고 하는 표현은 오답.

 

답 : 3

주소값은 호출된 객체 기준으로 정해진다.


13. 특수한 개념을 묶어 프로그래밍하는 방법인 일반화를 적용시킨 C++ 의 프로그래밍 기법을 무엇이라 하는 가?

  1. overload
  2. override
  3. template
  4. class

체크 답 : 4

개념을 묶어, 일반화 적용, 프로그래밍 기법. 을 class로 생각함.

 

오답. class는 프로그래밍 기법 이 아닌 객체 그 자체라고 봐야한다.

 

답 : 3

template로 개념을 묶어 일반화 시키고. 코드의 재사용성을 늘리 는 기법이다.


14. 객체지향의 4대 속성 중 하나로 재사용 및 확장에 가장 적합한 속성은 무엇인가?

  1. 상속성
  2. 추상화
  3. 캡슐화
  4. 다형성

체크 답 : 3

객체간을 묶어 독립적인 객체로 만들어서. 재사용성을 용이하게하고. 객체간의 합일로 확장에 유리하다고 생각.

 

오답. 캡슐화는 재사용 및 확장 또한 있으나, 보안성과 코드가독성에 더 큰 영향을 미침.

 

답 : 1

상속성은 하나의 코드를 재사용하고. 확장시킬 때 용이하다. 객체간의 상속으로 부모자식클래스로 구분되는 디자인패턴을 구축하기 용이하다.


15. 객체지향의 4대 속성 중 하나로 Function Overload 와 Override 는 어떤 속성에 해당하는가?

  1. 상속성
  2. 추상화
  3. 캡슐화
  4. 다형성

체크답 : 1

Overload를 객체의 상속개념으로 생각하였다.

 

오답. 상속성은 virtual을 기준으로 잡아야한다.

 

답 : 4

다형성으로 Overload 와 Override로 객체 자체를 인터페이스 화 시켜. 다양한 항목을 직관적으로 생성하고 확장시킬 수 있다.


20. 다음과 같이 C++ 언어를 사용하여 함수를 선언할 때 컴파일 에러가 발생하는 것은?

  1. void _(int a, int b);
  2. static int parent(int a = 1, int b = 2);
  3. double student(int, int);
  4. int friend(int a, int b);

체크답 : 3

매개변수에 이름을 지정해주지 않으면 컴파일 오류가 나타날것으로 예상.

 

오답. 컴파일 자체에서는 오류라고 인식하지 않는다.

 

답 : 4

friend 선언 시, 접근 지정자로써 함수선언이 허용되지 않는다.


22. 순수 가상함수에 대한 설명으로 올바른것은?

  1. 객체지향의 4대 속성 중 상속성에 가장 가까운 기술이다.
  2. 함수 뒤에 =0; , pure , abstract 를 작성하여 선언한다.
  3. 순수 가상함수 를 하나 이상 가지고있는 클래스를 인터페이스 라고 한다.
  4. 파생 클래스에서 재정의하지 않을 시 해당 파생 클래스를 상속받은 파생 클래스에서 정의한다면 문제가 없다.

체크답 : 3

순수 가상함수가 있을 경우, 상속받을 때. 가상함수를 무조건 재선언해주어야 하기 때문에. 인터페이스 라고 생각했음.

 

오답. 순수 가상함수로만 이루어져 있을 때 인터페이스 라고 한다.

 

답 : 2

진짜답 1

함수 뒤에 0 과 pure 와 abstract 라고 표시하면. 가상함수 라고 인식한다.


23.Interface 에 대한 설명으로 올바르지 않은 것은?

  1. __interface 를 작성하여 선언할 수 도 있다.
  2. 순수 가상함수와 가상 소말자만 가지고 있는 클래스를 의미한다.
  3. 다중 상속이 불가능하다.
  4. 인터페이스의 이름은 보통 접두사 I 를 사용한다.

체크답 : 1

__interface 를 작성하여 Interface를 선언해본적이 없어서. 골랐다.

 

오답. 가능

 

답 : 3

다중 상속은 당연히 가능하다.


27. 연관 컨테이너에 대한 설명으로 올바르지 않은 것은?

  1. Key 와 Value 를 쌍으로 가지고 있는 형태이다.
  2. 자료 탐색이 빠른 것이 장점이다.
  3. set, Multi Map, map 등이 있다.
  4. 데이터의 삽입 속도가 빠르다.

체크답 : 1

set은 Key를 value로 쓰기에, Key만 가지고 있다고 생각함.

 

오답?. Key = value로 보아야 하는가, Key만 존재한다고 보아야 하는가? 쌍으로 가지고 있다고 판단 할 수 있는가?

 

답 : 4

연관 컨테이너 는 정렬과 중복탐색이 이루어져야 하기 때문에, 삽입속도가 느리다.


30. Iterator 에 대한 설명으로 올바르지 않은 것은?

  1. 컨테이너의 요소에 접근하기 위해 사용 된다.
  2. Iterator와 같은 경우 컨테이너에 해당되는 개념이다.
  3. 요소를 순회할 때 ++, --, +, *, - 연산자를 사용한다.
  4. 컨테이너와 저장된 데이터의 타입에 상관없이 알고리즘을 사용할 수 있게 해준다.

체크답 : 2

Iterator는, 컨테이너에 해당되는 개념이 아니라 컨테이너에 접근하는 방법이다.

컨테이너에 해당되는 개념. 이라는 설명을 틀리다고 판단하였다.

 

오답?. 컨테이너에 접근하는 방법을 컨테이너에 해당되는 개념 이라고 판단할 수 있는가?

 

답 : 4?

컨테이너와 저장된 데이터의 타입에 상관없이 알고리즘을 사용할 수 있게 해준다. 라는 항목이 가장 올바르지 않다. 라고 판단했다. 저장된 데이터타입에 무조건 상관이 없는가? iterator에 요소순환 시 객체의 operator 가 존재하지 않다면, 요소순환이 힘들것이라 판단.


32. 다음 중 상속된 형태의 캐스팅 방법으로 가장 적합한 것은 무엇인가?

  1. static_cast
  2. dynamic_cast
  3. reinterpret_cast
  4. const_cast

체크답 : 3

reinterpret_cast 가 뭔지 몰라서 찍음.

 

오답.포인터/참조자 간의 casting으로 메모리 비트패턴을 직접적으로 다른타입으로 강제변환해준다.

 

답 : 2

dynamic_cast는 다운캐스팅과 업 캐스팅을 수행하는걸 이야기한다.


33. 강제적 형번환을 할 수 있는 캐스팅 연산자는 무엇인가?

  1. static_cast
  2. dynamic_cast
  3. reinterpret_cast
  4. const_cast

체크답 : 2

dynamic_cast가 dynamic하니까 강제적으로 형변환 한다고 생각.

 

오답. 맞을리가 없음

 

답 : 3

강제형변환은 3번이다.


37. 연산자 오버로딩에 대한 설명으로 올바르지 않은 것은?

  1. 기본 연산자의 기능 의외에 추가적인 기능을 부여하는 것이다.
  2. new 와 delete는 오버로딩이 불가능하다.
  3. 작성시 operator를 작성하여야 한다.
  4. 작성시 반환값과 매개변수 목록이 포함된다.

체크답 : 1

올바른것으로 봤음.

 

오답. 틀릴리가 없음.

 

답 : 2

오버로딩이 가능하다. 수업시간에도 해봄


46. 32bit 운영체제에서 다음 코드를 실행했을 경우 변수 TextSize의 값은?

char MyString[] = "12삼45육";
int TextSize = sizeof(MyString);

답 : 12

문자열 에 대한 값에. 한글이 들어가 있음으로 각 문자당 2byte로 생각했음.

 

오답

문자 '만' 2byte 였음.

 

답 : 9

숫자 12 = 2byte

문자 삼 = 2byte

숫자 45 = 2byte

문자 육 = 2byte

끝값 '\0'= 1byte

로, 9byte 가 나타남.


47. 다음 프로그램을 실행하면 화면에 출력되는 값은?

#include <iostream>
class NPC
{
public:
	int HP = 100;
	int Power = 10;

	virtual void Attack(NPC& target)
	{
		target.Attacked(Power);
	}
	virtual void Attacked(int damage)
	{
		HP -= damage;
	}
};

class Monster : public NPC
{
public:
	int Skill = 10;
	int Defence = 5;

	virtual void Attack(NPC& target)
	{
		target.Attacked(Power + Skill);
	}
	virtual void Attacked(int damage)
	{
		HP -= (damage - Defence);
	}
};
int main()
{
	NPC npc;
	Monster monster;
	npc.Attack(monster);
	monster.Attack(npc);

	std::cout << npc.HP << monster.HP;
	return 0;
}

체크답 : 9085

연산실수함. 몬스터 HP와 npc HP의 순서를 햇갈림.

 

오답.

 

답 : 8095

 

연산순서 상.

npc.Attack이 이루어지면, target의 Attacked(this->Power) 이기 때문에, monster의 Attacked 가 실행되어.

monster의 HP -= npc.damage - monster.Defence 가 된다.

즉, monster 의 HP가 5만큼 깍임.

monster.HP = 95

 

monster.Attack(npc)가 이루어지면,

Monster.Attack이 이루어지면,  target의 Atacked(this -> Power + this -> Skill) 이기 때문에, 상속받은 Power 10과 Skill 10 이 더해져, 20이 넘어감.

npc의HP -= monster.Power + monster.Skill 이 된다.

npc.HP = 80

 

그럼으로, 8095 가 맞음.


48. 다음 프로그램을 실행하면 화면에 출력되는 값은?

#include <iostream>

int main()
{
	int arr[] = { 0, 2, 4, 8 };
	int* p;
	p = arr;

	std::cout << (*p)++;
	std::cout << *(p++);
	std::cout << p[1];

	return 0;
}

체크탑 : 124

증감연산의 연산순서를 고려하지 않음.

 

오답.

 

답 : 014

 

첫번째 출력

*p = 배열 p 의 첫번째 값. 0

0을 넘긴 후 1을 더해준다.

 

그럼으로 출력값은 0

 

두번째 출력

*(p++)

임으로, *p에 해당하는 값을 도출 후 넘겨준 다음 p에 ++해준다.

첫번째 출력에서 1을 더해주었음으로

 

출력값은 1

 

세번째 출력

p[1] 번째 값을 출력해야한다.

두번째 출력에서 p에 1을 더해주었음 으로, p = 1 두번째 값을 가리킨다.

여기서, p[1]임으로. p에서 1번 더 넘긴 값을 출력해야한다.

 

출력값은 4

 

그래서 014


50. 다음 프로그램을 실행하면 화면에 출력되는 값은?

#include <iostream>

int Func(int& a, int* b)
{
	a += 1;
	b += 1;
	return a + *b;
}

int main()
{
	int x = 1;
	int y[] = { 1, 2, 3, 4, 5 };
	int z = Func(x, y);

	std::cout << x << *y << z;

	return 0;
}

체크답 : 124

 

오답.

 

답 : 214

 

첫번째 출력

x = 1 이다. 그러나, 받아온 값이 원본값 임으로 Func에서 중첩연산을 하였기에 출력시 에는 x +=1 이 되어, 2가 된다.

출력 : 2

 

두번째 출력.

y = 배열로, 첫번째 값은 1 이다. Func에서 y에 +=1을 하더라도, 원본값 이 아닌, 함수내부값으로 받아오기에, 복사되어 가져온다. 그래서. main문 안의 y는 변동이 없다.

출력 1

 

세번째 출력.

z = Func의 반환값으로, a의 +1된 2, y의 +1된 2 가 더해져. 4가 된다.

출력 4

 

그래서 214가 나타난다.

 

728x90