Study/TIL(Today I Learned)

24.07.18 C#

에린_1 2024. 7. 18. 17:23
728x90

C#

인터페이스와 추상 클래스

인터페이스 선언

  • 인터페이스는 interface 키워드를 이용해서 선언한다.
  • 클래스와 비슷하지만 메소드, 이벤트, 인덱서, 프로퍼티만을 가질 수 있다.
  • 인터페이스는 접근 제한자를 사용할 수 없고, 모든 것이 public으로 선언된다.
  • 인터페이스는 인스턴스를 가질 수 없지만, 이 인터페이스를 상속받는 클래스의 인스턴스를 만들 수 있다.
    • 이때 파생 클래스는 인터페이스에 선언된 모든 메소드(및 프로퍼티)를 구현해줘야 하고, 이 메소드들은 public 한정자로 수식해야 한다.

인터페이스를 상속하는 인터페이스

  • 인터페이스를 수정할 수 없을 때 인터페이스를 상속하는 인터페이스를 이용해야 한다.
    • 상속하려는 인터페이스가 소스 코드가 아닌 어셈블리로만 제공되는 경우
    • 상속하려는 인터페이스의 소스 코드를 갖고 있어도 이미 인터페이스를 상속하는 클래스들이 존재하는 경우

인터페이스의 기본 구현 메소드

  • 기본 구현 메소드는 인터페이스에 새로운 메소드를 추가할 때 구현체를 갖도록해서 기존에 있는 파생 클래스에서의 컴파일 에러를 막을 수 있다.
  • 인터페이스에 선언된 기본 구현 인터페이스는 파생 클래스의 참조로 호출할 수 없다.

추상 클래스

  • 추상 클래스는 ‘구현’을 가질 수 있다. 하지만 크랠스와 달리 인스턴스를 가질 수는 없다.
    • 추상 클래스는 구현을 갖되 인스턴스를 만들지 못한다.
  • abstract 한정자와 class 키워드를 이용해서 선언한다.
  • 한정자를 명시하지 않으면 모든 메소드가 private로 선언된다.
  • 추상 메소드는 public, protected, internal, protected internal 한정자 중 하나로 수식될 것을 강요한다.
    • 추상 메소드는 추상 클래스가 사용하는 프로그래머가 그 기능을 정의하도록 강제하는 장치이다.

프로퍼티

프로퍼티

  • 프로퍼티 선언 문법에서 get{…} 과 set{…}을 일컬어 접근자(Accessor)라고 한다.
    • get 접근자는 필드로부터 값을 읽어온다.
    • set 접근자는 필드에 값을 할당한다.
  • set 접근자를 구현하지 않으면 해당 프로퍼티는 읽기 전용이 된다.

자동 구현 프로퍼티(Auto-Implemented Property)

  • 필드를 선언할 필요도 없고, 그저 get접근자와 set접근자 뒤에 세미클론(;)만 붙여준다.

초기화 전용 자동 구현 프로퍼티(Init-Only)

  • init 접근자를 도입해서 객체 초기화할 때만 프로퍼티 변경이 가능하다.
  • set접근자 대신 init 접근자를 명시하면 된다.

프로퍼티 초기화를 강제하는 required 키워드

  • 초기화가 필요한 프로퍼티를 실수로 초기화하지 않는 실수를 방지할 수 있게 해준다.
  • 프로퍼티를 객체가 초기화할 때 반드시 초기화되도록 컴파일 수준에서 강제한다.

레코드 형식으로 만드는 불변 객체

  • 불변 객체(Immutable)객체는 내부 상태(데이터)를 변경할 수 없는 객체를 말한다.
  • 상태를 변경할 수 없다는 특성 때문에 불변 객체에서는 데이터 복사와 비교가 많이 이뤄진다. 새로운 상태를 표현하려고 기존 상태를 복사한 뒤, 이 중 일부를 수정해서 새로운 객체를 만들고, 상태를 확인하기 위해 객체 내용을 자주 비교한다.
  • record 키워드와 초기화 전용 자동 구현 프로퍼티를 함께 이용해서 선언한다.

with를 이용한 record 복사

  • C# 컴파일러는 레코드 형식을 위한 복사생성자를 자동으로 작성하는데, 이 복사 생성자는 Protected로 선언되기 때문에 명시적으로 호출할 수는 없고, with식을 이용해야 한다.

레코드 객체 비교하기

  • 컴파일러는 레코드 상태를 비교하는 Equals() 메소드를 자동으로 구현한다.

무명 형식(Anonymous Type)

  • 무명 형식은 형식의 선언과 동시에 인스턴스를 할당한다. 이 때문에 인스턴스를 만들고 다시는 사용하지 않을 때 무명 형식이 요긴하다.
  • 무명 형식의 프로퍼티에 할당된 값은 변경 불가능 하다.

