[TIL] Day1_Java 기초문법 & Git 연습

오진선·2024년 2월 5일
0

TIL

목록 보기
1/29
post-thumbnail

Today I learned


1. JAVA 기초문법

1) Java의 역사

  • A 언어(60') --> B 언어(60') --> C 언어(70') --> JAVA(90') 의 순으로 발전.
  • 1995년 썬 마이크로시스템즈에서 발표한 객체 지향 프로그래밍 언어.
    자바를 만든 제임스 고슬링은 자바 커피를 하루에도 10여 잔씩 마실 정도로 자바를 좋아했다고 한다.

  • 자바의 철학 : Write Once, Run Anywhere (WORA).

  • 인터넷, 월드 와이드 웹(WWW) 의 출현으로 크게 부상.

2) Java의 특징

  • 공통 실행환경이 있어 OS에 구애받지 않고 여러 기기에서 실행 가능 (App 개발에 적합)
  • 이전의 언어들에 비해 코드를 이해하기 쉽고, 따라서 유지보수도 쉬움 (객체지향)
  • 안정성이 높아 프로그래밍 오류를 방지하고, 보안상 안전 (Compiler)
  • 대규모 앱 개발이 가능 (API 제공)
  • 다양한 개발도구와 라이브러리 사용 가능

3) JVM이란?

Java Virtual Machine
OS에 종속받지 않고 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터.

Java의 원시코드는 CPU가 인식하지 못하기 때문에 컴파일을 필요로 한다.
따라서 JDK 속에 포함된 javac.exe = compiler가 JVM이 이해할 수 있도록 *.java 파일을 *.class 파일(Java bytecode)로 변환한다. 그 다음 JVM이 변환된 bytecode를 OS가 이해할 수 있도록 해석한다.

<JVM의 구조>

<용어 정리>

  • 바이트 코드 : 가상 컴퓨터(VM)에서 돌아가는 실행 프로그램을 위한 이진 표현법.
  • 인터프리터 : 자바의 *.class 코드 해석기. (바이트 코드를 기계어로 번역)
  • JIT Compiler : Just In Time, 동적 번역(dynamic translation), 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 해당 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식.
  • 메모리 영역 : Java 데이터를 저장.
  • 클래스 로더 : JVM으로 class(바이트 코드)를 불러와서 메모리에 저장.
  • 가비지 컬렉터 : 메모리 영역에서 안쓰는 데이터를 주기적으로 청소.
  • JRE : Java Runtime Environment, 자바 실행 환경, *.class 파일만 실행 가능.
  • JDK : Java Development Kit, 자바 개발 키트, 디버깅 기능 제공.

4) Java 문법

<기본 문법>

  • public/private/protected : 접근제어자
  • class : 클래스 선언
  • Main : 클래스명
  • // : 주석
  • 선언 : 값을 저장할 공간을 마련함.
  • 값의 저장 : 선언과 동시에 저장/선언 이후에 저장

  • 변수 : 값의 변화 가능
  • 상수 : 값의 변화 불가능 (final 사용)

<변수의 종류>

  1. 클래스 변수 (Class variables) - 클래스가 처음 호출될 떄 시작하여 프로그램이 끝날 때 소멸- 자주 사용되고 변함 없는 자료일 경우 클래스 변수에 선언함.
  2. 인스턴스 변수 (Instance variables) - 객체가 생성될 때 시작 해당 객체를 참조하는 객체가 없을 때 소멸.
  3. 지역 변수 (Local variables) - method안에서만 유효함. 다른곳에서 부를 수 없음.
  4. 매개 변수 (Parameters) - method가 호출될 때 시작, method가 끝날 때 소멸.

<변수의 타입>

  • 기본형 : boolean(논리형) / char(문자형) / byte, short, int, long(정수형) / float, double(실수형)
  • 참조형 : String(문자열) / Object, Array, List …
  • 래퍼 클래스(Wrapper Class) : Byte, Short, Integer, Long, Float ...

<입출력>

  • 입력 : Scanner.in 객체의 next() 명령을 사용.
Scanner sc = new Scanner(System.in); // Scanner 객체를 new 명령어로 생성합니다.
String input = sc.next(); // sc(Scanner)의 .next(); 를 실행하면 input 변수에 입력한 글자를 받을 수 있습니다.
  • 출력 : System.out 객체의 println() 명령을 사용.
    System.out.print & println : print -> 줄바꿈X / println -> 줄바꿈O
