brunch

You can make anything
by writing

C.S.Lewis

by Naserian Sep 08. 2019

[코딩 부트캠프 3주차] 꿈에서도 개발

TIL

 무더운 여름 코딩 공부를 시작한 나는 한 주 한 주 바뀌어가는 내 일상을 이 곳에 기록하고 있다.


3주 차가 된 이번 주도 별 다를 것 없이 낮에는 회사에서 일을 하고, 퇴근 직후 쌩하고 달려가 대충 몇 숟갈 밥을 떠먹고선 자습도 하고 수업도 듣고 과제도 푸는 야학도의 삶을 보내고 있다.

 처음 코스 신청을 하고 시작한 예습 기간부터 따지면 대략 1달이 된 것 같다. 그간 바뀐 것들은 매일 알고리듬 문제를 푸는 과정을 통해서 처음에 비해 사고방식이 말랑말랑해진 것과 풀리지 않는 문제를 앞에 두고 잠을 설치게 된 것일 테다.


 코딩 공부를 고민하면서 개발자로 전향한 예전 직장 동료를 만난 적이 있다. 나와 동갑인 그는 하루 종일 컴퓨터에 매달려도 구현하지 못하는 과제가 있는 날이면 자는 동안 머리가 깨어서 계속 고민을 하다가 다음 날이 되어서 짜잔 하고 구현을 하는 경험을 했노라 이야기했었다.

 처음 그 이야기를 들었을 땐 자면서까지 머리가 노동을 해야 하나 싶었는데, 프로그래밍에 '프'자도 시작하지 못한 나지만 알고리즘 문제 앞에서 낑낑거리다가 잠에 들면 이내 자기 전 못 풀었던 그 문제 푸는 꿈을 꾸곤 한다.


자면서도 코딩을 한다는 프로그래머들, 출처: https://devrant.com/rants/921852/programmer-life


 아무튼 끙끙거리며 주 초반에 주어진 알고리즘 과제는 대부분 모두 해결했다. 한숨을 돌릴 찰나도 없이 CLI(Command Line Interface)와 GIT Workflow에 대해서 배워 나가기 시작했다. 수업을 들으며 생각해보니 초등학교 저학년 방과 후 수업 때 컴퓨터에 작고 까만 화면을 켜고 뭔가를 쳐봤던 기억이 났다. 이십 년이나 지나 다시 내가 이 까만 화면을 켜서 무슨 명령어를 치게 될 줄이야.

 그 까만 화면을 다시 본 나는 다시 멘붕에 빠져 수업 영상을 한 3번은 다시 돌려보고 그 후에도 성이 차지 않아 생활코딩 [지옥에서 온 GIT]를 출퇴근길에 연신 돌려 들었다.

갈 길이 산더미인데 매번 알지 못했던 미지의 세계를 만나는 당혹스러움과 어떻게 서든 내 것으로 습득하겠다는 오기가 번갈아 나를 찾아와 한 주 한 주가 매우 다이내믹하다.


자 그럼 오늘도,


3주차 TIL


Number Method / Math Method

CLI 기초 학습

Git Workflow 익히기


[Number Method]

Number.isInteger(value)
- 정수인지, 아닌지 여부를 검사할 값을 argument로 입력
- return value : 정수를 판단한 결과(Boolean)로 true or false

parseInt(value) / parseFloat(value)
- type casting(형 변환)을 하기 위해 파싱 될 값을 argument로 입력
- return value : 정수 또는 소수점 숫자(음수일 경우 음수도 포함)
- parseInt는 진법 변환 시에도 사용
  - 형식 : parseInt(value, radix) ex) parseInt(“F”, 16) // 15
  - 10진법인 경우에는 radix가 필요 없지만 그래도 명시적으로 10을 넣어주는 것이 좋음
     ex) parseInt(15.00, 10) // 15
- 두 함수 모두 둘 다 문자열을 숫자로 변경하는 함수이나 Int는 정수로 변환 Float는 소수점까지 변환
  - ex) var won = ‘1000원’; var dollar =‘1.5$’;
  - console.log(parseInt(won) +`:` + parseInt(dollar)); //  → 1000 : 1
  - console.log(parseFloat(won) +`:` + parseFloat(dollar)); // → 1000 : 1.5


num.toFixed( [digits] )
- 소수점 뒤에 나타낼 자릿수(optional, 기본값은 0)를 argument로 입력
- return value : 숫자를 나타내는 문자열
- 형식: 숫자.toFixed()
- var num = 12345.6789;
  - num.toFixed(); // → ‘12346’ 반올림 without 소수
  - num.toFixed(1); // → ‘12345.7’ 1번째 소수점에 반올림 with 소수
  - num.toFixed(2); // → ‘12345.68’ 2번째 소수점에 반올림 with 소수
  - num.toFixed(6); // → ‘12345.678900’  모자란 소수점은 00으로 채워 넣음


