3-way merge git merge에는 고유의 동작 방식이 존재하는데 메인 브랜치와 신규 브랜치가 각각 신규 커밋이 1개 이상 있을 경우에 두 브랜치를 merge할 경우 브랜치의 두 버전이 합쳐져서 최종적으로 main에 남게 되는 것을 말한다. 말로하니까 어렵지 실제로 보면 어렵지않다. 일단 아래와 같이 브랜치를 준비해놓은 상태이다. - 커밋명이 '푸쉬' 인 main 브랜치에서 three-way 브랜치가 뻗어나왔다. - three-way 브랜치는 쓰리웨이연습, 쓰리웨이연습2로 2개의 커밋이 있는 상태이다. - main 브랜치는 three-way 브랜치를 만든 후 메인 수정이라는 별도의 커밋을 해놓은 상태이다. 즉, 아래의 그림과 같다. 이 때 main 브랜치로 이동해서 three-way 브랜치를 me..
git branch 생성 git branch 브랜치이름 git checkout 브랜치명 내가 보고있는 브랜치를 변경한다. git checkout main 을 입력하면 main 브랜치로 가게 되고 git checkout 연습브랜치 를 입력하면 연습브랜치로 가게 된다. git log --graph --oneline --all (현재 브랜치 커밋 상황을 그림으로 보기) git merge (branch 합치기) 브랜치에서 수정한 코드를 다시 main 브랜치로 옮기고 싶다면 git merge 명령어를 이용하면 된다. git checkout 메인브랜치(디폴트로 사용하는 브랜치) git merge 합칠브랜치명 이 때 주의사항은... 먼저 default 브랜치(별도의 설정이 없다면 main 브랜치 또는 master 브..
1. git init 깃을 이용할 폴더 내 경로에서 터미널이나 git bash를 이용하여 git init을 입력 그렇게 한다면 git이 git init을 선언한 폴더를 감시하기 시작한다. 2. git status 추적되고 있는 git 폴더 내의 파일 상태를 알려줌. git init을 한 상태에서 aa.txt, bb.txt, cc.txt를 만든 뒤 git status를 입력했다. git은 추적되지 않은 새 파일 aa.txt, bb.txt, cc.txt을 탐지했고, 아직 add되지 않았음을 말해준다. 3. git add 파일명 // git add . 'git add 파일명'을 입력하면 한개의 파일만 git에 add할 수 있다. git add aa.txt 를 입력하자 aa.txt만 커밋 대기 목록(stagin..
3개월이 지났다. 멋사 전, 멋사 후 나는 달라진 것이 있을까? 단언컨데 나는 3개월 전 대비해서 무지막지하게 성장했다. 일단... 3개월 전 기껏해야 자바스크립트 배열이나 좀 만지고 뿌듯해했던 내가... 원하는대로 html과 css를 스타일링할 수 있게 되었다. (즉, html과 css의 이론에 대해 약간 알게 되었다.) 자바스크립트 기초를 조금 더 탄탄히 하게 되었다. 알고리즘이 뭔지 하나도 모르는 상태에서, 조금씩 공부라도 할 수 있는 사람으로 변했다. 리액트에 대해 굉장히 불편했었지만, 지금은 지속적으로 배울 수 있는 추진력(?)을 스스로 탑재하게 되었다. 사실 자바스크립트나 리액트의 경우에는 개인적인 시간을 굉장히 많이 쏟아부었다. 예를들어... JS에서 promise를 배우고자 한다면 XML객..
일단 들어가기에 앞서서... 퀵정렬은 나에게 있어 정말 정말 난해한 정렬이었다. 사실 지금도 제대로 이해하고 있지 않은 것 같다. 그래도 지식을 견고히 하기 위해 일단 포스팅 해본다. 퀵 정렬은 어마어마하게 빠르다고 해서 붙여진 이름으로 합병정렬과 비슷하게 동작하지만 매우매우 직관적이지 못하다. 다만, 컴퓨터의 입장에서는 합병정렬보다 효율적일 수 있는 알고리즘이다. 연산 자체가 캐시 메모리에 최적화되어 CPU의 부하를 줄여주는 특징이 있다고 하는데 일단 그렇다는 키워드만 얻어놓고, 다음에 운영체제를 공부할 때 알고리즘과 엮여서 공부해보면 될 것 같다. 퀵 정렬(Quick Sort) 퀵 정렬은 배열 내 피봇(중심축)을 이용해서 엘리먼트를 정렬하는 정렬 방법인데, 합병정렬과의 차이점은 합병정렬이 기존의 배열..
객체지향 프로그래밍에서는 세상에 존재할 수 있는 것이거나, 우리가 어떤 개체로써 볼 수 있는 것들을 추상화하여 객체(Object)로 표현을 한다. 그리고 우리는 프로그래밍에서 오브젝트를 { key: value } 의 형태로 만들 수 있다. 하지만 프로그래밍이 복잡해지면 복잡해질수록 const a = { } 의 형태로 오브젝트를 찍어내는 것은 효율성이 매우 떨어진다. 따라서 우리는 비슷한 객체들을 빠르게 찍어낼 수 있는 템플릿 기법에 대해 배울 필요가 있다. 그 템플릿은 클래스이며, 이번 글에서는 함수를 이용해서 어떻게 클래스를 만들어내는지 배울 것이고 클래스로부터 오브젝트를 만들어내기 위해 new 키워드를 사용해볼 것이다. 오브젝트는 게임에서 매우 많이 쓰이는 개념이다. 게임 내 캐릭터들이 있고, 캐릭터..
합병정렬(merge sort)부터는 기본 정렬(버블, 선택, 삽입)보다 약간 복잡해진다. 하지만 성능은 훨씬 좋아진다. 정렬 알고리즘에서 빼놓을 수 없는 합병정렬에 대해 한 번 공부해보자. 폰 노이만 합병정렬은 폰노이만이 1945년에 개발한 정렬 알고리즘이다. 기초적인 정렬 알고리즘들(선택, 버블, 삽입)은 아무리 효율성을 고려한다고 해도 결국 배열을 싹 훑어내면서 정렬을 해야하는, 태생적인 O(N^2)의 시간복잡도를 가졌었다. 하지만 폰 노이만의 합병정렬은 알고리즘에 분할과 정복을 도입하여 정렬의 시간 복잡도를 크게 낮추었다. 발상 자체가 굉장히 천재적이다. 합병정렬의 분할과 정복(합병) 최대한 추상적으로 설명해보자면... 분할 먼저 정렬할 배열을 반으로 분할한다. 받은 배열을 또 절반으로 나눈다. 절..
삽입정렬은 배열의 좌측을 정렬된 배열로 두면서 오른쪽의 엘리먼트를 점진적으로 배열의 좌측에 하나씩 삽입해가며 정렬해가는 방식이다. 버블정렬은 큰 값을 뒤로 빼면서 정렬해 나아가고 선택정렬은 작은 값을 앞에 두면서 정렬해 나아간다. 삽입정렬은 일단 좌측의 엘리멘트들을 정렬되었다고 본다. 그리고 우측의 엘리먼트를 좌측의 엘리먼트와 하나하나 비교하며, 우측 엘리먼트를 좌측 엘리먼트에 삽입해가면서 정렬한다. (이러한 이유로 좌측의 정렬된 엘리먼트가 점진적으로 증가한다.) 위의 설명에 따른 삽입 정렬의 의사코드는 아래와 같다. 의사코드 배열의 두번째 엘리먼트부터 시작한다. (첫번째 엘리먼트는 자체로 정렬이 되었다고 가정하기 때문) 이제 두번째 엘리먼트를 첫번째 엘리먼트와 비교하고, 필요하다면 값을 삽입한다. 비교..
선택정렬은 기초적인 정렬 알고리즘 중 하나로써 효율성이 좋다고 평가받지 못하는 알고리즘이지만, 그래도 기초가 가장 중요하다는 관점에서 꼭 배워야만 하는 알고리즘이라고 할 수 있다. 선택정렬은 버블정렬과 비슷하지만 뚜렷한 한가지 차이점이 있다. 버블정렬 : 최대값을 선택하여 연산하면서 계속 뒤로 빼나간다. 선택정렬 : 최소값을 제일 앞에 두는 방식으로 큰 값들을 뒤로 빼나간다. 선택정렬 의사코드(Psuedocode) 배열의 첫번째 엘리먼트를 최소값 포인터로 일단 설정한다. 최소값 포인터를 다음 엘리먼트의 값과 비교를 하며, 현재 최소값 포인터보다 작은 값이 나올때까지 반복한다. 만약, 더 작은 값이 있을 경우, 최소값 포인터를 더 작은 값으로 재할당한다. 배열의 순회가 끝났다면, 가장 작은 값 엘리먼트와 ..