본문 바로가기

내일배움캠프/꾸준CS과제

[TIL 24.07.09] 07. C# 심화 문법

.

 

목   차

     

    확인 문제

    using System;
    using System.Collections.Generic;
    
    public class Box<T>
    {
        public T Value { get; set; }
    
        public void DisplayValue()
        {
            Console.WriteLine($"Value: {Value}");
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Box<int> intBox = new Box<int> { Value = 123 };
            Box<string> strBox = new Box<string> { Value = "Hello, World" };
            Box<DateTime> dateBox = new Box<DateTime> { Value = DateTime.Now };
    
            intBox.DisplayValue();
            strBox.DisplayValue();
            dateBox.DisplayValue();
        }
    }

     

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

    제네릭을 사용한 부분: Box 클래스.

    제네릭이 없을 때의 문제점: 현재 다양한 자료형을 혼용해서 그 값을 출력하는 용도로 사용되고 있는 Box는 제네릭이 없다면 다른 자료형을 사용하고 싶을 때 반드시 형변환을 한 번은 거쳐야 한다.

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

    public static T Max<T>(T a, T b) where T : IComparable<T> { return a.CompareTo(b) > 0 ? a : b; }

    이 코드는 Max(3, 5), Max("apple", "banana") 와 같은 방식으로 사용되며, 반환자는 Max 안에 들어갈 인자의 자료형과 일치한다. 이처럼 제네릭을 사용해 다양한 자료형의 크기를 비교하고, 그 중 큰 값을 반환하는 코드이다. 


     

    설명 문제

    1. 제네릭이란 무엇인가요?

    제네릭은 프로그래밍에서 데이터 타입을 일반화하여, 다양한 데이터 타입에서 동작할 수 있도록 하는 방법입니다.

    코드의 재사용성을 높이고 타입 안전성을 강화합니다.

    클래스, 인터페이스, 메서드 등에서 사용될 수 있으며, 컴파일 시에 타입 체크가 이루어지므로 런타임 오류를 줄일 수 있습니다.

    2. 람다식(Lambda Expression)이 무엇인지 설명해주세요.

    람다식은 익명 함수를 정의하는 간결한 방법으로, 주로 함수형 프로그래밍에서 사용됩니다.

    매개변수를 가지며, 화살표(=>)를 사용하여 매개변수와 함수를 구분합니다.

    이를 통해 코드의 가독성을 높이고, 간결한 표현을 가능하게 합니다.

    예시: 

    Func<int, int, int> add = (a, b) => a + b;

    3. LINQ란 무엇인가요?

    LINQ는 데이터 쿼리를 직접 코드에 통합하여 수행할 수 있는 기능을 제공합니다.

    다양한 데이터에 대한 쿼리 구문을 사용함으로써 코드의 가독성을 높이고, 데이터 조작을 쉽게 만들어 줍니다.

    예시:

    var filteredAndSortedPeople = from person in people
                                  where person.Age > 25
                                  orderby person.Name
                                  select person;

    4. 리플렉션(Reflection)이 뭔지, 사용을 해봤다면 어떤 이유에서 사용했는지 설명해주세요. 리플렉션의 단점에 대해 설명해주세요.

    리플렉션은 프로그램이 런타임에 자신의 구조를 검사하고 수정할 수 있는 기능입니다.

    클래스, 메서드, 필드, 속성 등의 메타데이터에 접근하고 조작할 수 있습니다.

    주로 동적 타입 검사, 객체의 속성 설정, 메서드 호출 등에 사용됩니다.

    접근해야 할 클래스가 무엇인지 런타임 중에 알게 되어야 할 때 주로 사용했습니다.

     

    단점은 다음과 같습니다:

    • 성능 저하: 리플렉션은 런타임에 타입 정보를 검사하고 메서드를 호출하므로, 정적 호출보다 성능이 떨어집니다.
    • 안전성 저하: 컴파일 타임에 타입 체크가 이루어지지 않으므로, 런타임 오류가 발생할 가능성이 높아집니다.
    • 가독성 저하: 리플렉션을 사용한 코드는 일반적으로 복잡하고 이해하기 어려울 수 있습니다.
    • 보안 문제: 잘못된 리플렉션 사용은 보안 취약점을 유발할 수 있습니다. 예를 들어, private 필드나 메서드에 부적절하게 접근할 수 있습니다.

     

    실습 문제

    namespace _07.C__심화_문법_실습
    {
        public class Character
        {
            public int Level { get; set; }
            public void PrintClassName()
            {
                // TODO: 리플렉션을 사용하여 클래스의 이름을 출력하는 코드 작성
                Type type = GetType(); // 현재 인스턴스의 타입을 가져옴
                Console.WriteLine(type.Name); // 클래스 이름 출력
            }
        }
    
        public class Warrior : Character
        {
        }
    
        public class Mage : Character
        {
        }
    
        public class Archer : Character
        {
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Warrior warrior = new Warrior();
                Mage mage = new Mage();
                Archer archer = new Archer();
    
                // 리플렉션을 사용하여 클래스 이름 출력
                warrior.PrintClassName();
                mage.PrintClassName();
                archer.PrintClassName();
            }
        }
    }

    .