C# 언어 소개 C#은 마이크로소프트가 개발한 현대적, 범용, 객체지향 프로그래밍 언어로 ECMA와 ISO 표준 승인을 받았습니다. 안데르스 헤일스버그 팀이 .NET Framework 개발 과정에서 만들었습니다. C#은 공통 언어 인프라(CLI)를 위해 설계되었으며, 실행 코드와 런타임 환경으로 다양한 고수준 언어가 여러 플랫폼/아키텍처에서 동작하게 합니다. C#이 널리 쓰이는 전문 언어인 이유 현대적 범용 프로그래밍 언어 객체지향 컴포넌트 지향 배우기 쉬움 구조화 언어 효율적인 프로그램 생성 다양한 플랫폼에서 컴파일 가능 .N
CGI란? CGI(Common Gateway Interface)는 웹 서버와 사용자 정의 스크립트 간 정보 교환 방식을 정의하는 표준 모음입니다. 현재 NCSA에서 관리하며, CGI는 HTTP 서버 같은 정보 서버와 외부 게이트웨이 프로그램이 인터페이스하는 표준으로 정의됩니다. 현재 버전은 CGI/1.1이며 CGI/1.2가 진행 중입니다. 웹 브라우징 과정 하이퍼링크를 클릭해 웹 페이지나 URL을 탐색할 때 일어나는 일: 브라우저가 HTTP 웹 서버에 연락해 URL(파일명) 요청 웹 서버가 URL을 파싱해 파일명 찾기. 파일이
멀티스레딩 개요 멀티스레딩은 멀티태스킹의 특수한 형태로, 멀티태스킹은 컴퓨터가 두 개 이상의 프로그램을 동시에 실행할 수 있게 하는 기능입니다. 멀티태스킹에는 프로세스 기반과 스레드 기반 두 가지 유형이 있습니다. 프로세스 기반 멀티태스킹: 프로그램들의 동시 실행을 관리 스레드 기반 멀티태스킹: 동일 프로그램 내 여러 조각의 동시 실행을 관리 멀티스레드 프로그램은 동시에 실행될 수 있는 두 개 이상의 부분을 포함하며, 각 부분을 스레드라고 하고 각 스레드는 별도의 실행 경로를 정의합니다. C++에는 멀티스레드 애플리케이션에 대한
시그널이란? 시그널은 운영체제가 프로세스에 전달하는 인터럽트로, 프로그램을 조기에 종료시킬 수 있습니다. UNIX, Linux, macOS, Windows에서 Ctrl+C를 누르면 인터럽트를 생성할 수 있습니다. 잡을 수 있는 시그널 목록 프로그램이 잡을 수 없는 시그널도 있지만, <csignal> 헤더에 정의된 다음 시그널들은 프로그램에서 잡아 적절한 조치를 취할 수 있습니다. 번호 시그널 및 설명 1 SIGABRT프로그램의 비정상적 종료, 예: abort() 호출 2 SIGFPE잘못된 산술 연산,
전처리기(preprocessors)는 실제 컴파일이 시작되기 전에 정보를 전처리하도록 컴파일러에 지시하는 지시자(directives)들입니다. 모든 전처리기 지시자는 #으로 시작하며, 한 줄에서 전처리기 지시자 앞에는 공백 문자만 올 수 있습니다. 전처리기 지시자는 C++ 문장이 아니므로 세미콜론(;)으로 끝나지 않습니다. 모든 예제에서 본 #include 지시자를 이미 접했습니다. 이 매크로는 헤더 파일을 소스 파일에 포함하는 데 사용됩니다. C++이 지원하는 전처리기 지시자는 #include, #define, #if, #else
템플릿(Template)은 제네릭 프로그래밍의 기초로, 특정 타입에 독립적인 방식으로 코드를 작성하는 것을 포함합니다. 템플릿은 제네릭 클래스나 함수를 생성하기 위한 청사진이나 공식입니다. 이터레이터와 알고리즘 같은 라이브러리 컨테이너들은 제네릭 프로그래밍의 예시이며 템플릿 개념으로 개발되었습니다. 예를 들어 vector 같은 각 컨테이너는 단일 정의가 있지만, vector<int>나 vector<string> 등 다양한 종류의 벡터를 정의할 수 있습니다. 함수와 클래스 모두 정의하는 데 템플릿을 사용할 수 있
같은 반에 자라(Zara)라는 이름을 가진 두 사람이 있다고 가정해 보세요. 이들을 구별하려면 이름 외에 추가 정보가 필요합니다. 예를 들어 사는 지역이 다르다면 지역을, 아니면 부모님 이름을 사용하겠죠. 같은 상황이 C++ 애플리케이션에서도 발생할 수 있습니다. 예를 들어 xyz()라는 함수가 있는 코드를 작성 중인데, 사용 가능한 다른 라이브러리에도 같은 함수 xyz()가 있습니다. 이제 컴파일러는 코드 내에서 어느 버전의 xyz() 함수를 참조하는지 알 수 없습니다. 네임스페이스(namespace)는 이 어려움을 극복하기 위해
C++에서 동적 메모리가 실제로 어떻게 작동하는지 잘 이해하는 것은 좋은 C++ 프로그래머가 되기 위해 필수적입니다. C++ 프로그램의 메모리는 두 부분으로 나뉩니다. 스택(the stack) − 함수 내부에서 선언된 모든 변수는 스택에서 메모리를 차지합니다. 힙(the heap) − 프로그램의 미사용 메모리로, 프로그램 실행 시 동적으로 메모리를 할당하는 데 사용할 수 있습니다. 많은 경우, 특정 정보를 정의된 변수에 저장하는 데 얼마나 많은 메모리가 필요할지 미리 알지 못하며, 필요한 메모리 크기는 런타임에 결정될 수 있습니
예외(exception)는 프로그램 실행 중에 발생하는 문제입니다. C++ 예외는 프로그램이 실행되는 동안 0으로 나누기 시도 같은 예외적 상황이 발생했을 때의 대응입니다. 예외는 프로그램의 한 부분에서 다른 부분으로 제어를 전달하는 방법을 제공합니다. C++ 예외 처리는 세 키워드 try, catch, throw를 기반으로 합니다. throw − 문제가 발생하면 프로그램이 예외를 던집니다. throw 키워드로 수행합니다. catch − 프로그램이 문제 처리를 원하는 지점에서 예외 처리기로 예외를 잡습니다. catch 키워드가 예
지금까지 iostream 표준 라이브러리를 사용해 cin과 cout 메서드로 표준 입력에서 읽고 표준 출력에 쓰는 방법을 다뤘습니다. 이 튜토리얼에서는 파일에서 읽고 쓰는 방법을 배웁니다. 이를 위해 fstream이라는 또 다른 표준 C++ 라이브러리가 필요하며, 이는 세 가지 새로운 데이터 타입을 정의합니다. 번호데이터 타입 및 설명 1ofstream출력 파일 스트림을 나타내며, 파일 생성과 파일에 정보 쓰기에 사용됩니다. 2ifstream입력 파일 스트림을 나타내며, 파일에서 정보 읽기에 사용됩니다. 3fstream일반적인 파
인터페이스(interface)는 특정 구현에 얽매이지 않고 C++ 클래스의 행동이나 능력을 기술합니다. C++ 인터페이스는 추상 클래스(abstract classes)를 사용해 구현되며, 이 추상 클래스는 데이터 추상화(구현 세부 사항을 관련 데이터로부터 분리하는 개념)와 혼동되어서는 안 됩니다. 최소 하나의 함수를 순수 가상(pure virtual) 함수로 선언하면 클래스는 추상 클래스가 됩니다. 순수 가상 함수는 선언에 = 0을 배치해 지정합니다. class Box { public: // 순수 가상 함수 virtu
모든 C++ 프로그램은 다음 두 가지 기본 요소로 구성됩니다. 프로그램 문장(code) − 프로그램이 행동을 수행하는 부분으로 함수라고 부릅니다. 프로그램 데이터 − 프로그램의 정보로, 프로그램 함수들에 의해 영향을 받습니다. 캡슐화(Encapsulation)는 데이터를 조작하는 데이터와 함수들을 묶고, 둘 다 외부 간섭과 오용으로부터 안전하게 지키는 객체 지향 프로그래밍 개념입니다. 데이터 캡슐화는 중요한 OOP 개념인 데이터 은닉(data hiding)으로 이어졌습니다. 데이터 캡슐화는 데이터와 이를 사용하는 함수들을 묶는
데이터 추상화(data abstraction)란 외부 세계에 필수 정보만 제공하고 배경 세부 사항을 숨기는 것, 즉 프로그램에서 필요한 정보를 표현하되 세부 사항은 제시하지 않는 것을 말합니다. 데이터 추상화는 인터페이스와 구현의 분리에 의존하는 프로그래밍(및 설계) 기법입니다. 현실 세계의 TV 예를 들어보세요. TV를 켜고 끄고, 채널을 바꾸고, 볼륨을 조절하고, 스피커, VCR, DVD 플레이어 같은 외부 부품을 추가할 수 있습니다. 하지만 내부 세부 사항, 즉 어떻게 공중파나 케이블로 신호를 수신하고, 어떻게 변환하며, 최종
다형성(polymorphism)이란 여러 형태를 가짐을 의미합니다. 일반적으로 다형성은 클래스 계층이 있고 상속으로 연결되어 있을 때 발생합니다. C++ 다형성은 멤버 함수 호출 시 해당 함수를 호출하는 객체 타입에 따라 다른 함수가 실행됨을 의미합니다. 기반 클래스가 다른 두 클래스로 파생된 다음 예제를 살펴보겠습니다. Live Demo #include <iostream> using namespace std; class Shape { protected: int width, height; public: S
C++은 동일한 범위에서 함수 이름이나 연산자에 대해 둘 이상의 정의를 지정할 수 있게 하며, 이를 각각 함수 오버로딩(function overloading)과 연산자 오버로딩(operator overloading)이라 부릅니다. 오버로드된 선언은 동일한 범위에서 이전에 선언된 선언과 같은 이름으로 선언되지만, 인자가 다르며 당연히 정의(구현)도 다릅니다. 오버로드된 함수나 연산자를 호출하면, 컴파일러는 함수나 연산자 호출에 사용된 인자 타입을 정의에 지정된 매개변수 타입과 비교해 가장 적절한 정의를 결정합니다. 가장 적절한 오버로
C/C++ 배열은 같은 종류의 데이터 항목 여러 개를 결합한 변수를 정의할 수 있게 하지만, 구조체(structure)는 다른 종류의 데이터 항목들을 결합할 수 있게 하는 또 다른 사용자 정의 데이터 타입입니다. 구조체는 레코드를 표현하는 데 사용됩니다. 도서관의 책들을 추적하고 싶다고 가정해 보세요. 각 책에 대해 다음 속성들을 추적하고 싶을 수 있습니다. 제목(Title) 저자(Author) 주제(Subject) 도서 ID(Book ID) 구조체 정의 구조체를 정의하려면 struct 문을 사용해야 합니다. struct 문은
C++ 표준 라이브러리는 적절한 날짜 타입을 제공하지 않습니다. C++은 날짜와 시간 조작을 위한 구조체와 함수를 C에서 상속받습니다. C++ 프로그램에서 날짜/시간 관련 함수와 구조체에 접근하려면 <ctime> 헤더 파일을 포함해야 합니다. 네 가지 시간 관련 타입이 있습니다: clock_t, time_t, size_t, tm. clock_t, size_t, time_t 타입은 시스템 시간과 날짜를 어떤 정수 형태로 표현할 수 있습니다. 구조체 타입 tm은 다음과 같은 요소를 가진 C 구조체 형태로 날짜와 시간을 보유합
참조 변수(reference variable)는 별명(alias), 즉 이미 존재하는 변수의 또 다른 이름입니다. 한 번 변수로 참조가 초기화되면, 변수 이름이나 참조 이름 중 어느 것을 사용해도 해당 변수를 가리킬 수 있습니다. 참조 vs 포인터 참조는 종종 포인터와 혼동되지만, 참조와 포인터 사이에는 세 가지 주요 차이점이 있습니다. NULL 참조는 가질 수 없습니다. 참조가 항상 합법적인 저장소에 연결되어 있다고 가정할 수 있어야 합니다. 한 번 객체로 초기화된 참조는 다른 객체를 가리키도록 변경할 수 없습니다. 포인터는
C++은 다음과 두 가지 문자열 표현 방식을 제공합니다. C-스타일 문자열 표준 C++과 함께 도입된 string 클래스 타입 C-스타일 문자열 C-스타일 문자열은 C 언어에서 유래했으며 C++에서도 계속 지원됩니다. 이 문자열은 실제로는 null 문자 \0로 끝나는 1차원 문자 배열입니다. 따라서 null-종료 문자열은 문자열을 구성하는 문자들에 이어 null 문자가 뒤따릅니다. 다음 선언과 초기화는 Hello라는 단어로 이루어진 문자열을 생성합니다. 배열 끝에 null 문자를 담기 위해, 문자열을 담는 문자 배열의 크기는
보통 숫자를 다룰 때 int, short, long, float, double 같은 기본 데이터 타입을 사용합니다. 숫자 데이터 타입과 가능한 값, 범위는 C++ 데이터 타입 논의 시 설명했습니다. C++에서 숫자 정의 이전 장의 여러 예제에서 이미 숫자를 정의했습니다. 여기 C++에서 다양한 타입의 숫자를 정의하는 또 다른 종합 예제가 있습니다. Live Demo #include <iostream> using namespace std; int main () { // 숫자 정의: short s;
C 언어