Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

동구의_C# & Unity_개발일지

기술 면접 질문 리스트(1 ~ 20) 본문

기술 면접

기술 면접 질문 리스트(1 ~ 20)

mongle_0l 2024. 4. 3. 11:02
1. float와 int의 표현 가능한 수의 범위가 다른 이유는 무엇인가요?
float와 int가 표현 가능한 범위가 다른 이유는 비트를 다른 구조로 활용해서 수를 표현하기 떄문이다.
즉, 다른 데이터 형식을 나타내기 때문인데 float은 정수부분과 소수 부분을 포함하는 부동 소수점을 나타낸다. 그래서 float는 보통 32비트 또는 64비트로 표현되는 반면 int는 보통 고정된 32비트 수를 사용한다. 이로 인해 표현 가능한 범위가 결정된다.
2. 'ref'와 'out'의 사용 시 차이는 무엇인가요?
1. ref는 호출된 메서드에서 변수의 값을 변경하고 호출자에게 그 변경을 반영하고자 할 때 사용되며, out은 호출된 메서드가 값을 반환하지 않고 추가적인 결과나 정보를 반환할 때 사용된다.

2. out을 사용한 함수는 함수 바깥에 있는 변수에 값을 할당 할 필요가 없는데, ref을 사용한 함수의 경우 함수 바깥에서 값을 할당하지 않으면 안된다.
3. 접근제한자란 무엇이며, 각각 어떤 차이가 있는지 비교해서 설명해주세요.
C#에서 접근 제한자는 접근 한정자라고 불리기도 하며, 타입의 범위뿐만 아니라 멤버의 접근 범위를 정의하는데 사용되는 기술이다. 클래스 또는 클래스의 멤버를 접근 가능 여부는 접근 제한자에 의해 정의된다.

C#에서의 존재하는 접근 제한자는 4가지이다. 
1. public
public으로 선언된다면 어느 곳에서든 자유롭게 사용될 수 있다. 아무런 제한을 받지 않고 원하는 곳에서 사용된다.

2. private
private으로 선언되면 약간의 제한을 갖게 된다. 예를 들어 어떤 클래스에 변수들이 private으로 선언된 경우 해당 클래스에서만 접근이 가능하다.

3. internal
internal로 선언된다면 해당 프로젝트에 public처럼 사용된다. 자신의 프로젝트에서 내부적으로 사용된다는 뜻이다. 이는 외부에서 사용될 가능성이 있는 프로젝트에서 유용하게 사용된다. 해당 프로젝트의 사용자가 굳이 몰라도 되는 정보를 감추는 것이다.

4. protected
protected로 선언된다면 상속받은 자식의 클래스에서만 사용 가능한 제한을 갖는다.
4. struct와 class를 비교해서 설명해주세요.
1. struct는 class와 다르게 상속을 할 수 없다.
2. class 객체는 힙(heap)에 할당되지만 struct 객체는 스택(stack)에 할당된다.

스택의 경우 사용할 수 있는 메모리 크기가 작고 한정적인 반면 힙은 많은 메모리크기를 가질 수 있다.
하지만 스택의 경우 가비지컬랙션에 의해 관리되지 않기 때문에 성능상 많은 장점이 있다.

class
데이터와 해당 데이터를 처리하는 메서드를 함께 묶는 데 사용됩니다.

struct
단순한 데이터를 그룹화하는 데 주로 사용됩니다.
5. 가비지 컬렉터에 대해 설명해주세요
가비지 컬렉터(Garbage Collector)는 프로그래밍 언어나 런타임 환경에서 동적으로 할당된 메모리 중에서 더 이상 사용되지 않는 객체들을 자동으로 파악하고 제거하는 기능을 말한다.

이는 메모리 누수(memory leak)와 같은 문제를 방지하여 프로그램의 안정성과 성능을 향상시키는 데 중요한 역할을 한다.
6. 가비지 컬렉터를 회피하기 위한 전략은 무엇이 있나요?
가비지 컬렉터는 메모리를 자동으로 관리해주지만, 성능저하가 발생할 가능성이 있기 때문에 가비지 컬렉션을 회피하는 전략이 필요할 수 있다. 이에는 메모리 할당 최소화, 가비지 컬렉션 메소드 직접 호출 피하기, IDisposable 인터페이스 사용, 종료자 사용 최소화, 값 타입 사용으로 가비지 컬렉터로 인한 성능 저하 문제를 해결할 수 있을 것이다.