인터페이스의 프로퍼티

  • 인터페이스는 메소드뿐만 아니라 프로퍼티와 인덱스도 가질 수 있다.

추상 클래스의 프로퍼티

  • 추상 클래스는 클래스처럼 구현된 프로퍼티를 가질수 있는 한편, 인터페이스처럼 구현되지 않은 프로퍼티도 가질 수 있다. 이것을 추상 프로퍼티(abstract property)라고 한다.
  • 추상 프로퍼티는 abstract 한정자를 이용해 선언한다.

배열과 컬렉션 그리고 인덱서

C# ^ 연산자

  • 컬렉션의 마지막부터 역순으로 인덱스를 지정하는 기능을 가지고 있다.
    • ex)
      • ^1 컬렉션 마지막 요소
      • ^2 컬렉션 마지막에서 두 번째
      • ^3 컬렉션 마지막에서 세 번째

배열을 초기화 하는 세 가지 방법

  1. 배열의 원소 개수를 명시하고, 그 뒤에 중괄호 {와 }로 둘러싸인 블록을 붙인 뒤 블록 사이에 각 원소에 입력될 데이터를 입력한다.
    • 배열 객체를 초기화하는 {} 블록을 컬렉션 초기자(collection initialzer)라고 부른다.
  2. 첫 번째 방법에서 배열의 용량을 생략하는 것이다. 이와 같이 초기화 해도 컴파일러는 첫 번째 방법을 이용해서 초기화 한 것과 동일한 실행 파일을 만든다.
  3. new와 형식, 대괄호, 배열 용량을 모두 생략한 채 코드 블록 사이에 배열의 각 원소에 할당할 데이터를 넣어준다.

배열 분할하기

  • System.Range 객체를 생성하고 .. 연산자를 이용한다.
  • .. 연산자는 왼쪽에는 시작 인덱스, 오른쪽에는 마지막 인덱스가 온다.
    • 시작 인덱스를 생략하면 배열의 첫 번째 요소를 시작 인덱스로 간주한다.
    • 마지막 인덱스를 생략하면 마지막 요소의 위치를 마지막 인덱스로 간주한다.

2차원 배열

  • 1차원 배열 선언 형식과 같지만 각 차원의 용량 또는 길이를 콤마( , )로 구분해서 대괄호 [와 ]사이에 입력해준다.

가변 배열(Jagged Array)

  • 데이터 형식[][] 배열 이름 = new 데이터 형식[가변 배열 용량][]; 으로 선언한다.

컬렉션 맛보기

  • 컬렉션(collection)이란, 같은 성격을 띤 데이터의 모음을 담는 구조를 말한다.
  • ArrayList
  • Queue
  • Stack
  • Hashtable

ArrayList

  • 배열과 가장 닮은 컬렉션이다. 컬렉션의 요소에 접근할 때는 []연산자를 이용하고, 특정 위치에 있는 요소에 데이터를 임의로 할당할 수 있다.
  • 배열과는 달리 컬렉션을 생성할 때 용량을 미리 지정할 필요 없이 필요에 따라 자동으로 그 용량이 늘어나거나 줄어든다.

Queue

  • FIFO 구조
  • Enqueue
  • Dequeue

Stack

  • LIFO 구조
  • Push
  • Pop

Hashtable

  • 키(key)와 값(value)로 이루어진 데이터를 다룰 때 사용한다.
  • 탐색속도의 강점이 있다.
    • 키를 이용해서 데이터가 저장된 컬렉션 내 주소를 계산하는데 이를 해싱(Hashing)이라고 한다.
  • Hashtable을 초기화 할때는 딕셔너리 초기자(Dictionary Initalizer)를 이용한다.

인덱서(Indexer)

  • 인덱스를 이용해서 객체 내의 데이터에 접근하게 해주는 프로퍼티이다.
  • 객체를 배열처럼 사용할 수 있게 해준다.
  • 인덱서는 프로퍼티처럼 식별자를 따로 가지지 않는다.

foreach 가능한 객체

  • foreach 구문은 IEnumerable을 상속하는 형식만 지원한다.
  • yield문을 이용하면 IEnumerator를 상속하는 클래스를 구현하지 않아도 컴파일러가 자동으로 해당 인터페이스를 구현한 클래스를 생성해준다. yield return문은 현재 메소드의 실행을 일시정지하고 호출자에게 결과를 반환한다. 메소드가 다시 호출되면, 일시정지된 실행을 복구하여 yield return 또는 yield break문을 만날 때 까지 나머지 작업을 실행하게 된다.
728x90

'Study > TIL(Today I Learned)' 카테고리의 다른 글

24.07.22 SVN  (0) 2024.07.22
24.07.19 C#  (0) 2024.07.19
24.07.17 C#  (0) 2024.07.17
24.07.16 C#  (0) 2024.07.16
24.07.15 C#  (0) 2024.07.15