Scanner sc = new Scanner(System.in);
String input = sc.next();  

System.out.println("입력값 : " + input);  // 입력한 글자를 출력합니다.

// 실행 결과
{입력}
입력값 : {입력}

<형변환>

  • 작은 타입 > 큰 타입 형변환시 (자동 형변환)
    • 더 큰 표현범위를 가진 타입으로 변환, 값의 손실 X.
    • 컴파일러가 자동으로 형변환.
  • 큰 타입 > 작은 타입 형변환시 (강제 형변환 = 캐스팅)
    • 더 작은 표현범위를 가진 타입으로 변환, 값의 손실 O.
    • 개발자가 선택하여 형변환.

<stack/Heap>

  • Stack : 정적으로 할당된 메모리 영역
    • 크기가 몇 byte 인지 정해져 있는 기본형 변수를 저장.
    • 크기가 정해져 있는 참조형 변수의 주소 값도 저장.
  • Heap : 동적으로 할당된 메모리 영역
    - 크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장.

<1주차 Java 입출력 과제>

import java.util.Scanner;

public class Main {

    // [JDK]
    // (1) compiler : .java -> .class
    // (2) JRE
    // (3) JDB : debugging

    // main method
    // 자바 프로젝트는, 제일 먼저 클래스의 main 메소드를 실행시킨다. = JVM의 약속
    // static : 이 프로그램이 시작할 때 무조건 실행됨
    // void : 메서드의 출력값의 데이터 타입, "아무것도 없다" -> 출력이 없다.
    // String[] args : 매개변수 자리
    public static void main(String[] args) {
        //1주차 과제
        //  입력값
        //    - 내가 좋아하는 요리 제목을 먼저 입력합니다.
        //    - 요리 별점을 1~5 사이의 소수점이 있는 실수로 입력해주세요. (ex. 3.5)
        //    - 이어서 내가 좋아하는 요리 레시피를 한 문장씩 10문장을 입력합니다.
        //  출력값
        //    - 입력이 종료되면 요리 제목을 괄호로 감싸서 먼저 출력 해줍니다.
        //    - 이어서, 요리 별점을 소수점을 제외한 정수로만 출력해줍니다. (ex. 3)
        //    - 바로 뒤에 정수별점을 5점만점 퍼센트로 표현했을 때 값을 실수로 출력해줍니다. (ex. 60.0%)
        //    - 이어서, 입력한 모든 문장 앞에 번호를 붙여서 모두 출력 해줍니다.
        Scanner sc = new Scanner(System.in);

        System.out.println("제목을 입력하세요.");
        System.out.print("> ");
        String title = sc.nextLine();
        System.out.println("별점을 입력하세요.");
        System.out.print("> ");
        float rate = Float.parseFloat(sc.nextLine());
        System.out.println("한 문장씩 입력하세요");
        System.out.print("1 > ");
        String se1 = sc.nextLine();
        System.out.print("2 > ");
        String se2 = sc.nextLine();
        System.out.print("3 > ");
        String se3 = sc.nextLine();
        System.out.print("4 > ");
        String se4 = sc.nextLine();
        System.out.print("5 > ");
        String se5 = sc.nextLine();
        System.out.print("6 > ");
        String se6 = sc.nextLine();
        System.out.print("7 > ");
        String se7 = sc.nextLine();
        System.out.print("8 > ");
        String se8 = sc.nextLine();
        System.out.print("9 > ");
        String se9 = sc.nextLine();
        System.out.print("10 > ");
        String lastSe = sc.nextLine();

        int intRate = (int)rate;
        double perRate = intRate * 100 / 5.0;

        System.out.println("[ " + title + " ]");
        System.out.println("별점 : " + intRate + " (" + perRate + "%)");
        System.out.println("1. " + se1);
        System.out.println("2. " + se2);
        System.out.println("3. " + se3);
        System.out.println("4. " + se4);
        System.out.println("5. " + se5);
        System.out.println("6. " + se6);
        System.out.println("7. " + se7);
        System.out.println("8. " + se8);
        System.out.println("9. " + se9);
        System.out.println("10. " + lastSe);

    }
}


2. Git 연습 (S.A - Github)

1) 팀장이 나...?

