Category Archives: 배우기

C# 6.0 완벽 가이드/ 동시성과 비동기성

소개

  • 동시성이 필요한 상황은 대부분 다음 네 범주 중 하나에 속한다.
    • 반응성 좋은 UI 작성
    • 다수의 요청을 동시에 처리
    • 병렬 프로그래밍
    • 예측 실행
  • 현재의 컴퓨터 구조에서 프로그램은 다중 스레드 적용(multithreading)이라고 부르는 일반적인 메커니즘을 이용해서 여러 작업을 동시에 실행한다. 이중 스레드 적용은 동시성의 근본 개념 중 하나이며 CLR과 운영체제 모두 다중 스레드 적용을 지원한다. 따라서 동시적인 프로그램을 만들려면 스레드 적용의 기초, 특히 스레드들이 공유 상태에 미치는 영향을 이해하는 것이 꼭 필요하다.

스레드 적용

  • 스레드는 독립적인 실행 흐름 또는 실행 경로이다. 한 스레드의 코드는 다른 모든 스레드와는 독립적으로 진행된다.
  • 각 스레드는 운영체제의 한 프로세스 안에서 실행된다. 프로세스는 프로그램이 실행되는 하나의 격리된 환경을 제공한다.
    • 단일 스레드 프로그램에서는 프로세스의 격리된 환경에서 스레드 하나만 실행되며, 따라서 그 스레드가 그 환경의 모든 것을 독차지한다.
    • 다중 스레드 프로그램에서는 한 프로세스 안에서 여러 스레드가 실행된다. 그 스레드들은 동일한 실행 환경(특히, 동일한 메모리)를 공유한다. 이는 다중 스레드 적용이 유용한 이유 중 하나이다.
    • 예컨대 한 스레드가 배경에서 자료를 만들어서 메모리에 저장하면 다른 한 스레드가 메모리의 자료를 표시할 수 있다. 그러한 자료를 공유되는 상태(shared state) 줄여서 공유 상태라고 부른다.

Continue reading

C# 6.0 완벽 가이드/ 진단과 코드 계약

  • 뭔가 잘못되었을 때문 문제를 진단하는데 도움이 되는 정보를 확인하는 것이 중요하다.
    • 이때 IDE나 디버거가 크게 도움이 되지만 그런 도구는 개발 도중에나 사용할 수 있다. 일단 응용 프로그램을 배포/설치하고 나면 응용 프로그램 자신이 진단(diagnostic) 정보를 수집해서 기록해야 한다.
    • 이를 지원하기 위해 .NET Framework는 진단 정보 기록, 응용 프로그램 행동방식 감시, 실행시점 오류 검출을 위한 일단의 수단을 제공하며, 가능한 경우 응응 프로그램과 디버깅 도구를 연동하는 수단들도 제공한다.
  • .NET Framework는 또한 코드 계약(code contracts)을 강조하는 수단도 제공한다. .NET Framework 4.0에서 도입된 코드 계약 기능을 이용하면 메서드가 일단의 상호 의무조항들을 점검해서 만일 의무조항 위반 사항이 있으면 실행을 일찍 실패하게 만들 수 있다.
  • 이 장에 나오는 형식들은 주로 System.Diagnostics 이름공간과 System.Diagnostics.Contracts 이름공간에 정의되어 있다.

