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를 활용한 디버깅
- 디버깅할 때 일시정지할 중단점 코드라인의 왼쪽 숫자 옆을 클릭
- 상단의 재생 버튼 옆의 버그 버튼을 눌러주면 디버깅 시작
- 디버깅이 시작되면 중단점에서 멈췄을 때 라인이 파란색으로 바뀜
- 일시정지된 상태에서 변수에 들어있는 값 확인 가능
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);
}
}
개선할 수 있는 점
- 요리 레시피를 받을 때 반복문과 리스트를 활용하여 코드 수를 줄일 수 있음.
정리
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 |