본문 바로가기

항해 99/Java

Java 문법 종합 1주차

Java란?

 A언어의 기능 + B 언어의 기능 + C 언어의 기능에 Java 언어의 기능을 추가한 언어

 

핵심 기능

  • C 언어 기능
  • 공통 실행환경
  • 클래스
  • 객체

JVM

  • Java Virtual Machine의 약자로 "자바 가상 머신"이라는 뜻.
  • 가상 머신이란 가상의 기기를 만드는 것.
  • 여러 기기 위에 Java 프로그램을 실행시킬 수 있는 가상의 기기를 만드는 것.

바이트 코드

Java 프로그램 변환 코드

  • 작성한 코드가 운영 체제가 읽을 수 있는 코드로(.class 파일) Java 컴파일러가 변환한 코드

인터프리터

Java.class 코드 해석기

  • 운영체제가 읽은 바이트 코드를 기기가 실행할 수 있는 기계어로 번역

JIT 컴파일러

빠른 Java.class 코드 해석기

  • 운영 체제로부터 JVM이 할당받은 메모리 영역

클래스 로더

Java.class 바이트 코드를 메모리 영역에 담는 운반기

  • JVM으로 class를 불러와서 메모리에 저장

가비지 컬렉터

Java 쓰레기 청소기

  • 메모리 영역에서 안쓰는 데이터를 주기적으로 흡수해가는 청소기

JVM에서 프로그램이 동작하는 흐름

 

 

개발환경 구성

JRE

  • JVM을 설치하는 방법은 JRE를 설치하는 것
    • JRE는 Java Runtime Enviornment(자바 실행 환경)
    • JRE만 있을 경우 Java 프로그램을 실행만 시킬 수 있다.
    • JRE는 .class 파일만 실행 가능 (JDK가 javac 명령을 통해 .java 파일을 실행 가능한 .class 파일로 변환)

JDK

  • Java 프로그램을 개발할 수 있음
    • JDK는 Java Developement Kit(자바  개발 키트)
    • Java  프로그램을 개발하기 위해 JDK 설치가 필요
    • JDK는 JRE(JVM)의 기능을 포함하고 있음
    • JDK는 .java 파일들을 .class 파일들로 변환해주는 Java Compiler(javac) 기능이 있음
    • JDK는 코드 디버깅하는 jdb 등의 기능이 있음
  • JDK 디버깅 기능
    • Java 프로그램 실행은 Java 코드를 한 줄씩 실행하면서 명령을 수행하는 것을 의미
    • 개발한 코드들을 한 줄씩 객체와 메소드를 수행하면서 변수들도 변하는 과정을 볼 수 있도록 JDK는 코드를 따라가면서 변수를 볼 수 있는 "디버깅" 기능을 제공함
    • 작성한 코드 라인에 "중단점"을 설정하고 "디버그" 모드로 프로그램 실행 시, 프로그램이 중단점의 코드라인을 수행할 때 프로그램 흐름이 일시정지되며 변수들을 볼 수 있게 도와줌

Intellij 와 JDK를 활용한 디버깅

  1. 디버깅할 때 일시정지할 중단점 코드라인의 왼쪽 숫자 옆을 클릭
  2. 상단의 재생 버튼 옆의 버그 버튼을 눌러주면 디버깅 시작
  3. 디버깅이 시작되면 중단점에서 멈췄을 때 라인이 파란색으로 바뀜
  4. 일시정지된 상태에서 변수에 들어있는 값 확인 가능

 

 

main 메서드에 대한 이해

// 클래스 정의
// public : 클래스 경로 외부에서 실행시킬 수 있다고 표시해주는 접근 제어자
public class Main {
// Main : 클래스 명, 파일 이름과 일치 시켜야 됨(그래야 javac가 바이트 코드 변환 시 파일 확장명과(.class)로 일치)
    public static void main(String[] args) {
    // main : 메서드 정의
    // public : 접근 제어자
    // static : javac가 바이트 코드로 변환할 때 미리 정의되는 메서드 표기
    // void : 메서드의 응답값을 정의하는 곳(void는 값이 없다는 정의)
    // (String[] args) : 메서드가 넘겨받을 데이터들(변수)
    // String[] : 문자열 데이터 타입
    // args : String[] 데이터의 이름
        System.out.println("Hello world"); // "Hello world"라는 문구 출력 후 줄바꿈
    }
}
  • 주석 : 설명을 달아 놓는 기능
    • 실제 프로그램 실행에 영향이 없는 코드
    • 코드에 대한 설명을 추가하거나 주의사항을 적을 때 사용

 

 

