record의 컴팩트 생성자에서는 this를 사용하지 않는다

this를 사용하면 컴파일 에러가 발생한다. 대신 매개변수 값을 직접 수정하면 된다. ``` public record User(String name, int age) { public User { // 매개변수 name의 값을 직접 수정하면, // 생성자 끝에서 자동으로 this.name에 할당됩니다. name = Objects.requireNonNullElse(name, "Unknown"); if (age

커밋 합치기 interactive rebase (git rebase -i)

### 커밋 합치기 interactive rebase (git rebase -i) - 커밋을 정리하고 싶을 때 사용. 아래 예시는 최근 커밋 3개를 수정할 때 ```bash git rebase -i HEAD~3 ``` - 커밋에 대한 vi편집기가 실행되면 해당내용을 변경 - pick : 커밋내용 유지 - squash : 해당 커밋을 이전 커밋과 합침 ```bash pick 1a2b3c4 feat: 로그인 기능 추가 squash 2b3c4d5 fix: 오타 수정 squash 3c4d5e6 docs: 주석 추가 ```

Rebase 충돌 해결하기

## Rebase 충돌 해결하기 - 충돌난 곳 수정 - git status를 입력한 후 “both modified”라고 되어있는 파일을 찾는다 - 두 코드중 남길 코드를 선택하거나 적절히 합친 후 ` >>` 표식을 모두 지워준다 - git add . : 수정 완료 표시 - git rebase —continue: 다음 단계 진행 - git push —force: 최종 결과 push

git main에 머지하기

## git main에 머지하기 - 사전 상황 - git을사용하여 여러명의 개발자가 개발을 진행중이다. main브랜치가 있고, 각 기능 개발시 별도의 브랜치를 사용하여야 한다. - 개발자1과 개발자2가 각각 기능1, 기능2를 개발 중이다. - 상황 1 - 개발자2가 기능2 개발을 완료하여 main 브랜치에 머지를 하려고한다. Merge, Rebase & Merge, Squash & Merge 중 어떤 방식을 사용해야할까 - “히스토리는 무조건 깔끔해야 한다” : Squash & Merge를 사용 - main 브랜치에는 자잘한 중간 커밋을 남길 이유가 없다. - “Feature: 로그인 구현” 과 같이 기능을 대표하는 한 줄의 커밋 만 남긴다. - 비교 | **방식** | **특징** | **장점** | **단점** | | --- | --- | --- | --- | | **Merge** (기본) | 모든 커밋과 병합 기록(Merge commit)을 남김 | 작업의 흐름(맥락)을 그대로 보존함 | 히스토리가 복잡해짐 (일명 '거미줄' 발생) | | **Rebase & Merge** | 작업 브랜치의 기점을 main의 최신 상태로 옮김 | 히스토리가 한 줄로 깔끔하게 정리됨 | 충돌 해결이 까다로울 수 있고, 커밋 ID가 변경됨 | | **Squash & Merge** | 여러 커밋을 **하나의 커밋**으로 합쳐서 합침 | main 히스토리가 매우 깨끗함 (기능당 커밋 1개) | 상세한 작업 과정(중간 기록)이 사라짐 | - 상황 2 - 개발자2가 기능2를 개발하여 main 브랜치에 머지를 완료하였다.(Squash & Merge). 이제 개발자1이 기능1을 개발완료하여 main에 머지할때 취해야할 조치는? - main 브랜치는 local에 항상 최신화 되어있다고 가정 ```bash ...

Shell에서 ‘&’를 한 개 사용하는 것과 두 개 사용하는 것의 차이

## Shell에서 ‘&’를 한 개 사용하는 것과 두 개 사용하는 것의 차이 - 한 개 사용: 시간이 오래 걸리는 작업을 백그라운드에 던져놓고 터미널을 바로 다시 사용하고 싶을 때 ```bash sleep 10 & echo "Done" ``` - 두 개 사용 : 앞의 명령어가 성공(exit code 0)했을 때만 뒤의 명령어를 실행. ```bash mkdir test && cd test ``` - “;”(세미콜론) : 앞의 명령어가 실패해도 다음 명령어가 실행 ```bash mkdir test;cd test ```

hammerspoon ESC키 스크립트

## hammerspoon ESC키 스크립트 ```jsx local inputEnglish = "com.apple.keylayout.ABC" -- 'local'을 빼고 전역 변수로 선언해야 Hammerspoon이 계속 감시를 유지합니다. escWatcher = hs.eventtap.new({hs.eventtap.event.types.keyDown}, function(event) local keyCode = event:getKeyCode() -- 53은 Escape 키의 코드입니다. if keyCode == 53 then local inputSource = hs.keycodes.currentSourceID() if inputSource ~= inputEnglish then hs.keycodes.currentSourceID(inputEnglish) -- 입력 소스 변경 후 아주 약간의 지연을 주거나 -- 즉시 반영되도록 처리 (필요시) end -- false를 반환해야 Esc 키가 원래 앱으로 전달됩니다. return false end end):start() -- 생성과 동시에 시작 ```

SDKMAN 기본 사용법

## SDKMAN 기본 사용법 ```jsx $ sdk list java #또는 gradle, maven # 설치 $ sdk install java #또는 버전 # 삭제할때 $ sdk unintall java # 또는 버전 # sdkman 자체 업데이트 $ sdk selfupdate ```