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 |
|---|
