μλ°μμ κ°μ²΄λ₯Ό λ§λλ λ² : ν΄λμ€(μ€κ³λ)λ₯Ό κΈ°λ°μΌλ‘ μΈμ€ν΄μ€(μ ν)λ₯Ό μμ±νλ€.
ν΄λμ€ μμλ μμ±(νλ)κ³Ό κΈ°λ₯(λ©μλ)μ΄ μ μλλ€.
π‘μΈμ€ν΄μ€ - instantμ κ°μ μ΄μμμ νμ
κ°μ²΄(μΈμ€ν΄μ€) = κ°(νλ) + κΈ°λ₯(λ©μλ)
π΄π‘π’
class Person {
String name;
int age;
String doing = ""; //π¦μμ±(νλ) : μ΄λ¦, λμ΄, νλ
public void sayHello() { //π¦κΈ°λ₯(λ©μλ) : μΈμ¬νκΈ°
System.out.println("μλ
νμΈμ? μ λ " + name + "μ
λλ€. μ μ λμ΄λ " + age + "μΈ μ
λλ€. μ λ " + doing + "νλ μ€μ
λλ€.");
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person(); //π¦μΈμ€ν΄μ€ μμ±
person.name = "μ£Όμ";
person.age = 100;
person.doing = "κ°μλ£κΈ°"; //π¦μμ±κ° μ μ
person.sayHello(); //π¦κΈ°λ₯ μ€ν
}
}
βΆοΈ κ²°κ³Ό
μλ
νμΈμ? μ λ μ£Όμμ
λλ€. μ μ λμ΄λ 100μΈ μ
λλ€. μ λ κ°μλ£κΈ°νλ μ€μ
λλ€.
| κ΅¬μ± μμ | μ€λͺ | μμ |
|---|---|---|
| νλ(Field) | ν΄λμ€ λ΄λΆμ μ μΈλ λ³μ | String name; int age; |
| λ©μλ(Method) | ν΄λμ€ λ΄λΆμ μ μλ ν¨μ | public void sayHello() {...} |
| μμ±μ | κ°μ²΄ μμ± μ μλμΌλ‘ νΈμΆλλ λ©μλ. ν΄λμ€λͺ κ³Ό κ°λ€. | public Person() { ... } |
ν΄λμ€ λ³μλͺ κ·μΉ : νμ€μΉΌ μΌμ΄μ€ - λ¨μ΄μ 첫 κΈμλ₯Ό λλ¬Έμλ‘
μ€νλ§ λΆνΈμμλ MVCν¨ν΄μ λ§κ² ν΄λμ€ λ§λλ 곡μμ΄ μκΈ° λλ¬Έμ μ°½μμ λν λΆλ΄μ μμ!
κ°μ .lengthλΌλ λ³μλͺ μ μ°μ§λ§, λ°°μ΄μ κ°, Stringμ λ©μλλ‘ λμ΄ μλ€.
μ΄μ λ...
π΄π‘π’
int[] number = {1, 2, 3, 4};
String name = "μ£Όμ";
System.out.println(number.length); //π¦λ°°μ΄μ κΈΈμ΄ λ³κ²½μ΄ λΆκ°νκΈ° λλ¬Έμ μμ±κ³Ό λμμ κ°μ κΈΈμ΄ μ μ₯μ΄ κ°λ₯νλ€.
System.out.println(name.length()); //π¦λ¬Έμμ΄ λ³μμλ λ€λ₯Έ λ¬Έμμ΄ ν λΉμ΄ κ°λ₯νκΈ° λλ¬Έμ κ·Έλλ§λ€ κΈ°λ₯μ μ΄μ©ν΄ κΈΈμ΄λ₯Ό μΈ‘μ ν΄μΌ νλ€. λ°λΌμ ν¨μλ‘ νΈμΆνλ€.
βΆοΈ κ²°κ³Ό
4
2
Java μ½λ μμμ μ¬μ©νλ ν΄λκ°μ λ Όλ¦¬μ κ²½λ‘
public classλ νμΌ μ΄λ¦κ³Ό κ°μμΌ νλ€.
νλμ νμΌμ μ¬λ¬ ν΄λμ€ μ‘΄μ¬ κ°λ₯. But public ν΄λμ€λ μ€μ§ νλλ§ νμ©
org.example λλ©μΈλͺ
μ°λ¦¬κ° μλ κ·Έ λλ©μΈκ³Ό κ°λ€κ³ μκ°νλ©΄ λ¨.
.μ΄ ν΄λ νλμ
π¦Importλ
λ€λ₯Έ ν¨ν€μ§μ ν΄λμ€λ₯Ό μ¬μ©ν λ μ¬μ©νλ λ¬Έλ².
//π¦ex) java.util ν΄λμ Scanner ν΄λμ€ import νκΈ°
import java.util.Scanner;
ν¨ν€μ§λͺ μμ±κ·μΉ : μλ¬Έμλ‘ μ μ΄μ΄μ§κ² μ΄λ€.
| μ κ·Ό μ μ΄μ | κ°μ ν¨ν€μ§ λ΄ μ κ·Ό | λ€λ₯Έ ν¨ν€μ§μμ μ κ·Ό | μ€λͺ |
|---|---|---|---|
| public | π’ | π’ | λͺ¨λ κ³³μμ μ κ·Ό κ°λ₯. λ¨ νμΌλͺ κ³Ό ν΄λμ€λͺ μ΄ κ°μμΌ νλ€. |
| (μ§μ μ ν¨) = default | π’ | β | λ€λ₯Έ ν¨ν€μ§μ public ν΄λμ€λ₯Ό μ¬μ©ν λ μ¬μ©νλ λ¬Έλ². |
π¦μμ±μλ?
μΈμ€ν΄μ€ μ΄κΈ°ν μ μλ νΈμΆλλ λ©μλ (=νλ κ°μ μ€μ νλ€.)
π΄π‘π’
public class Person {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void sayHello() {
System.out.println("Hello World");
System.out.println("μ΄λ¦μ " + name + " λμ΄λ " + age + " μ
λλ€.");
}
}
public class Main {
public static void main(String[] args) {
String name = "μ£Όμ";
int age = 18;
System.out.println("νλ‘κ·Έλ¨ μμ");
Person person = new Person(name, age);
person.sayHello();
}
}
ν΄λμ€ μ΄λ¦κ³Ό λμΌν΄μΌ νλ©°, λ°ν νμ μ΄ μλ€.
π‘λ§μ½ μμ±μκ° μλ€λ©΄?
νλ κ° μ΄κΈ°νκ° λλ½λμ΄ null, 0, κΈ°λ³Έκ°μ΄ μΆλ ₯λλ λ¬Έμ κ° λ°μν κ°λ₯μ±μ΄ μλ€.
π¦ this
νμ¬ μΈμ€ν΄μ€ μμ μ μλ―Ένλ ν€μλ. μμ±μλ λ©μλ μμμ νλμ λ§€κ°λ³μ μ΄λ¦μ΄ κ°μ λ ꡬλΆμ©μ΄λ€.
π΄π‘π’
public String name;
public int age; //μΈμ€ν΄μ€ νλ κ°
public Person(String name, int age) {
this.name = name; // π¦this ν€μλλ μΈμ€ν΄μ€ λ³μλ₯Ό μμ±μλ λ©μλ μμμ μ¬μ©ν λ μμ±μ/λ©μλ λ§€κ°λ³μμ ꡬλΆν΄μ€λ€.
this.age = age; // π¦μΈμ€ν΄μ€ νλμ μμ±μ λ§€κ°λ³μ κ°μ κ°μ Έμ ν λΉ.
}
jvmμ OS μμμ μ€νλλ€. (unmanaged language)
π‘[ JVM ꡬ쑰 ] class loader | Memory | Execution Engine
.class νμΌμ μ½μ΄ JVM λ©λͺ¨λ¦¬μ λ‘λ© (+κΈ°λ³Έ μλ° class)
[ Method Area | Heap | JVM Language Stacks | PC Registers | Native Method Stacks ]
| κ΅¬μ± μμ | μ€λͺ |
|---|---|
| Method Area | ν΄λμ€ κ΅¬μ‘° μ 보 μ μ₯ (static, method, constant λ±) |
| Heap | κ°μ²΄ μΈμ€ν΄μ€ μ μ₯ |
| JVM Language Stacks | κ° μ€λ λλ§λ€ νΈμΆ μ€ν κ΄λ¦¬ |
| PC Registers | νμ¬ μ€ν μ€μΈ λͺ λ Ή μμΉ μΆμ |
| Native Method Stacks | μλ° μΈ μ½λ(C/C++) μ€νμ© μ€ν |
heap : κ·Έλ₯ μμ λ‘μ΄ μ μ₯μ(λλ€) (μ΄κ±Έ κ΄λ¦¬ν΄μ£Όλ κ΄λ¦¬μκ° κ°λΉμ§μ»¬λ ν°)
stack : Last In First Out ꡬ쑰. μμλλ€ μμμ κΊΌλ΄λ ꡬ쑰.
Registers : νμ¬ μ€νμ€μΈ λͺ
λ Ή μμΉ μΆμ . νλ‘κ·Έλ¨μ΄ νμ€μ© μ€νλ λλ§λ€ 1μ© μ¦κ°.
Native Method Stacks : cμΈμ΄λ os컨νΈλ‘€μ΄ κ°λ₯νλ€λ μ§.. μλ°μ λΆμ‘±ν λΆλΆ 보좩
JVMμ Execution Engine μ λ°μ΄νΈμ½λλ₯Ό ν΄μ λλ JIT μ»΄νμΌλ‘ μ€ννλ€.
μΈν°νλ¦¬ν° λ°©μκ³Ό JIT(Just In Time)λ°©μμ μ°¨μ΄
| λ°©μ | μ°¨μ΄ |
|---|---|
| μΈν°νλ¦¬ν° | ν μ€μ© μ€ν (λλ¦Ό) |
| JIT | μμ£Ό μ°λ μ½λλ§ κΈ°κ³μ΄λ‘ λ³ν (λΉ λ¦) |
π‘μ κ°λΉμ§ 컬λ μ μ΄ νμν κΉ?
- κ°λ°μκ° deleteλ free νμ§ μμλ λ©λͺ¨λ¦¬κ° μλ κ΄λ¦¬λλ€.
- μλ λ©λͺ¨λ¦¬ κ΄λ¦¬ -> μ€μ μ λ°(λ©λͺ¨λ¦¬ λμ, λκΈλ§ ν¬μΈν°(μ€μ°Έμ‘°) λ±) (((( butμ€νμλκ° λΉ λ₯΄λ€)
GCλ μ¬μ©νμ§ μλ κ°μ²΄λ₯Ό νμν΄ μλμΌλ‘ νμνλ€.
λ¨μ : STW = gcκ° λ©λͺ¨λ¦¬ μ 체λ₯Ό μ‘°μ¬ν΄μ μ²μν΄μΌ νκΈ° λλ¬Έμ μ ν리μΌμ΄μ
μ€νμ΄ μ μ λ©μΆλ€.
π΄π‘π’
Node a = new Node(); βοΈmark
Node b = new Node(); βοΈmark
Node c = new Node(); βοΈmark
Node d = new Node(); π§Ήsweep
a.next = b;
b.next = c;
Eden μμμ GCκ° μμ£Ό μ€νλλ€. μ΄μλ¨μΌλ©΄ ->
Survivorλ‘ μ΄λ λͺ λ² μ΄μλ¨μΌλ©΄ ->
Old μμμΌλ‘ μΉκΈ (promotion)
| ꡬμ | μ€λͺ | μ²μλΉλ |
|---|---|---|
| Eden | μλ‘ μμ±λ κ°μ²΄κ° λ€μ΄κ° | μμ£Ό μμ£Ό μ²μ |
| Survivor | μ΄μλ¨μ κ°μ²΄ μμμ μ₯ | μ€κ° μμ£Ό μ²μ |
| Old | μ€λ μ΄μλ¨μ κ°μ²΄ μ μ₯ | κ±°μ μ μΉμ |
λ¨Όμ μΉμ°κΈ° μ’μ κ³³λΆν° μ²μνμ!
λ©λͺ¨λ¦¬λ₯Ό μμ μ‘°κ°(Region)μΌλ‘ λλ λ§μ΄ μ°μ§ μλ RegionλΆν° μ°μ μ²μ.
GCμ€μλ λ©μΆμ§ μκ² νμ!
GCμ€μλ μ ν리μΌμ΄μ μ΄ κ³μ μ€ν κ°λ₯νλλ‘ μ΄μ§μ°μΌλ‘ λ©μΆ€ μκ° κ±°μ μμ.