
컴퓨터가 특정 작업을 수행하도록 지시하는 일련의 명령어 집합
어떠한 일의 진행 방법, 계획이나 순서
고급 언어 (High Level Language) : 사람이 이해하기 쉬운 문버봐 구조를 제공, 컴파일러나 인터브리터를 통해 저급 언어로 변환되어 컴퓨터가 이해할 수 있는 형태로 실행된다.
저급 언어 (Low Level Language) : 사람보다는 기계와 더 가까이에서 동작하는 언어, 기계어와 어셈블리어가 이에 해당한다.
컴퓨터가 이해하는 언어로 바꿔주는 걸 컴파일이라고 한다.
컴파일이 필요한 고급 언어를 컴파일 언어라고 말한다.
한 줄의 코드를 한 줄 한 줄 해석하는 언어를 인터프리터 언어라고 한다.
단, 모든 고급 언어가 컴파일 언어는 아니다.
자바는 컴파일 언어이자 인터프리터 언어이다.

public class main {
public static void main(String[] args) {
System.out.println("Hello World!"); # 명령문 (문장) Statement
} # code block
}
# 명령의 흐름(Control flow)은 무조건 위에서 아래로

JVM (Java Virtual Machine) : Java 프로그램의 실행 환경을 제공하는 핵심 구성 요소이다. 바이트 코드를 읽고 해석하여, 해당 플랫폼에서 실행할 수 있는 기계어로 변환해준다. JVM은 플랫폼 독립성을 보장한다. JVM은 또한 메모리 관리, 가비지 컬렉션(Garbage Collection), 쓰레드(Thread) 관리 등의 기능을 담당하고 있습니다.
JRE(Java Runtime Environment) : 자바 애플리케이션을 실행하기 위한 환경을 제공한다. JRE는 JVM과 Java 표준 라이브러리로 구성되어 있으며, 자바 프로그램을 실행하는 데 필요한 모든 요소를 포함하고 있다.
JDK (Java Development Kit) : Java 애플리케이션을 개발하기 위한 도구 모음이다. JDK의 핵심 구성 요소 중 하나는 자바 컴파일러(javac)로, Java 소스 코드를 바이트코드로 변환(컴파일)하여, Java 가상 머신(JVM)에서 실행할 수 있도록 한다. Java 표준 라이브러리(API)를 포함하고 있어, 개발자는 내장된 클래스와 메서드를 활용하여 다양한 프로그래밍 작업을 효율적으로 수행할 수 있다.
메모리 특정 공간에 이름을 붙여놓은 것
변수를 사용하기 전에 변수에 저장될 형식(Type)과 이름을 결정
int integerVariable;
int age, height, weight;
변수에 값을 저장하는 과정
integerVariable = 10;
변수를 선언(Declare)함과 동시에 값을 할당(Allocate)
int integerVariable = 10;
int age = 1, height = 20;
데이터의 종류와 범위, 메모리에서의 저장방식을 결정
자바 언어에서 미리 정해놓은 자료형
자바 언어 자체에 내장되어있는 자료 처리 방식
언어차원에서 제공하고 있는 기본 자료형
byte(1byte), short(2byte), int(4byte), long(8byte)
수 체계 중 정수와 관련된 자료를 처리한다.
float(4byte), double(8byte)
부동 소수점 숫자를 처리하기 위해 사용한다.
char (2byte)
문자와 관련된 데이터를 처리하기 위해 사용한다.
기본적으로 인코딩방식은 유니코드(Unicode)이다.
(인코딩은 쉽게 말하자면 문자를 어떻게 출력할지에 대한 약속)
그래서 자바의 char는 2byte이다.
유니코드(Unicode)로 대문자 A는 97이라는 숫자이다. A = 97
아스키코드(ASCII)로 대문자 A는 65라는 숫자이다. A = 65
boolean
논리관계를 표현하기 위한 자료형이다.
어떠한 관계가 옳은지(True) 옳지 않은지(False)를 표현한다.
- 기본 자료형을 제외한 모든 자료형
- 객체를 참조하기 위해 사용
- 데이터의 값을 그대로 메모리에 저장하지 않고, 그게 저장된 주소를 메모리에 저장한다.
- 힙 영역에 저장하고, 참조 변수는 힙 메모리의 객체를 가리키는 메모리 주소를 저장합니다.
String Hello = "Hello!";
CustomType ct = new CustomType();
Java는 가비지 컬렉션(Garbage Collection)이라는 자동 메모리 관리 기법을 통해 더 이상 사용되지 않는 객체를 메모리에서 해제한다. 이는 개발자가 특정 언어와 같이 메모리 관리를 직접 하지 않도록 도와주며, 메모리 누수(memory leak)를 방지하고, 효율적인 메모리 사용을 가능하게 한다.
데이터를 저장할 수 있는 공간
컴퓨터 메모리는 대개 RAM(Random Access Memory)를 사용하며, RAM은 실행 중인 프로그램과 그 데이터를 저장하는 데 사용된다.
프로그램 실행되면 운영체제가 RAM에 프로그램이 적재하고, 프로그램이 종료될 되면 해당 메모리 공간은 해제된다.
자바 프로그램이 실행될 때, JVM은 메모리를 다양한 영역으로 나눠서 관리한다. 크게 메서드 영역, 힙 영역, 스택 영역, 그리고 네이티브 메서드 스택으로 구분된다.
- 클래스의 메타데이터를 저장하는 공간
- 모든 스레드가 공유하는 영역
- 클래스 로딩 시 클래스 정보, 메서드 코드, 정적 변수, 상수 풀 등을 포함하며, 클래스와 메서드의 구조적 정보를 저장
- 동적으로 생성된 객체와 배열을 저장하는 메모리 공간
- Java의 가비지 컬렉션에 의해 관리되며, 더 이상 참조되지 않는 객체를 자동으로 해제하여 메모리를 효율적으로 관리
- 각 스레드마다 별도로 할당
- 메서드 호출과 관련된 지역 변수와 매개 변수를 저장
- 함수 호출과 리턴의 과정에서 지역 변수와 메서드의 실행 정보를 저장
- 자바 외부에서 작성된 네이티브 메서드를 호출할 때 사용되는 메모리 영역
- 자바 네이티브 인터페이스를 통해 C나 C++로 작성된 네이티브 코드를 실행할 때 필요한 메모리 공간을 제공
- 자바와 네이티브 코드 간의 상호작용을 지원
| 8bit | 1 byte |
| 1024 byte | 1 KB |
| 1024 KB | 1 MB |
| 1024 MB | 1 GB |
| 1024 GB | 1 TB |
| 1024 TB | 1 PB |
| 1024 PB | 1 EB |
| 1024 EB | 1 ZB |
| 자료형 | byte |
|---|---|
| byte | 1 byte |
| short | 2 byte |
| int | 4 byte |
| long | 8 byte |
| 자료형 | byte |
|---|---|
| float | 4 byte |
| double | 8 byte |
| 자료형 | byte |
|---|---|
| char | 2 byte |
| 자료형 | byte |
|---|---|
| boolean | - |
0 ........ 0000 0000
가장 왼쪽에 있는 비트가 Most Significant Bit (MSB) : 부호비트
0 … 0000 0001 //1
+ 1 … 0000 0001 //-1
----------------------
1 … 0000 0010 ?
위의 문제를 보면 이론상으로는 두 수를 더 했을 때 0이 나와야 한다. 하지만, 부호비트 (MSB) 때문에 올바른 결과가 나오지 않는다.
이 문제를 해결하기 위해서 나온 것이 보수(Complement)이다.
<2의 보수>
0 … 0000 0001 // 1
-> 1 … 1111 1110 # 비트를 0->1 변환시키고
-> 1 … 1111 1111 // -1 # 끝에 1을 더해준다.
0 … 0000 0001 //1
+ 1 … 1111 1111
-----------------------
1 0 … 0000 0000 // 0 # 그럼 끝에 1은 버리기 때문에 0을 만들 수 있다.
특정한 작업을 수행하기 위해 사용하는 기호
하나의 피연산자(Operand)에 대해 연산(Operation)을 수행하는 연산자
두 개의 피연산자(Operand)에 대해 연산(Operation)을 수행하는 연산자
세 개의 피연산자(Operand)에 대해 연산(Operation)을 수행하는 연산자
+,-,*,/,%(이항 연산자),++,--(단항 연산자)
+덧셈 연산자는 이항연산자로서 두 개의 피연산자의 합을 구한다.
이 때, 문자열(String)간의 합은 두 문자열을 합한다.
-뺄셈 연산자는 이항연산자로서 두 개의 피연산자의 차을 구한다.
*곱셈 연산자는 이항연산자로서 두 개의 피연산자의 곱을 구한다.
나눗셈 연산자는 이항연산자로서 두 개의 피연산자의 나눗셈을 계산한다.
결과는 정수(몫) 부분만 계산한다. 만일, 실수 나눗셈일 경우, 소숫점 이하 값도 계산한다.
나머지 연산자는 이항연산자로서 두 개의 피연산자의 나눗셈의 나머지를 계산한다.
증가 연산자는 단항연산자로서 한 개의 피연산자를 취한다. 전위(Prefix)와 후위(Postfix)표기가 가능하며, 표기별 다른 결과값을 갖는다. 변수의 있는 값을 증감할 때 사용한다.
감소 연산자는 단항연산자로서 한 개의 피연산자를 취한다. 전위(Prefix)와 후위(Postfix)표기가 가능하며, 표기별 다른 결과값을 갖는다. 변수의 있는 값을 증감할 때 사용한다.
변수에 값을 할당하거나 변수의 값을 다른 값으로 업데이트하는 데 사용된다.
+=,-=,*=,/=,%=
이항연산자이며, 두 개의 피연산자 간의 관계를 비교하고, 그 결과를 논리자료형으로 반환한다. 관계 연산자는 제어문에서 주로 사용되며, 조건에 따라 프로그램의 흐름을 제어할 때 필요한 연산을 수행한다.
>,<,<=,>=,==,!=
주로 제어문에서 사용되며, 하나 이상의 조건을 결합하여 복합적인 논리식을 만드는 데 사용한다.
&&,||(이항연산자),!(부정연산자, 단항연산자)
두 항이 모두 참일 때 참을 반환하는 연산자
둘 중 하나라도 거짓일 때에는 거짓을 반환한다.
두 항 중 하나라도 참일 때 참을 반환하는 연산자
단일 조건의 논리 자료형의 값을 반전한다.
즉, true면 false로 false면 true로 값을 반전한다.
정수 자료형의 개별 비트(Bit)를 직접 다루는 연산자로서, 해당 자료의 비트에 대한 연산을 수행합니다. 실무 프로젝트에서는 잘 활용하지 않지만, 알고리즘 문제에서 사용할 수 있다.
이항연산자로서 연산하는 피연산자의 비트가 모두 1일 때에만 1을 반환한다. 둘 중 하나라도 0이면 0을 반환한다.
int a = 5;
int b = 3;
int result = a&b; //1
0000 0000 0000 0101 <- 5
& 0000 0000 0000 0011 <- 3
-------------------------------
0000 0000 0000 0001 -> 1
이항연산자로서 연산하는 피연산자의 비트 중 하나라도 1일 때에는 1을 반환한다. 두 비트가 모두 0일 때만 0을 반환한다.
int a = 5;
int b = 3;
int result = a|b; //7
0000 0000 0000 0101 <- 5
| 0000 0000 0000 0011 <- 3
-------------------------------
0000 0000 0000 0111 -> 7
이항연산자로서 연산하는 피연산자의 비트가 서로 다를 때에만 1을 반환한다. 두 비트가 같을 때에는 0을 반환한다.
int a = 5;
int b = 3;
int result = a^b; //6
0000 0000 0000 0101 <- 5
^ 0000 0000 0000 0011 <- 3
-------------------------------
0000 0000 0000 0110 -> 6
단항연산자로서 연산하는 피연산자의 모든 비트를 반전한다.
int a = 5;
int result = ~a; //-6
~ 0000 0000 0000 0101 <- 5
-------------------------------
1111 1111 1111 1010 -> -6
이항연산자로서 왼쪽의 피연산자의 비트를 오른쪽의 값만큼 왼쪽 이동하는 연산자 좌측으로 갈 때마다 2의 제곱꼴로 커진다.
int a = 5;
int result = a <<1 ; // 10
1 << 0000 0000 0000 0101 <- 5
-------------------------------
0000 0000 0000 1010 -> 10
우측 이동 연산자 >> 는 비트열을 오른쪽으로 지정된 수만큼 이동시키고, 왼쪽 빈 자리는 원래의 부호비트로 채운다. Java에서는 부호비트를 유지한다. 이는 2의 제곱수로 나눗셈하는 결과를 초래한다.
1 >> 0000 0000 0000 0101 <- 5
-------------------------------
0000 0000 0000 0010 -> 2
부호 없는 우측 이동 연산자는 비트열을 오른쪽으로 지정된 수만큼 이동시키고, 왼쪽 빈 자리를 항상 0으로 채운다. 부호 비트를 무시하고 이동한다.
int a = -5;
int result = a >>> 1; // 2147483645
1 >>> 1111 1111 1111 1011 <- -5
-------------------------------
0111 1111 1111 1101 -> 32765
조건 연산자는 삼항연산자(다항연산자)로서 세 개 혹은 그 이상의 피연산자를 취한다. 하나 혹은 여러 개의 조건을 검사하고, 결과에 따라 다른 값을 반환한다.
조건식?참(true)일 때의 반환 값 : 거짓(false)일 때의 반환 값;
boolean isFinishWork = true;
int reward = isFinishWork? 1000000 : 0;
자료형을 명시적으로 표기하지 않아도, 자바 컴파일러가 자동으로 수행하는 형변환으로서 자동형변환이라고도 일컫는다. 작은 데이터타입에서 큰 데이터타입으로 발생하며, 데이터 손실이 없는 변환
자료의 형식을 변환하고자 하는 자료형을 명시하여 명시적으로 변환하는 자료형 변환 방법
대개 큰 데이터 타입 -> 작은 데이터 타입으로의 변환에서 사용하며 그 경우, 데이터 손실이 발생할 수 있다.
캐스팅이라고도 부른다.
(변환하고자 하는 자료형) 값;
| 우선순위 | 연산자 | 비고 |
|---|---|---|
| 1 | ( ) , [ ] | 괄호 / 대괄호 |
| 2 | !, ~, ++, -- | 부정/ 증감연산자 (단항연산자) |
| 3 | *, /, % | 곱셈 / 나눗셈연산자 |
| 4 | +, - | 덧셈 / 뺄셈연산자 |
| 5 | << , >>, >>> | 비트 이동연산자 |
| 6 | <, ≤, > , ≥ | 관계연산자 |
| 7 | ==, != | |
| 8 | & | 비트 논리연산자 |
| 9 | ^ | |
| 10 | ` | ` |
| 11 | && | 논리연산자 |
| 12 | ` | |
| 13 | ? : | 조건연산자 |
| 14 | =, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, ~= | 대입, 복합대입연산자 |
자바의 구조 이런 추상적인 개념이 제일 어렵게 다가오는 것 같다.
IntelliJ로 자바 프로젝트를 만드는데, 강사님께서 말씀하신 JDK23버전을 사용하니 경고문이 떴다. gradle이 jdk 1.8부터 20까지만 지원한다고하면서, jdk 23과 gradle 8.4로 진행하겠냐고 물어봐서 yes를 눌러서 프젝을 생성했는데 바로 build 실패가 떴다.
강사님께 질문하면서 강사님 gradle 버전을 살짝 봤는데 8.10인 것을 볼 수 있었다. 구글링해봐도 jdk23은 gradle 8.10이랑 호환된다고 하여 프로젝트의 gradle을 8.10으로 설치해주었다.
지금도 Deprecated Gradle features were used in this build, making it ... 이라는 경고문이 뜨지만 (빌드, 실행은 됨) 아직 해결하지 않았다.
2일차가 끝났는데,, 여전히 어떻게 하면 TIL을 효율적으로 꼼꼼하게 작성할 수 있을까 고민이다. 수업 시간에 계속 기록을 하자니 한 번씩 적는 것에 집중해 강사님의 말을 놓칠 때도 생긴다. 그렇다고 손 놓고 강의만 보자니 놓치는 부분이 너무 많은 것 같다.
강사님께서 미리 나눠주시는 강의자료를 미리 한 번 읽고 수업을 들어볼까 생각도 해보았다. 이렇게 되면 어떤 부분이 중요한지, 내가 잘 모르는 부분은 무엇인지 구별이 되어 가볍게 작성할 내용 등등 여러 가지가 정리 될 것 같기도 .. !
개발 블로그를 쓰는 것이 익숙하지 않아 아직 고민이 많은 듯하다. 그래도 잘 고민해보고 기록할 수 있도록 해야겠다 !
https://www.reddit.com/r/java/comments/1exlyqh/gradle_810_already_supports_jdk_23/
https://android-developer.tistory.com/50
https://kotlinworld.com/425