조건부 컴파일

  • 전처리기 지시자(preprocessor directive)들을 이용해서 C# 코드 안의 임의의 구역을 조건부로 컴파일할 수 있다. 전처리기 지시자는 # 기호로 시작하는 특별한 명령으로, 컴파일러에게 코드의 컴파일 방식에 관한 지시를 전달하는 역할을 한다.(그리고 C#의 코드 구성요소와는 달리 하나의 전처리기 지시자 문장은 반드시 코드 한 줄을 차지한다)
    • 논리적으로 전처리기 지시자로 시작하는 문장(줄여서 전처리기 지시문)은 실제 컴파일 작업이 일어나기 전에 실행된다. (실제로는 C# 컴파일러가 어휘 분석 단계에서 전처리기 지시자들을 처리한다).
    • 조건부 컴파일을 위한 전처리기 지시자들은 #if, #else, #endif, #elif이다.
  • #if 지시자는 컴파일러에게 지정된 전처리기 기호가 정의되어 있는 경우에만 그 다음 코드 구역을 컴파일하라고 지시한다.
    • 전처리기 기호는 코드 안에서 #define 지시자로 정의할 수도 있고 컴파일러 옵션으로 정의할 수도 있다. #define으로 정의된 기호는 해당 파일 안에서만 효력을 가지지만, 컴파일러 옵션으로 정의된 기호는 어셈블리 전체에 적용된다.
#define TESTMDOE  // #define 지시문은 파일의 처음 부분에 있어야 한다. 기호 이름은 대문자로만 구성하는 것이 관례이다.

using System;

class Program
{
  static void Main()
  {
    #if TESTMODE
      Console.WriteLine("시험 모드");
    #endif
  }
}

Continue reading

C# 6.0 완벽 가이드/ 객체 처분과 쓰레기 수거

  • 객체 중에는 열린 파일이나 자물쇠(lock), 운영체제 핸들, 비관리(unmanaged) 객체 같은 자원들을 해제하는 명시적인 해체(tear-down) 코드가 필요한 객체들이 있다. .NET의 어법에서 그런 작업을 처분(disposal)이라고 부른다.
    • .NET Framework는 객체 처분 기능을 지원하기 위해 IDisposable이라는 인터페이스를 제공한다.
  • 처분은 쓰레기 수거(garbage collection, GC)와는 다른 연산이다. 보통의 경우 처분은 프로그래머가 명시적으로 수행하지만, 쓰레기 수거는 런타임이 자동으로 수행해준다.
    • 다른 말로 하면 프로그래머는 파일 핸들이나 자물쇠, 운영체제 자원들의 해제를 신경 쓰고, CLR은 그런 자원들이 차지하던 메모리의 해제를 신경 쓴다.

IDisposable, Dispose, Close

  • .NET Framework는 해체 수단이 필요한 형식을 위해 다음과 같은 특별한 인터페이스를 제공한다.
public interface IDisposable
{
  void Dispose();
}

Continue reading

C# 6.0 완벽 가이드/ 그 밖의 XML 기술들

XmlReader 클래스

  • XmlReader는 XML 스트림을 저수준, 전진 전용 방식으로 읽어들이는 고성능 XML 판독기를 나타내는 클래스이다.
  • XML 판독기는 XmlReader.Create를 호출해서 생성하는데, 이 메서드는 Stream이나 TextReader 또는 파일 이름을 뜻하는 URI 문자열을 인수로 받는다.
using (XmlReader reader = XmlReader.Create("customer.xml"))
  • Stream과 URI에서 XML 자료를 가져오는 속도가 느릴 수도 있기 때문에, XmlReader의 메서드들에는 비차단(nonblocking) 코드를 작성하는데 적합한 비동기 버전들이 존재한다.
  • 다음은 문자열로부터 XML을 읽어 들이는 XmlReader 인스턴스를 생성하는 예이다.
XmlReader reader = XmlReader.Create(new System.IO.StringReader(myString));

Continue reading

C# 6.0 완벽 가이드/ LINQ to XML

  • .NET Famework는 XML 자료를 다루는 여러 API를 제공한다. .NET Framework 3.5부터 범용 XML 문서 처리의 주된 수단은 LINQ to XML 이다. LINQ to XML은 가볍고 LINQ 친화적인 DOM과 이를 보충하는 일단의 질의 연산자들로 구성되어 있다.
  • LINQ to XML의 모든 형식은 System.Xml.Linq 이름공간에 있다.

전체적인 구조

DOM이란 무엇인가?

  • 다음과 같은 XML 파일을 생각해 보자
<?xml version="1.0" encoding="utf-8"?>
<customer id="123" status="archived">
  <firstname>Joe</firstname>
  <lastname>Bloggs<lastname>
</customer>
  • 다른 모든 XML 파이렃럼 이 파일은 하나의 XML 선언(declaration)으로 시작한다.
    • 그 다음은 XML 문서 전체의 뿌리(루트)에 해당하는 요소(element)로 그 이름은 customer이다.
    • 이 customer 요소에는 2개의 특성(attribute)이 있다. 각 특성은 이름(id와 status)과 값(“123”, “archived”)으로 구성된다.
    • customer 요소 안에는 두 자식 요소 firstname과 lastname이 있다. 이 요소들은 각자 단순 텍스트 내용(“Joe”와 “Bloggs”)을 담고 있다.
  • 이러한 구성요소들(선언, 요소, 특성, 값, 텍스트 내용)을 각각 클래스로 나타낼 수 있다.
    • 그리고 그런 클래스에 자식 내용을 저장할 수 있는 컬렉션 속성들을 부여한다면, 문서 전체를 나타내는 객체들의 트리를 형성할 수 있다.
    • 그러한 트리가 바로 흔히 DOM이라고 줄여서 표기하는 문서 객체 모형(document object model)이다.

Continue reading

시각의 이해

1

  • 시신경(optic nerve)
    • 망막에서 받아들인 시각정보를 뇌에 절달하는 역할을 하며 120만개의 신경섬유로 이루어진 2번 뇌신경
  • 시각 세포는 빛 자극에서 흥분된 전압 충격파(pulse)를 보낸다.

Continue reading

신경회로

  • 전정척수로(vestibulospinal tract)는 뇌간에서 시작되는 신경로의 하나로 자세 조절에 관여한다.
  • 내측세로다발의 하행로는 척수로 내려가 근육을 통해 균형을 잡는다.
  • 내측세로다발의 상행로는 동안신경, 외전신경을 통해 눈동자의 움직임으로 균형을 잡는다.
  • 기억한다는 것은 사건과 사물의 관계를 기억하는 것.
    • 기억을 위해서는 순서화가 중요하다. 이는 시간적, 공간적 관계이기 때문.
    • 학습을 위해서는 관계를 기억해야 한다.
  • 나이를 먹어도 나의 정체성이 유지되는 이유는 내 몸 전체 세포의 관계성 때문.
  • 공통인 관계의 집합이 범주.
  • 사람이 총명하다는 것은 패턴 인식을 잘 하는 것.
    • 패턴 인식이란 공통인 관계를 파악하는 것.
  • 청신경은 달팽이관에서 나가는 나선형의 뉴런 신경세포체인 나선신경절에서 시작한다.
  • 청각 신호의 중계기관인 등쪽 및 배쪽와우핵으로 연결된다.
  • 청신호의 1차적 종착지는 하구이다.
  • 내측슬상핵을 통해 청각이 만나는 1차 피질인 상측두엽과 최종 시냅스한다.

Continue reading

뇌간의 운동·감각 영역

  • 운동명령이 내려오는 하행로의 4가지 핵심
    • 전두교뇌섬유(frontopontine fibers)
      • 전두엽에서 교뇌로 이어지는 하행섬유
    • 피질연수섬유(corticobulbar fibers)
      • 대뇌피질에서 뇌간으로 이어지는 운동섬유
    • 피질척수로(corticospinal tract)
      • 대뇌피질에서 시작되어 척수까지 이어지는 수의운동을 관장하는 신경로
    • 교뇌로
      • 후두교뇌로(occipitopontine tract)
        • 후두엽에서 교뇌로 이어지는 신경로
      • 측두교뇌로(temporopontine tract)
        • 측두엽에서 교뇌로 이어지는 신경로
      • 두정교뇌로(parietopontine tract)
        • 두정엽에서 교뇌로 이어지는 신경로

Continue reading

브레인의 본질, 뇌간

  • 뇌간(brainstem)
    • 중뇌(상구+하구) + 교뇌 + 연수로 이루어진 것.
      • 중뇌는 중간뇌, 교뇌는 다리뇌
    • 연수(숨뇌, medulla oblongata)는 호흡
      • 척수와 곧바로 연결되어 있으며 호흡이나 혈액순환을 조절한다.
    • 교뇌(pons)는 균형
      • 척추동물의 중뇌와 연수 사이에 위치하는 중추신경계의 일부
    • 하구(inferior colliculus)는 청각
      • 중뇌의 덮개를 구성하는 한 부위. 청각 정보를 받아서 청각 피질로 전달
    • 상구(superior colliculus)는 시각
      • 중뇌의 상부에 있는 돌출부로 시각계의 일부. 눈 운동 조절에 중요한 역할
    • 뇌간이 브레인의 본질이다.
  • 진화적으로 볼 때 대뇌는 겉보기 현상에 불과 가장 중요한 것은 뇌간
    • 대뇌피질은 시각, 청각의 정보를 2차적으로 더 깊이 처리하는 것.
    • 물고기나 악어 때보다 인간으로 진화하면서 청각, 시각의 정보 처리량이 많아졌고, 예술 활동까지 가능할 정도로 발전하였음.

Continue reading

호흡은 어떻게 이루어지는가

  • 아가미 호흡
    • 아가미는 여러 개의 디스크 구조로 이루어져 있다
    • 디스크들 사이로 물이 통과하게 된다.
    • 디스크의 모세혈관을 통해 물속의 산소를 직접 공급 받는다.
  • 호흡 중추기관은 교뇌(연수)
  • 호와 흡은 다르다
    • 호는 내쉬는 숨으로 날숨(expiration)
    • 흡은 들이마시는 숨으로 들숨(inspiration)
  • 들숨과 날숨은 신경로가 다르다.
    • 등쪽호흡핵은 연수의 등쪽에 있으며, 들숨을 컨트롤한다.
    • 배쪽호흡핵은 연수의 배쪽에 있으며, 날숨을 활성화한다.
  • 심장은 무의식적인데, 호흡은 의식적인 부분이 있다.
    • 말하는 게 호흡

Continue reading