메가테라 2주차 강의 필기 요약

샨티(shanti)·2022년 5월 15일
0

TIL

목록 보기
136/145
post-thumbnail

메가테라는 매 주 금요일 오후 6시에 주말동안 들어야 할 아샬님의 강의를 오픈합니다.
주말 내도록 강의를 충분히 듣고, 필기&질문 목록을 만들고 난 뒤에
이어지는 월~금요일동안 주어진 과제를 수행하는 플립드 러닝(flipped learning) 방법으로 공부합니다.


메가테라... 마의 1주차가 드디어 끝났다.
드디어라는 말이 적절할지는 모르겠지만 정말 멘탈이 탈탈 털려서 남아나는게 없을 것 같던 1주차 ㅎㅎㅎ
어쨌든, 이제는 백엔드 개발자가 되기 위한 첫걸음을 떼었으니 한시도 발걸음을 멈출 수가 없다.

2주차 과제를 위해 주말동안 아샬님의 강의를 들었는데, 역시나 외계어처럼 어려운 말들이 눈앞에 동동 떠다녔다.
이번주도 지난주 못지않은 난항이 예상되지만(ㅋㅋ) 어쩌겠노~ 힘내자!!




1. Hello, World!


아~~주 아주 옛날. 그러니까 초등학교 5학년인가, 6학년 때였을게다 아마.
취미(?)마냥 다녔던 컴퓨터 학원에서 포토샵 책을 한권 다~ 끝내고서는 뭘하지 고민하시던 선생님이 주워든 희한한 책.
기억에는 비주얼베이직이라는 프로그램 관련 책이었는데...

초딩이었던 나는 포토샵으로 열심히 누끼(?) 따고, 셀카 보정하는 거나 재미있지 뭔 버튼을 만들어서 누르고, 알지도 못하는 이상한 영어단어를 쓰라고 하고....
할튼 취미로 배우는 컴퓨터가 이렇게 어려워서야 되겠는가!!! 하며 얼마 뒤에 그만두긴 했지만, 그 때 보았던 글자 중에 Hello world가 있었던 것 같다.

이번 강의에서는 자바 소스를 만들기 위한 프로그램인 Intelli J Idea를 이용해 이 전설과 같은 "Hello, World!" 글자가 나오는 과정을 알아보았다.

아, 여담인데. 메가테라 로지 트레이너님이 추천해주셔서 읽었던 그 책의 저자가 "Hello, World!"의 창시자라는 이야길 듣고 혼자 소스라치게 놀랐다는...ㅋㅋㅋ.
역시 세상은 아는 만큼 재밌어지는 것 같다.