[Math Method]

Math.max([value1 [, value2 [, … ] ] ]) / Math.min([value1 [, value2 [, … ] ] ]
- arguments : 숫자
- return value : 주어진 숫자 중 가장 큰 값/ 작은 값
- ex1) console.log(Math.min(2, 3, 1)); // → 1
- ex2) console.log(Math.max(‘hello’, ‘world’)); // → NaN


Math.floor(x) /Math.round(x) / Math.ceil(x)
- arguments : 숫자
- return value : 주어진 숫자 중 내림/반올림/올림 값
- ex1) console.log(Math.floor(49.95)); // → 49
- ex2) console.log(Math.floor(-49.95)); // → -50
- ex3) console.log(Math.round(20.5)); // → 21
- ex4) console.log(Math.round(-20.5)); // → -20
- ex5) console.log(Math.round(20.3)); // → 21


Math.random()
- arguments : 없음
- return value : 0과 1 사이의 난수를 반환
- console.log(Math.random()); // 0과 1 사이에 아무 숫자나 나옴
- 0~9 사이 숫자를 랜덤으로 만드는 함수:


랜덤으로 주사위 함수 만들기    

랜덤으로 문자와 숫자를 조합해서(비밀번호처럼) 만드는 함수:
closure 함수를 사용하면 비밀번호 자릿수를 다양하게 변경해서 함수 사용 가능
참고 : https://dance2i.tistory.com/240

Math.abs(x)
- arguments : 숫자
- return value: 주어진 숫자의 절댓값 반환


Math.sqrt(x)
- arguments : 숫자
- return value: 주어진 숫자의 루트를 씌운 값(제곱근) 반환, 음수이면 Nan이 반환
- ex1) Math.sqrt(16); // → 4


Math.pow(base, exponent)
- arguments : base는 여러 번 곱할 수(밑), exponent는 곱하는 횟수(지수)
- return value: base의 exponent 제곱 반환
- ex1) console.log(Math.pow(7, 3)); // → 343
- ex2) console.log(Math.pow(4, 0.5)); // → 2
- ex3) console.log(Math.pow(7, -2)); // → 0.02040816326530612 (1/49)
- ex4) console.log(Math.pow(-7, 0.5)); // → NaN


[CLI 기본 명령어]

ls : 해당 위치의 파일/디렉터리 전체 보기
ls -al : 해당 위치의 파일/디렉터리의 상세 정보 보기 including 숨김 파일

각 파일/디렉터리 당 나열되는 정보
- 접근권한(read/write/execute 가능) 여부
- 링크된 파일 개수
- 소유자
- 소유 그룹
- 파일 크기
- 만든 날짜(mm/dd)
- 만든 시간
- 파일/디렉터리 전체 이름


cd : 디렉터리를 이동할 때 사용
cd ~ : 홈 디렉터리로 이동
cd . : 현재 디렉터리에 머묾
cd .. : parent 디렉터리로 이동
cd / : 최상위 디렉터리로 이동


파일/디렉터리 이름에 공백이 있을 때는 \ 를 사용
ex) my dir → my\dir로 표현

파일/디렉터리 이름 자동 완성: tab키를 누르면 자동 완성


touch 파일 이름 : 파일 이름으로 된 빈 파일을 현재 위치에 생성

mkdir 디렉터리 이름 : 디렉터리 이름으로 된 빈 디렉터리를 현재 위치에 생성

cat 파일 이름 : 해당 파일을 cli에서 읽기

mv 파일/디렉터리 이름 : 해당 파일/디렉터리로 이동

cp 파일 이름 지정하고 싶은 디렉터리 : 해당 파일을 지정하고 싶은 디렉터리로 복사

cp -r 디렉터리 : 해당 디렉터리를 복사


주의: 삭제하는 방법 - 휴지통에 남지 않고 바로 지워지기 때문에 주의

rm 파일 이름: 해당 파일을 삭제

rm -r 디렉터리 이름 : 해당 디렉터리를 삭제

rm -rf / : root 디렉터리를 삭제해서 시스템이 모두 삭제됨


편리한 cli 명령어
1. code . : 현재 디렉터리를 vs code editor에서 열 때 사용
2. explorer . : 현재 디렉터리를 Window 검색창으로 열기


sudo : “super user do”의 줄임말로 관리자 권한 실행을 가리킴
- sudo로 접근하면 관리자만 읽을 수 있는 파일 읽기가 가능
- windows에서는 sudo가 불가능해서 chocolatey 같은 패키지 매니저를 깔고 sudo 기능을 다운로드하여서 실행 가능