저장공간의 종류(변수 타입)

저장공간은 변수와 상수로 나뉘지만 대부분 변수 용도로 쓰임

 

기본형 변수

  • boolean: True/ False 값만 저장
  • char: 'A', '1' 같은 문자 한 개만 저장
  • 정수형 변수
    • byte, short, int, long
  • 실수형 변수
    • float, double

정수형 리터럴 구분값(리터럴 = 데이터값)

int 와 long 의 데이터값을 구분하기 위한 구분자로 long으로 담을 숫자 뒤에 L을 붙임 (데이터 뒤에 붙이는 구분값을 "접미사"라고 함)

 

정수형 변수 표현 범위

  • byte : -128 ~ 127 (1byte, 2⁸)
  • short : -32,768 ~ 32,767 (2byte, 2¹⁶)
  • int : -2,147,483,648 ~ 2,147,483,647 (약 20억) (4byte, 2³²)
  • long : -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (8byte, 2⁶⁴)

실수형 변수 표현 범위

  • float : 대략 -3.4E38 ~ 3.4E38, 7자리 정밀도 (4byte, 2³²)
  • double : 대략 -1.7E308 ~ 1.7E308, 15자리 정밀도 (8byte, 2⁶⁴)

정수형 변수 표현 범위
실수형 변수 표현 범위

 

주의 사항

  • 각 변수 표현 범위를 넘는 숫자를 넣게되면 오버플로우가 발생하고, 해당 숫자를 출력해보면 입력값과 다른 값으로 표현 됨(변수의 표현 범위에 맞게 사용해야 버그가 발생하지 않는다).

float 타입이 long 타입보다 더 넓은 범위를 표현하는 이유

부동 소수점 방식으로 숫자를 저장하기 때문에 더 넓은 범위를 표현함.

  • 부동 소수점 방식: 가수와 지수를 구분해서 저장하고 이값들을 곱한 값을 저장(표현)하는 방식

 

참조형 변수

  • 문자열 변수 : String
    • "Apple", "글자"와 같은 문장을 저장함.
  • 그 외: Object, Array, List, ...
    • 객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장함.

래퍼 클래스 변수(Wrapper Class)

기본형 변수 클래스를 한 번 랩핑(감싸는) 변수

  • 기본형 변수 타입명에서 첫 글자를 대문자로 바꾸어서 래퍼 클래스를 정의
  • 박싱 vs 언박싱
    • 박싱 : 기본 타입에서 래퍼 클래스 변수로 변수를 감싸는 것
    • 언박싱 : 래퍼 클래스 변수를 기본 타입 변수로 가져오는 것
    • 모든 기본 타입에는 래퍼 클래스가 있음

래퍼 클래스 사용 이유?

  • 클래스는 객체지향 언어인 Java의 핵심 기능, 클래스로 변수를 관리하면 객체지향의 많은 기능을 사용할 수 있기 때문에 사용.

아스키 코드

  • 저장공간에 문자 저장하기 위해 문자를 숫자로 매핑해서 표현하는 규칙

문자와 문자열

  • char(문자) : ' ' 를 사용하여 문자 값을 저장함.
  • String(문자열) : " "를 사용하여 문자 여러 개를 문장형태로 저장함.

저장 방식의 차이

  • 문자는 뒤에 \0(널문자)가 없음, 문자열의 경우 \0(널문자)가 함께 저장됨.

참조형 변수

  • 참조형 변수 = 주소형 변수?
    • 기본형 변수가 실제 값을 저장하며, 참조형 변수는 실제 값이 아닌 원본 값의 주소 값을 저장
    • 참조형 변수는 주소 값을 저장하는 주소형 변수
  • 저장 관점에서의 차이점
    • 기본형 변수 : 원본 값이 stack 영역에 있음
    • 참조형 변수 : 원본 값이 Heap 영역에 있음
      • Stack 영역에는 따로 저장해둔 원본 값의 Heap 영역 주소를 저장

 

Stack, Heap

  • Stack : 정적으로 할당 된 메모리 영역
    • 크기 가 정해져 있는 기본형 변수를 저장
    • 크기가 정해져 있는 참조형 변수의 주소 값도 저장
  • Heap : 동적으로 할당된 메모리 영역(참조형 변수를 위한 별도의 공간)
    • 크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장

입출력

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 입력
        Scanner scanner = new Scanner(System.in); // Scanner 객체를 new 명령어로 생성
        String input = scanner.next(); // .next()로 input 변수에 입력한 글자를 저장
        
        // 출력
        System.out.println("입력 값: " + input); // 입력한 글자를 출력
    }
}

 

 

형변환(변수의 타입 바꾸기)

문자열로 입력받은 변수를 숫자로 변환해서 계산을 하고 싶거나 문자열에 숫자 값을 추가 하고 싶은 경우 등, 변수형을 다른 형으로 변환이 필요한 경우 사용.

  • 형변환 : 정수 ↔ 실수 ↔ 문자

Casting 예제

// 자동 형변환
package casting;

public class Casting1 {

    public static void main(String[] args) {
        int intValue = 10;
        long longValue;
        double doubleValue;
        
        longValue = intValue;
        System.out.println("longValue = " + longValue);

        doubleValue = intValue;
        System.out.println("doubleValue = " + doubleValue);

        doubleValue = 20L;
        System.out.println("doubleValue2 = " + doubleValue);
    }
}


// 명시적 형변환
package casting;

public class Casting2 {

    public static void main(String[] args) {
        double doubleValue = 1.5;
        int intValue;

        // intValue = doubleValue; // 컴파일 오류 발생
        intValue = (int) doubleValue; // 명시적 형변환
        System.out.println("intValue = " + intValue);
    }
}


// 오버플로우
package casting;

public class Casting3 {

    public static void main(String[] args) {
        long maxIntValue = 2147483647; // int 최고 값
        long maxIntOver = 2147483648L; // int 최고 값 + 1(초과)
        int intValue = 0;

        intValue = (int) maxIntValue; // 형변환
        System.out.println("maxIntValue casting = " + intValue);

        intValue = (int) maxIntOver; // 형변환
        System.out.println("maxIntOver casting = " + intValue);
    }
}


// 계산과 형변환
package casting;

public class Casting3 {

    public static void main(String[] args) {
        long maxIntValue = 2147483647; // int 최고 값
        long maxIntOver = 2147483648L; // int 최고 값 + 1(초과)
        int intValue = 0;

        intValue = (int) maxIntValue; // 형변환
        System.out.println("maxIntValue casting = " + intValue);

        intValue = (int) maxIntOver; // 형변환
        System.out.println("maxIntOver casting = " + intValue);
    }
}

 

  • 자동형변환
    • 작은 크기의 타입에서 큰 크기의 타입으로 저장될 때 큰 크기로 형 변환이 발생
    • 작은 크기의 타입이 큰 크기의 타입과 계산될 때 자동으로 큰 크기의 타입으로 형변환이 발생
  • 명시적 형변환(강제 형변환)
    • 큰 타입에서 작은 타입으로 형 변환 시 값의 손실이 발생함, 개발자가 선택하여 형 변환함.

 

1주차 숙제 - 요리 레시피 입출력 프로그램 (반복문, 조건문 미 사용)

  • 입력
    • 요리 제목 입력
    • 요리 별점 1~5 사이의 실수
    • 요리 레시피 10문장을 1문장씩 입력
  • 출력
    • 입력이 끝나면 요리 제목을 괄호로 감싸서 먼저 출력
    • 요리 별점을 소수점 제외 정수로 출력
    • 바로 뒤에 정수 별점을 5점 만점의 퍼센트로 표현 값을 실수로 출력
    • 레시피 10문장을 문장 앞에 번호를 붙여서 모두 출력
package javatraining;

import java.util.Scanner;

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

        // 요리 레시피 메모장
        // 요리 제목 입력
        System.out.println("좋아하는 요리의 제목을 입력하세요.");
        String foodName = scanner.nextLine();

        // 요리 별점 입출력
        System.out.println("요리 별점을 1~5 사이의 실수로 입력하세요 (ex : 3.5)");
        double foodRank = scanner.nextDouble();
        int foodScore = (int) foodRank;
        double scorePercent = (double) foodScore / 5 * 100;

        // 요리 레시피 입력
        System.out.println("요리 레시피를 한 문장씩 총 10문장 입력해주세요.");
        String foodRecipe1 = scanner.nextLine();
        String foodRecipe2 = scanner.nextLine();
        String foodRecipe3 = scanner.nextLine();
        String foodRecipe4 = scanner.nextLine();
        String foodRecipe5 = scanner.nextLine();
        String foodRecipe6 = scanner.nextLine();
        String foodRecipe7 = scanner.nextLine();
        String foodRecipe8 = scanner.nextLine();
        String foodRecipe9 = scanner.nextLine();
        String foodRecipe10 = scanner.nextLine();

        // 요리 레시피 전체 출력
        System.out.println("요리 제목");
        System.out.println("[ " + foodName + " ]");
        System.out.println("별점 : "+ foodScore + " (" + scorePercent + "%)");
        System.out.println("요리 레시피");
        System.out.println("1. " + foodRecipe1);
        System.out.println("2. " + foodRecipe2);
        System.out.println("3. " + foodRecipe3);
        System.out.println("4. " + foodRecipe4);
        System.out.println("5. " + foodRecipe5);
        System.out.println("6. " + foodRecipe6);
        System.out.println("7. " + foodRecipe7);
        System.out.println("8. " + foodRecipe8);
        System.out.println("9. " + foodRecipe9);
        System.out.println("10. " + foodRecipe10);
    }
}

 

개선할 수 있는 점

  1. 요리 레시피를 받을 때 반복문과 리스트를 활용하여 코드 수를 줄일 수 있음.

 

정리

 

JVM : 여러 기기에서 Java 프로그램 실행을 위한 가상 기기를 만드는 것.

구성

  • 바이트 코드 : 운영체제가 읽을 수 있도록 컴파일러가 변환한 코드(.class)
  • 인터프리터 : java.class 코드 해석기
  • JIT 컴파일러 : 빠른 java.class 코드 해석기, 인터프리터 효율 향상
  • 메모리 영역 : 운영체제로부터 JVM이 할당받은 메모리 영역
  • 클래스 로더 : 바이트 코드를 메모리 영역에 담는 운반기
  • 가비지 컬렉터 : 메모리 영역의 안 쓰는 데이터 청소기

변수와 상수

저장공간의 선언과 초기화(저장)

  • 데이터를 저장해 둘 저장공간 만들기 위해 데이터 타입과 이름을 명시해 선언
  • 선언한 저장공간에 데이터를 담는 것을 저장이라고 함(선언과 동시에 저장하는 것을 초기화라고 한다).

변수 : 변하는 저장 공간

상수 : 변하지 않는 저장 공간

 

변수의 종류

기본형 변수

  • boolean : true, false 저장
  • char : 문자 1개만 저장(' ' 로 감싼다)
  • 정수형 변수 : 정수형 숫자 값 저장
    • byte
    • short
    • int
    • long
  • 실수형 변수 : 실수형 숫자 값 저장
    • float
    • double

참조형 변수 = 주소형 변수

  • 실제 값이 아닌 원본 값의 주소 값을 저장함.
  • String : 문장을 저장(" "로 감싼다)
  • Object, List, Array, ... : 단일 저장공간에 담을 수 없는 값을 저장

형변환

데이터를 사용 시 타입을 변환할 때 사용(정수, 실수, 문자)

  • 자동 형변환
    • 작은 타입에서 큰 타입으로 값을 넣을 때 자동으로 변환 됨
    • 작은 타입의 값이 큰 타입의 값과 계산될 때 자동으로 변환 됨
  • 명시적 형변환(강제 형변환)
    • 큰 타입에서 작은 타입으로 값을 넣을 때 오버플로우(값 손실)를 방지하기 위해 개발자가 원하는 타입으로 명령을 통해 변환 가능

'항해 99 > Java' 카테고리의 다른 글

Java 문법 종합 2주차-2  (0) 2024.01.17
Java 문법 종합 2주차-1  (0) 2024.01.16
Java 기초 3 - 반복문, 스코프, 형변환  (0) 2024.01.15
Java 기초 2 - 연산자, 조건문  (0) 2024.01.11
Java 기초 - Java, 변수  (0) 2024.01.10