Cute Poka Dotted Sky Blue Bow Tie Ribbon
2026-07-07 13:35:40

https://wikidocs.net/227162 참고

 

1장 - C# 알아보기

C#: 객체지향언어.
.NET Framework
- 윈도우 프로그램 개발 및 실행환경. 이 소프트웨어가 있어야 C#실행가능.
- 서로 다른 언어들이 컴파일러에 의해 CIL(공통중간언어)로 변환되고, 다시 CLR(공통언어런타임)을 통해 특정한 플랫폼에서 동작하는 기계어로 변환되는 CLI(공통언어기반)의 구조를 통해 언어에 상관없이 윈도우에서 동작하는 프로그램을 만들 수 있음.
- 닷넷 패밀리로 윈도우의 닷넷프레임워크, 리눅스맥윈도우인 닷넷코어, 모바일용 자마린이 있는데 C#은 이 세개에서 다 돌아감


절차적 프로그래밍: 시간의 흐름에 따라 코드 작성.
객체지향 프로그래밍: 속성과 메소드로 구성된 객체로 모든 사물을 표현. -> 필요할때 불르고 문제가 있으면 해당 객체만 수정하면 됨

 

2장 - C# 시작하기

- using: namespace 사용
ㄴ namespace: 이미 선언된 클래스를 모아둔 그룹

namespace [네임 스페이스 이름]
{
    class [클래스 이름1]
    {
    }

    class [클래스 이름2]
    {
    }
}

위와 같이 직접 namespace 만들고 안에 클래스 정의할 수 있음.

class Program
{
    static void Main(string[] args)
    {
        System.Console.WriteLine("Hello World!");
    }
}

Main 메소드

- 프로그램 시작점

- static 쓰는 이유: 다른 메소드는 해당 클래스가 호출될때 메모리에 할당되지만 static 선언하면 실행전 메모리에 할당됨. + 자주 쓰이는 메소드는 여러번 할당하면 비효율적이니 static을 붙여서 정적처리.

- string[] args : main이 받는 매개변수 저장하는 배열, 만약 실행파일이 App.exe면 App.exe[이름]으로 치면 이름 사용가능.

 

4장 - 클래스 알아보기

생성자 : 초기화 필요할때 사용

소멸자 : ~메소드명() 으로 구분. 소멸자 호출시점은 가비지 컬렉터가 알아서 결정. (순서대로 실행 안될 수 있음)

Getter와 Setter로 멤버변수 접근

 

이하 자바와 동일


6장 - 윈폼 만들기

 

더보기
더보기
namespace WindowsFormsApp1
{
    partial class Form1
    {
        /// <summary>
        /// 필수 디자이너 변수입니다.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 사용 중인 모든 리소스를 정리합니다.
        /// </summary>
        /// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form 디자이너에서 생성한 코드

