2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[TIL] 내일배움캠프 웹개발 백엔드 과정 2024.07.22 김현수

2024. 7. 22. 21:07ㆍ자바

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) : 문자 뒤에 \0(널문자)가 없습니다.
    • 문자열(String) : 문장 끝에 \0(널문자)가 함께 저장됩니다.

참조형

  • 참조형 변수 = 주소형 변수?
    • 다른 기본형 변수가 실제 값을 저장하는 저장 공간이라면 
      참조형 변수는 실제 값이 아닌 원본 값의 주솟값을 저장
    • 참조형 변수는 주솟값을 저장하는 주소형 변수.
  • 저장 관점에서 차이점
    • 기본형 변수 : 원본 값이 Stack 영역에 있습니다.
    • 참조형 변수 : 원본 값이 Heap 영역에 있습니다
      • Stack 영역에는 따로 저장 해둔 원본 값의 Heap 영역 주소를 저장합니다.
Stack 영역 vs Heap 영역

Stack의 경우 정적으로 할당된 메모리 영역

Heap의 경우 동적으로 할당된 메모리 영역

 

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

형변환은 주로 기본형 변수인 정수 - 실수 - 문자 들 사이에서 일어난다.

ex)
double doubleNum = 10.5;

int num = (int)doubleNum; // double -> int 형변환

 

 

자동 형변환

자동 형변환은 작은크기의 타입에서 큰 크기의 타입으로 저장될 때 큰 크기로 형변환이 발생                 

자동 형변환 vs 강제 형변환

작은 타임 > 큰 타입 형변환 시 (자동 형변환)

큰 타입 > 작은 타입 형변환 시 (강제 형변환 = 캐스팅)

 

 

회고.
마지막 숙제를 진행 하면서 여러가지 문단으로 구성된 코드를 작성하였다. 작성 하면서 곰곰히 생각을 해보았다. 배열을 사용하면 어떨지 결론은 나쁘지 않은 것 같아(지극히 내 생각이지만...) 결과 값도 충분했었다 하지만 아쉬운 점이 문단을 원하는 곳에서 끊는 법을 잘 몰라 검색을 하면서 작성을 하였다 조금만 더 생각을 했었으면 알 수 있었던 내용이라서 더 아쉬움이 남았었다.
특강에서도 계속 고민하라고 얘기를 해주셨던 것이 기억나 다음에는 더 생각을 해볼 예정이다.