본문 바로가기

글또

[글또] 이직 실패.. 그래서 무엇을 채워야 할까?

안녕하세요

저번 글 포스팅은 서류부터 면접까지 이직 시도를 해봤던 경험을 작성했었는데요,

앞으로의 이직 성공을 위해 무엇을 구체적으로 해야할지 고민하다가 그냥 일단 하자! 생각을 하면서

이번 글을 써봤습니다.

 

회사 업무는 적응했고 정체되있는 것 같은 기분이 들고 자바 개발자가 코틀린을 배운다고 개발을 더 잘하는 것도 아니고 면접에서 물어보는 것은 대답하지 못하겠고.. 무엇이 부족한지 잘 모르겠더라구요.

 

그래서 첫번째'진짜 개발' 을 배워야된다는 생각에 공감하여 아래 책을 사서 읽는중인데 공감되는 내용도 많고 꼭 자바/스프링 개발자가 아니여도 읽으면 좋은 책 인 것 같다고 생각이 듭니다.

 

자바/스프링 개발자를 위한 실용주의 프로그래밍

 

자바/스프링 개발자를 위한 실용주의 프로그래밍 | 김우근 - 교보문고

자바/스프링 개발자를 위한 실용주의 프로그래밍 | 소프트웨어 개발을 잘하고 싶다면 ‘개발’ 공부를 해야 합니다! 자바 개발자가 코틀린 같은 신생 언어를 다룰 수 있게 된다고 해서 개발을

product.kyobobook.co.kr

 

책에서 나오는 내용은 결국 기술은 적응의 문제이고 개발 자체(OOP, 아키텍처, 테스트)를 배우라는 것 입니다. 

 

면접때도 많이 물어봤었는데 신입때는 달달 외웠던 것 같습니다.

  • OOP 가 무엇인지? 
  • 객체와 클래스, 함수와 메서드의 차이? 
  • 최근 진행한 프로젝트가 객체지향이에요 절차지향이에요?
  • Mockito, Junit 없이 테스트 코드 작성할 수 있나요? 테스트코드의 의미?
  • SOLID와 의존성이 무엇인지?
  • 디자인 패턴중 사용한 패턴이 있나요? 그걸 왜 쓰는 것 같아요?

면접때도 물어봤던 내용들인데 이런 내용에 대해 자바에서 예시 코드를 통해 정확한 개념과 실제 프로그래밍으로 어떻게 이어지는지 설명이 나와있는데 한번쯤 읽어보면 좋다고 생각이 듭니다.

 

다음 글 포스팅은 책을 끝까지 읽고 제 생각을 정리하여 한번 대답해보는 시간을 가져볼게요. (이제 3분의1 정도 읽었습니다 ㅠ)

 

두번째는 면접때 이야기 대답하지 못했던 내용들 몇개를 공부하고 적어보려고 합니다!

  • Tim sort

지도에서 마커 필터링시에 사용되었는데 여러 백엔드를 거치고 다중 필터가 n의 x제곱 형태로 되어 있어 필터 하나가 추가될때 마다 n의 x+1로 시간복잡도가 무자비하게 늘어나 개선하기 위해

효율적인 객체 비교를 위해 사용한 알고리즘 중 하나였습니다. 

 

우선 알고리즘은 탐지 및 병합으로 작동하게 됩니다.

 

1. 데이터 내에서 이미 정렬되어 있거나 역순으로 정렬된 Run (부분 배열)을 탐지합니다. 

2. 각 Run들을 Merge Sort로 병합하게 됩니다. 

 

시간 복잡도가 O(nlog⁡n) 실제 실행 시간은 다음과 같이 표현할 수 있습니다

<시간복잡도에 따른 실제 실행 시간>

C는 정렬 알고리즘에서 비교, 병합, 데이터 이동에 대한 비용을 의미하게 되는데  Tim Sort는 Run 을 통해 이미 정렬되어 있는 배열들에 대해 로컬 지역성 참조를 활용해서 CPU 캐시 (Cache hit rate) 를 높여 C 값을 낮출 수 있는 장점이 있습니다.

 

소팅 방식은 Run (부분 배열) 으로 데이터를 나누고 내부에 데이터가 메모리에 연속적으로 저장되어 있을때 CPU가 인접 데이터를 한번에 읽게 되기 때문이죠 

 

팀소트는 기본적으로 Run 내부에서는 Insertion Sort, Run 끼리의 병합은 Merge Sort로 작동하게 됩니다.

 

자바의 Collections.sort() 에서도  Run (부분 배열)의 크기가 32 이하인 경우 Run 내부의 데이터는 Insertion Sort로 정렬되고 32보다 크거나 Run 끼리의 병합 과정에서는 Merge Sort 알고리즘으로 병합되게 됩니다.

 

저는 코어 서버를 거쳐서 데이터가 어느정도 부분정렬된 데이터도 있고 1000건 이상의 데이터들을 한번에 가져와야 하는 경우가 있어 Tim Sort를 사용해야겠다고 생각이 들었습니다.

 

테스트는 Postman으로 했었지만.. 더 좋은 방법이 있을 거 같긴 합니다.

 

GPT 통하면 위와 같은 장점이 있다고 하네요

  • Collections.sort()  VS Arrays.sort()

둘다 객체 비교는 Tim Sort를 사용하지만 Arrays.sort에서 값을 비교할때는 원시타입 특성상 불변성이 보장되므로

Dual-Pivot QuickSort를 사용하더군요.. 면접때 물어봤었는데 몰랐었네요.

빠르지만 불안정 정렬이기 때문에 동일한 값의 상대적인 순서는 보장되지 않는다는 단점이 있습니다.

 

 

  • Dual-Pivot QuickSort가 더 빠른 경우:
    • 원시 타입 배열에서, 특히 크기가 크고 무작위 데이터일 때.
    • 추가 메모리가 제한된 환경.
    • 안정 정렬이 필요 없는 경우.
  • TimSort가 더 빠른 경우:
    • 객체 배열에서.
    • 데이터가 부분적으로 정렬된 상태일 때.
    • 안정 정렬이 필요하거나 다중 키 정렬이 필요한 경우.

로 정리해볼 수 있을 것 같습니다.

 

  • 일반적인 선택:
    • 원시 타입 배열: Arrays.sort (Dual-Pivot QuickSort 사용).
    • 객체 배열 또는 안정 정렬 필요 시: Collections.sort 또는 Arrays.sort (TimSort 사용).

 

Java 17 이상에서 도입된 Record는 불변 객체를 간단히 정의할 수 있도록 설계된 새로운 데이터 구조입니다.

Record는 데이터 중심 클래스(예: DTO, VO, Model 등)를 보다 간결하게 정의하기 위해 만들어졌습니다.

 

지금 다시 공부해서 정의해보자면 단순 데이터 전달이나 테스트 목적, 객체의 책임이 없는 무의미한 클래스라면 클래스 대신 record를 만들 것 같네요.

 

그래도 요즘은 공부의 방향성은 찾은 것 같은?? 기분은 드는데 모르겠네요

앞으로도 오늘 처럼 계속 면접 내용을 복기 해보고 대답하고 공부했던 내용을 쭉 써보려고 합니다.

 

감사합니다!