1-1. 다음 코드에서 제네릭을 사용한 부분을 식별하고, 해당 코드가 제네릭을 사용하지 않았을 때 발생할 수 있는 문제점에 대해 설명하세요.
이 코드에서는 제네릭을 사용하여 Box<T> 클래스를 정의하고 있다.
제네릭을 사용하지 않으면 다음과 같은 나타낼 수 있다.
이 접근법에서는 제네릭을 사용하지 않기 때문에 다음과 같은 문제점이 발생할 수 있다.
ⓐ 타입 안정성 부족
- 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)이 무엇인가요? 사용을 해봤다면 어떤 이유에서 사용했는지 설명해주세요.
리플렉션은 프로그램이 실행 중에 자신의 구조(예: 클래스, 메서드, 필드 등)를 검사하고 조작할 수 있는 기능이다.
리플렉션을 사용하면 동적으로 타입의 정보를 얻거나, 객체를 생성하거나, 메서드를 호출할 수 있다.
리플렉션의 사용 이유
- 프레임워크 개발
리플렉션은 프레임워크나 라이브러리를 개발할 때 유용하다.
예를 들어, 의존성 주입(DI) 프레임워크는 리플렉션을 사용하여 런타임에 객체를 생성하고 주입한다. - 런타임에 타입 확인
컴파일 타임에 알 수 없는 타입 정보를 런타임에 확인하고 조작할 수 있다. - 테스트 자동화
테스트 프레임워크는 리플렉션을 사용하여 테스트 메서드를 자동으로 발견하고 실행할 수 있다.
리플렉션의 단점
- 성능 문제
리플렉션은 일반적인 메서드 호출보다 느리다.
이는 런타임에 타입 정보를 탐색하고 메서드를 호출해야 하기 때문이다. - 안전성 문제
컴파일 타임에 타입 체크를 하지 않기 때문에, 리플렉션을 사용하면 런타임 오류가 발생할 가능성이 높다. - 캡슐화 위반
리플렉션을 사용하면 private 필드나 메서드에 접근할 수 있기 때문에,
객체 지향 프로그래밍의 캡슐화 원칙을 위반할 수 있다. - 복잡성 증가
리플렉션 코드는 일반적인 코드보다 더 복잡하고, 읽기 어려우며, 유지보수가 힘들 수 있다.
'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 |