전체 글 244

[C#] 코딩의기술(실전편) - 2.6 unsafe

unsafe 컨텍스트 메서드, 형, 코드 블록은 unsafe로 정의할 수 있습니다. unsafe 코드로 어플리케이션 성능을 끌어올릴 수 있다. unsafe 코드는 포인터를 사용해야 하는 네이티브 함수를 호출할 때 필요합니다. unsafe 코드를 사용하면 보안성과 안정성 측면의 위험도가 커집니다. C#에서 unsafe 코드를 컴파일하려면 빌드 속성 설정이 필요합니다. unsafe 예제 C# 에서는 일반적으로 포인터를 사용하지 않습니다. 간혹 C++ 에서 사용하던 Class를 가져오면서 포인터를 사용해야 하는 경우 unsafe를 사용합니다. class UnsafeTEST { unsafe static void SquarePtrParam(int* p) { *p *= *p; } unsafe static void ..

[C#] 코딩의기술(실전편) - 2.5 Checked 키워드

Checked 키워드 : 정수 형식 산술 연산 및 변환에 대한 오버플로우 검사를 명시적으로 사용하도록 설정하는 데 사용됩니다. UnChecked 키워드 :정수 형식 산술 연산 및 변환에 대한 오버플로 검사를 비활성화하는 데 사용됩니다. 오버플로우 예제 static void Main(string[] args) { var num = 1234; for (int i = 0; i < 21; i++) { num *= 2; Console.WriteLine(num); } for (int i = 0; i < 21; i++) { num /= 2; Console.WriteLine(num); } Console.WriteLine(num); } 실행결과 오버플로우 발생하여 '1293942784 * 2 = -1707081728'이..

[C#] 코딩의기술(실전편) - 2.3 Format 메서드

1.인수의 불일치로 발생하는 예외 다음 예제코드를 봅시다. 서식 지정 문자열에서 사용하는 인수의 개수와 실제 인수의 개수가 일치하는지는 자동으로 확인하지 않습니다. 컴파일 오류는 발생하지 않지만 컴파일 시 예외가 발생합니다. 서식 지정은 {0}~{9} 까지 10개가 있지만, 인수에 지정한 변수는 9개 이므로 예외 발생합니다. static void Main(string[] args) { var a = "A"; var b = "B"; var c = "C"; var d = "D"; var e = "E"; var f = "F"; var g = "G"; var h = "H"; var i = "I"; var j = "J"; Console.WriteLine("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}",..

[C#] 코딩의기술(실전편) - 2.2 변화하는 조건

오류 발생 가능한 코드 코드만 보면 오류가 없어보이는 코드입니다. DateTime birthday = new DateTime(2016,1,1); if(birthday == DateTime.Today) { var client = new WebClient(); var message = client.DownloadString("http://..."); Console.WriteLine(message); Console.WriteLine("{0:yyyy/MM/dd}, 생일 축하.", DateTime.Today); } 아래 상황에서 날짜 확인 시점과 출력할 때 시점이 달라서 오류가 발생할 수 있습니다. 다른 서버에 접속하는 경우 서버가 느리면 시차가 발생하여 시간 차이가 수십 초가 발생하여 오류 발생할 수 있습니다...

[C#] 코딩의기술(실전편) - 1.7 예외처리

1.예외처리 이메일을 파일로 저장한 후에 다시 읽는 시스템이 있다고 가정해봅시다. 작성한 파일을 확실하게 읽을 수 있을까요? 만약 메일이 바이러스에 걸렸다면 백신이 다른 곳으로 격리시키는 상황이 왔다면, 읽으려는 파일이 원래 읽으려는 위치에 없을 수 있습니다. 이런 경우 격리시킨 파일 이외에 나머지 파일은 이어서 읽을 수 있어야합니다. 2.예외가 발생하는 코드 다음은 존재하지 않는 파일을 읽다가 예외가 발생하는 코드입니다. b.txt파일이 작성된 적이 없어서 파일을 찾지 못해 예외가 발생합니다. static void Main(string[] args) { File.WriteAllText("a.txt", "hello A"); File.WriteAllText("c.txt", "hello C"); Consol..

[C#] 코딩의기술(실전편) - 1.6 강제 종료 처리

Flush()와 Close() Flush() : 이 스트림의 버퍼를 지우고 버퍼링된 모든 데이터가 파일에 쓰여지도록 합니다. 파일에 데이터가 기록될 예정이지만, 아직 기록되지 않은 데이터를 저장합니다. Close() : Flush()의 기능 + '파일 닫기' 기능을 추가합니다. 사용예제 using System; using System.IO; using System.Threading; using System.Threading.Tasks; class Solution { static void Main(string[] args) { String fileName= "test.txt"; var writer = new StreamWriter(Path.Combine(Environment.GetFolderPath(Env..

[C#] 코딩의기술(실전편) - 1.5 비동기 처리

비동기 처리란? (Asynchronous) 특정 로직의 실행이 끝날때까지 기다려주지 않고 나머지 코드를 먼저 실행하는것을 비동기 처리라고 합니다. 비동기처리가 필요한 이유는 서버로 데이터를 요청했을 때, 서버가 언제 그 요청에 대한 응답을 줄지 모르는데 마냥 기다릴순 없기 때문입니다. 장점 결과가 반환될 때까지 다른 작업을 할 수 있으므로 효율적으로 자원을 사용할 수 있습니다. 비동기 메서드의 경우 메소드 호출만 할 뿐 그 결과를 기다리지 않습니다. 여러가지 일을 동시에 처리할 수 있습니다. 단점 동기 방식(Synchronous)에 비해 코딩하기 복잡합니다. 결과 값 반환까지 시간이 더 소요 될 수 있습니다. 비동기 코드 task를 이용한 비동기 코드입니다. 사실 다음 예제 코드에 ReadToEndAsy..

[C#] 코딩의기술(실전편) - 1.4 병렬처리

동기 처리, 비동기 처리, 병렬 처리 한개 프로세스 안에서 동시에 여러 개의 일을 하려면 다중 쓰레드(Thread)가 필요합니다. 동시에 여러 개의 일을 한다는 측면에서 비동기와 병렬처리는 맥락을 같이합니다. 동기 처리 : 책을 읽듯이 순차적으로 처리하는 것 입니다. User의 입력이 필요한 경우, User 입력을 받기 전까지는 다음 줄로 넘어가 실행할 수 없는 상태로 컴퓨터는 멈춰있을것이다. 비동기 처리 : 실행되는 타이밍을 다 맞추는 것이 아니라 User 입력을 받는 부분은 별도로 처리한다. 병렬처리 : 병렬 처리란 여러 개의 프로세서를 통해 하나의 프로그램을 처리하는 것을 말합니다. 처리 부하를 분담하여 처리 속도의 향상시킵니다. 참고 https://docs.microsoft.com/ko-kr/do..

[C#] 코딩의기술(실전편) - 1.3 순차처리

동기(Synchronous), 비동기(Asynchronous), 블락(Blocking), 넌블락(Non-Blocking)의 개념 https://jins-dev.tistory.com/entry/%EB%8F%99%EA%B8%B0Synchronous-%EC%9E%91%EC%97%85%EA%B3%BC-%EB%B9%84%EB%8F%99%EA%B8%B0Asynchronous-%EC%9E%91%EC%97%85-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%B8%94%EB%9D%BDBlocking-%EA%B3%BC-%EB%84%8C%EB%B8%94%EB%9D%BDNonBlocking-%EC%9D%98-%EA%B0%9C%EB%85%90 Task 값을 반환하지 않고 일반적으로 비동기식으로 실행되는 단일 작업을 ..

[C#] LINQ 연습하기

LINQ 연습하기 Exists ForEach Where Select using System; using System.Collections.Generic; using System.Linq; namespace Sample_TEST { class SampleProgram { public static void Main(string[] args) { // list 선언 및 초기화 var nums = new List { 12, 87, 94, 14, 53, 20, 40, 35, 76, 91, 31, 17, 48 }; //Q1. LINQ의 Exists 메서드 사용하여, 8, 9로 나누어 떨어지는지 확인 if (nums.Exists(x => x % 8 == 0 || x % 9 == 0)) Console.WriteLine..

프로그래밍/C# 2022.03.27

[Linux] 서버 간 시간 동기화

Linux 서버 간 시간 동기화 예를 들어 PC1의 시간을 PC2에 시간과 '똑같이' 맞춰야할 필요가 있습니다. 간단히 다음 명령어를 입력하여 '시간 동기화'를 할 수 있습니다. sudo date --set"$(ssh administrator@192.168.0.2 'date -u')" 이렇게 하면 PC2의 시간과 PC1시간이 동기화가 됩니다. 수동으로 시간 변경하기 - 타임 서버 타임 서버의 시간을 획득하여 Linux서버의 시간을 변경하는 방법도 있다. 타임 서버 주소는 아래를 참고하여 입력하자. time.bora.net time.nist.gov time.nuri.net time.kriss.re.kr time.windows.com date -s {타임 서버 주소} 수동으로 시간 변경하기 유저가 시간을 지..

Linux 2022.03.27

[C#] 문자열 거꾸로 변환하기

String 변수 거꾸로 출력하기 string 형 변수의 문자열을 거꾸로 바꿔 출력하는 방법을 알아봅시다. EX> "안녕하세요" -> "요세하녕안" using System; namespace Sample_TEST { class SampleProgram { public static void Main(string[] args) { // str 변수 선언 및 초기화 string str = "Hello World."; // str을 char형 배열로 변환 후 reversStr변수에 초기화 char[] reverseStr = str.ToCharArray(); // Array.Reverse()메서드 사용하여 // 매개변수의 요소들을 역순으로 재배열 Array.Reverse(reverseStr); // str 문자열..

프로그래밍/C# 2022.03.27

[C#] Thread 2개 사용하여 변수 값 공유 테스트

Thread 2개를 사용하게 될 때, 각 Thread 별 가지고 있는 변수가 있다. 아래 코드는 Thread끼리 변수의 값을 공유하는지 확인하는 테스트이다. using System; using System.Threading; namespace Sample_TEST { class ThreadTestProgram { public static void Main(string[] args) { Thread thread = new Thread(() => Run(0)); // 1번째 Thread 실행 thread.Start(); // 5초 지연 시킨다. Thread.Sleep(5000); // 2번째 Thread 실행 Run(1); } public static void Run(int idx) { // Thread 별..

프로그래밍/C# 2022.03.22

[C#] LINQ 이용하여 리스트 2개 비교

Linq에는 두 목록을 비교하는 유용한 방법이 있습니다.Intersect리스트의 어떤 요소가 포함되어 있는지 확인할 수 있습니다.var source = new List() { "a", "b", "c" };var compare = new List() { "b", "c", "d" };var result = source.Intersect(compare);결과Except리스트에 포함되지 않은 요소를 확인할 수 있습니다.var source = new List() { "a", "b", "c" };var compare = new List() { "b", "c", "d" };var result = source.Except(compare);결과예외사항아래 예제처럼 Person Class의 요소를 비교하려고 할 때,단순히..

프로그래밍/C# 2022.03.22

스케일 업(Scale-Up), 스케일 아웃(Scale-Out)

운영중인 서비스의 유저 수가 점점 증가가 된다면, 기존의 서버에서는 충분히 운영이 가능했지만 점점 서버의 한계가 보이기 시작한다. 이때 서버 업그레이드가 필요하다. 업그레이드 하는 방법 2가지 스케일 업과 스케일 아웃의 개념에 대해 알아보자. 스케일 업(Scale-Up) 서버의 HW를 기존 사양보다 더 좋은 HW로 업그레이드 하는 방법이다. 예를 들어, CPU나 메모리 등을 추가하는 것이다. 하나의 서버의 능력을 증강하기 때문에 수직 스케일링(vertical scaling)이라고도 한다. 장점 추가적인 네트워크 연결이 필요가 없다. 스케일 아웃보다 유지보수 비용이나 운영이슈가 적다.단점 성능 향상에 한계가 있다. 서버 한대가 부담하는 양이 많아서 위험부담이 높다. 기존 서버를 교체하기 위해 서비스 다운타..

프로그래밍 2022.03.20