Java
-
Java
[Java 딥다이브] Integer도 객체잖아..! 그런데 왜 메서드에서 Call by Reference처럼 값이 안 바뀔까? #오토박싱 #State of Valhalla
Java를 공부하다 보면 한 번쯤 이상한 지점을 만나게 됩니다. int가 메서드 안에서 바뀌지 않는 것은 어느 정도 자연스럽습니다. primitive type은 값 자체가 전달된다고 배웠으니까요. 그런데 Integer는 다릅니다.Integer는 분명 class입니다. 그렇다면 객체는 Heap에 존재하고, 변수는 그 객체를 참조합니다. 메서드에 Integer를 넘기면 같은 객체를 바라보게 될 텐데,, 왜 메서드 안에서 값을 바꿔도 호출한 쪽의 값은 그대로일까요? 반대로 배열은 메서드에 넘긴 뒤 원소를 수정하면 호출한 쪽에서도 그대로 바뀝니다. public class Main { public static void main(String[] args) { Integer number = 10; ..
-
Java
[Java] Generic 1편: Type Erasure와 javac의 동작 원리
Java 개발을 하다 보면 List과 같은 제네릭(Generic)을 숨 쉬듯이 사용하게 됩니다. 하지만 “왜 런타임에는 제네릭 타입 정보가 남아있지 않을까?” 혹은 “왜 instanceof List은 컴파일 에러가 날까?”라는 의문을 가져본 적이 있으신가요? 이 글에서는 Java가 제네릭을 어떻게 처리하는지,그리고 컴파일러와 JVM의 역할이 어떻게 나뉘는지 심도 있게 파헤쳐 봅니다.제네릭이 없던 시절의 Java와 JSR-14Java 5에 제네릭이 도입되기 전, 컬렉션을 다루는 코드는 런타임 에러의 지뢰밭이었습니다. 제네릭 도입을 제안했던 JSR-14 Proposal의 문구를 보면 당시의 고민이 잘 드러납니다. "Many programs and libraries written in Java are intr..
-
Java
[Inside Java] 08. 마무리.. Java 실행 구조 핵심 위키!
앞선 1장부터 7장까지 다룬 내용을 다시 찾기 쉽도록 핵심 개념만 두줄로 압축했습니다.자세한 동작 원리와 예시는 각 챕터에서 확인하고, 이 글에서는 개념의 연결 관계만 빠르게 정리합니다. 이번 시리즈를 정리하면서 Java는 단순히 컴파일만 하는 언어가 아니라, 인터프리터와 JIT 컴파일러를 함께 활용해 실행 성능을 높이는 구조라는 점이 특히 인상 깊었습니다.또한 클래스 로딩부터 메모리 구조, 동적 디스패치, JIT 최적화까지 각각의 개념이 독립적으로 존재하는 것이 아니라 하나의 실행 흐름으로 연결되어 있다는 점도 새롭게 이해할 수 있었습니다. 예전에 Young Generation, Old Generation, Minor GC, Major GC 등 GC의 동작 방식도 한 번 공부했던 기억이 있는데, 이번..
-
Java
[Inside Java] 07. interface는 JVM 메모리에서 어떻게 관리될까? — default 메서드와 enum 객체까지!!
이전 [Inside Java] 시리즈에서는 class로 만든 객체와 메서드 호출이 JVM 안에서 어떻게 연결되는지 살펴봤습니다.그런데 Java에는 class만 있는 것이 아니죠.....interface Animal { void speak();}enum Direction { LEFT, RIGHT}@interface Marker {} 셋은 문법적으로 서로 완전히 달라 보입니다. 그런데 컴파일하고 나면 모두 .class 파일이 만들어집니다.Animal.java → Animal.classDirection.java → Direction.classMarker.java → Marker.class 여기서 한 가지 궁금한 점이 생겼습니다.이름은 모두 .class인데, 그렇다면 전부 일반 ..
-
Java
[Inside Java] 06. 같은 Java 코드가 실행될수록 빨라지는 이유 — JIT 컴파일과 HotSpot JVM 최적화 #Inline #Hot Code와 JIT Compilation #Runtime Profiling
[Inside Java] 1~5편 까지는 JVM이 메모리를 어떻게 관리하는지를 중심으로 살펴보았습니다. 그런데 지금까지 살펴본 것처럼 JVM이 런타임마다 바이트코드를 하나씩 해석하고, Operand Stack을 이용해 연산을 수행하며, 메서드 호출 대상까지 계속 찾아야 한다면 Java는 계속 느린 것 아닐까?.. 하는 의문증이 생길수도..왜냐면은 실제로 Java는 AOT(Ahead-Of-Time) 방식처럼 실행 전에 모든 코드를 기계어로 컴파일하지 않고, 우선 Interpreter를 통해 바이트코드를 실행합니다.그렇다면 같은 코드가 반복 실행될 때도 매번 바이트코드를 해석해야 하는 걸까요? Java는 처음부터 모든 코드를 기계어로 바꾸지 않습니다. 우선 빠르게 실행을 시작하고, 실제 실행 정보를 관찰한 ..
AI
-
AI Inbox
ADR-toolkit을 만들며 배운 것 : 결정을 잊지 않게 만드는 도구
1. 들어가며: AI가 코드를 고치는 시대, 결정 기록은 누가 읽을까팀이 성장하면 아키텍처 결정은 코드보다 빨리 잊힙니다. 코드는 남아 있습니다.디렉터리도 남아 있고, 인터페이스도 남아 있고, 의존성 방향도 남아 있습니다. 그런데 시간이 지나면 점점 흐려집니다.... 왜 이 구조를 택했는지.왜 이 의존성은 금지했는지.왜 이 모듈은 다른 모듈을 직접 참조하면 안 되는지.왜 여기서는 이벤트 기반으로 풀고, 저기서는 동기 호출을 유지했는지. 처음에는 다들 기억합니다. 회의도 했고, PR에서도 이야기했고, 슬랙에도 남아 있으니까요. 문제는 그 기억이 시스템의 일부가 아니라는 점입니다. 새로운 개발자가 들어오면 다시 설명해야 하고, 시간이 지나면 기존 팀원도 다시 묻게 됩니다. "엇,, 혹시 이거 왜 이렇게 되어..
-
AI Agent & Harness
[AI workflow #2] Plugin과 MCP는 무엇이 다를까? - Marektplace부터 AI Tool이 설치되고 실행되는 구조
1편에서는 제가 만든 Agent Toolkit과 GitHub 저장소의 구조를 살펴봤습니다. 그런데 저장소에 스킬과 코드를 잘 정리해두는 것만으로는 조금 부족했습니다. 다른 개발자는 제가 만든 깃헙 레포지토리인 Agent Toolkit의 skills에서 어떻게 스킬들을 어떻게 발견할까요? 발견한 뒤에는 어떻게 설치할까요?그리고 설치한 기능이 Claude Code, Codex 같은 AI 하네스 안에서는 어떻게 인식될까요? 추가로, 스킬을 사용하며 “최신 GitHub 이슈를 가져와줘”라고 지시했을 때, 실제 데이터는 누가 가져오는 걸까요…? 이 질문을 따라가다 보면 Plugin, Marketplace, MCP라는 단어를 계속 만나게 됩니다.셋 다 AI 에이전트에 기능을 붙이는 방법처럼 보입니다. 그래서 처음에..
-
AI Agent & Harness
[AI workflow] 매번 AI에게 같은 말을 복붙하던 내가 Codex, Claude, agy등 하네스용 스킬 플러그인을 만든 이유 #1
"이 글쓰기 규칙을 지켜줘", "지난번 형식으로 써줘"를 매번 붙여 넣는 일을 끝내기 위한 Agent Toolkit Skills 제작기 버전은 시간이 지나면 달라질 수 있습니다. 아래 값은 이 글을 작성할 때 실제로 확인한 환경입니다. 대상 확인한 버전 또는 상태 Agent Toolkit plugin 0.3.1 Codex CLI 0.151.0 Claude Code CLI 2.1.251 ChatGPT 고정 클라이언트 버전 미표시, 작성 기준일과 공식 문서로 추적합니다. 이후 버전에서 명령어와 UI가 달라질 수 있으므로 문제가 생기면 codex --version, claude --ve..
-
AI
[Interface Systems] 로컬 LLM은 어떻게 실행될까? — llama.cpp, Ollama, vLLM, SGLang 비교
거대한 언어 모델(LLM)을 다루는 개발 환경은 최근 몇 년 사이 유례없이 가속화되었습니다. 개발자들은 자신의 노트북이나 개별 서버에 모델을 띄워 로컬 에이전트(Coding Agent)를 구축하기도 하고, 수백 명의 동시 요청을 처리해야 하는 클라우드 인프라 위에서 고성능 추론 엔진을 구동하기도 합니다. 그러나 이 과정에서 흔히 마주치는 도구들 — llama.cpp, Ollama, vLLM, SGLang — 은 종종 "로컬에서 LLM을 실행하기 위한 프로그램"이라는 하나의 거친 범주로 뭉뚱그려 설명되곤 합니다. 실상은 그렇지 않습니다. 이 네 가지 도구는 컴퓨터 시스템 아키텍처 관점에서 전혀 다른 레이어에 위치하며, 풀고자 하는 문제의 본질과 시스템 추상화 수준이 완전히 다릅니다.개인 컴퓨터의 단일 메..
-
AI
[로컬 LLM 4탄] AI 개발자?!: RAG와 벡터 DB를 알아보쟈
지금까지 로컬 LLM의 수학적 원리(임베딩, 트랜스포머 파라미터)와 하드웨어 최적화 기법(양자화, mmap)을 쭉 살펴봤는데요,, '원리는 아주 추상적으로나마 알겠는데.. 그럼 요즘 채용 공고에 보이는 랭체인(LangChain)이나 RAG 개발자들은 다들 수학 천재들이라서미적분 풀며 AI 엔진을 깎고 있는 건가..'결론부터 말하자면 살짝 다른것 같기도 하더라구요 대학교 랩실 연구원분들이 엄청난 수학을 계산하며 AI 엔진 자체를 다듬는다면, 현업의 AI 서비스 개발자는 그 만들어진 엔진(LLM)을 가져다가 우리 회사 로직에 맞게 레고 블록을 조립하는 소프트웨어 엔지니어에 가깝다고 합니다.1. AI 모델 (초거대 파라미터 덩어리) = 똑똑한 요리사의 '고정된 뇌'Llama-3나 GPT-4 같은 AI 모델은 ..
-
AI
[로컬 LLM 3탄] 도대체 AI는 어떻게 글을 쓸까? 임베딩과 강화학습(RLHF)
전편에서 양자화와 mmap 기술 덕분에 거대한 수학 행렬 덩어리를 어떻게 메모리에 띄우는지는 알게 되었는데요..계속해서 공부하다 보니 아주 근본적인 의문이 하나 들었습니다.도대체 이 단순한 0과 1의 숫자 덩어리들이 어떻게 인간의 복잡한 뉘앙스를 알아듣고,, 문맥을 파악해서 그럴듯한 대답을 만들어 내는 걸까요..? 사실 컴퓨터는 '사과'라는 문자의 의미나 '맛있다'라는 감정을 전혀 모릅니다.그래서 AI를 연구하는 학자들은 아주 기발한 수학적 아이디어를 냈다고 합니다. 단어를 단순히 암호화하는 걸 넘어서, 우주 공간의 '좌표(숫자 벡터)'로 변환해 버린 겁니다. 이걸 워드 임베딩(Word Embedding)이라고 부르더라구요.1. 단어를 수천 차원의 우주 공간으로 쏘아 올린듯한.. (워드 임베딩)임베딩의 ..
-
AI
[로컬 LLM 2탄] 16GB 거대 AI가 내 노트북에서 돌아갈 수 있을까? (양자화와 mmap)
저번 포스팅에서 알아본 것처럼, 클라우드 종속성에서 벗어나 로컬 LLM을 돌려볼까 하는 생각도 드는데요. 시작부터 가장 큰 물리적 벽에 부딪혔습니다.AI 모델이라는 게 결국 코드가 아니라, 수십억 개의 가중치(Weight) 숫자들이 뭉쳐 있는 거대한 '수학 행렬 덩어리'더라구요. Meta에서 만든 오픈소스 모델인 Llama-3-8B 모델을 예로 들어보겠습니다.파라미터가 80억 개인데, 보통 이 숫자들은 모델을 정밀하게 학습시키기 위해 16비트 부동소수점으로 저장됩니다.숫자 하나를 저장하는 데 2Byte가 필요하니까, 80억 x 2Byte = 약 16GB라는 어마어마한 디스크 용량이 나옵니다. 이 16GB짜리 뇌를 일반적인 개인 노트북에서 어떻게 돌릴까요..? AI가 다음 단어를 추론하려면 일단 이 16G..
Algorithm concepts
-
Algorithm concepts
[Algorithm] with Java. 다익스트라 개념 진짜 이거 하나로 완벽하게 뿌수기!!
이번 포스트에서는 다익스트라에 대해서 알고리즘과 개념부터, 최적화까지 쉽게 파해쳐볼 생각입니다. 최단 거리 문제를 처음 만나면 생각보다 익숙한 느낌이 듭니다.“시작점에서 목적지까지 가장 빨리 가면 되는 거 아닌가?”그래프 탐색을 공부했다면 BFS가 먼저 떠오를 수 있습니다. 조금 더 알고리즘 공부를 했다면 프림, 크루스칼, 벨만-포드 같은 알고리즘도 생각납니다. 전부 뭔가 “최소”를 구하는 것 같아서 처음에는 비슷해 보입니다. 그런데 간선마다 서로 다른 비용이 붙기 시작하면 문제가 조금,, 달라집니다. 단순히 몇 번 이동했는지가 아니라, 어떤 경로를 거쳤을 때 비용의 합이 가장 작은가 를 따져야 하기 때문입니다. 바로 이 문제를 해결하기 위해 다익스트라(Dijkstra) 알고리즘이 등장합니다.이번 글에..
-
Algorithm concepts
[Algorithm] 크루스칼 #2. Union-Find 최적화 .. 경로 압축으로 해결이 안되는 스택 오버플로우. Rank를 알아보자!
크루스칼 알고리즘(Kruskal's Algorithm)과 MST 완벽 이해하기 (feat. Cut Property, Union-Find) #1(링크 바로가기) 1편에서는 MST와 Union-Find를 이용해 사이클을 판별하는 기본적인 흐름을 정리했습니다.이번에는 문제를 풀다가 실제로 StackOverflowError를 만나면서 알게 된 Union-Find의 최악의 경우, 경로 압축의 한계, 반복형 find, 그리고 Union by Rank까지 정리해보려고 합니다.1. 시작은 평범한 Union-Find였다..크루스칼에서 사이클을 판별하기 위해 보통 Union-Find를 사용합니다.제가 기존에 사용하던 find()는 다음과 같았습니다.static int find(int x) { if (cache[x] ..
-
Algorithm concepts
[Algorithm] 누적 합은 O(1)인데, 값이 바뀌면 왜 세그먼트 트리가 필요할까? #Java
[세그먼트 트리 1편] Prefix Sum은 O(1)인데, 왜 Segment Tree가 필요할까?구간 합을 구하라는 문제를 처음 만나면 Prefix Sum(누적 합)을 떠올리게 됩니다.누적 합 배열만 한 번 만들어 두면 [left, right]의 합을 O(1)에 구할 수 있으니까요.그런데 문제 중간에 원본 배열의 값이 계속 바뀐다면 어떨까요..? 값 하나가 바뀔 때마다 그 뒤의 누적 합을 전부 고쳐야 합니다. 조회는 빨라졌지만, 수정 한 번에 O(N)이 드는 참사가 발생합니다. 세그먼트 트리는 바로 이 상황에서 진가를 발휘합니다.세그먼트 트리는 배열의 여러 구간을 이진 트리로 미리 나눠 저장하여, 구간 조회와 값 변경을 모두 O(log N)에 처리하는 자료구조입니다. 이번 글의 목표는 세그먼트 트리의 모..
-
Algorithm concepts
[Algorithm] 크루스칼 알고리즘(Kruskal's Algorithm)과 MST 완벽 이해하기 (feat. Cut Property, Union-Find) #1
그래프 문제나 코딩 테스트를 풀다 보면 다양한 그래프 알고리즘을 접하게 됩니다. "이 정점에 도달할 수 있는가?""A에서 B까지 가장 빠르게 가는 방법은 무엇인가?""모든 도시를 가장 적은 비용으로 연결하려면 어떻게 해야 하는가?" 이번 포스트에서는 모든 정점을 최소 비용으로 연결하는 크루스칼 알고리즘(Kruskal's Algorithm)의 등장 배경부터 정당성을 증명하는 Cut Property, 핵심 자료구조인 Union-Find, 그리고 단계별 그래프 시각화까지 다뤄보겠습니다.크루스칼 알고리즘의 등장 배경그래프 탐색 알고리즘은 해결하려는 문제의 목적에 따라 선택해야 합니다.크루스칼 알고리즘은 단순히 "길을 찾기 위해" 만들어진 알고리즘이 아닙니다. 도로 건설 문제로 보는 기존 알고리즘의 한계5개의 ..
-
Algorithm concepts
[Algorithm] 배낭 문제 사고방식. 배낭 개념 정리. knapsack master
오늘은 DP 배낭 문제에 대한 개념을 정리하려고 합니다. 배낭문제가 01배낭문제라하는데 "0 1" 선택 할래 말래.... 그러니까 쉽게 말해서. 배낭의 크기는 '한정' 되어있다. '제한' 되어있다. 그 한정된 공간에 물건들을 넣을 수 있다.그래서 추운데 .. 담요 넣을래 말래.. 따뜻함은 왕창 증가(가치↑)하지만, 배낭에 널 공간(소비 공간↓)이 대폭 쭐어든다. 제한, 한정된 공간 -> 담을수록 점점 소비할 공간이 없어짐. 담요 -> 따듯하다 -> 가치가 증가한다.양말보다 높은 가치를 갖고 있다. '물건'에 가치와, 소비공간 이렇게 있는 경우입니다. 즉, 배낭 문제는1. 제한된 자원 : 배낭의 남은 공간(소비할수록 줄어듬)2. 선택의 가치 : 각 물건마다 주는 만족도가 있습니다. (담요는 양말보다 가치..
-
Algorithm concepts
[Algorithm][프로그래머스] lv3 네트워크 | 오늘 문득 깨닳아버렸다.. 때로는 bfs보다 dfs가 더 좋다는 사실을... ㄴㅇㄱ
https://school.programmers.co.kr/learn/courses/30/lessons/43162 코딩테스트 연습 - 네트워크알고리즘 문제 연습 카카오톡 친구해요! 프로그래머스 교육 카카오 채널을 만들었어요. 여기를 눌러, 친구 추가를 해주세요. 신규 교육 과정 소식은 물론 다양한 이벤트 소식을 가장 먼저 알려school.programmers.co.kr 오늘 이 문제를 풀면서bfs보다 dfs가 진짜 대박 효율적일 때가 있구나라는 것을 깨달아 버렸습니다.. 저는 보통 그래프, 지도나 맵 탐색, 네트워크 이런 문제들은 저는 거의 다 bfs로 먼저 로직을 짜왔습니다.bfs를 활용해서 거의 백준 dfs/bfs문제 100문제인가 정도 푼거같기도 하구요. 그래서 이 문제도 간단하게1. 그래프를 만..
-
Algorithm concepts
[Algorithm/Swift] 문자열 탐색. KMP 알고리즘 파해치기!! 부분 일치 테이블 pi 채우는 방법
요즘 문자열 알고리즘을 공부하고 있습니다. 문자열 탐색에 많이 사용되는 kmp 알고리즘에 대해서 공부한 개념을 정리하려고 합니다.ctrl + f를 통해 trans라는 단어를 찾아봤습니다. 주어진 text에서 "trans"라는 pattern을 찾았습니다. 문자열 탐색이란 주어진 text에서 특정한 단어 pattern을 찾는 것을 의미합니다. Knuth, Morris, Pratt 세 사람이 만든 KMP 알고리즘이 문자열 탐색에 유명합니다. 그 전에 먼저 문자열 탐색의 가창 기초적인 방법을 설명한 후에 kmp 알고리즘을 통한 문자열 탐색 알고리즘을 소개하려고 합니다. 1. 기본적인 문자열 탐색 방법 Naive string search주어진 문장에서 특정한 문자열을 찾을 수 있는 방법이 뭐가 있을까요? 주어진 ..
따근 따근한 React 최신 글
-
React-Fiber
[React] Fiber 5탄. useEffect는 언제 실행될까? Commit Phase 정리(Render vs Commit, Layout/Passive 차이)
Effect는 “렌더 중 실행되는 콜백”이 아니라, 렌더 결과가 커밋되는 과정(Commit pipeline)에서 플러시(flush : 쌓아둔 작업을 한방에 실행)되는 작업입니다.Effect는 React가 "렌더를 스케줄링 가능한 작업으로 만들기" 위해 Render와 Commit을 분리했을 때, Commit 쪽 파이프라인에 속한 단계라고 이해하는 게 좋습니당.Render Commit 분리 위에 Effect 파이프라인이 올라갑니다React(Fiber)는 UI 업데이트를 크게 두 단계로 나누죠!Render phase / Commit phase그리고 Effect는 Render가 아니라 Commit 파이프라인에서 실행됩니다. Render 단계에서 계산되는 useState, useMemo, useReducer, u..
-
React-Fiber
[React] Fiber 4탄. Lane과 Concurrent Rendering 내부 동작 정리(WIP, Scheduler, Mount/Unmount)
이번 편은 React는 왜 업데이트를 “스케줄링 가능한 작업”으로 만들었을까? 그리고 그 스케줄링은 실제로 어떻게 동작하는지에 대한 내용들을 정리해봤습니다. React가 바꾸고 싶었던 "즉시 렌더" 모델의 한계초기 React(Stack Reconciler)는 렌더링이 시작되면 끝까지 한 번에 실행하는 방식이었습니다.문제는 아래와 같습니다:큰 리스트 렌더링 중에 사용자가 입력하면?렌더가 길어지면 스크롤이 끊기면?애니메이션이 버벅이면?브라우저는 싱글 스레드입니다.한 번 JS가 오래 점유하면 클릭이 밀리고, 스크롤이 멈추고, 프레임이 드랍됩니다.그래서 React 팀은 Fiber 아키텍처를 설계하면서 목표를 바꿉니다:렌더링을 "즉시 실행"이 아니라"작업 단위로 쪼개서 스케줄링 가능한 모델"로 만들자. 요약하면 ..
-
React-Fiber
[React] fiber 3편. 왜 setState는 즉시 반영되지 않을까? Render/Commit, updateQueue, batching 개념 뽀개기
2편에서 “Fiber가 상태/props/Hook을 어디에 저장하냐”를 봤다면, 이제 3편은 그 저장 구조가 어떤 파이프라인(단계)에서 쓰이는지를 탐구해보겠습니다. 1. Trigger2. Render3. Commit 결론부터 말하면 React 업데이트는 크게 Render 단계와 Commit 단계로 나뉘고, 이 분리 덕분에 "중단 가능한 렌더링", "업데이트 큐", "배치 처리"를 할 수 있습니다.Render / Commit: React가 크게 두 단계로 나누는 이유React는 업데이트를 한 번에 “DOM에 바로 반영”하지 않습니다!Render(Reconciliation-재조정)다음 UI를 계산어떤 변경이 필요한지 계획을 세움DOM 직접 변경 X그래서 중단(interrupt) 가능, Schedular 개입 ..
-
React-Fiber
[React] Fiber 2탄. Fiber 내부 구조부터 Hook 연결 리스트, current/WIP까지!
이 글에서는 React가 내부에서 컴포넌트, 상태, 훅을 어떻게 관리하는지 “구조 중심”으로 정리합니다.다음 글에서는 Render / Commit 파이프라인을 다룰 예정입니다.컴포넌트 = Fiber 하나React 내부에서 컴포넌트 하나는 Fiber 하나로 표현됩니다. 내부 구조는 이렇게 생각할 수 있습니다.Fiber(App) └─ Fiber(Header) 각각의 Fiber는 자기만의 상태 저장 공간을 가집니다.Fiber는 트리 구조입니다React는 일반 트리를 다음 3개의 포인터로 저장합니다.fiber.child → 첫 번째 자식 fiber.sibling → 다음 형제 fiber.return → 부모 예를 들어: 내부 구조:Fiber(App) ↓ childFiber(Header) →..
-
React-Fiber
[React] Fiber 1편. React를 3겹으로 나누면 Fiber가 보인다.
React Fiber를 이해하려면 먼저 질문 하나가 필요합니다.React는 왜 내부 엔진을 교체했을까요? React 15까지는 기본적으로 동기식 렌더링이었습니다. 업데이트가 발생하면 트리를 끝까지 계산하고 DOM에 반영했습니다.중간에 멈출 수 없었습니다. 이 구조는 단순했지만 한계가 있었습니다.큰 트리에서 렌더 시간이 길어짐입력 반응성이 떨어짐애니메이션이 끊김업데이트 우선순위를 세밀하게 제어 어려움React 팀은 렌더링을 “즉시 실행”이 아니라 “스케줄 가능한 작업”으로 바꾸고자 했습니다.기존 React의 실행 모델기존 모델은 다음과 같은 흐름이었습니다.setState() ↓Reconciliation ↓DOM 반영 한 번 시작하면 끝까지 실행되었습니다.중간에 더 중요한 작업이 들어와도 끼어들 수 없었..
iOS Combine Framework
-
Combine Framework
[Swift] No7. Deep dive into AnyPublisher and eraseToAnyPublisher( )🤩 | Combine
안녕하세요. 이번 포스트는 Combine 프레임워크를 사용할 때 정말 많이 작성하고 호출했던 타입인 AnyPublisher와 eraseToAnyPublisher에 대해 탐구하려고 합니다. 왜 사용하는지, 어떻게 사용하면 좋을지에 대해 프로젝트를 하며 경험했고 알게 된 개념을 공유하려고 합니다😄. 컴바인 공부할 초기에는 기술 포스트에서 AnyPublisher를 왜 사용하는지, 왜 eraseToAnyPublisher를 사용하는지, 타입을 지워준다는 개념은 정말 잘 알겠는데 그렇게 확 와닿지가 않았었습니다. 그때 당시의 저와 같은 상황인 분들이 이 포스트를 보면서 Publishers의 구체적인 타입을 AnyPublisher로 wrapping하여 추상화하는 이유를 이해하시면 좋을것 같습니다😆 1. AnyPu..
-
Combine Framework
[Swift] MVVM에서 Combine을 활용한 ViewModel Input/Output binding 개념 완벽 부수기 +_+ | MVC와 MVVM 차이 진짜 뿌수기!!!!
안녕하세요! 이번 포스트는 MVVM 패턴을 사용할 때 Conbine framework로 ViewModel과 View를 Input/Output binding하는 방법에 대해 소개하려고 합니다. 뷰에서 발생 가능한 Input!, 그리고 View가 화면을 그려야 할 State!를 ViewModel은 Output!함으로 뷰의 render가 진행됩니다. 소프티어 부트캠프 활동을 하며 새로 배운 개념이 많아 기존의 글을 리빌딩 했습니다.그 전에! MVVM과 MVC 아키텍처 패턴의 차이가 무엇인지 명확하게 알아야합니다. 둘의 차이가 무엇인지 아시는 분들만이 MVVM을 잘 활용한다고 할 수 있습니다. 저는 제 나름대로 MVVM과 MVC 아키텍처의 차이점을 정리해봤습니다(관련 포스트 링크). MVC, MVVM 차이를 이..
-
Combine Framework
[Swift] No6. Transforming operator 개념 완전 뿌수기!! | Combine
안녕하세요! 이번 포스트는 Combine framework에서 publisher 와 subscriber간 subscription의 값을 바꾸는 operator 공부한 내용을 정리하려고 합니다. 주제는 transform 타입의 map, tryMap, flatMap + compactMap(_:) collect, scan. Upstram의 output value가 nil인 경우 대처 가능 한 replaceNil(with:), replaceEmpty(with:). 주의사항!! upstream publihser라는 말을 사용하는데 이는 operator보다 위에 있는 publisher의 흐름을 칭합니다. downstream은 특정 publihser가 값을 방출했을 때 그 하위에 있는 stream 입니다. subsc..
-
Combine Framework
[Swift] No5. Subscription, Cancellable 개념 뿌수기!!! | Combine
안녕하세요. 이번 포스트는 Combine에서 Cancellable과 Subscription에 대해 공부한 개념을 정리하려고 합니다. 1. What is Cancellable and AnyCancellable ? 컴바인 사용할 때 커스텀 subscriber 구현도 하긴 하지만?! 저는 sink(receiveCompletion:receiveValue:), sink(receiveValue:)를 많이 사용합니다. 물론 @Publihsed를 사용할 때 assign(to:on:)도 사용합니다. 이 세 개 operator의 공통적인 특징은 AnyCancellable을 반환하는 것입니다. AnyCancellable은 Cancellable 프로토콜을 채택하는 final class입니다. Cancellable은 cance..
iOS deep dive!!!
-
Deep dive!!!
[iOS] ARC의 개념, Class vs Struct 및 Memory Leak발생 이유 탐구하기 | ARC 진짜 뿌수기 #2
안녕하세요. 이번 포스트에서는 ARC의 기본 개념 및 class와 struct의 차이, GC's Mark and Sweep은 왜 메모리 릭을 예방하는지 등의 ARC와의 차이점, memory leack의 발생을 Debug Memory Graph를 통해 탐구하고 해결하는 과정까지 소개하려고 합니다: ]Class vs StructARC를 탐구하기 위해서 Value type, Reference type의 개념을 알아야 합니다. 대표적으로 Struct, Class가 있습니다.Value Type의 Struct 특징!! Potato 구조체가 있습니다. 그리고 thread에 의해 execute()가 호출되어 해당 함수의 scope에 들어왔을 때의 상황입니다. Memory(memory layout link)의 stack..
-
Deep dive!!!
[iOS] Dynamic view를 추가하는 상황에서 layoutIfNeeded() 활용 및 개념 완벽 뿌수기 +_+ | UIView life cycle
안녕하세요. 이번 포스트는 UIView와 AutoLayout이라면 빠질 수 없는 layoutIfNeeded()의 개념과 언제, 왜 사용해야 하는지 등을 정리하려고 합니다. 또한 커스텀 뷰 내부에 특정 subview를 동적으로 추가 후 화면에 render 해야할 때, subview's layoutIfNeeded와 super view's layoutIfNeeded 중 무엇을 호출해야 하는지에 대해 간단한 프로젝트를 통해 다양하게 탐구하며 알게된 개념을 소개하려고 합니다. 기본적으로 main run loop와 update cycle 관련해서 설명하는 해외 포스트(관련 링크)를 우선 꼭 보셔야 좋습니다. 지금부터 버튼을 클릭하면 동적으로 애니메이션과 함께 고양이 사진이 나온 후에 간단한 레이블이 아래로 보여지는..
-
Deep dive!!!
[iOS] CALayer의 mask 프로퍼티와 gradient animation 파해치기!!
안녕하세요. 이번 포스트는 CALayer의 mask와 gradient 주는 방법과 CABasicAnimation으로 애니메이션 처리하는 방법에 대해서 소개하려고 합니다. 이런 느낌으로 말입니다!! 시작하기 전에 프로젝트 링크 참고해주시면 감사합니다.(깃허브 프로젝트 링크 바로 들여다보기) 위와같이 화면을 구성하기 위해 알아야 할 개념은 3가지 입니다. CALayer와 mask CABasicAnimation (keyPath: locations) UIGraphicsImageRenderer(size:) CALayer와 Mask CALayer는 UIView와 같이 아래 사진처럼 계층구조를 가질 수 있습니다. CALayer는 mask란 프로퍼티가 있습니다. 이는 alpha channel을 통해서 layer's c..
-
Deep dive!!!
[iOS] collectionView(_:cellForRowAt:)에서 중복 선언 및 호출되는 로직 간소화 | POP와 OOP, 프로토콜 composition
안녕하세요. 지난 포스트에서는 최근 진행중인 프로젝트에서 재사용 가능한 cell의 UI에서 특정 영역에만 UI가 서로 다른 경우, 하나의 cell에 데이터가 들어올 때마다 데이터에 맞게 레이아웃을 잡는 경우 vs 서로 다른 UI별로 cell을 만드는 경우 중 뭐가 성능상 좋은지 실험(관련 포스트 링크) 후 리빌딩 했었습니다. 이번 포스트에선 지난 포스트에서의 리빌딩 과정 중 collectionView(_:cellForRowAt:) 델리게이트에서 중복 코드가 너무 많이 보여서 프로토콜 지향적 + 객체지향 개념을 활용해 리빌딩한 경험을(리빌딩한 코드 관련 커밋 링크) 소개하려고 합니닷!! 프로젝트 구조 간단 소개 진행중인 프로젝트의 피드 화면입니다. 자세히 보면, 회색 영역은 ui가 같지만 이미지 영역은 서..
-
Deep dive!!!
[iOS] 컬랙션 뷰cell에서 특정 영역만 다른 ui를 갖는 경우 단일 cell or 여러 개의 cell 중 뭐가 좋을까..? | UI 성능 실험 static vs dynmaic
안녕하세요. 오늘은 한 섹션에서 사용되는 reusable cell이 특정 영역만 다른 ui를 갖을 때, 하나의 cell안에 분기처리를 통해 레이아웃을 구성하는 것 vs 여러개의 cell을 등록하고 재사용 큐에서 꺼내오는 것 중 뭐가 성능이 더 좋을지 분석한 것을 정리하려고 합니다. 이번에 리펙터링한 코드의 PR 링크를 남겨두겠습니다[리펙터링 PR 링크]. 현재 개발중인 프로젝트의 피드 화면입니다!! 피드에서는 컬랙션 뷰를 사용하고 있습니다. 위 사진에서 맨 왼쪽은 cell내부에서 사용되는 서브뷰들의 영역입니다. 포스트가 보여지는 하나의 섹션에서, 사용자가 올린 사진에 따라서 총 5개 정도의 사진 배치가 있습니다. 이렇게 회색 영역은 모두 같지만, 포스트 thumbnail 이미지에 개수에 따라 배치가 ..
Swift Concurrency
-
Concurrency
[Swift] Sequence vs AsynceSequence : 왜 makeIterator는 default인데 makeAsyncIterator() 아닐까?
Sequence는 왜 default iterator가 있고, AsyncSequence는 없을까?Swift를 보다 보면 이런 차이를 만나게 됩니다.Sequence는 makeIterator()를 직접 구현하지 않아도 됨AsyncSequence는 makeAsyncIterator()를 반드시 구현해야 함이 차이를 이해하려면 먼저 "default 구현이 있다"는 것이 무슨 의미인지부터 알아야 합니다.default iterator 구현이 있다는 건 무슨 뜻..? 보통 프로토콜을 채택하면, 요구사항을 직접 구현해야 합니다. 간단하게 봐보자면protocol P { func foo() } 위 P를 채택하면struct A: P { func foo() { // 반드시 구현해야 함 }} 이렇게 ! 그..
-
Concurrency
[Swift 5.5] GCD의 문제? Swift 5.5 Concurrency model 특징과 async/await 개념 정복하기!! | Concurrency
안녕하세요. 이번 포스트는 Swift 5.5 WWDC async/await에서 새롭게 등장한 async/await에 대해서 공부를 하고 배웠던 내용을 정리하려고 합니다. Async/await는 WWDC를 통해 새롭게 알게 되었는데 원래 async/await pattern이 있고 여러 프로그램에서 디자인 되었다는 것도 새롭게 알게 되었습니다. Structured concurrency원칙을 기반으로 Swift 5.5 concurrecy가 설계 되었습니다. 기존에 존재하는 concurrenct APIs가 있음에도 불구하고 새로운 Concurrency model이 도입된 이유가 궁금했었는데, 그 이유중 하나로 async/await은 코드 길이가 줄어지고, 단순해지는 등의 장점이 있다는 것을 알게 되었습니다. S..
-
Concurrency
[Swift 5.5] Structured concurruency in swift | Concurrency
작년에 처음으로 WWDC 라는 것을 알게 됬고 여러 주제 중 modern concurrency(async/await,actor etc..) 소개 영상을 봤습니다. 영상에처 자꾸 Structured concurrency라는 말을 하는데 이 부분만 해석을 못하고 관련 개념이 안떠서 당황했었는데 이제서야 알게 됬습니다. 요기에 자세하게 있는데 이 글을 읽으며 알게 된 내용을 정리하고자 글을 작성하게 되었습니다. Structured Concurrency Concurrency system은 기본적인 툴을 제공합니다. 대부분은 지금 실행중인 threads는 새로 만들어진 thread와 concurrent 실행을 해야 합니다. shared system resource는 한정되어 있기에 Thread explosion을..
-
Concurrency
[Swift 5.5] actor, actor isolation, cross-actor reference 개념 완벽 뿌수기 | No2. Actor
안녕하세요. 저번 포스트에선 actor의 개념과 thread-safe, actor's serial executor에 대해 공부했던 개념을 정리했습니다. 이번 포스트는 actor와 isolated state, Sendable(관련 개념 정리)을 준수하며 actor를 사용하는 방법, actor isolated state, cross-actor reference, mainActor, nonisolated를 공부했던 내용을 정리하려 합니다. 지난번 actor에 대한 개념만 다시 간략하게 정리하겠습니다. 1. Actor concept Concurrent domain간 shared mutable state를 access할 때 동시성 문제가 발생할 수 있습니다. multi thread에서 mutable 값이 담긴 메..
Database
-
Database 이론
[Database] 11. 보안과 권한 관리 개념 정리
안녕하세요. CS지식 정리도 할 겸, 학교에서 배운 데이터베이스 개념 + "데이터베이스 개론-IT COOKBOOK" 의 책을 공부하며 알게 된 내용을 정리하려고 합니다. 지난 포스트"트랜잭션과 동시성관련 개념 정리"에 이어 이번 포스트는 데이터베이스에서의 보안과 권한 개념을 정리하려고 합니다. 주관적으로 작성된 글이기에 틀린 내용이 있을 수 있습니다.(댓글로 알려주시면 감사합니다 :) 데이터베이스 보안 데이터베이스는 중요한 정보나 개인정보같은 민감한 정보가 있습니다. 권한 관리를 통해 기밀성이 보호되오야 합니다. 데이터의 정확성과 일관성을 위해 무결성을 유지하는 것도 중요합니다. 데이터베이스 시스템은 항상 사용가능해야 합니다. 외부 공격, 시스템 장애 등등 으로부터 보호됨으로 가용성을 유지해야 합니다. ..
-
Database 이론
[Database]10. 트랜잭션 개념과 회복 기법. 동시성 문제와 수행. 2PL 개념 부수기 +_+ | 직렬 가능성 스케줄
안녕하세요. CS지식 정리도 할 겸, 학교에서 배운 데이터베이스 개념 + "데이터베이스 개론-IT COOKBOOK" 의 책을 공부하며 알게 된 내용을 정리하려고 합니다. 지난 포스트"정규화 개념 정리"에 이어 이번 포스트는 트랜잭션 개념과 회복 기법.Concurrency에서 발생할 수 있는 문제, 제어에 관한 개념. 트랜잭션의 concurrent execution 중 serial schedule과 같은 연산 결과를 보장할 수 있는 직렬 가능성과 로킹, 2단계 로킹 기법에 대해 개념을 정리하려고 합니다. 주관적으로 작성된 글이기에 틀린 내용이 있을 수 있습니다.(댓글로 알려주시면 감사합니다 :) 1. 트랜잭션(Transaction)이란? 데이터베이스에서 수행되는 하나의 논리적인 작업, 연산집합(SQL문들의..
-
Database 이론
[Database] 9. Normalization 정규화 개념 정리 | 정규형(1...BCNF), 함수 종속 개념 완전 뿌수기 +_+
안녕하세요. CS지식 정리도 할 겸, 학교에서 배운 데이터베이스 개념 + "데이터베이스 개론-IT COOKBOOK" 의 책을 공부하며 알게 된 내용을 정리하려고 합니다. 지난 포스트 "데이터베이스 설계 | 요구사항분석, 개념적, 논리적 설계 정리"에 이어 이번에는 데이터베이스의 논리적 설계 중 정규화 과정과 함수 종속에 관한 개념을 정리하려고 합니다. 주관적으로 작성된 글이기에 틀린 내용이 있을 수 있습니다.(댓글로 알려주시면 감사합니다:) 데이터베이스 논리적 설계 과정 중 하나인 정규화는 정말 중요한 작업입니다. E-R D를 Relational Schema로 변환 후에 정규화 과정을 거쳐야 데이터베이스의 데이터는 중복성이 줄어들고 일관성, 무결성 등이 향상되게 됩니다. "정규화 과정은 왜 거치는 것일까..
-
Database 이론
[Database] 8. 데이터베이스 설계 | 요구사항분석, 개념적, 논리적, 물리적 설계 개념 정리
안녕하세요. CS지식 정리도 할 겸, 학교에서 배운 데이터베이스 개념 + "데이터베이스 개론-IT COOKBOOK" 의 내용을 정리할 것입니다. 지난 포스트 "Database의 View에 관한 개념"에 이어 이번에는 데이터베이스의 설계( 요구사항 분석 -> 개념적 -> 논리적 -> 물리적 설계에 관한 개념을 정리하려고 합니다. 데이터베이스 설계 Db에서 원하는 데이터를 얻기 위해서는 특정 테이블이 필요합니다. 테이블의 열은 PK, FK, 후보키 등 다양한 속성으로 정의되어 있습니다. FK를 통해 다른 테이블의 PK와 연결됩니다. 이런 테이블의 속성들은 relational schema를 기반으로 만들어집니다. relational schema는 Entity-Relationship model로부터 정의됩니다..
-
Database 이론
[Database] 7-2. View 개념 정리
안녕하세요. CS지식 정리도 할 겸, 학교에서 배운 데이터베이스 개념 + "데이터베이스 개론-IT COOKBOOK" 의 책을 공부하며 알게 된 내용을 정리하려고 합니다. 지난 포스트 "SQL 개념정리 | SQL의 DDL, DML 명령어 정리"에 이어 이번에는 Database의 View에 관한 개념을 정리해보려고 합니다. 주관적으로 작성된 글이기에 틀린 내용이 있을 수 있습니다.(댓글로 알려주시면 감사합니다:) "이미 존재하던 table이 있는데 왜 View를 사용하는 것일까?" Database에서 View는 다른 테이블들을 기반으로 만들어진 가상 테이블입니다. 이 가상 테이블을 실제 테이블처럼 on-disk에 저장하지 않고 memory에 저장해서 논리적으로 존재하는 테이블입니다. on disk(HDD..
백준 PS일지
-
구현
[백준/Swift] 16917: 양념 반 후라이드 반 | PS일지
문제 간단한 문제 요약 치킨은 양념 치킨, 후라이드 치킨, 반반 치킨 세 종류를 판매한다. 각각 A원, B원, C원이다. 파티를 위해 양념취킨 최소 X마리, 후라이드 치킨 최소 Y마리 구매해야한다. 반반 치킨 두마리를 구입하면 양념치킨 하나, 후라이드 치킨 하나를 만들 수 있다. 치킨을 구매하는 금액의 최소값을 구하자. 고려해야 할 사항 최소한으로 양념 X마리, 후라이드 Y마리를 구매해야 한다. X, Y를 구매할 수 있는 최소 가격을 찾어야한다. 문제 풀이, 했갈렸던 점 대박.. 접근 방법은 크게 두가지 였습니다. 첫째는 후라이드 X마리 + 양념 Y마리 구매하는 경우 두번째는 최소 X, Y중 작은 값 만큼 반반 * 2로 구매한 가격 + 남은 치킨 * 해당 치킨 가격 만큼 구매한 가격 이 두가지 중 비교를..
-
String
[백준/Swift] 모음의 개수: 1264 | PS일지
문제 간단한 문제 요약 영문 입력 받았을 때 모음 "a,e,i,o,u" 개수를 세시오!!!!!!!! 고려해야 할 사항 # 입력 받을 시 종료! 코드 while let input = readLine(), input != "#" { print( input .lowercased() .filter { "aeiou".map { String($0) }.contains(String($0)) }.count) }
-
BruteForce
[백준/Swift] 사탕 게임: 3085 | PS일지
문제 간단한 문제 요약 N*N 크기의 상자에 사탕을 채워 놓는다. 사탕색이 모두 같지 않을 수 있다. 상자 안 사탕의 색이 다른 인접한 두 칸을 골라 서로 교환한다. 모두 같은 색으로 이루어져 있는 가장 긴 연속 부분(행, 열)을 고른 다음 그 사탕을 모두 먹을 때, 그 최대 개수를 구하시오. 문제 풀이, 했갈렸던 점 맨 처음에 문제를 읽으면서 사탕 안 색이 다른 인접한 두 칸을 골라 서로 교환하는데.. "언제까지 이걸 교환하지?"라는 생각에 문제의 의도와는 다른 방향으로 생각을 계속 했었습니다... 말 그대로 정말 심플하게 사탕안에 색이 다르면서 인접한 두 칸을 골라 서로 교환하면 됩니다. 그리고 나서 모든 행. 모든 열을 탐색 후 가장 긴 연속 부분을 찾으면 됩니다. 또 하나 문제를 풀면서, 열 우선..
-
Greedy
[백준/Swift] 2217: 로프 | PS일지 | enumerated().map()에 관해..
문제 간단한 문제 요약 여러 개의 로프가 있다. 로프를 통해 물체를 들어올리는데 각각의 로프마다 중량이 있고, 병렬로 로프들을 연결할 수 있다. 그 대신 w/k 로 해서 로프들의 중량이 일치하도록 해야 병렬적으로 로프를 물체에 묶어 들어올릴 수 있다. 문제 풀이 정말 어려운 그리디.. 어떻게 풀어야 할지 곰곰이 생각해봤습니다. 1 2 4 7 10 의 로프가 있을 때, "어떻게 최대한의 무게를 들 수 있을것인가?..." 이때 든 의문점은 중량 1의 로프와 중량 10의 로프를 같이 사용해서 물체를 올린다면 (10 + 1) / 2 = 5? 최대한으로 5씩 중량을 나눠서 들 수 있는데, 최대 중량 1짜리가 5를 들 수 있을까? 그럴 수 없을 것 같아서 내린 결론은 1로프와 10 로프를 같이 병렬적으로 사용할 땐..
-
Greedy
[백준/Swift] 1789: 수들의 합 | PS일지
문제 간단한 문제 요약 서로 다른 N 개의 자연수의 합이 S일 때, 자연수 N의 최대 값은 얼마일까? 문제 풀이 최대한 많이 서로 다른 자연수를 더해주어 S를 만들어야 합니다. 가장 작은 자연수 1부터 더해가는게 최대한 많은 서로다른 N개의 자연수를 사용할 수 있습니다. 이때 이전 자연수들의 덧셈 + 특정 자연수를 더한 값이 S라면, 서로 다른 자연수는 특정 자연수 개수만큼 존재합니다. 예를들어 S = 3이고 자연수의 덧셈이 1부터 시작한다면, 1. 1+2 = 3 답은 2입니다. 만약 특정 자연수의 덧셈이 S를 초과한다면, 초과한 값 - S를 한 자연수만 빼면 됩니다. 그럼으로 특정 자연수 -1이 답입니다. 예를들어 S = 5이고, 자연수의 덧셈은 1부터 시작합니다. 1 + 2 = 3 3 + 3 = 6..
-
String
[백준/Swift] 1302: 베스트셀러 | PS일지
문제 1302번: 베스트셀러 첫째 줄에 오늘 하루 동안 팔린 책의 개수 N이 주어진다. 이 값은 1,000보다 작거나 같은 자연수이다. 둘째부터 N개의 줄에 책의 제목이 입력으로 들어온다. 책의 제목의 길이는 50보다 작거나 같고 www.acmicpc.net 간단한 문제 요약 오늘 하루 동안 팔린 책의 제목이 입력으로 들어왔을 때, 가장 많이 팔린 책의 제목을 출력하는 프로그램을 작성하시오. 고려해야 할 사항 책은 가장(최대) 많이 팔린 책의 이름이 출력되야 하는데, 가장 많이 팔린 책의 개수가 같다면, 사전순(최소)으로 가장 앞서는 제목 출력해야 합니다. 문제 풀이, 새로 배운 개념 팔린 책들 중 이름이 같은 책이 있기에, 배열로 저장하기 보단 딕셔너리로 저장했습니다. 그리고 max함수를 통해, val..
-
Etc
[백준/Swift] 10814: 나이순 정렬 | PS일지 | 고차함수 사용!!
문제 10814번: 나이순 정렬 온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 www.acmicpc.net 간단한 문제 요약 나이와 이름이 가입한 순서대로 주어진다. 이때 회원들을 나이가 증가하는 순으로!! 나이가 같을 시 먼저 가입한 사람이 오는 순서로(이미 지정됬습니다. 가입한 순서대로 주어지기 때문입니다) 정렬하시오. 문제 풀이 이 문제는 말 그대로 입력받은 문장을 나이, 이름으로 분리 시킨 후에 나이에 따른 정렬을 하게 되는 문제입니다. 한 큐에 출력까지 뽑아보고 싶었습니다. print( (0..(String,String) in //2 let a=readLine..