Charles Petzold의 ".NET Book Zero": .NET 입문의 첫걸음

.NET Framework는 Microsoft의 강력한 개발 플랫폼으로, 다양한 애플리케이션을 만들 수 있는 기반을 제공합니다. 하지만 이 강력한 플랫폼을 제대로 이해하고 활용하기 위해서는 기본부터 탄탄한 학습이 필요하죠. **".NET Book Zero"**는 이런 목마름을 채워줄 수 있는 매우 귀중한 자료입니다.

저자 소개: Charles Petzold

Charles Petzold는 소프트웨어 개발자라면 한 번쯤은 들어봤을 법한 이름입니다. 그는 프로그래밍 세계에서 영향력 있는 저자로, 특히 **"Programming Windows"**라는 책으로 잘 알려져 있습니다. 그의 저서들은 많은 개발자에게 깊은 영감을 주었으며, 그 중에서도 **".NET Book Zero"**는 .NET Framework의 개념을 이해하는 데 매우 유용한 입문서입니다.

".NET Book Zero"란?

".NET Book Zero"는 초보 개발자를 위한 무료 eBook입니다. 이 책은 기존의 프로그래밍 경험이 있는 독자들에게 C#과 .NET Framework의 기본 개념을 쉽게 이해할 수 있도록 돕습니다. 책의 제목에서 "Zero"라는 단어가 의미하는 바는, 이 책이 "0단계" 즉, 아주 기본적인 부분에서 시작하는 책이라는 점을 강조하고 있습니다.

책의 특징

  1. 기초부터 시작: .NET을 처음 접하는 독자들에게 적합한 내용으로 구성되어 있습니다. 기본적인 문법부터 시작해서 점차적으로 복잡한 개념을 다루기 때문에 따라가기 어렵지 않습니다.
  2. C# 언어 학습: .NET의 핵심 언어인 C#을 깊이 있게 다룹니다. 변수, 클래스, 메서드와 같은 기초 개념에서부터 이벤트, 쓰레드와 같은 고급 주제까지 설명합니다.
  3. 명료한 설명: Charles Petzold 특유의 명확한 설명 스타일 덕분에 복잡한 개념도 쉽게 이해할 수 있습니다. 특히 .NET의 메모리 관리, CLR(Common Language Runtime), 가비지 컬렉션과 같은 핵심 개념들을 알기 쉽게 풀어냅니다.
  4. 무료 제공: 가장 큰 장점은 이 책이 무료로 제공된다는 점입니다. 누구나 쉽게 접근하여 .NET의 기본을 배울 수 있는 기회입니다.

이 책을 추천하는 이유

많은 입문서가 기본적인 문법을 다루는 데에만 그치지만, **".NET Book Zero"**는 그 이상의 것을 제공합니다. 이 책은 C#과 .NET에 대한 깊이 있는 이해를 돕는 동시에, 실제로 실무에서 사용될 수 있는 기본기를 확실히 다져 줍니다. 더 나아가, Charles Petzold의 저술 스타일은 기술적이면서도 직관적이어서 학습자에게 큰 도움을 줍니다.

DotNetBookZero11.pdf
1.22MB

마치며

".NET Book Zero"는 .NET과 C#에 대한 탄탄한 기초를 쌓고자 하는 모든 사람에게 강력히 추천할 수 있는 책입니다. 특히 프로그래밍 경험이 있는 개발자라면 이 책을 통해 빠르게 .NET의 핵심 개념을 파악하고, 실무에 바로 적용할 수 있을 것입니다.
또한 이 책은 Charles Petzold가 그의 지식과 경험을 기반으로 한 통찰력 있는 내용으로, 책을 읽다 보면 저자의 깊은 이해를 자연스럽게 느낄 수 있습니다.

이 책을 통해 .NET의 세계로 한 발짝 더 나아가 보세요!


