Tag Archives: 프로그래밍

C# 6.0 완벽 가이드/ 고급 C#

대리자

  • 대리자(delegate)는 어떤 메서드를 호출하는 방법을 담은 객체
  • 대리자 형식은 그 형식의 인스턴스, 즉 대리자 인스턴스가 호출할 수 있는 종류의 메서드를 정의한다.
  • 메서드를 대리자 변수에 배정하면 대리자 인스턴스가 생성된다.
  • 대리자 인스턴스는 이름 그대로 호출자의 대리자 역할을 한다. 즉, 호출자가 대리자를 호출하면 대리자가 대상 메서드를 대신 호출해 준다. 이러한 간접 호출에 의해, 호출자와 대상 메서드 사이의 결합(coupling)이 끊어진다.
// 다음과 같은 문장은
Transformer t = Square;

// 다음 문장을 줄여 쓴 것이다.
Transformer t = new Transformer(Square);

// 한편 다음과 같은 표현식은
t(3);

// 다음을 줄여 쓴 것이다.
t.Invoke(3);

Continue reading

C# 6.0 완벽 가이드/ C#의 사용자 정의 형식

클래스

메서드

메서드에 적용할 수 있는 수정자들

정적 수정자 static
접근 수정자 public, internal, private, protected
상속 수정자 new, virtual, abstract, override, sealed
부분 메서드 수정자 partial
비관리 코드 수정자 unsafe, extern
비동기 코드 수정자 async

