어제는 Java의 창조자인 제임스 고슬링의 팟캐스트 인터뷰를 듣다가 잠이 들었습니다. 제임스 고슬링이 가장 좋아하는 숫자는 √2라고 합니다. 종교를 바꿔놓은 숫자라고 해서 그렇답니다. 피타고라스의 정리를 만들어 기존의 개념을 파괴한 숫자이기 때문이랍니다. 컴퓨터 과학자들은 수학자에서 시작하는 경우가 많은데 이분도 마찬가지 인 것 같습니다. 전에 우연히 유튜브 알고리즘에 의해 알게 된 Leslie Lampart라는 튜링상을 받은 마이크로소프트 출신의 컴퓨터 과학자도 마찬가지로 수학에서 시작했다고 합니다. 제 주변만 봐도 비전공자중에 수학전공했던 분들이 개발자로 전향한 케이스가 대부분이었습니다. 저는... 경제학과 경영학과를 복수전공했으니 아예 거리가 있지는 않네요. 대학교에서 통계학 공부한 게 도움이 되길 바라면서 오늘도 공부를 시작해봅니다!

 

오늘의 학습목표는 어제 못한 Sololearn Java 정리(임시저장을 안해서 다 날라갔습니다.. 저장을 생활화 합시다😢), 핵심 쏙쏙 Git 3주차 듣기, 혼자 공부하는 자바 챕터 4를 끝내는 것입니다. 점심시간에 운동을 하고 오겠습니다. 강도는 좀 낮게 3세트씩만.. 안그럼 졸려서..ㅎㅎ

 

깃과 자바 공부

핵심 쏙쏙 Git 3주차

PR (Pull Request)

  • PR(Pull Request): 작업내역을 바로 merge 하지 않고, 참여하고 있는 프로젝트에 내 작업(branch)를 merge해달라고 요청(Request) 를 먼저 보내는 것
    • 여러 피드백을 거쳐서 repo 관리자의 승인을 거쳐 프로젝트에 반영(merge)
  • 왜 PR 이 완료된 후에야 로컬 repo의 feature/jjim 을 삭제해야할까요?
    • 통상적으로 PR 이 반영되기 전 추가 commit을 해야한다면, 로컬 branch에서 commit 후 원격 branch에 push해서 변경된 내용을 반영하기 때문
  • PR 은 리뷰하는 과정을 통상적으로 포함
  • PR 후에도 추가적으로 commit을 해야하는 경우
    • 리뷰에서 추가 수정을 요청받거나
    • PR 을 그대로 merge한다고 했을 때 merge conflict 가 나는 것을 미리 고치기
    • ex) 만약 추가 수정을 제안받았다고 가정할 때, 로컬 repo 의 feature/jjim 에서 commit 후, 원격 repo의 feature/jjim (origin/feature/jjim) 에 push 하는 것이 통상적임
  • 주니어 개발자 취업정보 repo
  • fork(포크,일종의 프로젝트 복사): 원본 소스코드를 복사해서 새로운 독립적인 소프트웨어로 개발하는 것
    • 마치 어떤 문서를 복사해서 그 위에 내가 원하는대로 수정해서 사용하는 것
    • repository 의 사용권한이 다른 사람에게 있을 때(ex.오픈소스), 내가 소유하고 있는 repo 가 아니더라도 프로젝트 제안할 때는 일단 프로젝트의 내용을 내 공간으로 가져와야하는데 그걸 포크라고 함

 

amend 최신 커밋 고치기

  • amend: 최신의 commit을 수정하는 것
  • 꼭! 나만 사용하는 branch 에서만 어멘드 하기
  • force push(강제 푸시): push 후에도 push 한 commit 을 되돌릴 수 있음; 강제로 commit 을 덮어씌우는 것과 같음
    • 강제 푸시 옵션은 꼭 필요할 때만 나 혼자만 작업하는 branch에서 사용
    • 일반적인 push 를 할 때는 강제푸시 옵션에 체크가 되어있지 않는지 꼭 확인

 

