Java 구조, 변수, 형변환

Geun Bo Kim·2023년 4월 3일
0

Java문법 공부

목록 보기
1/1
post-thumbnail

1.JVM

  • Java Virtual Machine 의 약자로 “자바 가상 머신”이라는 뜻을 가지고 있습니다.
  • 가상 머신이란 가상의 기기를 만들어주는 것을 의미합니다.
  • 다시 말해서, 여러가지의 기기위에 Java 프로그램을 실행시킬 수 있는 가상의 기기를 만들어주는것을 의미합니다.

-JVM의 구성

인터프리터📇

Java .class 코드 해석기

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

JIT 컴파일러📇

빠른 Java .class 코드 해석기

  • 인터프리터의 효율을 높여주는 서포터 해석기

메모리 영역🗂️

Java 데이터를 저장하는 영역

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

클래스 로더🚚

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

  • JVM으로 class(바이트 코드💬)를 불러와서 메모리🗂️에 저장함

가비지 컬렉터🧹

Java 쓰레기 청소기

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

동작흐름

2.JRE

  • Java 의 놀이터인 JVM 을 설치하는 방법은 JRE를 설치하는 것 입니다.
  • JRE 는 Java Runtime Environment 즉, 자바 실행 환경 이라는 뜻을 가지고 있습니다.
  • 하지만, JRE(JVM) 만 있다면 Java 프로그램을 실행만 시킬 수 있습니다.
  • JRE 는 .class 파일만 실행 가능합니다.
  • JDK 가 javac 명령을 통해 .java 파일을 실행가능한 .class 파일로 변환해줍니다.

3.JDK

  • Java 의 놀이터기능과 함께 Java 프로그램을 개발할 수 있는 JDK 라는것이 있습니다.
  • JDK 는 Java Development Kit 즉, 자바 개발 키트 라는 뜻을 가지고 있습니다.
  • 우리는 Java 프로그램을 개발할 것 이기 때문에 JDK 를 설치하겠습니다.
  • JDK 는 아래 그림처럼 JRE(JVM)의 기능을 포함하고 있습니다.
  • JDK는 .java 파일들을 .class 파일들로 변환해주는 Java Compiler(javac) 기능이 있습니다.
  • JDK는 코드를 디버깅하는 jdb 등의 기능이 있습니다.

4.변수

기본형 변수

(1)논리형 변수:boolean

  • True/False 값만 저장합니다.

boolean flag = true; // 1. 논리형 변수 boolean 으로 선언 및 True 값으로 초기화
flag = false; // 2. False 값으로도 저장할 수 있습니다.

(2)문자형 변수 : char

  • ‘A’, ‘1’ 와 같은 문자 하나만 저장합니다.

char alphabet = 'A'; // 문자 하나를 저장합니다.

(3)정수형 변수 : byte, short, int, long

  • 0,1,2,99 와 같은 정수형 숫자값을 저장합니다.
  • 정수형 변수 표현 범위
    • byte : -128 ~ 127 범위의 숫자만 저장 가능합니다.
    • short (2byte) 는 -32,768~32,767 범위의 숫자만 저장 가능합니다.
    • int (4byte) 는 -21억~21억 범위의 숫자만 저장 가능합니다.
  • long (8byte) 은 9백경 정도의 매우 큰수를 저장 가능합니다.
  • byte byteNumber = 127; // byte 는 -128 ~ 127 범위의 숫자만 저장 가능합니다.
  • short shortNumber = 32767; // short 는 -32,768~32,767 범위의 숫자만 저장 가능합니다.
  • int intNumber = 2147483647; // int 는 -21억~21억 범위의 숫자만 저장 가능합니다.
  • long longNumber = 2147483647L; // long 은 숫자뒤에 알파벳 L 을 붙여서 표기하며 매우 큰수를 저장 가능합니다.

(4)실수형 변수 : 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 floatNumber = 0.123f; // float 는 4byte 로 3.4 10^38 범위를 표현하는 실수값
double doubleNumber = 0.123123123; // double 은 8byte 로 1.7
10^308 범위를 표현하는 실수값

참조형 변수

(1)문자열 변수 : String

  • “Apple”, “텍스트” 와 같은 문장을 저장합니다.

String message = "Hello World"; // 문자열을 저장합니다.

(2)그 외 : Object, Array, List …

  • 객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장합니다.

List alphabet = [0,1,2,3]; // 기본형 변수 여러개를 저장합니다.

래퍼 클래스 변수

래퍼 클래스(Wrapper Class) 라는 말 그대로 “기본형 변수를 클래스로 한번 랩핑(감싸는) 변수” 라고 생각하시면 된다.

  • 기본형 변수 타입명에서 첫글자를 대문자로 바꾸어서 래퍼 클래스를 정의해주었습니다.
  • 박싱 VS 언박싱
    • 기본 타입에서 래퍼 클래스 변수로 변수를 감싸는 것을 “박싱” 이라고 부르며
    • 래퍼 클래스 변수를 기본 타입 변수로 가져오는 것을 “언박싱”이라고 부릅니다.
    • int 기본 타입 변수와 Integer 래퍼 클래스 변수를 변환하면서 실습해볼까요?