가비지 컬렉터를 회피하기 위한 전략은 주로 메모리 관리를 개발자가 수동으로 처리하는 방법이다.
예를들어,
자원 관리 패턴을 사용하여 메모리 누수를 방지할 수 있고
메모리 관리 도구를 사용하여 메모리 누수를 탐지하고 해결할 수 있다.
그외에는
수동으로 메모리 할당 및 해제
자동 메모리 관리를 지원하는 언어 선택
메모리 사용 패턴 최적화
가있으며 이를 통해 가비지 컬렉터가 동작하지 않도록 하고 메모리 누수를 최소화할 수 있다.
7. 가비지 컬렉션이란 무엇인지 설명해주세요.
가비지 컬렉션(Garbage Collection)은 프로그래밍에서 메모리 관리를 위해 사용되는 기술이다.

프로그램이 실행되는 동안 메모리를 할당하고 사용하는데, 이 과정에서 더 이상 필요하지 않은 메모리 영역이 발생할 수 있다. 이를 해제하지 않으면 메모리 누수(memory leak)가 발생하여 시스템 성능에 문제를 일으킬 수 있다.

가비지 컬렉션은 이러한 메모리 누수를 방지하기 위해 사용된다.
8. 박싱과 언박싱에 대하여 설명해주세요.
(꼬리질문) 박싱, 언박싱을 사용할 때 주의해야 할 점이 있다면 무엇이 있나요?
박싱은 값 형식(Primitive type)의 데이터를 참조 형식(Reference type)으로 변환하는 작업을 의미하고,
언박싱은 참조 형식의 데이터를 값 형식으로 변환하는 작업을 의미한다.

박싱과 언박싱은 추가적인 연산을 수반하므로 성능에 영향을 줄 수 있다.
언박싱할 때 박싱된 객체가 널(null)인 경우에는 NullPointerException이 발생할 수 있다.
또한, 박싱된 객체를 언박싱할 때 해당 자료형이 일치해야 한다. 그렇지 않을 경우 ClassCastException이 발생할 수 있다.
9. 배열과 List, ArrayList, Dictionary 의 차이점을 설명해주세요.
(꼬리질문) Dictionary는 어떻게 구현해야 하나요?
(꼬리질문) Dictionary 검색이 빠른 이유는 무엇인가요?
배열은 동일한 데이터 형식의 요소들이 메모리에 연속적으로 저장된 자료 구조,
List는 동적 배열로 크기가 동적으로 조정될 수 있는 자료 구조,
ArrayList는 Java에서 제공되는 List 인터페이스를 구현한 클래스 중 하나,
Dictionary는 키(key)와 값(value)의 쌍으로 데이터를 저장하는 자료 구조이다.

Dictionary를 구현할 때에는 해시 테이블이나 이진 검색 트리 등의 자료 구조를 사용하여 키(key)와 값(value)을 관리한다.

Dictionary는 해시 테이블로 구현되어 있어 키(key)를 해싱하고 해당 해시 값의 위치에 직접 접근하여 값을 찾는다.
10. 제네릭이란 무엇인가요?
제네릭(Generic)은 프로그래밍 언어의 한 기능으로, 코드를 작성할 때 특정 데이터 형식을 지정하지 않고 추상적인 형식으로 유지할 수 있는 기능이다. 제네릭을 사용하면 함수나 클래스가 다양한 형식의 데이터를 다룰 수 있으며, 코드의 재사용성과 유연성을 향상시킬 수 있다.
11. 델리게이트(Delegate)의 개념에 대해 설명해주세요.
다른 객체로의 작업을 위임하거나 콜백(callback) 함수를 구현하는 데 사용된다.

함수나 메서드를 변수처럼 다루는 기능을 제공하여 프로그램의 유연성을 높이고 코드의 재사용성을 높일 수 있다.
12. 'delegate', 'event', 'action', 'func' 간의 차이를 설명해주세요.
(꼬리질문) 프로젝트에 적용해 본 경험이 있다면 설명해주세요.
(꼬리질문) 프로젝트에 적용해 본 경험이 있다면 설명해주세요.
Delegate는 메서드를 참조하는 객체로, 메서드의 시그니처에 대한 정보를 포함한다.
어떠한 일이 생겼을 때 알려주는 객체가 필요할 때가 있는데 이런 객체를 만들 때 사용하는 것이 바로 이벤트이다. Action은 반환 타입이 void인 메소드를 위해 특별히 설계된 제네릭 델리게이트다.
Func는 반환 타입이 void가 아닌 0~n개의 매개변수를 가진 함수를 나타내는 제네릭 델리게이트다.

