분류 전체보기(37)
-
Lenovo X1 Carbon 4th 리튬전지 및 배터리 교체
얼마 전 여자친구가 남동생이 온라인으로 강의를 들어야 해서 남는 노트북이 있는지 물어봤습니다. 그때 전 2년 전에 지인에게 받은 Lenovo 노트북이 생각났습니다. 리눅스 컴파일 용도로 사용하던 노트북이었는데 강의만 듣는 것이라면 충분할 것이라 생각하고 그 남동생에게 선물해 주기로 마음먹었습니다. 그런데 집에 와서 확인해 보니 이 노트북 평범한 상태가 아니었습니다. 제가 이 노트북을 잊은 사이 총 2가지의 큰 문제가 생겼었습니다. 첫 번째 문제. 리튬전지 방전 처음 전원을 연결하고 부팅하니 비프음과 함께 위 에러가 발생했습니다. 말 그래로 BIOS의 날짜/시간 설정을 다시 하라는 뜻인데, 이 설정이 초기화 됐다는 뜻은 노트북 안에 있는 리튬전지가 방전되었다고 예상해 볼 수 있습니다. 이런 식으로 시간 ..
2025.03.17 -
Windows 프로세스 생성과 소멸
이 글은 윤성우 님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다.프로세스의 구성요소는 무엇일까요. 프로그램이 메모리에 할당되니, 메모리는 구성요소에 포함될 것입니다. 그리고 책에서는 레지스터도 프로그램의 구성요소로 취급합니다. 왜냐하면 프로세스를 실행하기 위해서는 레지스터의 값을 저장하고 불러와야 할 수 있기 때문입니다. 우선 프로세스의 메모리 구조를 확인해 보겠습니다. Process memory structureLow Address...CODEDATABSSHEAPUnused MemorySTACK...High Address CODE: 실행된 프로그램의 코드가 저장되는 공간, 함수와 메서드가 여기에 존재하며, 읽기 전용으로 컴파일 타임에 영역의 크기가 정해집니다.DATA: ..
2025.03.15 -
레지스터와 명령어 구조
이 글은 윤성우님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다. 지난번 컴퓨터의 구조를 공부하며 CPU가 명령어를 실행하는 Fetch, Decode, Excute 단계들을 배웠습니다. 그리고 32/64비트 시스템 컴퓨터에서 비트는 데이터 한번에 처리할 수 있는 최대양 이란 것을 알게되었습니다. 이번에는 더 나아가 32/64비트 시스템에서 CPU가 레지스터를 통해 어떻게 명령어를 실행하는지 알아보겠습니다. 명령어 구조초기 개인 컴퓨터는 16비트 시스템을 사용하였습니다. 그래서 16비트 시스템에서는 데이터를 한번에 처리하기 위해 명령어의 구조를 16비트로 구성하였습니다. 그래서 16비트 명령어를 WORD(unsigned short)라고 부르게 되었고, 32비트 시스템에서는 Do..
2025.03.14 -
C# 입출력 작업
이 글은 박상현 님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다. System.IO는. NET에서 제공하는 파일 및 데이터 스트림 등을 지원하는 네임스페이스입니다. 저희는 여기에 선언된 객체들을 통해 C# 코드에서 파일 및 디렉터리 작업을 수행할 수 있습니다. File, FileInfo, Directory, DirectoryInfoC#에서 파일과 디렉터리를 다룰 때 사용하는 주요 클래스들입니다. 이름에서 알 수 있듯이 File과 FileInfo는 파일을 다룰 수 있는 클래스이며, Directory와 DirectoryInfo는 디렉터리를 다루는 클래스입니다. 그리고 File과 Directory는 정적 메서드를 통해 파일과 디렉터리 작업을 지원하여 간단하게 사용할 수 있습니다. 반대로 FileI..
2025.03.09 -
C++ 스마트 포인터, unique_ptr, shared_ptr, weak_ptr
이 글은 이재범 님의 '모두의 코드'에서 '씹어먹는 C++ 13장'을 참고하여 공부한 내용입니다. 처음 게임 서버 개발자 면접을 봤을 때가 생각납니다. 그때 질문 중 하나로 스마트 포인터에 대해 설명하는 것이었고, 저는 "자세히는 모르겠습니다. 단지 자원의 할당과 해제를 자동적으로 해주는 요소로 알고 있습니다."라고 대답했습니다. 요즘 공부하고 보니 나는 정말 아는 것이 없구나 느낍니다. C와 C++은 자원 관리를 수동으로 하기에 개발자는 신경 쓸 일이 더 많습니다. 거기에 게임 서버의 경우 메모리 관리가 잘못되면 메모리 부족으로 모든 서비스가 다운될 수도 있는 치명적인 문제를 발생시킬 수 있습니다. 하지만 대규모 작업을 여러 개발자들과 협업하게 되면 자원 관리는 더더욱 힘들어질 것입니다. 그런 문제를 ..
2025.03.05 -
C# dynamic
이 글은 박상현님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다. 대부분의 컴파일러는 최적화를 위해 컴파일 타임에 모든 데이터 형식이 결정되어 바뀌지 않습니다. C#에서는 var를 사용해도 컴파일 타임에 컴파일러가 추론하여 올바른 데이터 형식을 결정하는 것 처럼 말이죠. 그래서 확정된 데이터 형식 덕분에 컴파일된 코드 부분은 오류가 발생하지 않고 더 빠른 속도로 작업을 처리할 수 있습니다. 그런데 컴파일 타임에 데이터 형식을 결정하지 않고 런타임에 결정되는 데이터 형식이 있습니다. Dynamic앞서 말한 런타임에 데이터 타입이 결정되는 데이터 형식 입니다. 컴파일러는 dynamic 형식에 대한 타입 검사를 하지 않으며, 관련된 모든 메서드 호출과 연산들은 런타임에 확인됩니다.class MyCl..
2025.03.05 -
C++ std::move 그리고 std::forward
이 글은 이재범 님의 '모두의 코드'에서 '씹어먹는 C++ 12장'을 참고하여 공부한 내용입니다.C에서 사용하던 값은 크게 2가지로 분류할 수 있었습니다.int a = 3; 대입 연산자를 기준으로 좌측에 잇는 값을 좌측값, 우측에 있는 값을 우측값으로 구분하였습니다. 좌측값은 보이는 그대로 값을 담을 수 있는 공간을 가진 변수로 주소를 가지고 있는 게 특징입니다. 우측값은 위 3과 같이 위 표현식이 끝나면 사라지는 값으로, 주소를 가질 수 없는 값을 말합니다. 하지만 현대의 C++의 값에는 위 범주를 포함한 5가지 분류가 있습니다. Generalized Lvalue, glvalue이 유형은 주소를 구할 수 있는 값으로, 주소연산자 &를 통해 주소를 알 수 있는 특징이 있습니다. 그리고 아래에서 설명할 x..
2025.03.04 -
Windows 32/64비트 시스템
이 글은 윤성우님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다. CPU가 데이터를 처리하기 위해 Bus Interface를 사용하여 메모리와 데이터를 송수신 합니다. 이때 한번에 송수신할 수 있는 데이터 크기에 따라 32비트, 64비트 시스템으로 나뉘게 됩니다. 그리고 그 데이터를 한번에 처리할 수 있는 크기를 뜻하기도 합니다. 그래서 64비트 시스템은 한번에 64비트를 받아 처리할 수 있는 시스템이라는 것 입니다. 메모리 주소32/64비트 시스템은 메모리 주소와 밀접한 관련이 있습니다. 운영체제는 실제 메모리에 주소를 할당하여 해당 메모리에 접근하여 사용할 수 있게 해줍니다. 이때 메모리의 주소의 범위는 시스템에 따라 32/64비트로 표현됩니다. 그래서 32비트에서는 사용..
2025.02.26 -
C# 애트리뷰트
이 글은 박상현님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다. 저희는 코드로 담을 수 없는 부가정보를 주석을 통해 표현합니다. 사람의 경우에는 이 주석을 통해 코드의 자세한 사용법을 익히거나 동작을 예상할 수 있을 겁니다. 하지만 주석은 컴파일 타임에 무시되어 런타임에서는 확인할 수 없습니다. 그렇다면 컴파일타임 혹은 런타임중에 부가정보를 전달할 수 있는 방법은 없을까요? 애트리뷰트, Attribute 클래스, 메소드, 구조체, 프로퍼티 등과 같은 요소에 추가적인 메타데이터를 제공하는 기능입니다. 애트리뷰트를 사용하면 컴파일타임 혹은 런타임에 특정동작을 수행할 수 있습니다. 대표적인 애트리뷰트로는 Obsolete가 있습니다.using System;class Program{ [Obsol..
2025.02.25 -
C# 리플렉션
이 글은 박상현님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다. 제가 생각하는 컴파일타임과 런타임의 차이는 정적과 동적으로 구분됩니다. 컴파일타임은 최적화를 위해 정적인 요소를 확정 짓는다고 생각합니다. 매크로, 스택 메모리 크기, 자료형 등 변하지 않는 값들은 확정되어 프로그램의 동작에 최적화와 안정성을 보장합니다. 그리고 런타임은 프로그램의 실행을 뜻하며, 사용자의 입력 등으로 변하는 동적값들이 런타임에 사용되어 사용자가 원하는 작업을 처리할 수 있게 해줍니다. 그렇다면 런타임에 사용자의 요청으로 컴파일타임에 확정되었을 클래스와 메서드의 구조를 새롭게 생성하는 것은 가능할까요? 리플렉션, ReflectionRuntime에서 객체의 정보를 확인 및 조작 할 수 있는 기능을 뜻합니다. 이 기..
2025.02.23