commit 되돌리기 - revert, reset

  • revert(리버트): commit 이 변경되었다는 거 알리면서 새로운 commit을 남기는 것
    • 최신 commit 뿐만 아니라 이전에 했던 commit 도 revert 로 되돌릴 수 있음
  • reset(리셋): commit 했던 작업내역을 말 그대로 리셋하는 것
    • soft(소프트): commit 들을 되돌리고 변경된 파일 작업 내역은 보존해서 파일 변경사항으로 보여줌. 이때 변경사항은 add 되지 않은 상태로 보임
    • mixed(믹스드): commit 들을 되돌리고 변경된 파일 작업 내역은 보존해서 파일 변경사항으로 보여줌. 이때 변경사항은 add 된 상태로 보임
    • hard(하드): commit 들을 되돌리고 그동안 작업했던 모든 것도 없앰; 즉, 작업내역을 복원할 수 없음
    • 히스토리를 남기지 않고 변경하는 것이므로 강제 푸시를 해야함; 그렇지 않으면 변경내역 이력이 남음

 

stash 변경사항 임시 보관하기

  • stash(스태시): 프로젝트의 변경사항을 임시적으로 보관해둘 때 사용
  • commit 한 적이 없는 파일이라면 stash 하지 않아도 됨
  • stash 는 여러 변경사항을 임시 저장해둘 수 있음
    • 만약 같은 파일을 여러 번 stash 했을 경우, 내가 수정한 내역이 이곳저곳에 흩어져 있어서 자칫하다가 작업내용이 날아갈 수 있음;
    • 내가 어떤 변경사항 stash 를 저장해두었는지를 파악하기
    • 이전 stash 에서 편집하던 파일을 불러와서 작업하는 습관을 들이기

 

작업으로 의사소통하기

 

Git 프로젝트 관리

오픈 소스 기여

 

깃헙 블로그 꾸미는 건 내일 해야겠다...

강의가 오래되서 (1년 반전) 테마 설정하는 버튼이 사라졌다...

 

🍯꿀팁 이미지 파일 url 만드는 법

github repo에서 issue 만들기 해서 이미지 끌어다 놓으면 자동으로 생성됨. 이슈 등록 안해도 이미지 링크는 쓸 수 있음

 

 


왜 또 안되냐... 깃헙 푸시 오류 😱

지난번에 토큰을 url 주소에 추가하는 것으로 해결된 문제(참조)인 줄 알았는데 PR 하고 푸시하는 과정에서 다시 에러가 발생했습니다. 김치 레시피 추가하는 게 이렇게 힘들일인가요😭


git -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags --set-upstream origin refs/heads/feature/1_stir_fired:refs/heads/feature/1_stir_fired 
Pushing to https://github.com/sooni2/kimchi-recipe-os.git
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/sooni2/kimchi-recipe-os.git/'
Pushing to https://github.com/sooni2/kimchi-recipe-os.git
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/sooni2/kimchi-recipe-os.git/'
Pushing to https://github.com/sooni2/kimchi-recipe-os.git
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/sooni2/kimchi-recipe-os.git/'
Pushing to https://github.com/sooni2/kimchi-recipe-os.git
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/sooni2/kimchi-recipe-os.git/'
Completed with errors, see above

push repo 오류

해결했습니다....!!😎

해결방법은 아래와 같습니다. 참고로 저는 맥북프로를 사용하고 있습니다. (참고 자료)

  1. keychain access에 접속한다
  2. github.com을 검색한다
  3. 속성에 들어간다
  4. 암호보기를 누른다.
  5. Github에서 발급받은 토큰을 입력한다. (전에 발급 받은 걸 따로 저장해 두어서 새로 발급받지는 않았습니다.)
  6. 변경 사항 저장 버튼을 누른다.

키체인 접근

 


Chapter 04 조건문과 반복문

Chapter 04-1 조건문: if문, switch문

조건문은 조건식에 따라 다른 실행문을 위해 사용

if문

  • 조건식의 결과에 따라 블록 실행 여부가 결정
  • 조건식에는 연삭식, boolean 타입 변수가 올 수 있음
  • if (조건식) {실행문; 실행문; ...}

if-else문

  • if문은 else 블록과 함께 사용
  • if문의 조건식이 true이면 if문의 블록이 실행되고, 조건식이 false이면 else 블록을 실행