아래부터는 강의 내용을 필기한 것이라 더이상의 사담은 없을 예정 ;;


  • Java 소스를 만들기 위한 프로그램으로 Intelli J Idea라는 프로그램을 사용함. 프로젝트 생성 시 version은 적어도 11 이상을 사용할 것을 추천
  • 프로젝트를 새로 생성하면 기본적으로 (1) .idea 폴더, (2) src 폴더(src는 source의 약자), (3) helloworld.iml 파일(helloworld는 내가 입력한 파일명) 총 3개가 생성됨
  • Java 프로그램을 만든다는 것은 곧 Java 소스코드(=원시코드)를 작성한다는 것을 의미함. *.java 파일은 텍스트 파일임
  • class(프로그램의 구성 요소)는 .java 파일 하나를 의미함(초반이라 class의 의미를 정확히 이해하지 못했음. 보완공부를 통해 정확히 파악해야 함)
  • 원칙적으로 꾸며주거나 설명하는 수식어가 앞에 오고, 이름은 뒤에 따라옴(예. public class)
  • main 메서드(method)의 개념은 보완 공부를 통해 충분히 학습할 것. 특히 Boilerplate는 지금으로서는 외우는 수밖에 없으며 나중에 이해가 되는 시점이 올테지만 지금은 몸이 기억하고 자동으로 작성할 수 있도록 계속 써보는 수밖에 없음.
    그런 의미에서 한번 써볼까~ (이렇게 쓰는거 맞나...? ;;)

    public static void main(String[] args){
    }

  • 소스를 작성할 때 사용하는 중괄호 { } 는 블록을 만들어주는 역할을 함. 문단으로 이해하거나 폴더의 개념으로 이해하면 쉬움
  • 작성한 코드를 실행할 때!! 자바라는 언어는 소스코드(원시코드) 파일을 그대로 실행할 수 없음. 따라서 '컴파일'이라는 과정을 거치는데, 컴파일을 하면 클래스 파일(*.class) 이 생성되며 이 클래스파일을 JVM(Java Virtual Machine)으로 실행 가능함
  • terminal 탭을 통하여 (1) 컴파일 한 후, (2) 실행 해보기
  • 'ls'를 입력할 경우 파일과 폴더 확인 가능(단, 여기서 폴더 명 앞에 . dot이 붙어있는 폴더는 보이지 않음). ** 참고. ls는 list segments의 약자라고 함
  • ls 뒤에 -a, -al 등이 붙는 경우가 있는데 -a의 경우 숨김파일/폴더를 포함한 모든 파일을 포함하여 보여주고, -l의 경우 해당 디렉터리에 존재하는 파일, 접근권한 등의 파일 정보를 포함하여 보여줌. 따라서 -al은 숨김파일/폴더&파일의 접근권한 등 정보 출력을 동시에 하는 것이라고 볼 수 있음. 강의에서는 ls -al 명령어 입력을 많이 했었음
  • ls 뒤에 폴더명일 붙으면 해당 폴더 안에 있는 파일을 볼 수 있게 됨(예. ls src 입력 시 src 폴더에 있는 파일 정보 출력)
  • 컴파일 명령: javac 폴더명/소스코드 파일 => ex. javac src/hello.java. => 컴파일 하라 + src 폴더에 있는 + hello.java 파일을
  • 클래스 파일 실행 명령
    (1) 클래스파일이 있는 폴더에 직접 들어가서 해당 파일을 실행하거나
    cd src 입력(cd=다른 디렉토리로 이동하기, src=이동할 디렉토리)
    java Hello 입력(java=클래스파일 실행, Hello=클래스파일 명)
    (2) 찾아들어가는 게 귀찮다면 파일이 있는 경로를 알려주고 실행시키거나
    ex) java --class-path = src Hello(여기서 --class-path는 -cp로 축약해서 사용 가능)
  • 소스코드와 클래스파일이 한 데 모여있으면 혼란스러우므로, 컴파일 시 클래스파일이 생성되는 목적지를 다른 곳으로 정하여 생성하도록 함
    ex) javac -d classes src/Hello.java
    (컴파일 명령 -디렉토리 -classes라는 디렉토리가 있으면 거기에 생성, 없으면 디렉토리 자체를 생성-src 폴더에 있는 Hello.java 파일 선택)



2. 변수와 타입

  • 프로그램 만들 때 정~말 중요한 것!! => 바로 관심사의 분리 => 차를 한 대 만들더라도 하나의 공정으로 모든 완제품을 만들어내는 것이 아니라, 각 부품들을 조립하여 완제품을 만드는 것임. 결국 관심사를 분리한다는 것은 이해하기 쉽고, 중복을 제거하여 효율성을 높이는 등의 효과

  • 이번 강의에서는
    (1) 변수(variable): 어떤 값에 이름을 붙여준 것
    (2) 타입(type): 변수가 다루는 데이터/값의 '종류'
    관련하여 공부했음

  • 리터럴(literal): 값을 표현하는 방법(개인적으로는 리터럴과 타입의 개념이 서로 헷갈리는데 보완하여 공부가 필요함)
    예시

    • 숫자 리터럴: 1, 2, 3
    • 문자 리터럴: 'H', 'e'
    • 문자열: "Hello"
    • 주석(comment): //
  • 기본값(default): 숫자일 경우에는 0, 문자일 경우에는 ""(빈 문자열) => 빈 문자열 표현이 가능하므로 공백 표현도 당연히 가능함(예. " ")

  • 사칙연산에서 사용하는 '+'는 덧셈의 개념이지만, 자바에서 이 '+' 기호를 가지고 문자열과 문자열을 더해줄 수 있을까?
    => 결론적으로는 더한다는 개념은 아니고, 문자열과 문자열을 연결해주는 역할로 '+'가 활용될 수 있음(자바에서는 가능)
    => 예시. "Hello" + "!" = Hello!

  • 타입(type). 초반 중요도에 따라 ⭐️을 붙였음

    타입설명
    byte8 bits(1byte) 정수형. 2^8=256(0~255, 또는 -128~127)
    short16bits(2bytes) 정수형. 2^16=65536(0~65535)
    ⭐️ int ⭐️32bits(4bytes) 정수형. 소수점 없음
    long64bits(8bytes) 정수형
    float32bits 부동 소수점
    ⭐️ double64bits 부동 소수점
    ⭐️ boolean불리언. 참/거짓 => true / false
    char16bits(2bytes) 문자
    ⭐️ String ⭐️N bytes 길이/크기가 가변 => 문자열

    *부동: 부동은 움직이지 않는다는 뜻이 아닌, 물에 뜬다는 의미의 부, 움직인다는 뜻의 동을 써서 둥둥 떠다닌다는 개념으로 받아들일 것




3. 입출력

  • 입력을 받고싶다면?! 그렇다면 입력은 어떻게 받을 것인가?! => Scanner란 '도구(객체)'를 가져다가 만들어 쓸 수 있음(객체의 의미를 잘 이해하지 못하고 있음. 나중 강의에서 계속 나올 것 같은 개념이므로 놓치지 말고 가자)
    • (1) scanner라는 '타입'을 가져오기(import). 이 타입은 누군가가 만든 것임(나중에는 내가 만들수도 있음. 지금은 초반이므로 내가 만들수는 없고 누군가가 만든 것을 가져올 것임)
    • (2) scanner란 어딘가에서 값을 가져오는 도구라고 이해할 것
    • (3) 키보드로 입력 => System.in
    • scanner import한 모습
      import java.util.Scanner;
      public class HelloToYou {
      public static void main(String[] args) {
        	Scanner scanner=new Scanner(System.in);
        		String name=scanner.nextLine();
        		System.out.println("Hello, " + name + "!");
      		 }
      	}



4. 조건문

  • 요구사항을 먼저 설정한 후에 그 요구사항에 맞는 '숫자 계산 프로그램 만들기'

    • 숫자 두 개를 입력받음
    • 숫자 두 개의 합을 입력하라고 요구함
    • 답을 입력했을 때와 오답을 입력했을 때의 출력 메시지를 다르게 함
    • 추후 숫자 두 개의 곱을 추가로 입력하라고 요구하여 (1) 두 입력값 모두 정답일 경우, (2) 둘 중 하나만 정답일 경우, (3) 둘 다 오답일 경우 출력 메시지를 다르게 함
  • 연산자 우선순위

    우선순위연산자
    높음* , / (사칙연산의 곱셈, 나눗셈)
    +, - (사칙연산의 덧셈, 뺄셈)
    ==, !=, <, >, <=, >= (비교; compare)
    &&(논리연산자 AND)
    ll(논리연산자 OR)
    낮음= (할당; assingn)
  • 흐름제어(Flow Control): 조건에 따라 다르게 행동. 조건문(if문)을 사용하여 코드실행의 흐름을 제어할 수 있음. if문 조건에 대해 결과값이 참인 경우 실행, 그렇지 않을 경우 해당 조건문은 지나치고 이어지는 조건에 대하여 실행. 조건문 내에 또다른 조건문이 부가 삽입될 수 있음

  • 참과 거짓을 반대로 하는 기능: NOT(!) 비교연산자에서 != 는 NOT ==, 즉 같지 않다가 됨. 고등학교 수학시간에 배웠던 명제와 집합 개념에서 p->~q 에서 '~'가 NOT을 의미하는 것을 떠올려 볼 것.




5. 방탈출 게임

  • 기본 컨셉: 컴퓨터가 제시하는 일정 갯수의 문제를 맞추어야만 (iterm)에서 탈출 할 수 있음
  • 제약조건: (맥 O/S 기준) ctrl + C로 강제탈출 하지 않는다, 문제는 3개까지 주어진다.
  • 방탈출 게임을 만들어내기 위해 고민해보아야 할 지점
    • 컴퓨터가 계속해서(=반복해서) 문제를 낼 수 있어야 함 -> 일정 조건에 따라 문제를 내는 flow를 '반복'하여 실행할 수 있어야 함(이것 역시 Flow Control에 해당. 이제까지 배운 Flow Control은 if문이 있었음)
    • 몇 문제를 맞추었는지 검사(count)할 수 있어야 함
    • 코딩의 큰 process: 입력받을 준비 -> 입력받음 -> 입력받은 내용 처리 -> 화면 출력의 과정(해당 흐름을 잊지 않고, 헷갈릴 때 주석으로 큰 프로세스 먼저 기재해두면 코딩이 산으로 갈 일이 줄어듦. 실제로 크게 도움받고 있음)
  • while: 조건이 맞는 동안에는 끊임없이 반복해서 실행(루프가 형성)
  • c.f. if문은 ( )이 '참'에 해당할 때 실행, 그렇지 않으면 노룩패쓰
  • assign의 개념: 다시 한번 반복하는 것은 assign과 compare에서 이야기하는 'equal'의 개념을 헷갈리지 말 것. assign(할당)은 변수에 값을 매겨주는 의미이고 '='로 표현되나, 우리가 흔히 생각하는 equal의 개념은(방정식의 x = y에서 좌항과 우항이 '같다'로 표현되는 equal) 자바에서 '==' 로 표현하니 주의
  • 증감, 곱/나누기와 관련한 reassign
    표현의미
    + =증가. 예) x += 1 은 x가 1씩 증가한다는 의미
    - =감소. 예) x -= 1 은 x가 1씩 감소한다는 의미
    * =곱. 예) x *= 2 는 x가 2배가 된다는 의미
    / =나누기. 예) x /= 2는 x가 1/2배가 된다는 의미
    더 엄밀히 이야기한다면 x += 1 은 x = x + 1 의 줄인 표현으로, 원래의 x값에 1을 더해준 값(x+1)을 다시 x에 재할당(reassign) 시킨다는 뜻이다. 그래서 assign의 '=' 의미를 equal로 이해하면 큰 오해가 발생한다(3 = 3+1과 같이 말도 안되는 것 같은 상황이 발생).



공통 강의. GitHub에 흔적 남기기

  • repository의 개념: Git의 저장소(원격 저장소이며 별도의 명령을 내리지 않는 한 내 컴퓨터에 있는 저장소가 아님). GitHub에서 관리가 가능함
  • commit의 개념: 현재로서는 'save'와 비슷한 개념으로 이해할 것. GitHub에서 내용을 바꾸고 나서 반드시 commit을 하여야 반영이 됨(반드시 commit의 개념을 알고 갈 것. 그래야 나중에 add, restore, rm, push, pull까지 모두 연결하여 오류 없이 사용할 수 있음)

iterm을 통하여 원격 저장소 내용을 내 컴퓨터와 동기화시키기

  • 자주 나오는 명령어

    명령어내용
    ls -al현재 폴더의 파일 정보(숨김파일/폴더 포함) 확인하기
    cd 폴더명해당 폴더에 진입(ex. cd work => work라는 폴더에 들어가기)
    cleariterm 화면 reset(cmd 키 + r 눌러도 동일하게 작동함)
    git init내가 원하는 폴더에 git 생성시키기. 해당 폴더에 .git이 생성됨
    git statusGit 상태 확인하기
  • 먼저 GitHub에 있는 Git을 내 컴퓨터에 있는 .git과 연동시켜야 함

    • GitHub의 code에서 SSH 복사해오기(SSH 개념 놓치지 말고 갈 것)
    • 복사한 주소를 활용하여 iterm에서 명령하기
      git remote add origin 복사한주소 => git / 원격으로 / 추가할거야 / origin이라는 이름으로 / 복사한것을
    • 잘 추가되었는지 궁금하다면 git remote (사실 아무일도 일어나지는 않음. 원격저장소의 것을 origin이라고 칭했을 뿐 내 컴퓨터로 '가져온' 것은 아니므로)
    • 이제 가져오는 작업이 필요함 이 때 사용하는 명령이 git fetch origin (컴퓨터 공부할 때 힌트를 얻었겠지만 fetch는 인출이라는 뜻. 따라서 원격 저장소소에 있는 origin을 인출한다고 이해하면 됨)
    • 여기서 끝나느 것이 아니라 다음 작업이 필요함. git switch -c main origin/main(이 대목은 외우기는 하겠으나 각 명령어의 뜻을 정확히 알아야 이후에 까먹지 않을 것 같음)

비주얼스튜디오로 GitHub 내용 고치기

  • iterm에서 작업중인 내용 그대로 비주얼스튜디오를 바로 실행하려면 code . 명령어 입력
  • 비주얼스튜디오에서 내용을 수정하면 해당 행 좌측에 파란색 highlight가 뜨면서 수정되었음을 알려주고, iterm에서도 엔터를 쳐보거나, git status를 쳐보면 현재 작업중인 파일이 수정되고 있는 상태인지 확인할 수 있음