// 박싱 VS 언박싱
// 박싱
// Integer 래퍼 클래스 num 에 21 의 값을 저장
int number = 21;
Integer num = new Integet(number);
// 언박싱
int n = num.intValue(); // 래퍼 클래스들은 inValue() 같은 언박싱 메서드들을 제공해줍니다.

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

📌 Stack 영역 vs Heap 영역

  • Stack의 경우에는 정적으로 할당된 메모리 영역입니다.
    • 그래서, 크기가 몇 byte 인지 정해져있는 기본형 변수를 저장합니다.
    • 추가로, 크기가 정해져있는 참조형 변수의 주소값도 저장합니다.
  • Heap의 경우에는 동적으로 할당된 메모리 영역입니다.

5. 형변환

형변환에 대한 이해

  • Java 프로그래밍을 하다보면 문자열로 입력받은 변수를 숫자로 변환해서 계산을 하고싶은 경우, 문자열에 숫자값을 추가하고 싶은 경우 등… 어떤 변수형을 다른 형으로 변환이 필요한 경우가 많다.
  • 형변환은 주로 기본형 변수인 정수 ↔ 실수 ↔ 문자 들 사이에서 일어나며 방법은 아래와 같다.

(1) 정수형, 실수형 간 발생하는 형변환

정수 ↔ 실수 간에 변환할때는 `({원하는 타입})` 명령을 통해 변환할 수 있습니다. (캐스팅)
  • Double, Float to Int
    (Int)캐스팅 방식으로 실수를 정수로 치환하는 방법입니다.
    이때 실수형의 소수점아래자리는 버려집니다.
double doubleNumber = 10.101010;
float floatNumber = 10.1010  
int intNumber;
intNumber = (int)doubleNumber; // double -> int 형변환
intNumber = (int)floatNumber; // float -> int 형변환
  • Int to Double, Float
    (Double,Float) 캐스팅으로 정수형을 실수형으로 변환하는 방법입니다.
int intNumber = 10;  
double doubleNumber = (double)intNumber; // int -> double 형변환
float floatNumber = (float)intNumber;  // int -> float 형변환

(2) 자동 형변환

  • Java 프로그래밍에서 형변환을 직접적으로 캐스팅하지 않아도 자동으로 형변환 되는 케이스가 있습니다.
  • 프로그램 실행 도중에 값을 저장하거나 계산할때 자동으로 타입변환이 일어납니다.

2-1)자동 타입변환은 작은 크기의 타입에서 큰 크기의 타입으로 저장될때 큰 크기로 형변환이 발생합니다.

📌 변수 타입별 크기 순서
byte(1) → short(2) → int(4) → long(8) → float(4) → double(8)

byte byteNumber = 10;

int intNumber = byteNumber;    // byte -> int 형변환
System.out.println(intNumber); // 10
char charAlphabet = 'A';
intNumber = charAlphabet;   // char -> int 형변환
System.out.println(intNumber); // A의 유니코드 : 65
intNumber = 100;
long longNumber = intNumber; // int -> number 형변환
System.out.println(longNumber); // 100
intNumber = 200;
double doubleNumber = intNumber; // int -> double 형변환
System.out.println(doubleNumber); // 200.0  (소수점이 추가된 실수출력)

2-1)작은 크기의 타입이 큰 크기의 타입과 계산될때 자동으로 큰 크기의 타입으로 형변환이 발생합니다.

int intNumber = 10;
double doubleNumber = 5.5;
double result = intNumber + doubleNumber; // result 에 15.5 저장됨 (int -> double)
intNumber = 10;
int iResult = intNumber / 4; // iResult 에 2 저장됨 (int형 연산 -> 소수점 버려짐)
intNumber = 10;
double dResult = intNumber / 4.0; // dResult 에 2.5 저장됨 (double형 연산 -> 소수점 저장)

🔥 자동 형변환 vs 강제 형변환

  • 작은 타입 > 큰 타입 형변환시 (자동 형변환)
    • 더 큰 표현범위를 가진 타입으로 변환되는것이라 값의 손실이 없습니다.
    • 값의 손실없이 변환이 가능하기 때문에 컴파일러가 자동으로 형변환을 해줍니다.
  • 큰 타입 > 작은 타입 형변환시 (강제 형변환 = 캐스팅)
    • 더 작은 표현범위를 가진 타입으로 변환된는것이라 값의 손실이 생깁니다.
    • 값의 손실이 생기기 때문에 자동으로 형변환을 해주지 않고 개발자가 선택하여 형변환을 합니다.

🖨️입력&출력

  • 입력
    • Java 프로그램에서는 기본적으로 Scanner.in 객체의 next() 명령을 사용해서 입력받습니다.
Scanner sc = new Scanner(System.in); // Scanner 객체를 new 명령어로 생성합니다.
String input = sc.next();  // sc(Scanner)의 .next(); 를 실행하면 input 변수에 입력한 글자를 받을 수 있습니다.
  • 출력
    • Java 프로그램에서는 기본적으로 System.out 객체의 println() 명령을 사용해서 출력합니다.
Scanner sc = new Scanner(System.in);
String input = sc.next();  
System.out.println("입력값 : " + input);  // 입력한 글자를 출력합니다.
// 실행 결과
{입력}
입력값 : {입력}
profile
미래는 개발이다

0개의 댓글