if-else if-else문

  • 주사위를 굴려서 나올 수 있는 숫자 중 하나의 수를 무작위로 뽑아서 출력하는 프로그램 작성하기

1. 임의의 정수를 뽑는 법: Math.random() 메소드 활용하기; 0.0과 1.0 사이에 속하는 double 타입의 난수 하나를 리턴함. 0.0은 범위에 포함되고 1.0은 포함되지 않음

        0.0 <= Math.random() < 1.0

2. 1~10 사이의 정수를 얻기 위해서는 각 변에 10을 곱함

        0.0*10 <= Math.random()*10 < 1.0*10 

3. 각 변을 int 타입으로 강제 변환

       (int) 0.0 <= (int) (Math.random()*10) < (int) 10.0

4. 각 변에 1을 더하면 1~10 사이의 정수 중에서 하나의 정수를 얻게 됨

       0+1 <= (int) (Math.random()*10)+1 < 10+1

5. start부터 시작하는 n개의 정수 중에서 임의의 정수 하나를 얻기 위한 연산식은 다음과 같음

      int num = (int) (Math.random()*n)+1;

6. 주사위 번호 하나 뽑기 위한 연산식

     int num = (int) (Math.random()*6)+1;

7. 로또 번호 하나 뽑기 위한 연산식

     int num = (int) (Math.random()*45)+1;

 

public class prac {
    public static void main(String[] args) {
        int num = (int) (Math.random() * 6) + 1;
        if (num == 1) {
            System.out.println("1번이 나왔습니다!");
        } else if (num == 2) {
            System.out.println("2번이 나왔습니다!");
        } else if (num == 3) {
            System.out.println("3번이 나왔습니다!");
        } else if (num == 4) {
            System.out.println("4번이 나왔습니다!");
        } else if (num == 5) {
            System.out.println("5번이 나왔습니다!");
        } else if (num == 6) {
            System.out.println("6번이 나왔습니다!");
        }
    }}

 

switch문

  • if와 다르게 변수의 값에 따라 실행문이 결정됨
  • if문보다 코드가 간결함
public class prac {
    public static void main(String[] args) {
        int num = (int) (Math.random() * 6) + 1;
        switch (num){
            case 1:
            System.out.println("1번이 나왔습니다!");
            break;
            case 2:
            System.out.println("2번이 나왔습니다!");
            break;
            case 3:
            System.out.println("3번이 나왔습니다!");
            break;
            case 4:
            System.out.println("4번이 나왔습니다!");
            break;
            case 5:
            System.out.println("5번이 나왔습니다!");
            break;
            default:
            System.out.println("6번이 나왔습니다!");
            break;
        }
    }}

 

  • break문이 없는 case: case값과 상관없이 실행됨

 

04-2 반복문:for문, while문, do-while문

  • for문
    • for ( 초기화식; 조건식; 증감식){실행문;}
    • for (Int i=0, j=100; i<=50 && j>=50; i++, j--){실행문}
    • 초기화식에서 루프 카운터 변수 선언할 때 float 타입 사용하지 말아야함
  • 중첩 for문
    • 바깥쪽 for문이 한 번 실행할 대마다 중첩된 for문은 지정된 횟수만큼 반복해서 돌다가 다시 바깥쪽 for문으로 돌아감

              구구단 출력하기

public class prac {
    public static void main(String[] args) {
        for (int m=2; m<=9; m++){
            System.out.println("*** "+m+"단 ***");
            for (int n=1; n<=9; n++) {
                System.out.println(m + "x" + n + " = " + (m*n));
            }
        }
    }}
  • while문
    • 조건식이 true일 경우 반복 실행
    • 조건식이 false가 되면 반복 행위를 멈추고 while문 종료

           1부터 100까지 합을 출력