파일/디렉터리 소유권 변경하기: chown
- sudo로 만든 파일/디렉터리는 소유자가 root로 표현됨(ls -al로 확인 가능), 이렇게 만들어진 파일/디렉터리는 root가 아니면 수정이 어려움
- root 파일/디렉터리 소유권 변경 시에는 sudo를 앞에 넣어줘야 함


소유권 변경 방법 :
chown 변경하고픈 owner 이름 : 변경하고픈 group 이름 해당 파일/디렉터리 이름
ex1) 일반 변경 chown sooji : staff newname.txt
ex2) root 변경 sudo chown sooji : staff newname.txt


파일/디렉터리의 유저당 접근권한 변경하기: chmod
- ls -al을 했을 때 첫 번째 나오는 정보는 접근권한(read/write/execute 가능) 여부
- 상세 순서:
 1) 사용자(owner 소유자) 권한
 2) 그룹 권한
 3) 다른 사용자 권한
- ex) drwxr-wr-x: 사용자는 모든 권한이 있고, 그룹에는 write와 read 권한, 다른 사용자의 경우에는 실행 권한만 있음
- 권한 종류
 1) read : 읽기 (r)
 2) write : 쓰기 (w)
 3) execute : 실행하기(x)
- 사용자 종류
 1) User : 사용자 (u)
 2) Group : 그룹 (g)
 3) Other : 다른 사용자 (o)
 4) All : 모든 사용자 (a)
- 사용자별 권한 종류 변경 방법 :
chmod 변경하고픈 사용자(ugoa) +(권한 추가)/-(권한 제거) 권한(rwx) 파일/디렉토리명
ex1) chmod g+w newname.txt → newname 파일에 대해 그룹에 쓰기 권한 추가
ex2) chmod o-r newdir → newdir 디렉터리에 다른 사용자에게 있던 읽기 권한 삭제
- chmod 관련 사용 표현
 1) chmod 000 : ugo의 모든 권한 제거
 2) chmod 777 : ugo의 모든 권한 추가
 3) chmod 700 : u에게만 모든 권한 추가
 4) chmod 744 : u에게는 모든 권한 제공, go에게는 읽기 권한 추가


chmod/chown/chgrp 관련 상세 자료: https://withcoding.com/103


[GIT Workflow]

Key Term
- repository
- branch
- clone(fork)
- commit
- pull/push

working directory : 내가 작업하고 있는 위치

staging area : 어떤 파일을 버전 관리 시스템에 저장하려면 꼭 필요한 공간
- 명령어 : git add 파일 이름
- 저장할 파일을 staging area에 올려야 commit이 가능

repository : 기록과 작업 흐름 모든 것을 포함한 개념
- 명령어 : git commit -m ‘여기에 반드시 어떤 설명을 추가
- commit을 할 때마다 어떤 내용을 하는지에 대한 설명을 달아야 함

commit의 단위는 아래 그림의 동그라미 하나    


Branching과 Merging
- branching : 가지가 펼쳐지는 것
- merging : 펼쳐진 가지를 다시 합치는 것
- branching과 merging이 필요한 이유 : 여러 단계에 걸쳐서 기능을 만들고 버그를 없앤 후에 end-user에게 배포하려고
- branch : master, develop, feature 여러 개로 구성
 1) master branch : 사용자들이 bug 없는 프로그램을 사용하도록 하는 end-user 단의 소스 코드
 2) develop branch: 개발 중인 버전의 소스 코드가 담겨 있음, 여기서 충분한 테스트와 새로운 버그 발견 후에 master로 이동 가능
 3) feature branch : 하나하나의 기능을 담고 있음
 4) master에 가까워질수록 버그가 없는 상태에서 배포 가능

분산 시스템 Distributed  

fork : 오픈 소스를 통째로 내 계정에 다 가져오고 싶을 때, 이때 오픈 소스의 위치는 remote repository

clone : 내 컴퓨터에게 가져와서 소스를 변경하는 과정을 진행하고 싶을 때, 이때 소스의 위치는 내 컴퓨터(local repository)




      Github에서 fork 하는 방법 :
- 해당 repository에 들어가서 우측 상단의 fork 버튼을 눌러서 내 계정으로 해당 repository를 통째로 가져올 수 있음
- fork가 완료되면 repository의 소유자가 나로 바뀜
- 내 repository에서 우측 중간에 clone or download(녹색)을 클릭해서 URL을 복사해 내 컴퓨터 CLI에서 사용


Local repository를 Remote repository로 옮기는 방법 : git push origin master

      동시에 여러 사람으로부터 변경 사항이 발생하는 경우, 그 변경 사항을 local repository에 적용시키는 방법 : git pull origin master

repository를 처음 소유하고 배포했던 maintainer가 소스 코드에 변경을 진행한 경우(from upstream), 원본 repository의 변경사항을 local repository로 가져오는 방법 : git pull upstream master


    Git 명령어 전체 관계도  



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari