본문 바로가기

카테고리 없음

[항해99] Java 문법 종합반 : 1주차 & GitHub 사용

  • Java

- C언어의 기능 + 공통 실행환경(여러 기기에서 실행가능하도록 도와줌) + 데이터,메서드를 담는 클래스(바구니 틀)를 통해 객체(바구니)를 만들 수 있는 언어

출처 : 스파르타 코딩클럽

- 객체 지향 언어

  •  객체(object)란? 사람, 사물 등 세상에 존재하는 모든 것
  • 특징 : 이름 , 나이, 주소, 혈액형 등
  • 행동 : 걷는다, 숨쉰다 등

▶ 이러한 모든 세상의 객체를 담아서 만든것이 객체지향언어

 

* Java 컴파일러 (사람이 이해) ------------> Java -- 변환해 주는 것 --> class (운영체제가 이해)

* Input - System - Output : 인풋과 아웃풋 제한됨 (ex. 숫자만, 문자만)

-> 인풋이 들어가면 아웃풋이 나오는게 시스템!!

 

  • JVM

- Java Virtual Machine 의 약자

- 여러가지 기기위에 Java 프로그램을 실행시킬 수 있는 가상의 기기를 만들어주는것

 

- JVM에서 프로그램 동작의 흐름

  • Runtime : 프로그램이 실행중인 상태
  • Runtime 시스템 : 프로그램이 실행중인 상태를 관리하는 시스템

 

- 바이트 코드

  • Java 프로그램 변환코드 : 작성한 코드를 운영체제가 읽을 수 있는 코드로 Java 컴파일러가 변환한 코드
  • Java 컴파일러 : 작성한 Java 코드을 운영체제가 읽을 수 있는 바이트 코드(.class 파일)로 변환하는 변환기
  • 인터프리터 : Java .class 코드 해석기 / 운영체제가 읽은 바이트 코드💬를 기기(기계)가 실행할 수 있는 기계어로 번역
  • JIT 컴파일러 : 빠른 Java .class 코드 해석기 /  인터프리터의 효율을 높여주는 서포터 해석기
  • 메모리 영역 : Java 데이터를 저장하는 영역 / 운영체제로 부터 JVM이 할당받은 메모리 영역
  • 클래스 로더 : Java .class 바이트 코드를 메모리 영역에 담는 운반기 / JVM으로 class(바이트 코드)를 불러와서 메모리에 저장
  • 가비지 컬렉터 : Java 쓰레기 청소기 /  메모리 영역에서 안쓰는 데이터를 주기적으로 흡수해가는 청소기
  • main 메소드 / System.out.print() / 주석
//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.

// 클래스
// public : 제어자, 공공의, 공통의 -> 어디든 접근 가능
public class Main {

    // [JDK]
    // compiler : .java -> .class
    // JRE
    // JDB : 디버깅

    // () : 소괄호
    // {} : 중괄호
    // [] : 대괄호

    // main 메소드
    // 자바 프로젝트(앱)은, 가장 먼저 클래스의 main 메소드를 실행한다
    // = JVM의 약속
    // static : 이 프로그램이 실행될 때 무조건 실행되는 녀석임

    // void : 메서드의 출력값의 데이터 타입
    // void : "아무것도 없다" -> 출력은 없다

    // String[] args : 메개변수 자리
    public static void main(String[] args) {

        // 객체 : 특징(속성, 변수), 행동(메소드)
        // print : 즐 바꿈 x
        // println : 줄 바꿈 0
        // System.out.println("Our First Project! :)");
        // System.out.println("Our First :)");
        // ln : line

        System.out.println(7);
        System.out.println(3);
        System.out.println(3.14);
        System.out.println("java");



        }
    }

 

  • 변수와 상수

- 상수 : 항상 유지되는 것

- 변수 : 변하는 것기본형 변수

▶ 기본형 변수

  • 논리형 변수 : boolean (True/False 값만 저장)

 

  • 문자형 변수 : char (A, 1 같은 문자 하나만 저장)

 

  • 정수형 변수 : byte, short, int, long (정수형 숫자값 저장)
  • 정수형 변수 표현 범위
    • byte : -128 ~ 127 범위의 숫자만 저장 가능
    • short (2byte) 는 -32,768~32,767 범위의 숫자만 저장 가능
    • int (4byte) 는 -21억~21억 범위의 숫자만 저장 가능
    • long (8byte) 은 9백경 정도의 매우 큰수를 저장 가능

-> 각 변수 표현 범위를 넘는 숫자를 넣게되면 오버플로우가 발생하고, 해당 숫자를 출력해보면 입력값과 다른 값으로 표현됨 (표현 범위를 초과한것이기 때문에 입력한 값보다 작거나 음수인 값이 표현)

 

  • 실수형 변수 : float, double (0.123, 0.99999 와 같은 소수점 실수값을 저장)
    • float (4byte) : 3.4 * -10^38 ~ 3.4 * 10^38(long 보다 큼)범위의 숫자 저장이 가능
    • double (8byte) : 1.7 * -10^308 ~ 1.7 * 10^308(long 보다 큼)범위의 숫자 저장이 가능
    • float 는 소수점 7자리까지 double 은 소수점 16자리 까지 저장 가능

public class Main {


    public static void main(String[] args) {
        // 우리의 플레이 그라운드

        // 1. boolean
        // 변수를 선언해보자 => 타입 이름 = 값;

        boolean flag = true;
        flag = false;

        System.out.println((flag));



        }
    }
public class Main {


    public static void main(String[] args) {
        // 우리의 플레이 그라운드

        // 2. 문자형(char)
        // 변수를 선언해보자 => 타입 이름 = 값;
        char alphabet = 'A';
        System.out.println((alphabet));​
public class Main {


    public static void main(String[] args) {
        // 우리의 플레이 그라운드

        // 3. 정수형(byte, short, int, long)
        // 변수를 선언해보자 => 타입 이름 = 값;

        byte bytenumber = 127; // -128 ~ 127 ( 1byte만 표현 가능 )
        short shortnumber = 32456; // -32,768 ~ 32,767
        int intnumber = 21384856;
        long longnumber = 334328483285L;

        System.out.println(bytenumber);
        System.out.println(shortnumber);
        System.out.println(intnumber);
        System.out.println(longnumber);


        }
    }
public class Main {


    public static void main(String[] args) {
        // 우리의 플레이 그라운드

        // 4. 실수형 float(4byte) = double(8byte)
        // 변수를 선언해보자 => 타입 이름 = 값;

        float floatnum = 0.123f;
        double doublenum = 0.1231232;

        // 참조한다.
        System.out.println(floatnum);
        System.out.println(doublenum);

        }
    }

 

▶ 참조형 변수 : 뭔가 복잡(한 번에 저장이 어렵기 때문에 어떤 곳에 별도로 저장)

  • 문자열 변수 : String (Apple, 텍스트와 같은 문장 저장)
  • 그 외 : Array, List 등 (객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장)
public class Main {


    public static void main(String[] args) {
        // 우리의 플레이 그라운드
        // 참조형
        // 1. 문자열 변수

        String helloworld = "Hello World!";

        System.out.println(helloworld);
        
        }
    }

 

import java.lang.reflect.Array;
import java.util.Arrays;

public class Main {


    public static void main(String[] args) {
        // 우리의 플레이 그라운드
        // 참조형
        // 1. 문자열 변수
        // String helloworld = "Hello World!";
        // 2. 배열
        int[] a = {1,2,3};

        System.out.println(Arrays.toString(a));

        }
    }

 

▶ 래퍼 클래스 변수 : 기본형 변수를 클래스로 한 번 랩핑(감싸는)하는 변수

import java.lang.reflect.Array;
import java.util.Arrays;

public class Main {


    public static void main(String[] args) {
        // 우리의 플레이 그라운드
        // 래퍼 클래스 (Wrapper Class 변수)
        int number = 21;

        Integer num = number; // 박싱

        System.out.println(num.intValue()); // 언박싱

        }
    }

- 문자와 문자열

  • 선언 관점 - 문자 (char) : 문자 한개만 저장하며 따옴표를 사용하여 값을 지정 (ex. char ex1 = 'a' )
  • 저장 관점 - 문자 뒤에 \0(널문자)가 없음. (1 byte 만 쓰기 때문에 끝을 알아서 데이터만 저장)

 

  • 선언 관점 - 문자열 (String) : 문자 여러개를 문장형태로 저장하며 쌍따옴표를 사용하여 범위를 지정 ( String ex1 = "a" ) 
  • 저장 관점 - 문장의 끝에 \0(널문자)가 함께 저장 (몇개의 byte 를 쓸지 모르기 때문에 끝을 표시해야함)

 

- 참조형

  • 참조형 변수 = 주소형 변수?
    • 다른 기본형 변수가 실제 값을 저장하는 저장공간 이라면 참조형 변수는 실제 값이 아닌 원본값의 주소값을 저장
    • 참조형 변수는 주소값을 저장하는 주소형 변수라고 불러도 됨
  • 저장 관점에서 차이점
    • 기본형 변수 : 원본값이 Stack 영역
    • 참조형 변수 : 원본값이 Heap 영역 -> Stack 영역에는 따로 저장 해둔 원본값의 Heap 영역주소를 저장
  • Stack : 정적(int->4byte)으로 할당된 메모리 영역
    • 그래서, 크기가 몇 byte 인지 정해져 있는 기본형 변수를 저장
    • 추가로, 크기가 정해져 있는 참조형 변수의 주소 값도 저장
  • Heap : 동적(알 수 없을 때)으로 할당된 메모리 영역 / 별도 공간
    • 크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장

// 숫자 -> 문자
// import : im(in) + port(항구)
import java.util.Scanner;

public class Main {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int asciiNum = sc.nextInt();
        char ch = (char)asciiNum; // 문자로 형변환을 해주면 숫자에 맞는 문자로 표현됨.

        System.out.println(ch);


        }
    }

 

 

public class Main {


    public static void main(String[] args) {
        // 형 변환 예제 : 변수의 타입을 바꾸는 방법
        // 문자열 -> 숫자
        // 정수 -> 실수
        // 실수 -> 정수

        // double / float 형 -> int
        // 실수 -> 정수(0.xxxx -> 0)
        double doublenum = 10.101010;
        float floatnum = 10.1010f;

        // 변환(int)
        int intnum;
        intnum = (int)floatnum;

        System.out.println(floatnum);
        System.out.println("Int Type =>" + intnum);
//        intnum = (int)doublenum; // double -> int
//        System.out.println(doublenum);
//        System.out.println("Int Type =>" + intnum);
        }
    }
public class Main {


    public static void main(String[] args) {
        // 형 변환 예제 : 변수의 타입을 바꾸는 방법
        // 정수 -> 실수
        // 실수 -> 정수
        int intnum = 10;

        double doublenum = (double)intnum;
        float floatnum = (float)intnum;

        System.out.println("doublenum =>" + doublenum);
        System.out.println("floatnum =>" + floatnum);
        }
    }
public class Main {


    public static void main(String[] args) {
        // 변수 타입별 크기 순서
        // byte(1) -> short(2) -> int(4) ->long(8) -> float(4 부동형 소수점을 쓰고 있어서 표현할 수 있는 식이 더 많음) -> double (8)

        // 1. byte
        byte byteNumber = 10;
        int intNumber = byteNumber;    // byte -> int 형변환
        System.out.println(intNumber); // 10

        // 2. char(1 byte) -> int(4 byte) 변환
        char charAlphabet = 'A';
        intNumber = charAlphabet;   // char -> int 자동 형변환
        System.out.println(intNumber); // A의 유니코드 : 65

        // 3. int -> long number 형변환
        intNumber = 100;
        long longNumber = intNumber; // int -> number 형변환
        System.out.println(longNumber); // 100

        // 4. int -> double 형변환
        intNumber = 200;
        double doubleNumber = intNumber; // int -> double 형변환
        System.out.println(doubleNumber); // 200.0  (소수점이 추가된 실수출력)
        }
    }

 

작은 타입 -> 큰 타입 ( 값 손실 x )

큰 타입 -> 작은 타입 ( 값 손실o )

 

  • 1주차 과제

요리 레시피 메모장 만들기

  • 입력값
    • 내가 좋아하는 요리 제목을 먼저 입력합니다.
    • 요리 별점을 1~5 사이의 소수점이 있는 실수로 입력해주세요. (ex. 3.5)
    • 이어서 내가 좋아하는 요리 레시피를 한 문장씩 10문장을 입력합니다.
  • 출력값
    • 입력이 종료되면 요리 제목을 괄호로 감싸서 먼저 출력 해줍니다.
    • 이어서, 요리 별점을 소수점을 제외한 정수로만 출력해줍니다. (ex. 3)
    • 바로 뒤에 정수별점을 5점만점 퍼센트로 표현했을 때 값을 실수로 출력해줍니다. (ex. 60.0%)
    • 이어서, 입력한 모든 문장 앞에 번호를 붙여서 모두 출력 해줍니다.
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        String title = sc.nextLine();
        float star = sc.nextFloat();
        String text1 = sc.next();
        String text2 = sc.next();
        String text3 = sc.next();
        String text4 = sc.next();
        String text5 = sc.next();
        String text6 = sc.next();
        String text7 = sc.next();
        String text8 = sc.next();
        String text9 = sc.next();
        String text10 = sc.next();

        title = "[ " + title + " ]";
        System.out.println(title);
        int intRate = (int)star;
        System.out.println(intRate);
        double percentRate = intRate * 100 / 5.0 ;
        System.out.println(percentRate);
        System.out.println("1. " + text1);
        System.out.println("2. " + text2);
        System.out.println("3. " + text3);
        System.out.println("4. " + text4);
        System.out.println("5. " + text5);
        System.out.println("6. " + text6);
        System.out.println("7. " + text7);
        System.out.println("8. " + text8);
        System.out.println("9. " + text9);
        System.out.println("10. " + text10);

    }
}
보완해야하는 부분 / 부족한 점
깃허브 사용을 거의 안해봐서 익숙하지 않았다.
로컬저장소에 원본 저장소 등록까지는 했는데 커밋하고 푸쉬하는 과정에서 자꾸 src refspec master does not match any 을 비롯한 다양한 오류가 나서 main으로도 고쳐보고 했는데 해결되지 않았다. 무엇이 문제인지 도저히 모르겠어서 결국 다 지우고 포크부터 다시 해서 해결했다. 

https://velog.io/@jisubin12/Github-%EC%99%B8%EB%B6%80%EC%A0%80%EC%9E%A5%EC%86%8C-fork-pull-request-%EB%8F%99%EA%B8%B0%ED%99%94-%ED%95%98%EA%B8%B0

https://corinediary.tistory.com/7

이 블로그가 정리가 잘 되어있어서 많은 도움을 받았다.

팀 프로젝트를 진행하면 깃허브 많이 사용할 텐데 열심히 공부해서 다음엔 시간을 반으로 줄여봐야겠다.