식 본문 메서드 (C# 6)

int Foo (int x) { return x * 2; }

int Foo (int x) => x * 2; // 위 코드와 동일

void Foo (int x) => Console.WriteLine(x); // 반환형이 void인 함수도 이런 식으로 사용할 수 있다.
  • 위의 코드와 같이 표현식이 본문인 메서드(expression-bodied method)를 줄여서 식본문 메서드라고 부른다. 중괄호와 return 키워드 대신 ‘이중 화살표’가 쓰였다.

Continue reading

C# 6.0 완벽 가이드/ C# 언어의 기초

첫 번째 C# 프로그램

컴파일

  • C# 컴파일러는 확장자가 .cs인 일단의 소스코드 파일들을 컴파일해서 하나의 어셈블리를 생성한다. 어셈블리는 .NET 프로그램 패키징 및 배포 단위이다. 어셈블리는 응용 프로그램(application)일 수도 있고 라이브러리(library)일 수도 있다.
  • 보통의 콘솔 또는 Windows 응용 프로그램은 진입점 Main 메서드를 가지고 있으며 파일 확장자는 .exe이다. 라이브러리의 확장자는 .dll이며, .exe와는 달리 진입점이 없다. 라이브러리의 주된 용도는 라이브러리 안의 코드를 다른 응용 프로그램이나 다른 라이브러리가 호출 또는 참조하는 것이다. .NET Framework는 라이브러리들의 집합이다.
  • C# 컴파일러 프로그램의 이름은 csc.exe이다. C# 프로그램은 Visual Studio 같은 IDE로 컴파일 할 수도 있고, 명령줄에서 csc를 직접 실행해서 컴파일 할 수도 있다.
csc MyFirstProgram.cs // 응용 프로그램 컴파일
csc /target:library MyFirstProgram.cs // 라이브러리 컴파일

구문

키워드와의 충돌 피하기

  • 예약된 키워드에 해당하는 식별자를 꼭 사용해야 한다면 식별자 앞에 접두사 @를 붙이면 된다.
    • @ 기호는 식별자 자체의 일부로 간주되지 않는다. 즉, @myVariable은 myVariable과 같다.
    • 접두사 @는 C#과는 다른 키워드들을 가진 다른 .NET 언어로 작성된 라이브러리를 C# 프로그램에서 사용할 때 유용할 수 있다.

Continue reading

C# 6.0 완벽 가이드/ C#과 .NET Framework 소개

(필요한 부분만 정리)

C#과 CLR의 관계

  • C#은 자동 메모리 관리와 예외 처리 같은 다양한 기능을 갖춘 런타임에 의존한다. C#의 설계는 해당 실행시점 기능들을 제공하는 Microsoft CLR의 설계와 밀접하게 대응된다.(비록 기술적으로는 C#이 CLR과 독립적이지만) 게다가 C#의 형식 체계는 CLR의 형식 체계와 밀접하게 대응된다.

CLR과 .NET Framework

  • .NET Framework는 CLR과 아주 다양한 라이브러리들의 집합으로 구성되어 있다. 그 라이브러리 집합에는 핵심 라이브러리들과 그 핵심 라이브러리들에 의존하는 응용 라이브러리들이 있다.
  • CLR은 관리되는 코드(managed code)를 실행하기 위한 런타임이다. C#은 여러 관리되는 언어(managed language) 중 하나인데, 관리되는 언어로 작성한 소스 코드를 컴파일하면 관리되는 코드가 생성된다. 관리되는 코드를 실행 파일(.exe) 또는 라이브러리(.dll) 형태로 만들고 그것을 형식 정보, 즉 메타자료(metadata)와 함께 하나의 패키지로 묶은 것을 어셈블리(assembly)라고 부른다.
  • 관리되는 코드는 중간 언어(intermediate language, IL)로 표현된다. 어셈블리를 적제(load)할 때 CLR은 어셈블리에 담긴 IL 코드를 해당 컴퓨터(x86 등) 고유의 기계어 코드로 변환한다. 이러한 변환을 담당하는 것이 CLR의 JIT(just-in-time) 컴파일러이다. 어셈블리는 원래의 원본 언어의 구성을 거의 그대로 유지하기 때문에 코드를 조사하기 쉽고 심지어 동적으로 생성하기도 쉽다.
    • ILSpy나 dotPeek, Reflector 같은 도구를 이용하면 IL 어셈블리의 내용을 조사하고 역컴파일 할 수 있다.
  • CLR은 여러 실행시점 서비스들의 호스트 역할을 한다. 그런 서시브들로는 이를테면 메모리 관리, 라이브러리 적재, 보안 서비스 등이 있다. CLR은 언어 중립적이므로 여러 언어(C#, F#, Visual Basic, .NET, Managed C++ 등)로 응용 프로그램을 개발하는 것이 가능하다.

Continue reading

C++로 쉽게 풀어쓴 자료구조/ 탐색

탐색이란?

컴퓨터 프로그램에서 탐색은 하나 이상의 필드(field)로 구성되는 레코드(record)의 집합에서 원하는 레코드를 찾아내는 작업이다. 보통 이러한 레코드들의 집합을 테이블(table)이라 부른다. 레코드들은 서로 중복되지 않고 고유한 값을 가지는 키를 가지는데, 이것을 탐색키(search key)라 부른다.

맵이란?

맵은 탐색을 위한 자료구조이다. 맵(map) 또는 사전(dictionary)은 자료를 저장하고 키를 이용해 원하는 자료를 빠르게 찾을 수 있도록 하는 자료구조를 말한다. 맵은 키를 가진 레코드(keyed record) 또는 엔트리(entry)라 불리는 키-값 쌍(key, value)을 테이블에 저장한다. 이때 각 키는 유일하고 맵에 저장되는 키와 값은 어떠한 자료형도 가능하다.

키를 가진 레코드의 추상 자료형은 다음과 같다.

  • 객체
    • 키(key)와 값(value)을 가진 요소 (key, value)의 집합
  • 연산
    • create(key, value): 주어진 key와 value를 각각 키와 값으로 갖는 레코드를 생성한다.
    • getKey(): 레코드의 키를 반환한다.
    • getValue(): 레코드의 값을 반환한다.
    • update(value): 레코드의 값을 value로 변경한다.

맵의 추상 자료형은 다음과 같다.

  • 객체
    • 유일한 키를 가진 엔트리(키를 가진 레코드)의 집합
  • 연산
    • create(): 공백 상태의 맵을 생성한다.
    • search(key): 테이블에서 주어진 탐색키 key를 가진 레코드를 찾아 반환한다.
    • insert(entry): 테이블에서 주어진 entry를 삽입한다.
    • delete(key): 테이블에서 주어진 탐색키 key를 가진 레코드를 찾아 삭제한다.
    • count(): 테이블의 모든 레코드 수를 반환한다.

맵을 구현하는 가장 간단한 방법은 배열일 것이다. 그러나 맵의 탐색 성능을 향상하고자 한다면 이진 탐색 트리와 같은 보다 효율적인 자료구조를 사용해야 한다.

Continue reading

C++로 쉽게 풀어쓴 자료구조/ 정렬

정렬이란?

정렬(sorting)은 물건을 크기순으로 오름차순(ascending order)이나 내림차순(descending order)으로 나열하는 것을 말한다.

일반적으로 정렬시켜야 될 대상은 레코드(record)라고 불린다. 레코드는 다시 필드(field)라고 하는 보다 작은 단위로 나누어진다. 예컨대 학생들의 레코드에는 이름, 학번, 주소, 전화번호 등이 필드가 될 것이다. 여러 필드 중에서 특별히 레코드와 레코드를 식별해주는 역할을 하는 필드를 키(key)라고 한다. 학생들의 레코드의 경우에는 학번이 키가 될 수 있다.

정렬 알고리즘의 분류

정렬 알고리즘은 다음의 2가지 그룹으로 나눌 수 있다.

  • 단순하지만 비효율적인 방법 – 삽입 정렬, 선택 정렬, 버블 정렬 등
  • 복잡하지만 효율적인 방법 – 퀵 정렬, 힙 정렬, 합병 정렬, 기수 정렬 등

정렬 알고리즘을 내부 정렬(internal sorting)과 외부 정렬(external sorting)으로 구분할 수도 있다. 내부 정렬은 정렬하기 전에 모든 데이터가 메인 메모리에 올라와 있는 정렬을 의미한다. 반면 외부 정렬은 외부 기억장치에 대부분의 데이터가 있고 일부만 메모리에 올려놓은 상태에서 정렬하는 방법이다. 여기서는 내부 정렬만을 다루기로 한다.

Continue reading

C++로 쉽게 풀어쓴 자료구조/ 가중치 그래프

가중치 그래프란?

간선에 비용이나 가중치가 할당된 그래프를 가중치 그래프(weighted graph)라고 한다.

가중치 그래프는 수학적으로는 G = (V, E, w)와 같이 표현된다. V(G)는 그래프 G의 정점들의 집합을, E(G)는 그래프 G의 간선들의 집합을 의미하고, w(e)는 간선 e의 강도(weight), 비용(cost), 또는 길이(length)라고 부른다. 어떤 가중치 그래프의 경로를 p = (v0, v1, v2, … vk)라고 한다면 경로의 강도 w(p)는 다음과 같이 경로 상의 모든 간선의 강도 합으로 표현된다.

가중치 그래프의 표현

가중치의 표현

가중치 그래프의 클래스에서는 인접 행렬을 약간 다른 용도로 사용해야 한다. 인접 행렬의 값을 간선의 유무가 아니라 간선의 가중치를 직접 나타내게 하면 가중치 그래프를 나타낼 수 있다.

그러나 이 경우 간선의 유무를 판단하기 어려워지는데, 이런 경우에는 간선의 유효 범위를 넘어서는 값을 지정하여 –예컨대 999999– 그 값 이상이 되면 간선이 없는 경우로 판단하여 처리하는 방법이 있다.

Continue reading

C++로 쉽게 풀어쓴 자료구조/ 그래프

그래프란?

그래프는 요소들이 서로 복잡하게 연결되어 있는 관계를 표현하는 자료구조이다.

그래프의 역사

그래프는 오일러에 의해 처음 창안되었다. 오일러는 ‘모든 다리를 한번만 건너서 출발했던 장소로 돌아올 수 있는가’라는 문제가 답이 없다는 것을 그래프 이론을 이용하여 증명하였다. 오일러는 이 문제의 핵심은 ‘A, B, C, D의 위치가 어떠한 관계로 연결되었는가?’라고 생각하고 ‘위치’라는 객체는 정점(vertex)로, 위치간의 관계인 ‘다리’는 간선(edge)로 표현하여 그래프 문제로 변환하였다. 오일러는 그래프에 존재하는 모든 간선을 한번만 통과하면서 처음 정점으로 되돌아오는 경로를 오일러 경로(Eulerian tour)라 정의하고, 그래프의 모든 정점에 연결된 간선의 개수가 짝수일 때만 오일러 경로가 존재한다는 오일러의 정리를 증명하였다.

그래프는 정점(vertex)과 간선(edge)들의 집합으로 구성된다. 수학적으로는 G = (V, E)와 같이 표시한다. 여기서 V(G)는 그래프의 G의 정점들의 집합을, E(G)는 그래프 G의 간선들의 집합을 의미한다. 정점은 여러 특성을 가질 수 있는 객체를 의미하고, 간선은 이러한 객체 정점들 간의 관계를 의미하는데, 정점 A와 정점 B를 연결하는 간선은 (A, B)와 같이 정점의 쌍으로 표현한다. 정점은 노드(node)라고 불리며, 간선은 링크(link)라고도 불린다.

Continue reading

C++로 쉽게 풀어쓴 자료구조/ 우선순위 큐

우선순위 큐

우선순위 큐란?

도로에서 먼저 진입하는 차가 먼저 가게 되지만, 만일 구급차나 소방차가 나타나면 모든 자동차들은 이러한 긴급 차량을 위하여 도로를 양보해야 한다. 이러한 긴급 차량들은 도로 교통법에 의하여 높은 우선순위(priority)를 갖고 있기 때문이다. 컴퓨터에서도 우선순위 개념이 필요할 때가 있는데, 네트워크 패킷 중에서 네트워크 관리와 관련된 것들은 다른 일반 패킷보다 우선순위를 가진다.

우선순위 큐는 바로 이러한 우선순위의 개념을 큐에 도입한 자료구조이다.보통의 큐는 선입선출(FIFO)의 원칙에 의하여 먼저 들어온 데이터가 먼저 나가게 되는데 우선순위 큐(priority queue)는 데이터들이 우선순위를 가지고 있어 우선순위가 높은 데이터가 먼저 출력된다.

우선순위 큐는 사실 가장 일반적인 큐로 볼 수 있는데, 우선순위 큐를 이용하여 스택이나 큐도 얼마든지 구현할 수 있기 때문이다. 예컨대 데이터가 들어온 시각이 빠른 것을 높은 우선순위로 처리하면 큐처럼 동작하고, 늦게 들어온 것을 높은 우선순위로 처리하면 스택으로 사용할 수 있다.

우선순위 큐는 배열, 연결 리스트 등 여러 방법으로 구현이 가능하지만 가장 효율적인 구조는 힙(heap)이다.

Continue reading

C++로 쉽게 풀어쓴 자료구조/ 이진 탐색 트리

이진 탐색 트리

탐색이란?

컴퓨터 프로그램에서 탐색은 레코드(record)의 집합에서 특정한 레코드를 찾아내는 작업을 의미한다.

레코드는 하나 이상의 필드(field)로 구성된다. 예컨대 학생의 레코드는 이름, 주소, 주민등록번호 등의 필드들로 이루어진다. 일반적으로 레코드들의 집합을 테이블(table)이라고 한다.

레코드들은 보통 키(key)라고 불리는 하나의 필드에 의해 식별할 수 있다. 키는 서로 중복되지 않는 고유한 값을 가지는데, 키를 사용하면 각각의 레코드들을 구별할 수 있다. 이러한 키를 주요키(primary key)라고 한다.

Continue reading