        /// <summary>
        /// 디자이너 지원에 필요한 메서드입니다. 
        /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
        /// </summary>
        private void InitializeComponent()
        {
            this.display = new System.Windows.Forms.Label();
            this.ButtonInput = new System.Windows.Forms.Button();
            this.textBox = new System.Windows.Forms.TextBox();
            this.ButtonStart = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // display
            // 
            this.display.Dock = System.Windows.Forms.DockStyle.Top;
            this.display.Font = new System.Drawing.Font("나눔바른고딕", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
            this.display.Location = new System.Drawing.Point(0, 0);
            this.display.Name = "display";
            this.display.Size = new System.Drawing.Size(445, 31);
            this.display.TabIndex = 1;
            this.display.Text = "게임을 시작합니다.";
            this.display.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            // 
            // ButtonInput
            // 
            this.ButtonInput.Location = new System.Drawing.Point(265, 72);
            this.ButtonInput.Name = "ButtonInput";
            this.ButtonInput.Size = new System.Drawing.Size(75, 26);
            this.ButtonInput.TabIndex = 2;
            this.ButtonInput.Text = "입력";
            this.ButtonInput.UseVisualStyleBackColor = true;
            this.ButtonInput.Click += new System.EventHandler(this.ButtonInput_Click);
            // 
            // textBox
            // 
            this.textBox.Font = new System.Drawing.Font("나눔바른고딕", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
            this.textBox.Location = new System.Drawing.Point(70, 72);
            this.textBox.Name = "textBox";
            this.textBox.Size = new System.Drawing.Size(162, 26);
            this.textBox.TabIndex = 3;
            // 
            // ButtonStart
            // 
            this.ButtonStart.Dock = System.Windows.Forms.DockStyle.Bottom;
            this.ButtonStart.Location = new System.Drawing.Point(0, 131);
            this.ButtonStart.Name = "ButtonStart";
            this.ButtonStart.Size = new System.Drawing.Size(445, 40);
            this.ButtonStart.TabIndex = 4;
            this.ButtonStart.Text = "게임 시작";
            this.ButtonStart.UseVisualStyleBackColor = true;
            this.ButtonStart.Click += new System.EventHandler(this.ButtonStart_Click);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(445, 171);
            this.Controls.Add(this.ButtonStart);
            this.Controls.Add(this.textBox);
            this.Controls.Add(this.ButtonInput);
            this.Controls.Add(this.display);
            this.Font = new System.Drawing.Font("나눔바른고딕", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
            this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.Name = "Form1";
            this.Text = "출력";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion
        private System.Windows.Forms.Label display;
        private System.Windows.Forms.Button ButtonInput;
        private System.Windows.Forms.TextBox textBox;
        private System.Windows.Forms.Button ButtonStart;
    }
}

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private int findNumber = 0;
        private int chance = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void ButtonStart_Click(object sender, EventArgs e)
        {
            var rand = new Random();
            findNumber = rand.Next(1, 21);
            chance = 10;
            display.Text = "맞출 숫자를 입력하세요.";
        }

        private void ButtonInput_Click(object sender, EventArgs e)
        {
            int inputnumber=Int32.Parse(textBox.Text);
            if(inputnumber == findNumber) {
                display.Text = "승리했습니다!";
            }
            else
            {
                chance--;
                display.Text = "기회는 " + chance + "번 남았습니다.";
            }
            if (chance <= 0)
            {
                display.Text = "실패했습니다!";
            }
        }
    }
   
}

 

7장 - 웹 서비스 만들기

웹 서버

- 인터넷을 통해 웹페이지를 볼 수 있도록 서비스를 제공하는 서버. 웹브라우저가 클라이언트가 되어 서비스를 요청해서 받고 그걸 해석해 사용자에게 보여줌.

ㄴ 웹서버와 웹브라우저 간 사용하는 언어: HTTP 프로토콜.

 

클라이언트(웹 브라우저)가 요청할때:

GET / HTTP/1.1  <!--웹브라우저가 정보 요청.-->
Host: www.example.com <!--웹서버의 주소-->
User-Agent: Mozilla/5.0 <!--웹브라우저 종류-->
Accept: text/html,application/xhtml+xml,application/xml
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

 

웹 서버가 응답할때:

HTTP/1.1 200 OK <!--HTTP의 버전과 오류발생여부를 알려줌-->
Date: Mon, 23 May 2005 22:38:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 155 <!--전송하는 데이터 크기-->
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
ETag: "3f80f-1b6-3e1cb03b"
Accept-Ranges: bytes
Connection: close

<html> <!--이 형식을 통해 웹브라우저는 사용자에게 문자, 그림, 영상 등을 보여줌.-->
  <head>
    <title>An Example Page</title>
  </head>
  <body>
    <p>Hello World, this is a very simple HTML document.</p>
  </body>
</html>

 

- 파일 서버: 파일을 주고받는 서비스를 제공. 파일 전송하기 위한 규격으로 FTP를 사용.

- API 서버: 데이터를 주고받는 서비스 제공. 클라이언트가 요청하면 데이터베이스에 접근해서 저장된내용 보내줌. XML이나 JSON 형식으로 주고받음.

- ASP.NET: 실시간으로 변경내용이 반영되어 사용자와 상호작용 할 수 있는 동적 웹개발기술.-> 위의 서버들 다 구성 가능.

 

- 포트번호 사용x면 기본적으로 80번 포트, 포트번호는 0~65535번까지 할당, 같은 포트번호를 통해 데이터 송신 가능. + 이미 사용중인 포트 다른 목적으로 사용x

직접 웹앱 실행해봄

 

10장 - C#의 새로운 기능

1. 대리자와 이벤트

대리자: 메소드 담을 수 있는 타입.

delegate 반환형 대리자이름 (매개 변수);

 

 

발행자 클래스: 이벤트 생성, 이벤트 실행을 위한 메소드 구현.

구독자 클래스: 이벤트 등록, 이벤트 발생할때 실행되는 메소드 구현.

메인 객체: 발행자,구독자 클래스의 인스턴스변수 생성. 이벤트 발생시키는 메소드 호출.

 

using System;

delegate void myEventHandler(); #대리자 생성

class Publisher {
  public static event myEventHandler myEvent; #전체에서 대리자 접근 가능하게 static
  public void RunEvent() {
    myEvent(); #실행시 구독자 이벤트 실행
  }
}

class Subscriber {
  public Subscriber() {
    Publisher.myEvent += TestMethod; #발행자의 이벤트 발생시 실행될 메소드 덧붙이기
  }

  public void TestMethod() {
    Console.WriteLine("이벤트 메서드 호출!!"); #위의 메소드
  }
}

class MainClass {
  public static void Main(string[] args) {
    Publisher pub = new Publisher(); #발행자 생성
    Subscriber sub = new Subscriber(); #구독자 생성
    pub.RunEvent();
  }
}