public class prac {
    public static void main(String[] args) {
        int sum = 0;
        int i =1;
        while(i<=100){
            sum+=i;
            i++;
        }
        System.out.println("1 ~ " + (i-1) + " 합 : " + sum);
    }}
  • do-while문: 내부 실행문을 우선 실행하고 실행 결과에 따라서 반복 실행을 계속할지 결정
  • break문: 반복문의 실행을 중지할 때 사용
    • 대게 if문과 같이 사용되어 If문의 조건식에 따라 for문과 while 문을 종료할 때 사용
    • 반복문이 중첩되어 있을 경우 break문은 가장 가까운 반복문만 종료하고 바깥쪽 반복문은 종료하지 않음
      • 바깥쪽 반복문까지 종료하려면 바깥쪽 반복문에 이름(라벨)을 붙이고 'break 이름;'을 사용하면 됨
  • continue문: for문, while문, do-while문에서만 사용
    • continue문은 블록 내부에서 실행되면 for문의 증감식 또는 while문, do-while문의 조건식으로 이동
    • If랑 사용시 특정 조건을 만족하는 경우에 continue문을 실행해서 그 이후의 문장을 실행하지 않고 다음 반복으로 넘어감

           1에서 10 사이 중 짝수만 출력 (continue를 사용한 for문)

public class prac {
    public static void main(String[] args) {
        for(int i=1; i<=10; i++){
            if(i%2 !=0){
                continue;
            }
            System.out.println(i);
        }
    }}

 

확인문제

3. while문과 Math.random() 메소드를 사용해 2개의 주사위를 던졌을 때 나오는 눈을 (눈1, 눈2) 형태로 출력; 눈의 합이 5이면 실행을 멈추는 코드

 

public class prac {
    public static void main(String[] args) {
        int sum = 0;

        while (true) {
            int num1 = (int) (Math.random() * 6) + 1;
            int num2 = (int) (Math.random() * 6) + 1;
            System.out.println("" + num1 + "와" + num2 + "합은" + (num1 + num2));
            if ((num1 + num2) == 5) {
                break;
            }
        }

    }
}

 

4. 중첩 for문을 이용하여 방정식 4x + 5y=60의 모든 해를 구해서 (x,y) 형태로 출력

public class prac {
    public static void main(String[] args) {
        for(int x=0; x<=10; x++) {
            for (int y =1; y<=10; y++){
            if(4*x+5*y== 60){
                System.out.println(x+" , "+y);
            }}
        }
    }
}

 

5, 6. for문 이용해서 출력하기

public class prac {
    public static void main(String[] args) {
        for (int i = 1; i <= 4; i++) {
            for (int j = 1; j <= i; j++) { /*i가 2면 j는 2번 실행됨*/
                System.out.print("*");
                if (i == j) {
                    System.out.println();
                }
            }
        }
    }
}

6. for문 이용해서 출력하기

public class prac {
    public static void main(String[] args) {
        for (int i = 1; i < 5; i++) {
            for (int j = 4; j > 0; j--) {
                if (i < j) {
                    System.out.print(" ");
                } else{ System.out.print("*");}
            }
            System.out.println();
        }
    }
}

i=1, j =4 일 때: 1<4 -> " "

i=1, j=3 일 때: 1<3 -> " "

i=1, j=2 일 때: 1<2 -> " "

i=1, j=1 일 때: 1=1 -> "*"

 

중첩for문 이해할 것...😇😇😇

 

7. while문과 Scanner의 NextLine()를 이용해서 입력된 데이터로 예금, 출금, 조회, 종료 기능을 제공하는 코드 작성

public class prac {
    public static void main(String[] args) {
        boolean run = true;
        int balance = 0;
        Scanner scanner = new Scanner(System.in);
        while (run) {
            System.out.println("----------------------------");
            System.out.println("1.예금 | 2. 출금 | 3.잔고 | 4.종료");
            System.out.println("----------------------------");
            System.out.println("선택> ");

            int menuNum = Integer.parseInt(scanner.nextLine());

            switch (menuNum) {
                case 1:
                    System.out.print("예금액> ");
                    balance += Integer.parseInt(scanner.nextLine());
                    break;
                case 2:
                    System.out.print("출금액> ");
                    balance -= Integer.parseInt(scanner.nextLine());
                    break;
                case 3:
                    System.out.print("잔고> ");
                    System.out.println(balance);
                    break;
                default:
                    run = false;
                    break;
            }
            System.out.println();
        }
        System.out.println("프로그램 종료");
    }
}

Integer.parseInt() : String 타입을 Int 타입으로 바꿔주는 메소드

 

 

+ Recent posts