분류 전체보기
C# 메모. 크로스 스레드 문제
C# 메모. 크로스 스레드 문제
2019.04.09윈폼에서 개발하다 보면 아래와 같은 오류에 부딪히게 될 때가 있다. 이러한 크로스 스레드(Cross-thread) 문제를 해결하는 방법은 주로 아래와 같이 3가지 방법이 있다. CheckForIllegalCrossThreadCalls를 통해 해결 System.Windows.Forms.Control.Invoke를 통해 해결 System.ComponentModel.BackgroundWorker를 통해 해결 CheckForIllegalCrossThreadCalls 가장 간단한 해결 방법이다. 아래와 같이 코드 한 줄만 작성하면, UI 스레드 외의 스레드를 통해 컨트롤의 Handle에 접근하는 경우를 잡아내지 않도록 만들 수 있다. CheckForIllegalCrossThreadCalls = false; 그러나..
C# 메모. 패턴 매칭(Pattern Matching)
C# 메모. 패턴 매칭(Pattern Matching)
2019.04.07패턴이 있는 Is 표현식(Is-expressions with patterns)아래 예제에서는 상수 패턴(const pattern)과 타입 패턴(type pattern)을 사용한 표현식을 볼 수 있다. public void PrintStars(object o) { if (o is null) return; // 상수 패턴 "null" if (!(o is int i)) return; // 타입 패턴 "int i" WriteLine(new string('*', i)); } 위 예제를 보면 패턴 변수라는 녀석이 등장한다. 표현식 중간에서 패턴 변수를 선언할 수 있고, 자신을 둘러싸고 있는 블럭 내에서 사용할 수도 있는 것을 볼 수 있다. 전에 만나봤던 out 변수란 녀석과 비슷하다. 패턴을 Try로 시작하는 메서..
C# 메모. out 변수(Out variables)
C# 메모. out 변수(Out variables)
2019.04.06기존에는 out 매개변수를 통해 메서드를 호출하려면 먼저 변수를 넘겨주기 위해서 변수를 먼저 선언해야 했다. 보통 전달받는 메서드가 초기화하기 때문에, 이런 변수들을 넘겨주기 전에 초기화하지 않는다. 이와 같은 이유로, var를 사용해 변수를 선언하지 못하고 변수의 타입을 명시적으로 적어주어야만 했다. public void PrintCoordinates(Point p) { int x, y; // 미리 선언해야 함 p.GetCoordinates(out x, out y); WriteLine($"({x}, {y})"); } 하지만 C# 7.0에 와서는 out 변수라는 기능이 추가되면서, 전달인자를 넘겨줄 때 변수를 선언할 수 있게 되었다. public void PrintCoordinates(Point p) {..
파이썬 강좌 번외편. 재귀 함수
파이썬 강좌 번외편. 재귀 함수
2019.03.29우리는 함수 내에서 또 다른 함수를 호출할 수 있습니다. 그리고 물론 자기 자신을 호출할 수도 있습니다. 여기서 함수 내에서 자기 자신을 호출하는 함수를 재귀 함수라고 부릅니다. 이 재귀 함수는 팩토리얼이나 피보나치 수열을 만드는 등과 같은 다양한 수학 문제를 해결하는 데 매우 유용합니다. 예제를 보며 직접 한번 살펴보도록 하겠습니다. >>> def recursive(num): print(num) num += 1 recursive(num) # 자기 자신을 호출한다! >>> recursive(10) 10 11 12 13 … 위의 예제를 직접 실행시켜보면 함수 recursive()가 자기 자신을 호출하고, 호출된 함수가 다시 자기 자신을 호출하며 끊임없이 변수 num의 값을 출력하고 있는 것을 볼 수 있습니..
파이썬 강좌 4-7편. 집합(Set)
파이썬 강좌 4-7편. 집합(Set)
2019.03.271. 집합(Set)파이썬에서는 집합에 관한 자료형을 제공합니다.집합 객체를 만드는 방법은 중괄호로 감싸고, 각 요소들은 쉼표(,)로 구분합니다. >>> A = {1, 2, 3, 4} >>> type(A) 빈 집합을 만들때는 아래와 같이 set 함수를 통해서 만들게 됩니다. >>> empty_set = set() >>> type(empty_set) >>> empty_set set()그러나 아래와 같이 중괄호를 사용하여 빈 집합을 만들 수는 없습니다. 아래 예제와 같이 중괄호를 사용하면 파이썬은 빈 사전 객체를 만들게 됩니다. 이는 위 예제에서 empty_set을 {}로 나타내는 게 아니라 set()로 나타내는 이유와 동일합니다. >>> B = {} >>> type(B) 집합 객체에는 순서가 있을까요? 사전..
C# 메모. 튜플(Tuple)
C# 메모. 튜플(Tuple)
2019.03.16튜플(Tuple)은 C# 7.0에서 추가된 기능이다. 이제 튜플을 통해서 두 개 이상의 값을 반환하는 메서드를 보다 깔끔하게, 효율적으로 구현할 수 있게 되었다. 기존에는 메소드에서 두 개 이상의 값을 반환하고 싶을 때는 아래와 같은 방법들을 이용했다.(1) out 매개변수 한정자를 통해서 여러 개의 값을 넘겨주는 방법 (비동기 메서드에서는 사용할 수 없음)(2) System.Tuple 형식을 통한 튜플 객체 할당 (튜플 객체를 따로 할당해야 하는 것도 그렇지만 코드가 길게 늘어짐)(3) 두 개 이상의 값을 반환해야 하는 메소드마다 전달을 위한 클래스/구조체를 따로 만들기 (필요 이상으로 코드 오버헤드가 생기게 됨)(4) dynamic 반환형을 통해 익명 타입(Anonymous types)의 객체를 반환..
C# 6.0의 새로운 기능
C# 6.0의 새로운 기능
2019.03.10C# 6.0에서는 어떤 기능들이 추가되었을까? 지금부터 새로 추가된 9가지의 기능들을 함께 살펴보도록 하자. using 정적 지시문(using static)기존에는 정적 메서드를 호출하거나 속성을 가져오기 위해서는 아래와 같이 클래스명과 메서드명 또는 속성명을 같이 적어주어야 했다. double result = Math.Sqrt(a); 그럼 여기에서 아래와 같은 문장을 추가하면 어떻게 될까? using static System.Math; 직접 예제를 보도록 하자. using static System.Math; namespace StaticUsingExample { class Program { static void Main(string[] args) { double a = 4; double result =..
C# 메모. 문자열 보간(String interpolation)
C# 메모. 문자열 보간(String interpolation)
2019.03.09C# 6.0에서 문자열 보간(String interpolation)이라는 기능이 새로 추가되었다. 기존에는 주로 복합 형식 지정(Composite Formatting), 즉 String.Format()와 같은 메서드를 사용하여 형식화된 문자열을 출력할 수 있었으나, 문자열 보간을 사용하면 기존의 방법보다 더 읽기 쉽고 편리하게 형식화된 문자열을 만들 수 있다고 한다. 대체 어떤 녀석일까? 바로 확인해보자. string name = "마크"; var date = DateTime.Now; // 복합 형식 지정(Composite formatting): Console.WriteLine("안녕, {0}! 오늘은 {1}, {2:HH:mm}이야.", name, date.DayOfWeek, date); // 문자열 보..
C# 메모. 널 조건 연산자(Null-conditional operators)
C# 메모. 널 조건 연산자(Null-conditional operators)
2019.03.08C# 6.0에서 소개되었던 널 조건 연산자(Null-conditional operators)란 기능이다. 그전에는 아무런 객체도 참조하지 않을 때 NullReferenceException 예외를 처리해야 했기 때문에 검사 코드를 계속해서 써 내려가야 했지만, 이제는 연산자 하나로 깔끔하게 해결할 수 있게 되었다. 기존에는 아래와 같이 null인지 검사하는 코드가 반복적으로 등장하는 경우가 많았다. 개발자 입장에서는 핵심 코드가 뒤로 밀리거나, 매번 단순한 검사 코드를 계속해서 적어주어야 하는 귀찮음이 있었다.public static string Truncate(string value, int length) { string result = value; if (value != null) // 설명을 위해 빈..
C# 강좌 14편. 확장 메소드, 분할 클래스, 중첩 클래스 [최근 수정 2017.01.11]
C# 강좌 14편. 확장 메소드, 분할 클래스, 중첩 클래스 [최근 수정 2017.01.11]
2018.01.141. 확장 메소드(Extension Method)확장 메소드는 지금까지 우리가 보아왔던 메소드와는 다르게 조금 독특한 메소드라고 할 수 있습니다. 이 확장 메소드는, 기존 클래스의 기능을 확장시켜주는 메소드라고 볼 수 있습니다. 아래는 확장 메소드의 선언 형식입니다. namespace 네임스페이스명 { public static class 클래스명 { public static 반환형식 메소드명(this 확장대상형식 식별자, 매개변수..) { .. } .. } } 선언 형식을 보시면, 정적(static) 클래스를 먼저 정의하고 그 안에 확장 메소드가 정의되었습니다. 확장 메소드 역시 정적(static) 메소드여야 합니다(정적 메소드는 객체를 만들지 않고도 바로 호출이 가능). 그리고 메소드의 첫번째 매개변수..
C# 강좌 13편. 클래스의 상속(Class inheritance) [최근 수정 2017.12.26]
C# 강좌 13편. 클래스의 상속(Class inheritance) [최근 수정 2017.12.26]
2018.01.121. 클래스의 상속(Class inheritance)이번에 배울 건 '클래스의 상속(Class inheritance)'입니다. 어? 상속이란 말을 어디선가 들어본 적이 있는 것 같지 않나요? 짐작하는 그 상속이 맞냐구요? 네 맞습니다. 혹시나 상속이 뭔지 들어보 적 없는 분들을 위해 무엇인지 알려드리려고 합니다. 상속이란 네이버 지식백과를 빌어 다음과 같이 정의되어 있습니다. '일정한 친족적 관계가 있는 사람 사이에 한 쪽이 사망하거나 법률상의 원인이 발생하였을 때 재산적 또는 친족적 권리와 의무를 계승하는 제도'. 즉, 부모님이 돌아가셨다고 할 때 그 유산을 자식이 물려받는 것이라고 할 수 있습니다. 클래스의 상속도 이와 똑같습니다. 객체 지향 프로그래밍에선 부모 클래스와 자식 클래스가 있는데, 부모 ..
12편. 생성자(Constructors)
12편. 생성자(Constructors)
2018.01.12생성자(Constructor) 생성자와 소멸자를 간단히 소개하자면, 생성자는 객체를 생성할 때 호출되는 메서드이며, 소멸자는 객체가 소멸될 때 호출되는 메서드라고 할 수 있습니다. 우선 생성자 부터 알아보고, 이 생성자가 어떻게 사용되는지 아래 예제를 살펴보며 생각해봅시다. 그러기 전에, 생성자의 선언 형식부터 잠깐 보고 들어가보도록 하겠습니다. class 클래스명 { // 여기서 대괄호([])는 선택 사항이라는 의미다. // 따로 제한자를 적지 않으면 기본 접근 제한자인 internal이 사용된다. [접근 제한자] 클래스명(매개변수1, 매개변수2, ...) { // ... } // ... } 생성자의 선언 형식을 살펴보면, 생성자의 이름은 클래스의 이름과 똑같고, 생성자는 메서드와 같이 매개변수를 가질..