JVM = Java Virtual Machine 자바 가상 머신
Java 프로그램을 실행시킬 수 있는 가상의 기기를 만들어주는 것을 의미
바이트 코드
운영체제가 읽을 수 있는 코드(바이트 코드)로 Java 컴파일러가 변환한 코드
Java 컴파일러란?
내가 작성한 Java 코드들(.java 파일)을 운영체제가 읽을 수 있는 바이트 코드(.class 파일)로 변환하는 변환기
인터프리터
Java .class 코드 해석기
- 운영체제가 읽은 바이트 코드를 기기(기계)가 실행할 수 있는 기계어로 번역
JIT(Just In Time) 컴파일러
빠른 Java .class 코드 해석기
- 운영체제로 부터 JVM(Java Virtual Machine)이 할당받은 메모리 영역
클래스 로더
Java .class 바이트 코드를 메모리 영역에 담는 운반기
- JVM(Java Virtual Machine)으로 접기빠른 Java .class 코드 해석기
메모리 영역
Java 데이터를 저장하는 영역
- 운영체제로 부터 JVM(Java Virtual Machine)이 할당받은 메모리 영역
클래스 로더
Java .class 바이트 코드를 메모리 영역에 담는 운반기
- JVM으로 class를 불러와서 메모리에 저장함
가비지 콜렉터
Java 쓰레기 청소기
- 메모리 영역에서 안쓰는 데이터를 주기적으로 흡수해가는 청소기
객체 : 특징(속성, 변수), 행동(메소드)
System.out.print : 메서드를 사용하면 출력창에 괄호() 안으로 전달된 데이터를 출력해 줌
System.out.println : 메소드르르 사용하면 출력창에 괄호() 안으로 전달된 데이터를 출력 후 줄바꿈을 해줌
주석 : // - 주석은 설명을 달아놓는 기능(실제 프로그램 실행에는 영향을 미치지 않는 유령코드)
저장공간의 선언
자바 프로그램에서 값을 다루기 위해서는 값을 저장해둘 저장공간의 선언이 필요하다.
ex) int number;
int : 값의 타입(저장공간 타입)
number : 값의 이름 (저장공간 이름)
값의 저장
선언과 동시에 저장한다면 이것은 "초기화"라고 한다.
ex) int number = 10;
선언 이후에 값을 저장한다면 일반적인 "덮어쓰기" 이다.
ex) number = 10;
변수와 상수
변수 : 자바 프로그램에서 저장하는 대부분의 값들은 변하는 것. 즉, 변수 입니다.
상수 : 자바 프로그램에서는 변하지 않을 값을 변하지 않는 저장공간에 저장해둡니다.
(데이터 타입 앞에 final 을 붙이면 된다)
데이터 타입
기본형
논리형 변수 : bolean
true/False 값만 저장합니다
문자형 변수 : char
'A', '1' 와 같은 문자 하나만 저장합니다
정수형 변수 : byte, short, int, long
0,1,2,99 와 같은 정수형 숫자 값을 저장합니다.
각 변수 표현 범위를 넘는 숫자를 넣게 되면 오버플로우가 발생하고. 해당 숫자를 출력해 보면 입력값과 다른 값으로 표현된다.
byte : -128 ~ 127 범위의 숫자만 저장 가능하다.
short (2 byte) : -32,768 ~ 32,767 범위의 숫자만 저장 가능하다.
int(4 byte) -21억 ~ 21억 범위의 숫자만 저장 가능하다.
long(8 byte) 9백경 정도의 매우 큰수를 저장 가능합니다.
// int 와 long의 데이터값을 구분하기 위한 구분자로 long으로 담을 숫자 뒤에 L을 붙힘
//float와 double의 데이터 값을 구분하기 위한 구분자로 float으로 담을 숫자 뒤에 f를 붙임
실수형 변수 : float, ,double
0.123, 0.9999와 같은 소수점 실수값을 저장
실수형 변수의 표현 범위
실수도 동일하게 각 변수 표현 범위를 넘는 숫자를 넣게 되면 오버 플로우가 발생하고, 해당 숫자를 출력해보면 입력 값과 다른 값으로 표현
특히, 실수는 표현범위가 매우 넓어서 정수형 변수에서 담지 못할 수 있다.
float(4byte) : 3.4 * -10^38 ~ 3.4 * 10^38 범위의 숫자 저장이 가능(long보다 큼)
변수 타입별 크기 순서
byte (1byte) -> short(2byte) -> int(4byte) -> long(8byte) -> float(4byte) -> double(8byte)
오버 플로우(Overflow) : 메모리의 표현 범위에서 벗어난 수의 값을 저장하는 경우
언더 플로우(Underflow) : 메모리가 표현할 수 있는 수보다 적은 수의 값을 저장하는 경우
부동 소수점 : 가수와 지수를 구분해서 저장하고 이 값들을 곱한 값을 저장하는 방식
참조형
문자열 변수 : String
"Apple", "텍스트"와 같은 문장을 저장합니다.
그 외 : Object, Array, List .....
객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장합니다.
래퍼 클래스 변수(Wrapper Class)라는 말 그대로 "기본형 변수를 클래스로 한번 랩핑(감싸는) 변수"
기본 타입 | 래퍼 클래스 |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Charater |
boolean | Boolean |
byte | Byte |
short | Short |
박싱 ? 언박싱?
기본 타입에서 래퍼 클래스 변수로 변수를 감싸는 것을 "박싱"이라고 부르며
래퍼 클래스 변수를 기본 타입 변수로 가져오는 것을 "언박싱" 이라고 부름
ex) int -> Integer = 박싱
Integer -> int = 언박싱
래퍼타입 클래스 언박싱 메소드
메소드 | 반환값 | 설명 |
booleanValue() | boolean | 기본형 데이터를 문자열로 바꾼 뒤 반환 |
byteValue() | byte | 객체의 값을 byte 값으로 변환하여 반환 |
doubleValue() | double | 객체의 값을 double 값으로 변환하여 반환 |
floatValue() | float | 객체의 값을 float 값으로 변환하여 반환 |
intValue() | int | 객체의 값을 int 값으로 변환하여 반환 |
longValue() | long | 객체의 값을 long 값으로 변환하여 반환 |
shortValue() | short | 객체의 값을 short 값으로 변환하여 반환 |
문자와 문자열
- 선언 관점에서 차이점
- 문자(char) : 문자 한 개만 저장하며 따옴표를 사용하여 값을 지정합니다
- ex) char alphabet = 'A';
- 문자열(String) : 문자 여러 개를 문장 형태로 저장하며 쌍따옴표를 사용하여 범위를 지정한다
- ex) String message = "Hello World"
- 문자(char) : 문자 한 개만 저장하며 따옴표를 사용하여 값을 지정합니다
- 저장 관점에서 차이점
- 문자(char) : 문자 뒤에 \0(널문자)가 없습니다.
- 문자열(String) : 문장 끝에 \0(널문자)가 함께 저장됩니다.
참조형
- 참조형 변수 = 주소형 변수?
- 다른 기본형 변수가 실제 값을 저장하는 저장 공간이라면
참조형 변수는 실제 값이 아닌 원본 값의 주솟값을 저장 - 참조형 변수는 주솟값을 저장하는 주소형 변수.
- 다른 기본형 변수가 실제 값을 저장하는 저장 공간이라면
- 저장 관점에서 차이점
- 기본형 변수 : 원본 값이 Stack 영역에 있습니다.
- 참조형 변수 : 원본 값이 Heap 영역에 있습니다
- Stack 영역에는 따로 저장 해둔 원본 값의 Heap 영역 주소를 저장합니다.
Stack 영역 vs Heap 영역
Stack의 경우 정적으로 할당된 메모리 영역
Heap의 경우 동적으로 할당된 메모리 영역
변수 타입 바꾸기 (형변환)
형변환은 주로 기본형 변수인 정수 - 실수 - 문자 들 사이에서 일어난다.
ex)
double doubleNum = 10.5;
int num = (int)doubleNum; // double -> int 형변환
자동 형변환
자동 형변환은 작은크기의 타입에서 큰 크기의 타입으로 저장될 때 큰 크기로 형변환이 발생
자동 형변환 vs 강제 형변환
작은 타임 > 큰 타입 형변환 시 (자동 형변환)
큰 타입 > 작은 타입 형변환 시 (강제 형변환 = 캐스팅)
회고.
마지막 숙제를 진행 하면서 여러가지 문단으로 구성된 코드를 작성하였다. 작성 하면서 곰곰히 생각을 해보았다. 배열을 사용하면 어떨지 결론은 나쁘지 않은 것 같아(지극히 내 생각이지만...) 결과 값도 충분했었다 하지만 아쉬운 점이 문단을 원하는 곳에서 끊는 법을 잘 몰라 검색을 하면서 작성을 하였다 조금만 더 생각을 했었으면 알 수 있었던 내용이라서 더 아쉬움이 남았었다.
특강에서도 계속 고민하라고 얘기를 해주셨던 것이 기억나 다음에는 더 생각을 해볼 예정이다.
'자바' 카테고리의 다른 글
[TIL] 내일배움캠프 웹개발 백엔드 과정 2024.07.25 김현수 (0) | 2024.07.25 |
---|---|
[TIL] 내일배움캠프 웹개발 백엔드 과정 2024. 07.23 김현수 (2) | 2024.07.23 |
[KPT] 내일배움캠프 웹개발 백엔드 과정 2024.07.19 27조 (0) | 2024.07.19 |
[TIL] 내일배움캠프 백엔드 과정 2024.07.17 김현수 (0) | 2024.07.18 |
[TIL] 내일배움캠프 백엔드 과정 2024.07.15 (0) | 2024.07.15 |