".NET Book Zero"는 Creative Commons Attribution-NonCommercial-NoDerivs (CC BY-NC-ND) 라이선스 하에 배포됩니다. " .NET Book Zero"는 무료로 제공되지만, 저자의 저작권을 존중하고, 비상업적이고 수정되지 않은 원본 형태로 배포를 해야합니다.

  • Thread
    1. 컴퓨터 프로그램 수행 시 프로세스 내부에 존재하는 수행 경로, 일련의 실행 코드
    2. 프로세스 생성 시 하나의 주 스레드가 생성되어 대부분의 작업처리, 주 스레드 종료->프로세스 종료
      - 멀티 스레딩 : 하나의 프로세스 내에서 다수의 스레드가 동시에 수행
    3. 스레드 구성
      - 예외 처리기
      - 스케쥴링 우선 순위
      - 구조집합(시스템에서 일정을 잡을 때까지 스레드 컨텍스트를 저장하는데 사용)
  • 프로세스
    1. 실행 중인 프로그램을 의미
    2. 하나 이상의 스레드를 가짐(primary thread)
    3. 메인 스레드는 프로세스가 할당한 메모리 영역에서 실행, 프로세스에 할당된 시스템 리소스 사용
    4. 하나의 프로세스가 스레드 여러개 소유 가능
  • User Defined Thread 사용 이유
    • 작업에 특정 우선 순위를 지정이 필요하면
    • 실행 시간이 오래 걸려 다른 작업을 차단이 필요하면
    • 모든 ThreadPool 스레드는 MTA(다중스레드아파트)에 있는데 일부만 STA(단일스페드아파트)에 두어야 하는 경우
    • 사용하는 기능을 위해 안정적인 ID가 필요한 경우(중단, 일시중단, 검색)
    • 사용자 인터페이스와 상호 작용하는 백그라운드 스레드를 실행하는 것이 필요
  • 스레드 생성과 소멸
    • 스레드 관련 주요 클래스(다중스레드를 위한 클래스)
      • 1. Thread class : 스레드를 만들고 제어, 해당속성 설정 및 상태를 가져옴
        • 생성 : 스레드 클래스를 이용한 생성, 스레드 객체 생성 후 이 객체의 생성자에 ThreadStart 위임형식을 전달
          • 프로세스는 하나 이상의 스레드를 만들어 해당 프로세스와 관련된 프로그램 코드 부분을 실행
          • 스레드가 실행하는 프로그램 코드를 지정하려면 ThreadStart 대리자 또는 ParameterizedThreadStart 대리자를 사용
          • ParameterizedThreadStart 대리자를 사용하여 스레드 프로시저에 데이터를 전달할 수 있음

Thread classdp 의한 생성 : Thread 객체생성 후에 이 객체의 생성자에 ThreadStat 위임 형식을 전달.

[Thread property and method]

Thread.currentThread : 현재 실행중인 스레드 객체 참조 반환

Thread.IsAlive : 특정 스레드의 실행 여부

Thread.IsBackground : 백그라운드 스레드 여부

Thread.Name : 특정 스레드의 이름 지정 반환

Thread.ThfreadState : 스레드 상태 반환

Thread.Priority : 스레드 우선순위 설정 반환

Thfread.Abort() : 스레드 중지

Thread.GetHashCode() : 스레드 ID 반환

Thread.interrupt() : 스레드에 인터럽트 호출

Thread.Join() : 중지된 스레드 동기화

Thread.Resume() : Suspend된 스레드를 다시 활성화

Thread.Start() : 스레드 시작

Thread.Suspend() 스레드를 Suspend

'C# 기초 > MyResearching' 카테고리의 다른 글

