본문 바로가기
개발/C#

C# 과제

by EPdev 2020. 7. 21.
728x90

 

C#을 공부하던 중. 과제가 약간 있어서 해당 과제에 대한 답을 달아봤다.

이게 맞는지는 모르겠다. 하지만 이러한 문제를 가지고 고민해본다는 것은 좋은 경험같다.

여러분들도 공부한 내용을 토대로 답을 달아보시고, 본인이 만든 답에 대해 평가해보길 바란다.


  1. C#의 특징에 대해 아는데로 기술하시오.
    C#은 마이크로소프트에서 .NET Framework를 위해 만든 언어로, C와 C++에서 자료형부터 구문, 로직 등을 가져왔으며, Java에서 객체지향 프로그래밍의 개념을 가져왔다. 이게 C# 1.0의 탄생이다. 하지만 그 뒤로 기술의 발전과 산업의 발전으로 점점 요구사항이 다양화되었으며 이를 만족하기 위해 C#도 발전하였다. 그 출발은 C# 3.0부터 JavaScript에서 코드와 데이터를 처리하는 방식을 본 받으려 하였고 이것을 Stream Task C#이라고 할 수 있겠다. 그렇게 C# 5.0까지 발전하였고 이후로 또 다른 업그레이드가 일어났는데 C# 6.0부터 Node.js의 성격을 받아들였고 이것이 Service based C#이라고 할 수 있다. 이렇게 C# 8.0까지는 Tuple 이라는 개념으로 발전해왔다. C#은 지금도 트렌드를 따라가기 위해 계속 발전하는 중이며, 이제 Functional language로서의 사용을 위해 C# 9.0 부터는 Record 라는 개념을 도입하고 있다. 이러한 C#의 발전은 기존의 (Heavy Weight, Tightly coupled, static base)의 성향에서 (Light weight, loosely coupled, dynamic based)의 개념으로 나아가겠다는 철학을 기반하고 있다.

  2. ClassType, StructType, RecordType 에 대해 기술하시오.
    가장 크게 분류하자면, ClassType(이하 CT)와 StructType(이하 ST)는 mutable이고, RecordType(이하 RT)는 immutable이다. 먼저 CT와 ST에 대해서 보자면, 이는 객체지향프로그래밍에서 객체를 코드로 표현할 때 상태나 행동을 나타내기 위해 CT, ST를 사용한다. CT와 ST의 차이를 잠깐 보자면, CT reference type으로 힙에 저장된다. ST는 value type으로 스택에 저장된다. 이 차이는 메모리의 사용에 대한 차이가 있는데, 스택은 그때 그때 메모리에 들어갔다가 빠져서 큰 부담을 주지 않는다. 반면에 힙은 가비지 콜렉터라는 요소가 메모리를 정리해주지 않는 이상 메모리를 차지하고 있다. 이런 큰 차이가 있고 ST는 상속할 수 없다는 등의 기타 특징이 있다. 하지만 CT든 ST든 코드가 복잡해지고 현실 세계의 객체를 코드로 표현하려다보니 문제가 발생하는데, 바로 mutable이란 특징이 요인이다. mutable이란 다시 말해 변하기 쉽다는 얘기인데, 코드에서 내가 선언해놓은 타입이나 클래스의 값이 코드가 흘러가면서 변화하게 된다. 그런데 이게 여러 코드가 엮어있다보니 내가 의도하지 않는 곳에서의 값도 변형되는 것이다. 이로써 데이터가 꼬이게 되는 문제가 많이 발생했고 이를 해결하기 위해 코드를 전반적으로 검토해야하는 등 어려운 문제를 야기했다. 이를 방지하기 위해 '한번 객체나 데이터가 변화했다면, 이전 객체나 데이터와는 다른 것이다!' 라는 철학을 생각해서 이후로 객체나 데이터를 immutable로 만들게 된다. 이 생각을 담은 것이 record이다. 한번 선언하고 나서는 그 값이 변하지 않는 것이다.

  3. static operation, dynamic operation 에 대해 기술하시오.
    static operation이란 옛 버전의 C#에서 주로 처리하던 방식으로, 작업의 결과나 상태의 형을 정해놓은 것이다. 예를 들어 int, string 같은 자료형을 들 수 있는데, 이들은 한번 선언되면, 그 결과나 상태도 그 형태로 저장되어야하거나 처리되어야한다. 이 방식의 문제점은 무슨 결과나 상태가 나올지 알 수 있는 환경이라면 크게 어려움이 없으나, 뭐가 나올지 모르는 상황에서는 타입이 일치하지 않아서 오류를 발생할 수 있다. 이를 개선하기 위해 위의 예에 이어서 var라는 형식이 나온 것이다. 여기서 무엇이 나올지, 어떤 상태일지는 모르겠으나 이걸 담아내고 가져가겠다는 생각이다. 그래서 어떠한 자료형도 dynamic하게 담아질 수 있는 것이다.

  4. var, dynamic, anonymous type, tuple, record 에 대해 기술하시오.
    var, dynamic, anonymous 등은 같은 개념에 뿌리를 두고 있으며, 그 개념은 3번에서 답한 내용과 같다. tuple과 record는 C# 8.0까지 tuple, 9.0부터 record의 개념이 있는데, 이는 2번에서 답한 내용과 같다.

  5. interface, un-typed delegate, typed delegate 에 대해 기술하시오.
    위의 세 개념 모두 de-coupling 즉 결합을 해제해 상호 의존성을 줄이겠다는 철학에서 나왔다. 의존성을 낮춘다는 것은 각 요소의 간결화와 재사용성 등을 올릴 수 있는 장점이 있다. 어쨌든 interface는 클래스와 클래스 간의 의존성을 낮춰준다. 원하던 기능들을 인터페이스의 추상 메소드로 선언하고 이 인터페이스를 통해서 필요한 기능들을 불러낼 수 있으며, 여러 클래스가 엮어있다면 인터페이스로 그들을 통합해 추후 코드 수정 필요가 있을 때 그 수정범위를 줄일 수 있다. 의존도가 낮아서 가능한 일들이다. interface가 위처럼 클래스간 디커플링이 목적이라면 delegate는 코드와 쓰레드를 de-coupling 한다. 그 중에서도 un-typed delegate는 일반 delegate를 말하며, typed delegate는 Func이나 Action을 말한다. delegate는 method를 대신할 수 있다. 메소드를 대신 하려면 해당 메소드와 반환형식, 파라미터 형식이 같은 델리게이트를 먼저 선언해줘야한다. 매번 이 델리게이트를 선언하는 건 좋지 않으니 이를 개선하기 위해 나온 것이 Func 과 Action이다. 델리게이트를 따로 선언할 필요 없이 메소드를 대신할 수 있다. Func과 Action의 차이는 반환값이 있느냐, 없느냐의 차이다. 반환값이 있다면 Func, 없다면 Action을 사용하게 된다. 그렇다면 일반 delegate와 Func/Action을 사용하는 기준은 무엇일까? Delegate는 여러 메소드를 담을 수 있다. 그러니까 복합적인 기능을 요구하는 메소드들이 필요하다면 delegate를 사용하면 되고, 복합적이진 않지만 메소드를 대신해야한다면 func 또는 action을 사용하면 된다.

  6. IEnumerable, IEnumerator, Queryable, Observable 에 대해 기술하시오.
    IEnumerable/IEnumerator 는 집합 데이터를 처리하는 데 나온 개념이다. 기존에는 array 또는 collection의 개념으로 집합 데이터를 처리했었는데, 코드 중심에서 데이터 중심으로 양상이 변화하고 데이터의 형태나 양이 커지는 등의 변화로 이를 처리하기 위해 IEnumerable이라는 개념을 도입한다. 어떠한 객체 단위에 IEnumerable이라는 성격을 부여하면, 이는 집합 데이터로 처리될 수 있음을 부여한다. 이 IEnumerable 성격을 가진 객체들을 어떻게 처리를 해줄지를 명시해주는 것이 IEnumerator 이다. Queryable은 IEnumerable에서 더하여, 마치 SQL의 Query를 보는 것처럼 질의문으로 집합데이터를 처리하게 해준다. Observable은 reactive 즉 반응형이라는 성격을 가진다.

728x90

'개발 > C#' 카테고리의 다른 글

Helper Class - 헬퍼 클래스  (0) 2020.11.13
Lambda Expression - 람다식  (0) 2020.07.21
as, is 연산자  (0) 2020.07.21
List - 리스트  (0) 2020.07.14
값형식과 참조형식  (0) 2020.07.13

댓글