대학교 전공수업으로 자바를 배운적이 있는데 Python이나 C#등 다른 언어만 계속 사용하다보니 기록해두지 않으면 까먹을 것 같아서 복습한 내용을 정리하는 게시물이다.
(분명 다 알고 있었는데 왜 기억이 안나지)
이미 한번 자바에 대한 공부를 해본 사람을 위해 빠르게 훑고 가기 위해 작성한 게시물이므로, 자바를 처음 배우거나 프로그래밍 언어가 익숙하지 않으신 분들은 인강이나 교재를 통해 공부하는 것을 추천드립니다.
해당 시리즈의 게시물은 codelatte.io 사이트를 참고하여 정리한 내용입니다.
https://www.codelatte.io/courses/java_programming_basic
자바의 기초 개념에 대해 설명하기 전에 자바는 어떻게 입출력하는지부터 배워보자.
자바에서 출력문법은 아래와 같다.
System.out.println(20000);
System.out.println("Hello World!");
// 20000
// Hello World
정수, 실수는 그대로 넣으면 되고, 문자열의 경우 쌍따움표를 넣어 출력할 수 있다.
ln은 개행(\n)과 같은 의미이다. 따라서 System.out.print()만 사용하면 개행 없이 출력이 가능하다.
자바에서 입력받기 위해서는 필수적으로 import java.util.Scanner; 를 선언하여 해당 라이브러리를 들고와야한다.
Scanner scanner = new Scanner(System.in);
// 입력한 값을 문자열로 반환
String value1 = scanner.nextLine();
System.out.println(value1);
// 입력한 값을 int형으로 반환
int value2 = scanner.nextInt();
System.out.println(value2);
// 입력한 값을 short형으로 반환
short value3 = scanner.nextShort();
System.out.println(value3);
// 입력한 값을 byte형으로 반환
byte value4 = scanner.nextByte();
System.out.println(value4);
// 입력한 값을 long형으로 반환
long value5 = scanner.nextLong();
System.out.println(value5);
// 입력한 값을 float형으로 반환
float value6 = scanner.nextFloat();
System.out.println(value6);
// 입력한 값을 double형으로 반환
double value7 = scanner.nextDouble();
System.out.println(value7);
// 입력한 값을 boolean형으로 반환
boolean value8 = scanner.nextBoolean();
System.out.println(value8);
변수는 하나의 값을 저장할 수 있는 공간이다. 변수의 특징은 아래와 같다.
변수 사용 구문
[자료형] [변수명] = [값];
변수 선언
int number; // 변수 선언
number = 100; // 변수에 값 저장
int number = 100; // 변수 선언 & 값 저장 동시에
자료형에 맞는 하나의 값만 저장할 수 있고 자료형이 맞지 않으면 저장할 수 없다.
또한 자료형의 범위 벗어나는 크기는 저장할 수 없다.
// 정수형 자료형에 실수 저장 불가능
int number = 100.1;
// short 자료형은 -32,768 ~ +32,767 범위만 저장 가능
short number = 10000000000;
변수는 하나의 값만 저장이 가능하므로 아래와 같이 저장되었던 값 변경이 가능하다.
// 저장한 값을 100에서 200으로 변경
int number = 100;
number = 200;
정수, 실수, 문자열과 같은 변수를 저장하는 자료형을 기본 자료형이라고 한다.
-128 ~ 127 범위의 정수를 저장할 수 있는 변수
byte num = 100;
-32,768 ~ 32,767 범위의 정수를 저장할 수 있는 변수
short num = 10000;
-2,147,483,648 ~ 2,147,483,647 범위의 정수를 저장할 수 있는 변수
int num 2100000;
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 범위의 정수를 저장할 수 있는 변수
-2,147,483,648 ~ 2,147,483,647 범위 (int 범위)를 넘어가는 정수를 저장할 경우 접미사 L을 붙여서 작성해야함
long num = 10000000000L;
작은 범위의 실수를 저장할 때 사용하는 변수이며 접미사 F를 붙여야 함
float num = 21.3123F;
더 많은 범위의 실수를 저장할 때 사용하는 변수이며 접미사를 붙일 필요 없음
double num = 21.312312312;
문자 하나를 저장하는 변수
char alphabet = 'A';
문자열을 저장하는 변수를 만들 때 사용하는 변수
문자 하나를 저장할 때는 작은따옴표(') 문자열을 표기할 때는 쌍따옴표(") 사용
String text = "오늘 하루도 힘차게!";
true 또는 false 값을 저장하는 변수
boolean isSunday = true;
기본적으로 모든 프로그래밍 언어는 변수를 선언하게 되면 변수를 위한 메모리가 할당된다. 이러한 변수에는 메모리 주소가 존재하며 변수를 접근하기 위해서는 메모리 주소를 알아야 접근이 가능하다.
그러나 우리는 메로리 주소를 알지 못해도 변수에 쉽게 접근이 가능한데, 자바 언어를 실행시키는 자바 가상 머신(Java Virtual Machine, JVM) 처리하기 때문이다.
(자바에서 JVM은 매우매우 중요한 내용)
따라서 값이 존재하지 않는 변수는 메모리를 할당하지 않는다.
public class Main {
public static void main(String[] args) {
int num;
// 값이 존재하지 않는 변수에는
// 접근할 수 없다
System.out.println(num);
// 컴파일 오류 발생
}
}
물론 추후 배우는 객체를 생성하는 클래스에서 멤버 변수의 경우 값이 존재하지 않더라도 메모리에 적재도 하고 초기화도 해준다.
하지만 기본적으로 아무런 조치 없이 변수만 딸랑 선언하면 메모리에 적재되지 않는다는 점은 알고있자.
수학적인 개념으로 이해하면 정수는 숫자 뒤 소수점이 없는 수, 실수는 소수점이 포함된 수로 이해하기 쉽다.
물론 틀린게 아니고 맞는 말이지만 정수와 실수는 컴퓨터 메모리에서 저장되는 방식도 다르다. 우리는 지금 수학공부가 아니라 프로그래밍 언어를 공부하고 있으므로 좀 더 컴공스럽게 접근해보자.

32bit 공간에 정수를 저장할 경우 맨 앞의 1bit는 부호 비트(0이면 양수, 1이면 음수)로 사용하며, 나머지 비트는 정수 표현을 2진수로 변환하여 저장한다.
따라서 위 사진과 같이 부호 비트가 0이고 자리에만 1이므로 정수 32가 저장된다.
32bit 공간에 실수를 저장할 경우 맨 앞 1bit는 부호 비트(0이면 양수, 1이면 음수)로 사용하며, 이후 첫 8bit는 지수부, 나머지 23bit는 가수부로 부동소수점 규칙에 의해 계산되어 저장된다.
결론은 정수와 실수는 저장되는 구조부터 다르므로 정수 32와 실수 32.0은 다르다.
실수를 표현하는 방식에는 고정 소수점과 부동 소수점 방식이 있다. 그런데 한정된 자원을 가진 컴퓨터 세계에서 무수한 실수를 최대한 표현하기 위해 부동 소수점 방식을 채택하게 되었다.
고정 소수점 방식은 정확한 값을 표현할 수 있지만 큰 수를 표현하려면 그만큼 많은 bit를 사용해야하므로 자원 낭비가 심해 사용하지 않는다.
해당 내용에 대한 자세한 내용은 아래 링크 참조
https://www.codelatte.io/courses/java_programming_basic/ZWV86NEECRUFIQIE#head5
변수가 변할 수 있는 수라면 상수는 변할 수 없는 수를 의미한다. 자바의 상수에는 리터럴과 심볼릭 상수가 있다.
리터럴의 종류에는 정수, 실수, 문자, 문자열, 불리언이 있으며 변할 수 없는 값이다.

int num에 값을 저장한 100이 리터럴이 된다. 아래는 다른 종류의 리터럴 예시이다.
// 실수
1.2184
// 문자
'A'
'가'
'오'
// 문자열
"코드라떼"
// 불리언
true
false

당연한 얘기이지만 리터럴은 상수이므로 리터럴에 리터럴을 대입할 수 없다.
변수 앞에 final 키워드를 붙인 변수는 값이 저장된 이후에 값 변경이 불가능하다.
이 변수는 이름이 붙은(상징적인) 상수로 볼 수 있으므로 심볼릭 상수라는 이름을 가지게 되었다.
// 심볼릭 상수
final int num = 1;
// 변경 불가능
num = 4
final int num;
num = 1;
// 변경 불가능
num = 4;
자바 메모리 모델에 대해 공부하면 알 수 있는 내용이지만 간단하게 정리하면 다음과 같다.
문자열 리터럴을 제외하고 byte, short, int, long, float, double, boolean, char 리터럴은 Operand Stack에 일시적으로 적재되었다가 변수라는 메모리 공간에 저장된다.
정수형 데이터인 경우는 기본적으로 약 21억이 넘어가는 크기의 상수가 아닌 이상 그 이하의 수는 기본적으로 4 byte 크기로 스택 메모리 공간에 적재된다.
만약 21억이 넘어가는 리터럴 값인 경우 큰 수를 표현하기 위해 8 byte 메모리 공간이 필요하므로 JVM은 4 byte가 아닌 8 byte 크기의 메모리 공간에 할당해 줘야 하는 리터럴 값이라고 명시해야 하는데, 이 때 사용하는 것이 전에 본 접미사 L이다.
long 자료형이 8 byte를 표현하는 경우가 있어서 위 설명에 해당한다.
반대로 실수형 데이터인 경우는 기본적으로 8 byte 크기로 스택 메모리 공간에 적재된다. (4 byte를 2개로 나눠서 저장)
근데 4 byte로 표현하는 실수형 리터럴은 자바 언어를 실행하는 JVM에게 4 byte 크기의 메모리 공간에 할당해 줘야하는 리터럴 값이라고 명시해야하는데, 이 때 사용하는 것이 전에 본 접미사 F이다.
float 자료형이 4 byte를 표현하는 경우가 있어서 위 설명에 해당한다.