게임에서 플레이어가 적을 공격할 때 발생하는 이벤트를 다루는 경험이 있었다.
플레이어가 공격 버튼을 누르면 이벤트가 발생하고, 이를 감지하여 적에 대한 공격을 수행하는 코드를 작성할 수 있었다.
13. 람다식(Lambda Expression)이 무엇인지 설명해주세요.
람다식이란 익명 함수를 표현하는데 사용된다. 람다식은 간결하고 가독성이 높은 코드를 작성하기 위해 사용된다. 람다식을 이용하여 코드의 길이를 줄일 수 있고, 의미 있는 변수명을 사용해 가독성을 높일 수 있다. 메모리를 효율적으로 사용할 수 있게 해주며, 반복적인 작업을 수행할 때 재사용성을 높일 수 있다. 복잡한 코드를 더 쉽게 작성할 수 있고, 개발자의 생산성을 높여주며, 버그를 줄이고 유지보수성을 높일 수 있다. 코드의 효율성과 가독성, 생산성, 유지보수성을 높이기 위해 람다식이 사용된다. 하지만 람다식은 코드를 생성하는데 많은 자원을 사용할 수 있고, 복잡한 람다식을 사용하면 성능적으로 저하를 발생할 수 있다. 반복문 내부에서 람다식을 사용하면 반복 횟수에 비례해 성능 저하 될 수 있다. 클래스를 생성하고, 클래스의 인스턴스를 생성하므로 메모리 할당이 더 많아 질 수 있다. 간단한 작업에는 사용해도 문제가 없지만, 복작한 작업에는 성능 저하를 방지하기 위해 다른 방법을 고려하는 것이 좋다.
14. 콜백이란 무엇인가요? 사용해봤는지?
콜백(callback)은 다른 함수나 메서드의 인수(parameter)로 전달되는 함수를 가리킨다. 이 함수는 주로 비동기적인 작업이 완료되었을 때 호출되는데, 이를 통해 비동기 코드의 실행 흐름을 제어할 수 있다.
사용해본적 X
15. 정렬 알고리즘이란 무엇이며, 사용 이유에 대해 설명해주세요.
정렬 알고리즘은 주어진 데이터를 특정한 기준에 따라 순서대로 정리하는 알고리즘이다.

(사용 이유)
탐색 용이성: 정렬된 데이터는 특정 값을 찾거나 검색하는 데 더욱 효율적이다.
데이터 분석 및 통계: 정렬된 데이터는 데이터 분석 및 통계 작업에 유용하다. 정렬된 데이터를 사용하면 중앙값, 평균값 등을 효율적으로 계산할 수 있다.
중복 제거: 중복된 항목을 제거하거나 중복을 확인하기 위해서는 종종 데이터를 정렬해야 한다. 정렬된 데이터에서 중복을 확인하거나 제거하는 작업은 단순하고 효율적이다.
데이터 시각화: 데이터를 시각화할 때, 정렬된 데이터는 그래프나 차트를 만들기에 적합하다. 정렬된 데이터를 사용하면 시각화가 보다 의미 있고 이해하기 쉬워진다.
다른 알고리즘의 전처리 단계: 다른 알고리즘의 입력으로 사용되는 데이터를 정렬하면 종종 해당 알고리즘의 성능을 향상시킬 수 있다.
16. 선택 정렬과 버블 정렬에 대해 설명해주시고, 코드를 작성해보세요.
선택 정렬(Selection Sort): 배열을 순회하면서 각 원소를 순서에 맞게 선택하여 정렬하는 방식이다.
버블 정렬(Bubble Sort): 인접한 두 원소를 비교하여 순서에 맞지 않는 경우 서로 교환하는 방식이다.
# 선택 정렬(Selection Sort) 구현
def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]

