본문 바로가기

C#/Knowledge

C# 심화 문법

1-1. 다음 코드에서 제네릭을 사용한 부분을 식별하고, 해당 코드가 제네릭을 사용하지 않았을 때 발생할 수 있는 문제점에 대해 설명하세요.

이 코드에서는 제네릭을 사용하여 Box<T> 클래스를 정의하고 있다.
제네릭을 사용하지 않으면 다음과 같은 나타낼 수 있다.

여기서 Box 클래스는 Value 속성을 object 타입으로 가짐
비제네릭 클래스의 인스턴스 생성


이 접근법에서는 제네릭을 사용하지 않기 때문에 다음과 같은 문제점이 발생할 수 있다.

ⓐ 타입 안정성 부족

  • Value 속성이 object 타입이므로, Value에 어떤 타입의 값이든 할당할 수 있다. 이는 타입 안전성을 보장하지 않는다.
  • 예를 들어, int 값을 기대하고 사용하는 경우, Value가 실제로 string일 수도 있다. 이는 런타임 오류를 초래할 수 있다.

ⓑ 박싱 및 언박싱 오버헤드

  • 값 타입(int, DateTime 등)은 object 타입으로 변환될 때 박싱이 발생합니다. 이는 성능 오버헤드를 유발한다.
  • 박싱된 값을 다시 값 타입으로 변환할 때 언박싱이 필요하며, 이 또한 성능 오버헤드를 증가시킨다.

ⓒ 가독성과 유지보수성 저하

  • 제네릭을 사용하면 코드의 의도가 명확해지고, 코드의 가독성과 유지보수성이 향상된다.
  • 비제네릭 코드는 다양한 타입을 처리하기 위해 형변환을 자주 사용하므로, 코드가 복잡해지고 유지보수가 어렵다.

 

1-2. 다음 코드가 어떤 기능을 하는지, 어떤 방식으로 동작하는지 간단하게 설명해주세요.

이 코드의 기능은 두 개의 값을 비교하여 더 큰 값을 반환한다.
제네릭 메서드를 사용하여 다양한 타입의 값을 비교할 수 있다. 단, 비교 가능한 타입이어야 한다.

[ 제네릭 메서드 정의 ]

이 메서드는 제네릭 타입 T를 사용한다. T 타입의 두 매개변수 a와 b를 받아들인다.
where T : IComparable<T> 제약 조건은 T가 IComparable<T> 인터페이스를 구현해야 한다는 것을 명시한다.
이 인터페이스는 비교 기능을 제공한다.

[ 비교 연산 ]

 

  • a.CompareTo(b)
    a와 b를 비교
    IComparable<T> 인터페이스의 CompareTo 메서드는 a가 b보다 크면 양수, 작으면 음수, 같으면 0을 반환

  • 삼항 연산자(? :)
    a.CompareTo(b) > 0 조건이 참이면 a를 반환하고, 거짓이면 b를 반환

 

2-1. 제네릭(Generic)이란 무엇인가요?

제네릭은 클래스나 메서드를 정의할 때 데이터 타입을 명시하지 않고, 인스턴스를 생성하거나 메서드를 호출할 때 구체적인 타입을 지정할 수 있도록 하는 기능이다. 제네릭을 사용하면 코드의 재사용성을 높이고 타입 안전성을 강화할 수 있다.

2-2. 람다식(Lambda Expression)이 무엇인가요?

람다식은 익명 함수(anonymous function)를 정의하는 간결한 방법이다.
주로 함수형 프로그래밍 언어에서 사용되며, 코드의 가독성을 높이고 간결하게 표현할 수 있게 한다.
람다식을 사용하면 간단한 함수나 메서드를 한 줄로 표현할 수 있다.

2-3. LINQ란 무엇인가요?

LINQ는 .NET 언어(C#, VB.NET 등)에서 제공하는 쿼리 구문을 이용하여 데이터 소스(Collection, SQL, XML 등)를 질의하고 조작할 수 있게 해주는 기능이다.
LINQ는 쿼리 구문을 언어에 통합하여 데이터 질의를 직관적이고 일관되게 수행할 수 있도록 한다.

2-4. 리플렉션(Reflection)이 무엇인가요? 사용을 해봤다면 어떤 이유에서 사용했는지 설명해주세요.

리플렉션은 프로그램이 실행 중에 자신의 구조(예: 클래스, 메서드, 필드 등)를 검사하고 조작할 수 있는 기능이다.
리플렉션을 사용하면 동적으로 타입의 정보를 얻거나, 객체를 생성하거나, 메서드를 호출할 수 있다.

리플렉션의 사용 이유

  1. 프레임워크 개발 
    리플렉션은 프레임워크나 라이브러리를 개발할 때 유용하다.
    예를 들어, 의존성 주입(DI) 프레임워크는 리플렉션을 사용하여 런타임에 객체를 생성하고 주입한다.

  2. 런타임에 타입 확인 
    컴파일 타임에 알 수 없는 타입 정보를 런타임에 확인하고 조작할 수 있다.

  3. 테스트 자동화 
    테스트 프레임워크는 리플렉션을 사용하여 테스트 메서드를 자동으로 발견하고 실행할 수 있다.

리플렉션의 단점

  1. 성능 문제
    리플렉션은 일반적인 메서드 호출보다 느리다.
    이는 런타임에 타입 정보를 탐색하고 메서드를 호출해야 하기 때문이다.

  2. 안전성 문제
    컴파일 타임에 타입 체크를 하지 않기 때문에, 리플렉션을 사용하면 런타임 오류가 발생할 가능성이 높다.

  3. 캡슐화 위반
    리플렉션을 사용하면 private 필드나 메서드에 접근할 수 있기 때문에,
    객체 지향 프로그래밍의 캡슐화 원칙을 위반할 수 있다.

  4. 복잡성 증가
    리플렉션 코드는 일반적인 코드보다 더 복잡하고, 읽기 어려우며, 유지보수가 힘들 수 있다.

 

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

선형 자료 구조 - LinkedList, Stack, QueQue  (0) 2024.07.16
GC 가비지 컬렉터  (0) 2024.07.11
상속과 인터페이스  (0) 2024.07.09
스택 메모리 vs 힙 메모리  (0) 2024.07.09
콜백, delegate, event  (0) 2024.07.04