[C#][Delegate][Event]  (0) 2020.02.16
[C#][Event]  (0) 2020.02.14
[C#][Example]TreeView  (0) 2020.02.13
  • 메서드 자체를 값으로 갖는 타입의 인스턴스 생성
  • C/C++만 아는 사람에겐 함수 포인터의 의미로 다가옴
  • 일어난 일과 그 일에 대한 다음 처리를 분리

  • delegate를 사용하는 경우
    • 이벤트 디자인 패턴을 사용
    • 정적 메서드를 캡슐화해야 하는 경우
    • 메서드를 구현하는 개체에 대한 다른 속성 메서드 또는 인터페이스에 호출자가 액세스할 필요가 없을 때
    • 쉽게 작성
    • 메서드에 대한 여러 구현이 클래스에 필요한 경우
  • 인터페이스를 사용하는 경우
    • 호출할 수 있는 관련 메서드의 그룹이 있는 경우
    • 클래스에 메서드의 구현이 하나만 필요한 경우
    • 인터페이스를 사용하는 클래스에서 이 인터페이스를 다른 인터페이스나 클래스 형식에 캐스팅하려는 경우
    • 비교 메서드의 경우와 같이 구현하려는 메서드가 클래스의 형식이나 동일성 여부와 관련되어 있는 경우

Non-static 메서드를 인자로 타입의 인스턴스 

  • 35번 라인: 이벤트에 test.ActuallyRun 메서드를 인자로 하는 타입의 인스턴스 delegate(대리자)를 연결
  • 36번 라인: EvenTrigger로 이벤트 발생하고 delegate로 인해 ActuallyRun 실행

'C# 기초 > MyResearching' 카테고리의 다른 글

[C#][Thread]  (0) 2020.02.16
[C#][Event]  (0) 2020.02.14
[C#][Example]TreeView  (0) 2020.02.13
  • 이벤트의 호출과 응답에 관하여 동작에 관한 내용
  • 호출:이벤트 발생과 발생 통지(이벤트가 생겼다는 것을 알림)는 Publisher가 담당
  • 응답:이벤트가 발생한 것을 알고 호출되어질 메서드(이벤트 핸들러)를 등록한 객체
  • 용도
    • .NET Framework 공용 언어 런타임을 대상으로 하는 다른 프로그램에서 사용하는 것이 가능함
  • 이벤트 선언 단계
    • 대리자를 만들거나 지정
    • 사용자가 지정 이벤트를 정의하는 경우 해당 이벤트 키워드와 함께 사용할 대리자가 있는지도 확인
      •  .NET Framework에서 이벤트가 미리 정의된 경우 이벤트의 소비자가는 대리자의 이름으로만 가능함

Clicked가 이벤트에 의해 실행하지만 Delegate 로 Test.TestGreeting을 메서드를 값으로 하는 인스턴스로 인해 Test.TestGreeting 메서드가 실행됨

'C# 기초 > MyResearching' 카테고리의 다른 글

[C#][Thread]  (0) 2020.02.16
[C#][Delegate][Event]  (0) 2020.02.16
[C#][Example]TreeView  (0) 2020.02.13

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            TreeViewItem tvi1 = new TreeViewItem() { Header = "I" };
            TreeViewItem tvi1A = new TreeViewItem() { Header = "IA" };
            TreeViewItem tvi1A1 = new TreeViewItem() { Header = "IA1" };
            TreeViewItem tvi1A2 = new TreeViewItem() { Header = "IA2" };
            TreeViewItem tvi1B = new TreeViewItem() { Header = "IB" };

            tvi1.Items.Add(tvi1A);
            tvi1A.Items.Add(tvi1A1);
            tvi1A.Items.Add(tvi1A2);
            tvi1.Items.Add(tvi1B);

            treeView1.Items.Add(tvi1);
        }

'C# 기초 > MyResearching' 카테고리의 다른 글

[C#][Thread]  (0) 2020.02.16
[C#][Delegate][Event]  (0) 2020.02.16
[C#][Event]  (0) 2020.02.14
  • 클래스(C언어만사용했다면...데이터타입이라고생각을하면쉬움)
    • 고전적인 절차적 프로그래밍에서는 변수에 값을 대입한 후 연산하는 식의 방법으로 프로그래밍하는 것이 일반적이었다. 
    • 그러나 객체지향프로그래밍 언어에서는 객체라는 개념이 절차적 프로그래밍 변수를 대신해서 프로그래밍의 주체가 되어 프로그래밍되는 방법을 취하는데, 객체가 변수와 다른 점은 변수는 값만을 가지는데 비해 객체는 값과 움직임(행위)를 함께 가진다는 것이다.
    • C언어 문법에서는 서로 다른 데이터타입의 자료들을 다루기 위해 구조체라는 자료형을 이용했었다.
    • 객체지항형 프로그래밍에서는 객체를 표현하기 위한 구조로 Class를 제시하는데 이것은 C언어의 구조체와 아주 흡사한 구조로 되어 있으며, 클래스 안에는 값을 표현하기 위한 멤버필드와 행위를 표현하기 위한 멤버 메소드라는 개념을 제시하고 있다.

 

  • 객체생성
    • 클래스 선언만으로는 프록그래밍을 할 수 없고 반드시 객체를 생성해서 프로그래밍하는 형식을 취해야한다. 
    • 에를 들어, 클래스를 하나 선언하면 그 클래스형 객체를 생성해야한다.
    • 절차적 프로그래밍언어에서 주인공이었던 변수는 반드시 선언되어야하는 것을 우리는 잘 알고 있다. 
    • 이때, 변수를 선언하는 방법은 
      자료형 변수명;
    • 이런식으로 선언무을 작성했다. 이 경우를 객체지향형 프로그래밍에 대입한다면 자료형에 해당하는 것이 바로 클래스이고, 변수에 해당하는 것이 바로 객체명이 된다.
    • 다시 말해서, 클래스 그 자체로는 실체는 없고, 개념만 존재하므로 실체에 해당되는 객체를 반드시 생성해 주어야만 한다.
    • 객체를 생성하는 방법은 변수를 선언하듯이
      클래스명 객체명;
    • C#에서는 모든 형식이 클래스이다. 
    • 따라서 int, float, string과 같은 기본 데이터 형식도 생성자를 가지게 된다. 
    • 그러므로 
      int a = new int(); 이런 형식의 코딩이 가능하다. 

 

  • 멤버필드와 멤버메소드의 참조
    • 객체지향형 프로그래밍에서의 절차를 생각해보면...
      • 처음 클래스를 선언한다. (클래스 안에는 멤버필드와 멤버메소드들이 존재한다.)
      • 그 다음 클래스 형 객체를 선언한다.
      • 그렇다면, 멤버필드와 멤버메소드들은 어떤식으로 접근할 것인가? 바로 그 클래스형 객체를 이용해 접근(참조)한다.
      • 어떤 클래스의 멤버필드와 멤버메소드를 참조하는 형식은 다음과 같다.
        객체.멤버필드         객체.멤버메소드

 

  • 생성자와 소멸자
    • 생성자
      • 클래스 내부에 정의된 클래스와 같은 이름을 갖는 멤버함수를 생성자(Constructor)라고 한다. 
      • 생성자는 클래스형 객체가 선언될 때 마다 자동적으로 호출되는 함수이다. 
      • 주로 객체 선언 시 객체 내의 자료를 초기화하는 수단으로 사용된다.
      • 생성자는 클래스와 같은 이름의 멤버메소드로 선언하며 return type을 기술하지 않는다.
      • 생성자는 여러 개로 정의할 수 있다. 
      • 성성자의 접근 지정자는 일반적으로 public으로 선언한다.

    • 소멸자
      • 클래스 이름 앞에 ~(tilder)를 붙인다.
      • 생성자와는 반대로 객체가 선언되어 사용되던 블록이 끝날 때(객체가 소멸될 때)자동적으로 호출되는 함수.
      • 주로 객체가 생성될 때 동적으로 할당한 메모리를 객체 소멸과 함께 해제하고자 할 때 사용된다. 
      • 반환형이 없으며, 실제로 반환도 일어나지 않는다.
      • 매개변수는 void 형이기 때문에 디폴트 매개변수 선언도 불가능하며, 함수의 오버로딩도 불가능하다. 

  • 객체복사하기
    객체를 복사하는 방법에는 얕은 복사와 깊은 복사 두 가지 방법이 존재한다.
    • 얕은 복사
      - 클래스는 처음부터 참조형식이기 때문에 참조만 살짝 복사하는 것을 의미한다.
      - 얕은 복사된 변수에 값을 대입하면 얕은 복사 대상의 변수도 값이 변경된다.
    • 깊은 복사
      - 객체복사 시 값의 내용을 복사 받아 별도의 공간에 저장하는 것을 깊은 복사라고 한다. 복사 대상과 복사된 것은 별도의 저장 공간을 사용한다.
      - C#에서는 자동으로 깊은 복사를 해주는 구문이 없으므로 프로그램으로 구현을 해야한다.

+ Recent posts