# 버블 정렬(Bubble Sort) 구현
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
17. 스택, 힙 메모리란 무엇이며 어떤 차이가 있는지 비교해서 설명해주세요.
스택: 스택은정적 할당 방식으로 후입선출(LIFO, Last In First Out) 방식으로 동작한다. 즉, 가장 최근에 추가된 데이터가 가장 먼저 제거된다.
힙: 힙은 동적으로 할당된 메모리를 관리하는 데 사용된다. 이는 사용자가 메모리를 수동으로 할당하고 해제할 수 있는 영역이며, 임의의 순서로 데이터를 저장한다. 스택은 빠른 메모리 액세스를 제공하고, 힙은 동적 데이터 구조를 지원하며 유연성이 높다.
18. 값 형식과 참조 형식의 차이에 대해 설명해주세요.
값 형식과 참조 형식은 데이터를 저장하고 전달하는 방식에 따라 나누어진다.
값 형식은 변수에 직접적인 값을 저장한다. 변수에 값 형식의 데이터가 할당되면 해당 변수는 실제 값의 복사본을 가지게 된다.
참조 형식은 변수가 데이터의 메모리 주소를 참조한다. 변수에 참조 형식의 데이터가 할당되면 해당 변수는 데이터의 위치(주소)를 가리킨다.
19. 자료구조의 종류는 무엇이 있으며 각각 어떤 차이점이 있는지 설명해주세요
a. 위 자료구조는 무조건 좋은가요?
배열(Array): 일련의 요소를 순차적으로 저장하는 자료구조이다. 요소에 직접 접근할 수 있어 빠른 접근이 가능하다. 크기가 고정되어 있으며, 요소를 추가하거나 삭제하는 것이 어렵다.
연결 리스트(Linked List): 각 요소가 데이터와 다음 요소를 가리키는 포인터로 구성된다. 삽입 및 삭제가 배열보다 효율적이다. 중간에 요소를 추가하거나 삭제할 때 특히 유용하다. 요소에 직접 접근하는 데는 시간이 더 많이 소요된다.
스택(Stack): 후입선출(LIFO, Last In First Out) 원칙에 따라 데이터를 저장하는 자료구조이다. 데이터를 추가하거나 제거하는 데는 상단(마지막으로 추가된 요소)에서만 가능하다. 주로 함수 호출 및 재귀 알고리즘에서 사용된다. 큐(Queue): 선입선출(FIFO, First In First Out) 원칙에 따라 데이터를 저장하는 자료구조이다. 데이터를 추가하거나 제거하는 데는 앞과 뒤에서 모두 가능하다. 프로세스 관리, 네트워크 패킷 처리 등에 사용된다.
트리(Tree): 계층적으로 구성된 데이터를 표현하는 자료구조이다. 이진 트리(Binary Tree) 등 다양한 형태로 구성될 수 있으며, 데이터 검색 및 정렬에 사용된다.
이진 탐색 트리(Binary Search Tree)는 효율적인 검색 및 정렬이 가능하다.
해시 테이블(Hash Table): 키와 값을 한 쌍으로 저장하는 자료구조입니다. 해시 함수를 사용하여 키를 값의 위치로 변환한다. 빠른 데이터 검색과 삽입이 가능하며, 키의 중복을 피할 수 있다.

아니다. 각 자료구조는 특정한 문제나 상황에 더 나은 해결책을 제공하지만, 그 자체로는 모든 상황에 완벽하게 적합하지는 않다. 따라서 문제의 성격과 조건에 따라 적합한 자료구조를 선택하는 것이 중요하다.
20. 객체지향이란 무엇인지 설명해주세요.
(꼬리질문) 객체지향의 특징은 무엇이 있나요?
(꼬리질문) OOP란?
(꼬리질문) SOLID 원칙은 무엇인가요?
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어 개발에서 사용되는 프로그래밍 패러다임 중 하나로, 현실 세계의 객체(Object) 개념을 소프트웨어 모델링에 적용하여 프로그래밍을 하는 방법론이다.

객체지향의 특징: 캡슐화(Encapsulation) 상속(Inheritance) 다형성(Polymorphism) 추상화(Abstraction)

OOP란? OOP는 객체지향 프로그래밍의 약어로, 객체지향 프로그래밍 패러다임을 의미한다.

SOLID 원칙: SOLID는 객체지향 설계 원칙의 약어로, 다음 다섯 가지 원칙으로 구성된다.
S: Single Responsibility Principle (단일 책임 원칙)
O: Open/Closed Principle (개방-폐쇄 원칙)
L: Liskov Substitution Principle (리스코프 치환 원칙)
I: Interface Segregation Principle (인터페이스 분리 원칙)
D: Dependency Inversion Principle (의존성 역전 원칙)
이러한 원칙들은 유연하고 확장 가능한 코드를 작성하기 위한 지침으로 사용된다.

'기술 면접' 카테고리의 다른 글

기술 면접 질문 리스트(21 ~ 40)  (0) 2024.04.03