sourcetree를 실행하여 간결하게 확인하기

  • sourcetree를 실행한 상태에서 iterm에 open . 명령을 실행하면 현재 상태에서 적합한 창이 뜨는데 강의에서는 finder 창이 떴고, 깃허브 작업폴더를 sourcetree에 옮겨다두고 작업하였음

iterm에서 수정된 파일을 커밋(수정, 삭제, 삭제취소 등)

  • stage와 commit 개념이 계속 헷갈리고 있음. 앞에서도 언급했지만 이 개념이 헷갈리지 않아야 add, restore, rm, commit, push, pull 모든 작업을 오류 없이 진행할 수 있음
  • 비주얼스튜디오에서 작업내용을 수정한 상태에서 iterm으로 돌아와 git add 명령을 실행한다
    • 파일명을 직접 입력하는 방법 git add README.md(단어를 쓰는 도중에 탭 키를 누르면 자동 완성됨)
    • 또는 파일이 여러개일 경우 git add . 을 입력하면 한번에 add 가능
  • git status 명령을 통해 확인하거나, 또는 sourcetree에서 확인해보면 unstaged files 영역에 있던 README.md 파일이 'staged file' 영역으로 이동한 것을 볼 수 있음. 이 상태여야 커밋(commit)이 가능함!!
  • '커밋이 가능한 상태'인 것이지 아직 '커밋을 한 것'은 아님. 따라서 git commit을 입력하여 커밋해야 함
    • 'i'는 insert의 약자로, GitHub에서 커밋 시 메모를 남기듯이 iterm에서도 메모를 남길 수 있음
    • 'esc'를 누르면 탈출 가능!
    • :q! 를 누르면 강제로 탈출하는 것
    • 커밋 메시지를 입력하고 저장 후 나가려면 :wq
  • 안타깝게도 여기까지의 상태는 내 컴퓨터에 저장이 되었을 뿐, 원격 저장소와는 연동된 것이 아님. 따라서 원격 저장소와 동기화를 다시 해주어야 함

내 컴퓨터에 저장되어 있는 file을 push하기

  • git push origin main => 하나 하나 뜯어보면 git 명령 / 푸시할거야 / origin으로 / 내 main을!
  • 원격저장소에서 내 컴퓨터로 파일을 가져올 때 fetch를 사용했다면, 내 컴퓨터에 저장되어 있는 파일을 원격저장소로 연동시킬 때는 push라는 명령어를 사용하니 비교해서 공부해볼 것

내 컴퓨터에서 새로운 file을 추가/삭제/실행취소 해보기

  • 파일의 내용을 수정하는 것 뿐만 아니라 새로운 파일을 생성하는 것, 기존의 파일을 삭제하는 것 역시 '변경사항'에 해당함. 따라서 내용 수정/새로운 파일 추가/삭제가 발생했다면 git status를 입력했을 때 이를 확인할 수 있음
  • 변경사항(create new file)을 add하는 명령은 마찬가지로 git add 파일명, 또는 git add .
  • 위와 같은 명령 실행 후 git status로 확인해보면 수정이 발생했을 때(modified file) 와 달리 new file이라는 내용이 출력됨을 확인할 수 있음
  • 파일 삭제 명령은 rm 파일명 으로 입력할 것. 엄밀히 말하면 '삭제'하는 것이 아니라 '삭제 대기' 상태가 되는 것. '삭제할 예정'이라는 상태로 파일을 staged 상태로 만든달까?
  • 그럼 삭제할 예정으로 staged 상태인 이 파일에 대해서 또다시 'add' 명령을 해주어야 삭제가 되는 것임.
  • 실수로 삭제했다면 git restore --staged 파일명(스테이지에서 내려오도록 하고), git restore 파일명(내려온 상태의 파일을 복구하고)
  • 그 밖에 여태껏 변경사항을 쭉 보는 명령어(마치 sourcetree 형식처럼 볼 수 있음) => git log, git log --graph(좌측 이음선 표시 원한다면). 탈출을 원할 경우 q 입력 시 바로 탈출 가능
profile
가벼운 사진, 그렇지 못한 글

0개의 댓글