랜덤 당첨제였는지 팀원들도 모르게 팀장이 된 나^^
일단 과제를 받았으니 할 일을 추려봐야지...
팀장이 해야 할 일을 정리해 보았다.

  1. Repository 만들기
  2. 첫 README.md 올리기
  3. 팀원 1의 Pull Request를 merge하기
  4. 팀원 2, 3의 Pull Request를 merge하기 -> conflict error 발생
  5. conflict로 인한 Request Change 요청하기
  6. 함께 conflict 해결하기
  7. 팀원 2, 3의 해결된 PR을 merge하기
  8. github 링크 제출하기

음... 남들보다 꽤나 할 일이 많아 보이는 건 기분 탓이겠지?
하지만 CLI를 거의 사용하지 않을 수 있다는 장점이 있고... 그런 거겠지...?

2) Dumm Dumm...하게 일단은 성공!

일단 레파지토리를 먼저 생성했다. 이건 그냥 사이트에서 했다.
젠장 README.md 파일 추가하는 걸 깜빡했다.
그래도 이건 충분히 terminal에서 다룰 수 있으니까 일단 폴더를 만든다.
터미널에 가서 친절하게 github에서 알려준 대로 붙여 넣...기 전에
안에 내용 적어야 한다는 걸 깜빡! (나중에 알았는데 S반 8조 적어야 한다는 걸 예시에 나와있는대로 R반 1조 적었다. 방금 깨달아서 방금 고치고 다시 왔다 ^____^ ... ) 하는 바람에 다급하게 VScode 열어서 README.md 파일 작성 완료하고!!!

git init
git add README.md
git commit -m "first commit"
git branch -M main
gir remote origin ~
git push -u origin main

그랬어야 하는데...
바보 같은 나의 이야기 들어볼래...?
html 주소를 받아왔어야 하는데 ssh 키를 받아온 게 아니겠어...?
원격으로 하는 거니까 이게 맞는 건가 싶어가지고 끝없이 이어지는 ssh키의 반항을 잠시 들어주고 있었다.

애초에 이상함을 느끼지 못한 이유는 이전에 Aper 플랫폼 github이랑 db 접근을 ssh로 했기 때문이다. 
그래서 조금 착각 해 버리고 말았다. 하면서도 영 이상하길래 차근차근 되짚어보니 결과적으로 나는 바보였다. 
(근데 생각해보니 나 맥북 새로 샀고 ssh 새로 등록해두는게 맞긴 하더라고요. 오히려 좋아~) 

아무튼 다시 html 주소 받아와서 제대로 시도했더니 한 번에 성공!
아 눈물겹다. 잘 등록이 되었고, repository 팀원들에게 공유했다.

3) 본격적인 합작

팀원분들 중 한 분이 branch를 내 계정으로 미리 생성해두는 편이 편할 것 같다고 하셔서 각 팀원분들의 깃헙 아이디로 branch를 생성했다. 크게 어려운 일은 아니라서 손쉽게 해결했다.
이후 팀원1님의 차례에 잠시 고군분투 하였다. git을 해보신 경험이 적어 branch 변경법을 몰랐기 때문..!
일단 fork를 하고, git clone으로 팀원1님의 저장소를 받아온 후, README.md 수정을 하고, add, commit, push 이후에 저장소로 돌아와 pull request까지 완료...!

fork~~pull request 까지의 과정은 이 블로그에서 정보를 얻었다.
https://wayhome25.github.io/git/2017/07/08/git-first-pull-request-story/

이제 팀원2, 3분들의 conflict를 해결할 시간이 돌아왔다.
억지 conflict를 만들어 해결하는 과제..!
생각보다 손쉽게 성공했다.
일단 Request Change를 comment를 써서 보내고,
팀원2님이 그걸 받아 다시 수정 후 재차 PR 하신 걸 잘 받아 merge했다.

Request Change 요청 보내는 것은 이 블로그에서 정보를 얻었다.
https://velog.io/@dlzlqlzl/Github-Request-Changes-%EB%A5%BC-%ED%86%B5%ED%95%9C-PR-%EB%8B%A4%EC%8B%9C-%EC%9A%94%EC%B2%AD%ED%95%98%EA%B8%B0-30idb618

그렇게 완성된 우리의 역사...

뿌듯해~

ssh 관련해서는 이 곳에서 정보를 얻었다. 언젠가 도움이 될 거야...!
https://hyelmy.github.io/%EB%81%84%EC%A0%81%EB%81%84%EC%A0%81/setting_sshkey/


profile
₍ ᐢ. ̫ .ᐢ ₎

0개의 댓글