어제는 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 프로젝트 관리
오픈 소스 기여
- 오픈소스 기여 가이드
- 프로젝트의 bug report(버그 신고)하기 - 동작하지 않는 것을 issue 에 적기
- 버그리포트하는 issue 에 해결 답변 달기
- 기술 문서화 - 오타 수정, 서식 수정, 기술을 설명하는 문서 작성에 참여
- 번역하기 - 주로 영어를 한글로 번역하는 프로젝트가 많음
- 버그 코드 수정
- 새로운 기능 추가
- 프로젝트에서 필요로 하는 자료 모으기
- 프로젝트 행사 운영 기획에 참여하기
- 그리고 프로젝트가 필요로 하는 모든 것!
- 깃헙 처음 기여하는 사람들을 위한 스프린트
- 오픈소스 라이센스 비교표
- 성당과 시장 한글판 링크
- 핵토버페스트
- 스프린트서울
- 파이콘서울스프린트
깃헙 블로그 꾸미는 건 내일 해야겠다...
강의가 오래되서 (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
해결했습니다....!!😎
해결방법은 아래와 같습니다. 참고로 저는 맥북프로를 사용하고 있습니다. (참고 자료)
- keychain access에 접속한다
- github.com을 검색한다
- 속성에 들어간다
- 암호보기를 누른다.
- Github에서 발급받은 토큰을 입력한다. (전에 발급 받은 걸 따로 저장해 두어서 새로 발급받지는 않았습니다.)
- 변경 사항 저장 버튼을 누른다.
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();
}
}
}
}
}
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 타입으로 바꿔주는 메소드
'TIL' 카테고리의 다른 글
TIL 혼자 공부하는 자바 JAVA 챕터 1~5 복습 221112 (0) | 2022.11.12 |
---|---|
TIL 혼자 공부하는 자바 JAVA 참조타입 배열 array 221111 (0) | 2022.11.11 |
TIL 입학시험과 핵심 쏙쏙 Git 2주차 (0) | 2022.11.09 |
TIL 혼자 공부하는 자바 JAVA 연산자 핵심 쏙쏙 Git 1주차 221108 (0) | 2022.11.08 |
TIL 혼자 공부하는 자바 JAVA 프로그래밍 언어 입문 221107 (0) | 2022.11.07 |