인스턴스의 타입 전체에 걸쳐 적용되는 필드, 메서드, 생성자를 알아보자.정적 필드\- 클래스이름.정적필드로 접근정적 메서드\- 클래스이름.정적메서드로 접근\- 정적 메서드 안에서는 인스턴스 멤버에 접근할 수 없다. 아직 new 연산자로 인스턴스가 생성되지 않았으므로,
캡슐화는 관련성 있는 데이터와 그 데이터를 다루는 메서드를 객체 안에 구현하고, 객체의 밖에서 알아야할 필요가 없는 내부 멤버는 숨기는 것을 일컫는다.1\. 접근 제한자\- 접근 제한자를 생략하면, 클래스는 internal, 클래스의 멤버는 private으로 설정된다.
자식\_클래스 : 부모\_클래스상속을 이용하면 자식 클래스에서 부모 클래스의 기능을 물려받을 수 있다.계층 상속은 가능하지만, 다중 상속은 가능하지 않다.암시적 형 변환✍ 샘플 코드✅ 결과자식 인스턴스를 부모 타입으로 암시적으로 형 변환할 수 있다.부모 타입의 자식 인
모든 클래스는 System.Object를 상속받는다.모든 형식의 부모이므로, 모든 형식은 object로 변환 가능하다.object ← System.ValueType(값 형식) ← bool, int, double, char...← System.ValueType(값 형식)
클래스 내부의 코드에서 (인스턴스화된) 객체 자신을 가리킬 수 있도록 this 예약어가 제공된다.클래스의 멤버 변수와 메서드의 매개 변수의 이름이 같아도, 구분할 수 있다.코드의 중복을 줄인다.✍ 샘플 코드🧐 더 알아보기인스턴스 메서드는 명시적인 매개변수가 없어도 컴
타입에 상관 없이 인스턴스에 따른 동작을 실행시키고 싶을 때 다형성을 활용한다.1\. 오버라이드 되지 않은 메서드✍ 샘플 코드컴파일 경고가 발생한다. 자식 클래스에서 override 키워드를 추가하거나 new 키워드를 추가할 것을 추천한다.✅ 결과부모 타입으로 자식 인
매개변수의 수나 타입은 다르지만, 같은 기능을 하는 메서드라면 같은 이름으로 오버로드하여 쓰는 것이 좋다.더 나아가, C\*✍ 샘플 코드✅ 결과✍ 샘플 코드✅ 결과
클래스 간 형 변환 시 특정 동작 혹은 연산을 하게 할 수 있다.이 때 형 변환을 암시적으로 가능하게 하려면 implcit 연산자를, 명시적으로만 가능하게 하려면 explicit 연산자를 사용한다.✍ 샘플 코드✅ 결과✍ 샘플 코드✅ 결과
중첩 클래스한 클래스 안에서만 쓰이는 클래스가 있다면, 중첩 클래스로 만든다.클래스 내부에 접근 제한자를 생략한 클래스를 멤버로 정의하면, private이 지정되어 클래스 외부에서 인스턴스를 직접 생성하는 것이 불가능하다.✍ 샘플 코드추상 클래스부모 클래스의 인스턴스를
C1\. 방법int Clean (object arg);→ delegate int FunDelegate(object arg);= 예약어 반환값 타입명 (인자)✍ 샘플 코드2\. 실체delegate는 타입이다.클래스 내부에서 delegate를 정의하는 것은 중첩 클래스일
특징 인터페이스는 구현 없는 메서드 선언만을 갖고 있다. 추상 클래스와 비슷하지만, 클래스는 다중 상속이 불가능하고 인터페이스는 가능하다. 인터페이스로부터 구현해야 하는 메서드의 접근 제한자는 public이여야 하며, override 예약어를 지정하지 못한다. (굳이
int, char, bool 같은 값 형식에 class처럼 사용자 정의 형식을 두려고 할 때 구조체(struct)를 사용한다. 문법클래스와 유사하지만 다음과 같은 차이점이 있다.인스턴스 생성을 new로 해도 되고, 안 해도 된다.기본 생성자는 명시적으로 정의할 수 없다
참조에 의한 호출(CBR : call by reference)을 지원하기 위해 ref 예약어와 out 예약어가 있다. ref 예약어 클래스처럼 얕은 복사로 전달한 것과 같은 동일한 효과를 낸다. ✍ 샘플 코드 ✅ 결과 그러나 클래스 복사처럼 스택에 같은 주소값을
열거형은 값 형식의 하나로 숫자형 타입을 상속받아 정의할 수 있는 제한된 사용자 정의 타입이다. 활용 [접근_제한자] enum 타입명 ✍ 샘플 코드 ✅ 결과 상속 enum은 System.Object을 상속 받아 ToString 메서드를 재정의하여, 문자열을 반환
읽기 전용 필드(readonly)변수를 정의할 때와 생성자를 제외하고는 그 값을 바꿀 수 없다.✍ 샘플 코드상수(const)변하지 않는 값인 리터럴에 식별자를 붙인 것이다.✍ 샘플 코드readonly vs const상수는 static 예약어가 허용되지 않는다.(의미상
다음 조건을 만족하는 콜백 패턴을 구현하려고 할 때, event 예약어를 사용할 수 있다.클래스에서 이벤트(콜백)을 제공한다.외부에서 자유롭게 해당 이벤트를 구독하거나 해지하는 것이 가능하다.이벤트의 발생은 오직 클래스 내부에서만 가능하다.이벤트의 첫번째 인자로는 이벤
array0과 같이 배열의 요소에 접근할 때 쓰이는 \[] 연산자는 사용자가 직접 정의할 수 없다. 이를 보완하기 위해 c✅ 샘플 코드 ✅ 결과
제네릭이 없다면 기본 형식(primitive types)은 Object 타입으로 박싱/언박싱을 거쳐야 해서 성능 상 문제가 발생한다. 이를 해결하기 위해 닷넷 프레임워크 2.0에서는 제네릭을 도입했다.제네릭 클래스CLR은 JIT 컴파일 시 클래스가 타입에 따라 정의될
제네릭을 쓰다 보면 형식매개변수로 받아들이는 타입이 특정 조건을 만족해야할 때가 있다. 이 때 알맞게 제약 조건을 걸어주어야 한다.형식 매개변수에 대한 제약 조건모든 타입 T가 CompareTo를 가지고 있지 않기 때문에, CompareTo를 T에게 적용하려고 하면 컴
a ?? b→ a가 null이 아니라면 a를 그대로 반환하고, null이라면 b를 반환한다.✍ 샘플 코드✅ 결과
타입에 상관 없이 초기값을 얻고 싶을 때 default 예약어를 사용한다.✍ 샘플 코드✅ 결과
yield return이나 yield break 예약어를 이용하면, IEnumberable, IEnumerator 인터페이스를 구현하는 코드를 간편하게 표기할 수 있다.✍ 샘플 코드✅ 결과Next() 메서드에서 yield return에서 값을 반환하면 Next() 메서
클래스의 소스코드를 2개 이상으로 나누고 싶을 때 partial 예약어를 쓴다. partial 클래스는 한 파일(.cs) 안에 있어도 되고 다른 파일로 나누는 것도 가능하지만, 반드시 같은 프로젝트에서 컴파일해야 단일 클래스로 빌드된다.✍ 샘플 코드
Nullable 타입은 T타입의 값과 null값을 가질 수 있게 하는 타입이다.true/false 값을 갖는 bool타입에 true인지 false인지 모르겠다는 의미의 null값을 갖게 하고 싶으면 Nullable 혹은 bool?로 표기한다.✍ 샘플코드 ✅ 결과
델리게이트에 전달되는 메서드가 일회성으로만 필요할 때 Anonymous Method를 만들어 사용한다.익명 메서드를 사용하지 않으면 아래의 코드와 같이 메서드를 정의하여 매개변수로 넘긴다.✍ 샘플코드이를 익명 메서드로 바꾸면 아래의 코드와 같다.
static class는 오직 static 멤버 변수/메서드만을 가질 수 있다.객체에 따른 데이터 저장이 별도로 없이 기능 구현만을 하기 위한 목적으로 클래스를 만들었을 경우, static class로 만들면 new 연산자로 인스턴스를 만들 필요 없이 해당 기능을 이용
C메서드의 지역변수의 선언 시 타입에 관계 없이 var 예약어를 쓸 수 있다.✍ 샘플 코드✅ 결과var 키워드는 c# 컴파일러에 의해 실제 타입으로 치환된다. var 예약어를 남발하는 것은 코드의 가독성을 떨어뜨리지만, 복잡한 타입(ex> KeyValuePair<
get/set에 별다른 내용이 없음에도 불구하고 private 필드와 속성을 각각 구현하는 것은 거추장스럽다. 그렇다고 public 필드로 정의해버리자니 OOP의 캡슐화 원칙에 어긋난다. 자동 구현 속성은 개발자가 거추장스럽게 직접 모든 것을 적지 않아도, 빌드 시 O
생성자에 전달되는 인자의 종류가 다양하면, 그 종류만큼 생성자를 구현해야 하는 번거로움이 있다. public 접근자가 명시되어 있다면, new 구문에서 특정 변수에 값을 할당할 수 있다.■ 생성할 때 전달해야 하는 인자의 수와 종류가 다르면 아래와 같이 각각의 생성자를
익명 타입은 이름을 지정하지 않고도 그 타입을 쓸 수 있게 지원한다.✍ 샘플 코드
기존 클래스를 상속하지 않고 기존 클래스의 내부 구조를 전혀 바꾸지 않고도, 새로운 메서드를 추가할 수 있게 하는 것이 확장 메서드이다.확장 메서드는 static 클래스 내의 static 메서드로 this 예약어 매개변수를 이용하여 구현한다.✍ 샘플 코드✅ 결과위의 코
람다 식은 익명 메서드의 간편 표기 용도로 사용된다.1\. 람다 메서드와 익명 메서드💡 샘플 코드컴파일러는 Thread 타입의 생성자가 "void(object obj)" 형식의 델리게이트 인자를 받는다는 것을 알고 있으므로, 개발자가 람다식을 사용하여 delegate
LINQ 쿼리의 반환 타입이 IEnumerable, IOrderedEnumerable인 경우 lazy evaluation 또는 deferred execution 방식으로 동작한다.💡 샘플 코드✅ 결과Where절은 foreach문에서 열거자를 통해 요소를 순환할 때 F
선택적 매개변수(optional parameter)을 이용하여 매개변수 중 값이 전달되지 않은 인자가 있을 때 미리 지정된 기본값을 사용할 수 있다.💡 샘플 코드✅ 결과optional parameter는 ref, out 예약어와 함께 사용할 수 없다.optional
CLR을 바탕으로 한 DLR(Dynamic Language Runtime) 라이브러리를 통해, 루비나 파이썬 같은 동적 언어도 닷넷 프레임워크에 실행될 수 있다. 이런 동적 언어로 만들어진 프로그램의 타입을 정적 언어인 C#에 연동하기 위해 dynamic 예약어가 제공
호출자 정보 : 호출하는 측의 정보를 선택적 매개변수로 전달할 수 있다. 컴파일 시 호출자의 정보의 값으로 치환된다.CallerMemberName : 호출한 메서드 명CallerFilePath : 호출한 소스코드의 파일 경로CallerLineNumber : 호출한 소스
C📝 동기 호출📝 비동기 호출📝 동기와 비동기의 쓰레드 차이✅ SyncPrint 호출 시 결과Read를 실행하기 전과 후의 쓰레드가 변하지 않는다.✅ AsyncPrint 호출 시 결과await 아래의 구문부터는 쓰레드 아이디가 변화하였다. await 이후의 코드는
Task, Task<Result>는 비동기 처리를 위해 내부적인 존재가 되어있기 때문에, await에 따른 코드를 Task에 맡김으로써 비동기 기능을 간편하게 구현할 수 있다.Task 타입을 await 없이 쓰는 것도 가능하며, ThreadPool.QueueUse
c> public string PropertyName {get; set;} = "Initial Value"l;✍ 샘플 코드
식(expression)0개 이상의 연산자(operator)에 의해 결합되어 단일 값으로 계산할 수 있는 경우에는 식이다.메서드 호출, 리터럴 자체도 식이다.(x>=100) && (x<300)Console.WriteLine("test");"I am good."문(
기존에는 '타입명.static메소드명' 으로 호출하지만,이제는 'using static 타입의전체이름'을 선언하면타입명 없이 바로 메소드를 호출할 수 있다.✍ 기존의 static 메서드 호출✍ using staticenum 타입의 멤버와 const 상수 멤버도 컴파일하
null 조건 연산자: 참조 변수의 값이 null이라면 그대로 null을 반환하고, null이 아니라면 지정된 멤버를 호출한다.✍ 참조변수의 멤버 접근 시 ?✍ 배열 인덱스 접근 시 ?✍ nullable 형식의 사용✍ ??✍ 효율성 고려
위의 코드에서 PrintInfo의 첫번째 인자인 name을 fullName으로 이름을 바꾸려고 하면, 식 안의 name도 컴파일 에러가 뜨면서 fullName으로 바꿀 것을 강제한다. 그러나 출력 결과에 쓰일 리터럴은 여전히 name으로 남아있다는 문제가 있다.
기존 방식위의 코드는 아래와 같이 컴파일 된다.새로운 방식위의 코드는 아래와 같이 컴파일 된다.기존 키 값을 덮어쓰기 때문에 다음과 같이 작성하여도 오류가 발생하지 않는다.
비주얼베이직과 Ftry { } catch (예외타입 e) when (조건식) { }✍ 샘플 코드조건식이 실행되는 시점은 처리 핸들러가 실행되는 시점이 아니기 때문에 아래와 같이 부가적인 작업을 할 수 있다.위의 코드가 아래의 코드와 동일하다고 생각할 수 있다.그러나 두
c✍ c\`\`\`csint result;int.TryParse("50", out result);Console.WriteLine(result);c✍ 중복 변수 선언 오류\_c\`\`\`csint.TryParse("50", out int result);Console.Wr
c✍ 로컬 변수에 ref✍ 반환값에 ref✅ 결과✍ 컴파일 오류1 : 지역변수지역변수의 유효범위가 스택 상에 있을 때로 한정되기 때문에 메서드의 실행이 끝나 호출 측에 넘어가는 시점에 스택이 해제되어 return re로 반환받은 인스턴스가 남아있을 거라는 보장을 할 수
c여러 값을 인자로 또는 반환값으로 쓰고 싶을 때, 아래의 옵션을 고려할 수 있다.✍ 별도의 클래스원하는 값을 멤버변수로 담을 수 있는 별도의 클래스를 일일이 만드는 것은 귀찮다. ✍ dynamic 예약어정적 형식 검사를 할 수 없어 필드 이름이 바뀌어도 컴파일 시 문
튜플의 반환값을 분해하는 구문을 원한다면 Deconstruct 메서드를 1개 이상 정의하여 구현할 수 있다. 분해가 되는 개별값을 out 매개변수를 이용해 처리하면 된다.✍ 샘플코드✅ 결과
람다 식으로 정의가 가능한 유형은 다음과 같다.일반 메서드속성의 get/set인덱서의 get/set생성자종료자이벤트의 add/remove✍ 샘플코드