4. 주요 키워드
- 객체 지향 언어, 컴포넌트 지향 언어
- 가비지 컬렉터
- Nullable
- 언어 통합 쿼리(LINQ) 구문
- 통합 시스템
- 참조 타입 / 벨류 타입
- 제네릭 메서드와 제네릭 타입
- 컬렉션 클래스
5. .NET 아키텍처
- MS 에서 JAVA 의 대안으로 C#과 함께 내놓은 플랫폼
- C# 소스 → IL(중간 언어)로 번역 (C++의 경우 소스 → 기계어로 직접 번역)
- CLR(공용 언어 런타임) 위에서 실행. IL 코드를 기계어로 컴파일한 뒤 실행 (C++는 운
영체제 위에 직접 실행)
- C#에서 생성된 IL 코드는 다른 .NET 언어와 호환 가능(F#, 비주얼 베이직 등)
- 다른 운영체제에서도 돌아감
결론: C# 언어를 쓴다는건 곧 .NET 아키텍처를 사용하는 것
6. C# 타입 시스템 특1) 상속으로 이루어져 있다.
C#의 모든 타입은 object 클래스
를 직간접적으로 상속 받고 있다.
따라서 object는 모든 타입의 부
모 클래스이다.
그래서 이런 짓(박싱/언박싱)을
할 수 있다.
7. C# 타입 시스템 특2) 타입이 두 가지로 나뉜다.
벨류 타입: 해당 데이터 직접 포함(스택에 할당)
기존 객체를 새 변수에 새 변수에 할당하면 별도
의 데이터가 복사된다.
각 복사본의 변경 사항은 다른 복사본에 영향을
주지 않는다.
- 기본 제공 타입(정수, 유니코드 문자, 부동
소수점, 불리언…)
- 열거체
- 구조체*
- Nullable
- 튜플
참조 타입: 데이터에 대한 참조 포함(힙 할당)
새기존 객체를 새 변수에 할당하면 동일한 데이
터를 참조하게 된다.
변수의 변경이 다른 변수에도 반영된다.
new 로 생성하고 가비지 컬렉터가 알아서 메모
리 할당 해제 해준다.
- 배열
- 스트링
- 클래스
- 인터페이스
- 델리게이트
8. C# 타입과 맴버
- 클래스
- 구조체
- 인터페이스
- 열거형
- nullable
- 튜플
9. 클래스
- 클래스 = 필드 + 매서드 + 기타 맴버함수
- 상속, 다형성, 파생 클래스, 특수화 기능이 있다.
- new 연산자로 생성하고 가비지 지컬렉터가 알아서 메모리 해제 해준다.
- 새 클래스 클래스 선언 형식:
[ 한정자 ] [ 클래스 이름 ] [ 부모 클래스 이름 ]
{
// 본문 …
}
10. 클래스 - 타입 매개변수
- 제네릭 클래스(C++ 의 템플릿 클래스와 매우 유사하다)는 타입 매개변수를 정의한다.
- 제네릭 클래스는 타입 매개변수를 사용한 클래스, 구조체, 인터페이스, 델리게이트
- <> 로 감싼 타입이 타입 매개변수 목록이다
11. 클래스 - 부모 클래스
- 생략하면 object 클래스를 직방 상속
- C++ 처럼 암시적 변환 존재
12. 구조체
- 크기가 작은 단순 데이터 저장용으로 쓴다.
- 부모 타입으로 못쓴다. (C++ 과 다르게)
- System.ValueType 에서 암시적으로 상속받는다.
즉, 동적 할당 생성 못함!
13. 인터페이스
- 클래스나 구조체가 구현할 것을 정의한다.
- 인터페이스 내 맴버는 선언만 하고 구현하지 않는다.
- 인터페이스는 다중 상속할 수 있다.
- 암시적 변환이 가능히다.
14. 열거형
- 상수 값 세트를 정의한다.
- 예제의 [Flag] 어트리뷰트는 비트 플래그로 쓸 수 있다는 뜻임
15. Nullable
- 기본 제공 타입(정수, 유니코드 문자, 부동 소수점, 불리언…)을 null 타입으로 만들어버리기
- 타입이 벨류 타입이라면 System.Nullable<T> 를 상속받는다.
- nullable 여부는 메타데이터로 저장서 컴파일러와 라이브러리가 읽는다.
17. C# 프로그램 구성 요소
- 맴버
- 필드
- 매서드
- 함수 맴버
- 식(생략)
- 문(생략)
18. 맴버
맴버의 종류
- 상수
- 필드: 클래스와 연결된 변수
- 매서드: 클래스가 수행할 수 있는 작업
- 프러퍼티: 읽기/쓰기 함수
- 인덱서: 인덱싱 관련 함수
- 이벤트: 클래스에서 생성할 수 있는 알림
- 연산자
- 생성자
- 소멸자
- 타입
접근 제한 수준
- public
- private
- protected
- internal
- protected internal
- private protected
19. 필드
- 클래스의 인스턴스와 연결된 변수이다.
- static 아니면 인스턴스가 각각 별도의 복사본을 가지고 있다.
- readonly 한정자를 선언하면 읽기 전용 필드가 된다.
20. 메서드
C# 메서드 시그니처는 다음과 같다.
- 메서드 이름
- 한정자, 타입, 매개변수 수
- 제네릭 타입 파라미터 수 ***
※ 리턴 타입은 메서드 시그니처가 아니다.
메서드 시그니처를 유지하는 한 오버로드 가능하다.
21. 메서드 - 매개 변수
메서드의 매개변수는 네 종류가 있다.
- 벨류 파라미터: 그냥 입력 값을 복사전달한다.
- 참조 파라미터: 인수와 동일한 메모리 주소 전달하고, 값이 꼭 있어야함.
- 출력 파라미터: 인수와 동일한 메모리 주소 전달하고, 값이 없어도 된다.
- 파라미터 배열: 여러개의 인수를 전달한다.
22. 메서드 - 참조 매개 변수
- 인수는 명확한 값을 가진 변수야 한다.
- 메서드를 실행하는 동안 인수와 동일한 주소를 나타낸다.
- ref 한정사를 사용한다.
23. 메서드 - 출력 매개 변수
- 인수는 명확한 값을 가질 필요 없다.
- 참조 매개변수와 비슷하다.
- out 한정사를 사용한다.
24. - 파라미터 중 맨 뒤에 있어야 함.
- 배열 타입은 1차원 배열이야 함
- 배열 뿐만 아니라 단일 인수를 넣어도 알잘딱
- params 한정사를 사용한다.
메서드 - 매개 변수 배열
25. 함수 맴버
특별한 매서드 맴버이다.
- 생성자
- 프러퍼티
- 인덱서
- 이벤트
- 연산자
- 소멸자
26. 함수 맴버 - 생성자
- 인스턴스 생성자, 스테틱 생성자가 있다.
- 인스턴스 생성자: 클래스 인스턴스 초기화
- 스테틱 생성자: 클래스 자체를 초기화. static 한정사 사용
- 오버로드할수 있고 매개변수도 가질 수 있다.
- 명시하지 않으면 암시적으로 빈 생성자가 만들어진다.
- 상속되지 않는다.
27. 함수 맴버 - 프러퍼티
- 필드의 확장 버전. 필드처럼 타입을 지정하고 접근하나, 필드처럼 메모리 위치
를 명시하지 않는다.
- ; 로 안 끝나고 {} 안에 get 접근저와 set 접근자 선언을 한다.
- get는 해당 프로퍼티 타입을 반환하는 메서드, set는 value 를 매개변수로 받는 메서드
- 잘 설정하면 읽기/쓰기 설정할 수 있다.
32. 주목할만한 C# 주요 기능
- 배열, 컬렉션, LINQ
- 델리게이트와 람다식
- 어트리뷰트
33. 배열, 컬렉션, LINQ
- 배열은고정 크기의 데이터
- 1차원 배열, 다차원 배열, 가변 배열
- 가변적 크기의 자료구조를 쓰려면 컬렉션
- List<T>, Dictionary<TKey, TValue>, HashSet<T>, Queue<T>, Stack<T>, LinkedList<T>
- C++ STL 의 이터레이터 같은 것(yield 키워드)도 지원
- 컬렉션은 LINQ 쿼리와 함꼐 사용할 수 있다.
- 컬렉션은 C++에서 STL 같은 것, LINQ쿼리는 SQL쿼리 같은 것
35. 델리게이트와 람다 식
- 특정 메서드에 대한 참조 타입이다.
- 매서드를 하나의 객체처럼 취급하게 만든다.
- 함수 포인터와 비슷하나 보다 OOP 적이고 안전하다고 한다.
- 정의 없이 함수만 선언한 것 같은 모습
36. 어트리뷰트
- 메타데이터를 추가하는데 사용한다.
- [] 속성 이름과 매개변수를 넣는다.
종류
- [Obsolete]: 더는 사용되지 않는다는 뜻. 해당 코드를 쓰면 컴파일러 경고
- [DllImportable]: 외부 DLL 에서 정적 메서드를 가져올 수 있음
- [Serializable]: 클래스나 구조체가 직렬화 할 수 있음
- [Conditional]: 메서드가 조건부로 호출됨
- [Flag]: 열거형을 비트플래그로 사용함