VisualStudio/C# 39

[C#] Task async awiat

Task 이 글은 C#에서 Task 클래스와 async, await 사용법에 대한 글입니다. 제가 이전 글에서 Thread에 대해서 설명한 적이 있습니다. 링크 - [C#] 36. 스레드(Thread)를 사용하는 방법, Thread.Sleep 함수 사용법 쓰레드라는 건 병렬 처리라는 건 몇 번을 설명했는지, 이번 글에서는 생략하겠습니다. Thread를 생성할 때는 시스템 상에서 여러가지 리소스를 사용하고 지나치게 많이 사용되면 반대로 시스템의 성능이 느려집니다. 그래서 쓰레드 풀을 생성해서 쓰레드의 개수 제한과 쓰레드 리소스의 재활용을 통해서 시스템의 성능을 향상 시킬수 있는데 스레드 상태를 제어할 수 없어서 쓰레드가 종료할 때까지 기다리는 것을 별도로 구현을 해야 하는 불편함이 있습니다. Task는 T..

VisualStudio/C# 2022.08.10

[C#] 동기와 비동기 개념

동기식 싱글 쓰레딩, 동기식 멀티 쓰레딩, 비동기식 싱글 쓰레딩, 비동기식 멀티 쓰레딩에 대해서 정리하려 한다. 동기식 비동기식 지금부터 나는 개발자이며 내가 개발한 게임을 플레이하는 유저다. 열심히 코딩해서 친구 목록을 출력하는 함수를 개발했다. 그리고 조금 과장해서 게임에서 친구가 2만 명 정도 된다. 게임에 접속해서 친구 목록을 출력하는 버튼을 클릭하고 NPC와 대화를 하려 한다. 여기서 예상되는 결과는 두 가지로 나뉜다. 첫 번째, 2만 명의 친구를 출력하는 동안 게임이 멈추고 출력이 끝나면 NPC와 대화가 진행된다. 두 번째, 화면이 멈추지 않고 NPC와 대화하는 도중에 친구 목록을 출력한다. 전자가 동기 방식이고 후자가 비동기 방식이다. 이 두 차이를 이해하는 것이 동기 비동기를 이해하는 첫걸..

VisualStudio/C# 2022.08.10

[C#] 콜백 함수와 델리게이트

목차 개요 콜백 (Callback)이란? 일상 생활에서의 콜백 예 콜백이 없었다면? 대리자 (Delegate) 대리자는 인스턴스가 아닌 형식(Type)이다. "대리자는 왜, 그리고 언제 사용을 하나요?" 개요 콜백(Callback)이란 개념을 처음 들은 것은 유니티(Unity)를 공부할 때였다. 게임이란 분야 특성상, 비동기 처리가 주를 이루는 시점에 콜백이란 개념은 필수적으로 등장하는 것 같았다. 그 당시에는 배경 지식이 아무것도 없었기 때문에 읽어봐도 무슨 말인지 몰랐다. 지금도 물론 완벽하게 아는 것은 아닐 수도 있다. 그래도 책을 보며 공부한 것을 토대로 내가 이해한 내용들을 정리해볼 생각이다. 이 글을 읽는 다른 분들께 도움이 되셨으면 좋겠고, 틀린 점이 있다면 지적도 해주셨으면 한다. 콜백 (..

VisualStudio/C# 2022.08.10

[C#] 델리게이트(delegate)와 이벤트 (event)

델리게이트 (Delegate) 델리게이트는 메소드에 대한 참조입니다. 즉, 델리게이트는 하나의 형식(type) 입니다. 델리게이트는 인스턴스 메소드, 정적메소드 모두 참조가능합니다. 프로그래밍을 할때 매개변수에 값을 넘겨 쓸모있는 메소드를 만들었습니다. 델리게이트는 값이 아닌 '코드' 자체를 넘기고 싶을때 사용할 수 있습니다. 사용방법은 다음과 같습니다. 한정자 delegate 반환형식 델리게이트이름 (매개변수_목록); 어떤 데이터를 정렬하고자 할때 오름차순이나 내림차순, 중앙부터 가까운 순으로 정렬 등, 프로그래머가 원하는 정렬방식을 사용하도록 메소드만 건네주기만 하면 됩니다. 코드를 보겠습니다. using System; using System.Collections.Generic; using Syste..

VisualStudio/C# 2022.08.10

[C#][방법,개념] Nullable Type

방법 1 static void Main(string[] args) { int? number = null; if (number != null) { int a = number.Value; } if (number.HasValue) { int a = number.Value; } } 방법 2 static void Main(string[] args) { int? number = null; int b = number ?? 0; //number가 null이 아니라면 number값을 b에 주고 null이라면 개발자가 지정한 0을 넣어줘라 } 방법 3 class Monster { public int Id { get; set; } } static void Main(string[] args) { Monster monster ..

VisualStudio/C# 2022.08.10

[C#] 구조체와 클래스 차이

C# 에서 클래스와 구조체의 차이점에 대해 간단하게 짚어보자. 대부분의 경우 클래스를 사용하는 게 더 익숙할 것이다. 우리가 생각하는 객체지향적인 목표에 맞춰 다양한 기능(함수)을 수행해야 하는 경우 클래스를 선언하고 간단하게 자료형(변수) 몇가지를 묶어 하나의 객체로 선언할 때만 구조체를 사용하곤 한다. 하지만 엄밀히 말해 구조체에도 함수를 선언해 클래스와 똑같이 사용하는게 가능하며 반대로 클래스를 구조체 처럼 사용해도 문제는 없다. 그럼에도 클래스와 구조체는 엄연히 차이점이 존재한다. 1. 클래스는 힙(heap) 영역에 할당 되지만 구조체는 스택(stack) 영역에 할당 된다. 힙과 스택의 차이점을 간단하게 설명하자면 1. 힙은 런타임에 할당되는 영역이며 new 등의 동적 할당 기능을 통해 프로그램 ..

VisualStudio/C# 2022.08.10

[C#] static 변수, 클래스, 메소드

데이터 영역 -전역변수와 static변수가 할당되는 영역. -프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야만 메모리에서 소멸. 스택 영역 -함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역. -함수 호출이 완료되면 소멸. -늦게 할당된 변수의 메모리가 먼저 해제. 힙 영역 -프로그래머가 관리하는 메모리 영역. -동적 할당으로 생성되는 메모리 영역. static 변수는 객체를 선언만 해도 메모리가 할당되며 해당 객체를 계속 반복적으로 생성해도 그 메모리는 유지가 됨. 일반적인 변수들이 객체가 새로 생성될 때 메모리가 초기화 되는 것과는 다른 점. 프로그램 로딩시 단 한 번 클래스 내에 생성되고 동일 메모리를 계속 사용. public class MyClass { private stat..

VisualStudio/C# 2022.08.10

[C#] 전역 변수, 지역변수

전역 변수로 선언하면 어디에서든 불러오고 수정할 수 있다. 하지만 함수 안에서 변수를 선언하면 그 변수는 지역 변수가 된다. 이때 해당 변수는 함수 내에서만 존재하며 밖에서는 불러올 수 없다. 그렇기 때문에 각기 다른 함수 내에서 같은 이름의 지역 변수를 만들어도 무관하다. int a = 1; // 전역 변수(멤버 변수) void a () { int a = 5; // 지역 변수 a = 6; } 이렇게 이미 전역 변수를 선언했는데 같은 이름의 지역 변수를 선언하게 되면 그 함수 안에서는 지역 변수가 우선이 되므로 전역 변수는 무시된다. 지역 변수는 평상시 존재하지 않다가 함수가 호출되면 생성됐다가 함수가 종료되면 파기된다. 이걸 이용해 메모리 최적화가 가능하다. 접근 지정자 public class test..

VisualStudio/C# 2022.08.10

[C#] 값 형식(Value Types)과 참조 형식(Reference Types)

값 형식 : 변수가 값을 담는 데이터 형식. 참조 형식 : 변수가 값 대신 값이 있는 곳의 위치(참조)를 담는 데이터 형식. 이 둘을 이해하려면 두 가지 메모리 영역에 대해 알고있어야 한다. 바로 스택(Stack)과 힙(Heap)이다. 이 메모리 영역 중 값 형식과 관련이 있는 것은 스택 메모리 영역이고, 참조 형식과 관련 있는 것은 힙 메모리 영역이다. 1. 스택과 값 형식. 스택에 대해 이야기 해보자. 스택의 구조는 마치 책상 위에 쌓인 책이라고 생각하면 된다. 맨 밑에 있는 책을 읽고 싶다면, 위에 있는 책들을 모두 걷어낸 후에나 가능할 것이다. 스택 메모리도 이렇게 동작한다. 다음과 같은 코드를 작성했다고 하자. { // 코드 블록 시작 int a = 10; int b = 20; int c = 3..

VisualStudio/C# 2022.08.10