| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- Inventory
- UnrealEngine
- Firebase
- Photon
- UE4
- 포톤
- Unity2D
- 스택
- 순열
- unityui
- 유클리드호제법
- 내일배움캠프
- 워크플로
- c#
- 해시
- C++
- 구현
- FSM
- 언리얼엔진
- 알고리즘
- QueryDSL
- Unity3d
- BFS
- Unity
- 이분탐색
- 스파르타내일배움캠프TIL
- 문자열
- 유니티
- 스파르타내일배움캠프
- 프로그래머스
- Today
- Total
개발 낙서장
2025.09.01 면접 회고 본문
오늘 기술 면접에서 받았던 기술 질문들을 정리하면서 부족했던 부분을 다시 정리해보고자 한다.
분명 예전에 공부했었고 잘 알고 있던 내용이었는데 잊어버린 부분이 많은 것 같다.
다시 보면 당연히 알고 있어야 했고 어려운 질문이 없었는데 바보같이 답변을 하지 못한 것 같다.
이번 기회에 반성하게 됐고 앞으로 CS 지식을 놓치면 안되겠다는 생각이 들었다.
1. final 클래스를 왜 사용하는가?
final 클래스를 왜 사용하는가? 에 대한 질문에 답을 제대로 하지 못했다.
사실 '불변 변수를 위해 사용한다'라는 것 말고는 제대로 파고든 적이 없던 것 같다.
final은 불변을 보장하는 키워드다.
Java에서 final은 세 가지 레벨에서 사용할 수 있다.
final 변수
한 번 초기화된 이후에는 값 변경 불가
ex) 상수 선언 시 final static과 함께 사용
final int a = 10;
a = 20; // 컴파일 에러 발생
final 메서드
해당 메서드를 오버라이딩할 수 없음
보안상 중요한 로직이나 변경되면 안 되는 로직 보호 목적
class Parent {
public final void display() {
System.out.println("부모 출력");
}
}
class Child extends Parent {
@Override
public void display() { } // 컴파일 에러
}
final 클래스
상속 불가능한 클래스
대표적으로 String, Integer 등 Wrapper 클래스가 final
상속을 통한 확장/변경을 막고 불변 객체로 사용하기 위함
public final class String {
// ...
}
2. 시간복잡도와 공간복잡도에 대하여
시간 복잡도와 공간 복잡도에 대한 질문을 받았다.
대학생 때는 잘 알고 있던 개념이었는데 최근에 잊고 살았더니 대답을 틀린 대답을 하고 난리 났다.
부끄러운 일이다. 성능을 신경 쓴다는 개발자가 시간 복잡도와 공간 복잡도를 잊어버리다니
이번 기회에 다시 찾아보고 앞으로도 이런 부분을 신경 써서 로직을 구현해야겠다.
(1) 시간복잡도?
알고리즘이 실행되는 데 걸리는 시간을 입력 크기(n)의 함수로 표현
예시
- 배열 탐색: O(n)
- 이진 탐색: O(log n)
- 정렬(퀵정렬 평균): O(n log n) 등
// O(n) - 선형 탐색
for (int i = 0; i < n; i++) {
if (arr[i] == target) return i;
}
(2) 공간복잡도?
알고리즘이 실행되는 데 필요한 메모리 공간
예시
- 단순 변수 사용 : O(1)
- 크기 n의 배열 사용 : O(n)
- 재귀 호출 깊이 n : O(n) 등
// O(n) - 재귀 깊이만큼 메모리 사용
int factorial(int n) {
if (n == 1) return 1;
return n * factorial(n-1);
}
3. 특정 위치의 값을 삭제해야 한다면 배열이 좋을까, 연결 리스트가 좋을까?
나는 특정 위치의 값만 0 혹은 특정 무의미한 값으로 바꿔버리면 된다고 이해하여 배열이 더 좋다고 답했다.
하지만 면접관님의 의도는 '특정 위치를 아예 지운다(NULL)'였다.
이 경우에서는 배열은 지운 개수 만큼 앞으로 땡겨야 하기에 연결 리스트가 당연히 월등히 좋을 수밖에 없다.
긴장한 탓에 순간 질문의 의도를 잘못 파악했다.
배열
- 장점 : 인덱스로 바로 접근 가능 → 검색 O(1)
- 단점 : 중간 요소 삭제 시 뒤의 원소들을 전부 이동해야 함 → 삭제 O(n)
연결 리스트
- 장점 : 중간 요소 삭제 시 노드 참조만 바꿔주면 됨 → 삭제 O(1)
- 단점 : 인덱스로 접근 불가 → 검색 O(n)
이전에도 정말 좋은 면접 경험이 많았지만 오늘은 나 스스로를 되돌아보게 됐던 것 같아서 더 뜻깊었다.
면접관 님들도 굉장히 편안하게 격려해주시면서 면접에 임해주셨기에 더 좋은 경험으로 기억될 것 같다.