 이벤트가 발생하면 각 구독자의 메소드를 호출하는게 아닌 발행자 클래스에서 자동으로 메소드를 호출할 수 있어서 유용.

ㄴ 메소드1.메소드 이런식으로 하나하나 나눠서 할필요 없이 그냥 대리자한테 매개변수로 보내고 거기서 알아서 이벤트 실행하게 하면됨.

 

2. 제네릭, partial 형식, Nullable 값

- 제네릭: 타입을 T로 두고 그때그때에 맞춰서 사용할 수 있음. (타입나눠서 같은 기능의 함수 여러개 만들필요x)

- partial 클래스: 하나의 클래스를 여러개로 분할 가능, 분할된 클래스는 컴파일 과정에서 하나의 클래스로 결합.

public partial class Employee {
  public void DoWork() {}
}

public partial class Employee {
  public void GoToLunch() {}
}
#컴파일 시에는 Employee안에 DoWork랑 GoToLunch가 메소드로 들어가 있는 것처럼 작동

 

 

- partial 메소드: 템플릿 코드나 소스코드 생성기 만들때 활용. 하나에서 메소드 정의하고 한곳에서 메소드 구현하는것과 유사.

// file1.cs 파일에서 정의
partial void OnNameChanged();

// file2.cs 파일에서 구현
partial void OnNameChanged() {
  // 메서드 본문
}

 

-Nullable 값: int형같은 기본자료형 변수에 null값 할당 안되지만, int ? <이렇게 뒤에 ? 붙이면 기본자료형도 null값 허용.

ㄴ 피연산자중 하나라도 null이면 결과는 null.  null != null (비교연산할때) 

ㄴ Nullable.GetUnderlyingType(type) 으로 Nullable 형식인지 구분가능.

 

3. 자동속성, 람다식, 암시적 형식 지역변수

- 자동속성: 일일이 getter, setter 만드는거 비효율적. ->  속성변수 만들때 뒤에  { get; set; } 붙이면 자동으로 getter setter 만들어짐. obj.속성명으으로 게터 세터 역할 함.

- 람다식: 매개변수(입력) => 식(출력) 으로 구현가능.

using System;

delegate int Add(int a, int b); 

class MainClass {
  public static void Main(string[] args) {
    Add add = (a, b) => a + b; #대리자에 대한 익명함수 add
    Console.WriteLine(add(1, 2));
  }
}

 

4. Func, Action 대리자

Func 대리자는 반환값이 있는 경우에 사용하고, Action 대리자는 반환값이 없는 경우에 사용. 

using System;

class MainClass {
  public static void Main(string[] args) {
    Func < int, int > square = x => x * x;
    Console.WriteLine(square(5));
  }
}

Func<입력변수,반환형> 함수명 = x => 식 으로 이루어져있다. 따라서 위의 결과는 5*5=25.

 

using System;

class MainClass {
  public static void Main(string[] args) {
    Action < string > greet = name => {
      string greeting = "Hello " + name;
      Console.WriteLine(greeting);
    };
    greet("World");
  }
}

Action<매개변수> 함수명 = x => 식 으로 이루어져 있음. 결과는 Hello World

- 암시적 형식 지역변수: var 타입을 쓰면 컴파일러가 자동으로 형식 지정. (반드시 지역변수로 선언 및 초기화 값 지정해야 유추가능)

 

5. 다이나믹 자료형, 선택적 매개변수

- dynamic: 실행시간에 자료형 결정(var은 컴파일시간), var보다 좀더 유연함, 지역변수 뿐만아니라 메소드의 매개변수나 반환형에도 적용가능.(함수 안에서 자료형 구분하는 코드는 필요)

- 명명된 매개변수: 변수명1: 값, 변수명2:값 이런식으로 매개변수 넣을때 순서상관x 직접 하나씩 지정해서 입력 가능.

- 선택적 매개변수: 메소드 만들때 매개변수의 기본값 설정 가능.

 

6. 비동기 프로그래밍, 호출자 정보

- 동기는 작업이 순차적, 비동기는 작업 순서x로 진행. await로 작업대기해서 순서변경 가능.

- 호출자: 메소드를 사용하는 주체. 호출자 정보를 알면 어디서 오류가 발생했는지 찾기 좋음. -> 호출자 찾는 클래스들 활용

 

7. 인덱스, global using

- ^n으로 하면 배열을 뒤에서부터 가져올수 있음(n은 1부터 시작)

- [a..b]로 쓰면 인덱스 a부터 b-1까지 가져옴.

- global using: glabal로 using을 써서 전체 프로젝트에서 필요한 네임스페이스를 한곳에서 관리 가능.

 

'공부 > ' 카테고리의 다른 글

딥 러닝 파이토치 교과서  (0) 2026.07.08