전체 글
C 언어와 C++ 의 차이
안녕하세요 피터입니다. 많은 분들이 C 언어를 배우고 나서 C++ 를 배우기 시작 할 때 어려움을 겪곤 합니다. 제 주변에도 그런 분들이 있어서 어떤 점 때문에 어려운지 물어봤더니 어디서부터 어떻게 시작해야 될 지 모르겠다는 답변이 가장 많았습니다. 어쩌면 당연한 일인지도 모르겠습니다. 비교적 간단한 문법 체계를 갖고 있는 C 언어와 달리 C++ 은 굉장히 다양한 패러다임이 녹아있으며 방대한 스케일을 자랑하는 언어이기 때문입니다. (물론 그렇다고 해서 C 언어가 가볍고 만만한 프로그래밍 언어라는 말은 아닙니다. 오히려 그 반대로 처음엔 쉬워보이지만 알면 알수록 어려워지는 언어입니다. C 언어는 역사가 긴 만큼 괴수 분들이 많이 서식하고 계십니다 :D) 그래서 우선은 C 언어와 C++ 두 언어가 어떤 부분..
[Linux] nohup 세션이 끊겨도 계속 실행되도록 해보자
개요 nohup 명령어는 리눅스에서 프로세스를 실행한 터미널의 세션 연결이 끊어지더라도 지속적으로 동작 할 수 있게 해주는 명령어입니다. 기본적으로 터미널에서 세션 로그아웃(logout)이 발생하면 리눅스는 해당 터미널에서 실행한 프로세스들에게 HUP signal 이 전달하여 종료시키게 되는데, 이 HUP signal을 프로세스가 무시(ignore)하도록 하는 명령어라서 nohup 이라는 이름인 것입니다. 그래서 결과적으로 터미널에서 연결이 끊기거나 터미널을 종료해도 실행했던 프로세스들이 계속 실행될 수 있는 것입니다. 또한 nohup 명령어는 표준 출력(standard output)을 nohup.out 파일로 재지향(redirection) 합니다. 터미널이 종료되어도 표준 출력은 nohup.out 파일..
[bash 쉘 스크립트] 변수 할당(assignment)과 치환(substitution)
개요 안녕하세요 피터입니다. 오늘은 Bash 쉘 스크립트에서 사용되는 변수(variable)에 대해서 설명드리겠습니다. 변수는 모든 프로그래밍 언어와 스크립트 언어에서 핵심적인 기능을 합니다. 데이터를 조작하기 위한 연산이나 문자열을 파싱(parsing)하는데 있어서 없어서는 안될 꼭 필요한 존재입니다. 변수는 단지 데이터를 담고 있는 메모리상의 위치를 나타내는데 어떤 변수에 어떤 데이터가 담겨있는지 쉽게 알 수 있게 이름을 붙여놓은 것입니다. 변수 할당(assignment) 데이터를 담는 공간인 변수를 사용하려면 먼저 변수를 할당(assignment) 해야 합니다. 변수는 할당 연산자 = 를 사용해서 할당합니다. a=100 b="hello" 주의 해야 할 것은 할당 연산자 앞뒤로 공백이 없어야 한다는 ..
[객체지향] Object-Oriented Programming 핵심 개념의 이해
배경 데이터 흐름(Flow)에 기반한 절차지향적 프로그래밍 방법은 복잡한 로직을 갖는 큰 규모의 소프트웨어 개발에는 적합하지 않습니다. 하드웨어 성능이 폭발적으로 성장하면서 요구되어지는 소프트웨어는 점점 복잡해지고 거대해졌는데 기존의 전통적인 절차지향 개발 방법 으로는 소프트웨어를 설계 및 구현하는데 많은 어려움이 생긴 것이죠. (사실 소프트웨어 공학 - software engineering 이라는 개념도 생소할 시기였습니다) 이러한 문제를 해결하기 위해 프로그램을 함수(procedure) 단위로 나누어 구조화하는 구조적 프로그래밍 방법이 대두되었는데, 상위로부터 하위로 쪼개나가는 방식이기 때문에 Top-Down 방식이라고도 합니다. 하지만 함수는 데이터를 처리하는 부분은 구조화할 수 있었지만 데이터는 ..
[Linux] kill 프로세스를 '안전하게' 종료시켜보자
개요 kill 명령어는 이름 때문에 프로세스를 강제로 종료시키는 명령어로 오해를 사기 쉬운데 실제로는 프로세스에 시그널(signal)을 보내는 명령어입니다. 이름이 kill 인 이유는 어떤 시그널을 보낼 지 지정하지 않으면 기본적으로 SIGTERM 시그널을 보내게 되는데 SIGTERM의 기본 동작이 프로그램 종료이기 때문입니다. 물론 프로세스에 SIGKILL 시그널을 보내 강제로 종료시킬 수도 있습니다. 그렇지만 일반적인 상황에서 SIGKILL 시그널을 보내는 것은 권장되지 않습니다. 본래 프로그램을 설계 할 때 대부분의 경우 종료 시그널을 받았을 때 처리하고 있던 데이터가 안전하게 정리 될 수 있도록 설계합니다. SIGTERM, SIGINT 등의 종료 시그널에 대해 시그널 핸들러(handler)를 등록..
[Linux] ps 로 실행 중인 프로세스 확인하기
개요 ps 명령어는 리눅스에서 현재 실행중인 프로세스를 확인하는 명령어 입니다. Process Status에서 따온 이름이죠. 이름 그대로 명령어를 실행하면 현재 실행되고 있는 프로세스들의 정보를 화면에 출력합니다. 윈도우에서 특정 프로세스가 실행 중인지 확인하거나 강제 종료하기 위해 작업 관리자를 사용하듯이 리눅스에서는 ps 명령어가 자주 사용됩니다. 특히 GUI를 사용하지 않는 서버 환경에서는 대부분의 프로세스들이 백그라운드에서 동작하기 때문에 특정 프로세스가 동작 중인지 확인하기 위해서 많이 쓰입니다. bash 스크립트(script)를 통한 자동화에도 ps 명령어가 자주 사용되는데요. 주로 특정 프로세스에 시그널(signal)을 보내야 할 때 PID(process id)를 식별하기 위해서 쓰이기도 ..
[C#] 프로젝트에 log4net 적용하기
개요 안녕하세요 피터입니다. 오늘은 C# 프로젝트에 log4net 라이브러리를 통해 로그 시스템(log system)을 적용하는 방법을 알려드리겠습니다. 프로젝트를 진행하다 보면 로그 시스템이 절실할 때가 있습니다. 특정 상황에서 에러가 발생하는데 어떤 절차에 의해 실행하면 에러가 발생하는지 추적이 어려울 때가 바로 그런 경우입니다. 또한 개발을 진행할 때에는 세부적이고 자세한 로그를 기록하는 것이 도움이 되지만 실제로 사용자가 프로그램을 쓸 때에는 중요한 내용만 기록하는 것이 더 도움이 됩니다. 이런 이유로 상황에 따라 어떤 수준의 로그를 기록할지 손쉽게 설정할 수 있는 로그 시스템이 필요합니다. C# 프로젝트에서는 log4net 라이브러리를 통해 이러한 기능을 쉽게 구현 할 수 있습니다. 로그시스템 ..
[Vim] 대소문자 변경하기
개요 안녕하세요 피터입니다. 오늘은 vim에서 대문자 또는 소문자로 일괄적으로 변경하는 방법에 대해서 알려드리겠습니다. 전체적으로 대문자 또는 소문자로 변경하는 것도 가능하지만 대문자인 것은 소문자로 소문자인 것은 대문자로 반전(inverse)하는 것도 가능합니다. vim 에서 대소문자를 변경하는 방법은 크게 두 가지가 있습니다. 첫 번째는 일반 모드에서 명령어를 입력해서 변경하는 방법이고, 두 번째는 비주얼 모드에서 영역을 지정하고 변경하는 방법입니다. 일반 모드 일반 모드에서 대소문자를 변경하는 명령어는 아래와 같습니다. Command Description Examples gU 에 해당하는 범위의 문자를 대문자로 변경 gUU : 현재 라인 전체 대문자로 변경 gUw : 현재 커서부터 단어의 끝까지 대..