🐯[TIL] 250610-007

byoΒ·2025λ…„ 6μ›” 10일

πŸ’« JAVA

βœ”οΈ Class

βœ… Class / Instance

μžλ°”μ—μ„œ 객체λ₯Ό λ§Œλ“œλŠ” 법 : 클래슀(섀계도)λ₯Ό 기반으둜 μΈμŠ€ν„΄μŠ€(μ œν’ˆ)λ₯Ό μƒμ„±ν•œλ‹€.
클래슀 μ•ˆμ—λŠ” 속성(ν•„λ“œ)κ³Ό κΈ°λŠ₯(λ©”μ†Œλ“œ)이 μ •μ˜λœλ‹€.
πŸ’‘μΈμŠ€ν„΄μŠ€ - 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

βœ”οΈ Package

βœ… Package

Java μ½”λ“œ μƒμ—μ„œ μ‚¬μš©ν•˜λŠ” 폴더같은 논리적 경둜

public classλŠ” 파일 이름과 κ°™μ•„μ•Ό ν•œλ‹€.
ν•˜λ‚˜μ˜ νŒŒμΌμ— μ—¬λŸ¬ 클래슀 쑴재 κ°€λŠ₯. But public ν΄λž˜μŠ€λŠ” 였직 ν•˜λ‚˜λ§Œ ν—ˆμš©

org.example 도메인λͺ… μš°λ¦¬κ°€ μ•„λŠ” κ·Έ 도메인과 κ°™λ‹€κ³  μƒκ°ν•˜λ©΄ 됨.
.이 폴더 ν•˜λ‚˜μž„

βœ… Import

πŸ¦„Importλž€
λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ 클래슀λ₯Ό μ‚¬μš©ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 문법.

//πŸ¦„ex) java.util ν΄λ”μ˜ Scanner 클래슀 import ν•˜κΈ°
import java.util.Scanner;

νŒ¨ν‚€μ§€λͺ… μƒμ„±κ·œμΉ™ : μ†Œλ¬Έμžλ‘œ μ­‰ μ΄μ–΄μ§€κ²Œ μ“΄λ‹€.

βœ… μ ‘κ·Ό μ œμ–΄μž | default

μ ‘κ·Ό μ œμ–΄μžκ°™μ€ νŒ¨ν‚€μ§€ λ‚΄ μ ‘κ·Όλ‹€λ₯Έ νŒ¨ν‚€μ§€μ—μ„œ μ ‘κ·Όμ„€λͺ…
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 ν‚€μ›Œλ“œ

πŸ¦„ this
ν˜„μž¬ μΈμŠ€ν„΄μŠ€ μžμ‹ μ„ μ˜λ―Έν•˜λŠ” ν‚€μ›Œλ“œ. μƒμ„±μžλ‚˜ λ©”μ†Œλ“œ μ•ˆμ—μ„œ ν•„λ“œμ™€ λ§€κ°œλ³€μˆ˜ 이름이 같을 λ•Œ κ΅¬λΆ„μš©μ΄λ‹€.

πŸ”΄πŸŸ‘πŸŸ’

public String name;  
public int age;      //μΈμŠ€ν„΄μŠ€ ν•„λ“œ κ°’

public Person(String name, int age) {
    this.name = name;   // πŸ¦„this ν‚€μ›Œλ“œλŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μƒμ„±μžλ‚˜ λ©”μ†Œλ“œ μ•ˆμ—μ„œ μ‚¬μš©ν•  λ•Œ μƒμ„±μž/λ©”μ†Œλ“œ λ§€κ°œλ³€μˆ˜μ™€ ꡬ뢄해쀀닀.
    this.age = age; // πŸ¦„μΈμŠ€ν„΄μŠ€ ν•„λ“œμ— μƒμ„±μž λ§€κ°œλ³€μˆ˜ 값을 가져와 ν• λ‹Ή.
}

πŸ’« CS

βœ”οΈ JVM ꡬ쑰와 싀행원리

jvm은 OS μœ„μ—μ„œ μ‹€ν–‰λœλ‹€. (unmanaged language)

  • os레벨의 λ©”λͺ¨λ¦¬ κ΄€λ¦¬λŠ” κ°€λΉ„μ§€ 컬렉터가 μ•Œμ•„μ„œ ν•΄μ€€λ‹€.
  • (<->) cλ‚˜ c++은 os levelκΉŒμ§€ manage κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬κΉŒμ§€ 관리할 수 μžˆλ‹€.
  • μžλ°”μ—λ„ OSλ ˆλ²¨μ—μ„œ μ‹€ν–‰λ˜λŠ” μ½”λ“œκ°€ 있긴 ν•˜λ‹€.

πŸ’‘[ JVM ꡬ쑰 ] class loader | Memory | Execution Engine

βœ… Class Loader

.class νŒŒμΌμ„ 읽어 JVM λ©”λͺ¨λ¦¬μ— λ‘œλ”© (+κΈ°λ³Έ μžλ°” class)

βœ… Memory

[ 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컨트둀이 κ°€λŠ₯ν•˜λ‹€λ“ μ§€.. μžλ°”μ˜ λΆ€μ‘±ν•œ λΆ€λΆ„ 보좩

βœ… Execution Engine

JVM의 Execution Engine 은 λ°”μ΄νŠΈμ½”λ“œλ₯Ό 해석 λ˜λŠ” JIT 컴파일둜 μ‹€ν–‰ν•œλ‹€.

인터프리터 방식과 JIT(Just In Time)λ°©μ‹μ˜ 차이

방식차이
μΈν„°ν”„λ¦¬ν„°ν•œ 쀄씩 μ‹€ν–‰ (느림)
JIT자주 μ“°λŠ” μ½”λ“œλ§Œ κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ (빠름)

βœ”οΈ Garbage Collection

πŸ’‘μ™œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ΄ ν•„μš”ν• κΉŒ?

  • κ°œλ°œμžκ°€ deleteλ‚˜ free ν•˜μ§€ μ•Šμ•„λ„ λ©”λͺ¨λ¦¬κ°€ μžλ™ κ΄€λ¦¬λœλ‹€.
  • μˆ˜λ™ λ©”λͺ¨λ¦¬ 관리 -> μ‹€μˆ˜ 유발(λ©”λͺ¨λ¦¬ λˆ„μˆ˜, λŒ•κΈ€λ§ 포인터(였참쑰) λ“±) (((( but싀행속도가 λΉ λ₯΄λ‹€)

βœ… GC μ•Œκ³ λ¦¬μ¦˜ 1 - Mark and Sweep

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;

βœ… GC μ•Œκ³ λ¦¬μ¦˜ 2 - Generational GC (μ˜›λ‚ μ‹)

Eden μ˜μ—­μ€ GCκ°€ 자주 μ‹€ν–‰λœλ‹€. μ‚΄μ•„λ‚¨μœΌλ©΄ ->
Survivor둜 이동 λͺ‡ 번 μ‚΄μ•„λ‚¨μœΌλ©΄ ->
Old μ˜μ—­μœΌλ‘œ μŠΉκΈ‰ (promotion)

ꡬ역섀λͺ…μ²­μ†ŒλΉˆλ„
Edenμƒˆλ‘œ μƒμ„±λœ 객체가 듀어감아주 자주 μ²­μ†Œ
Survivor살아남은 객체 μž„μ‹œμ €μž₯쀑간 자주 μ²­μ†Œ
Old였래 살아남은 객체 μ €μž₯거의 μ•ˆ μΉ˜μ›€

βœ… GC μ•Œκ³ λ¦¬μ¦˜ 3 - G1 GC (Garbage First) (μ΅œμ‹ ν˜•)

λ¨Όμ € 치우기 쒋은 κ³³λΆ€ν„° μ²­μ†Œν•˜μž!

λ©”λͺ¨λ¦¬λ₯Ό μž‘μ€ 쑰각(Region)으둜 λ‚˜λˆ  많이 μ“°μ§€ μ•ŠλŠ” RegionλΆ€ν„° μš°μ„  μ²­μ†Œ.

βœ… GC μ•Œκ³ λ¦¬μ¦˜ 4 - ZGC (Zero Garbage Collector) (μ΅œμ‹ ν˜•)

GC쀑에도 λ©ˆμΆ”μ§€ μ•Šκ²Œ ν•˜μž!

GC쀑에도 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 계속 μ‹€ν–‰ κ°€λŠ₯ν•˜λ„λ‘ μ΄ˆμ§€μ—°μœΌλ‘œ 멈좀 μ‹œκ°„ 거의 μ—†μŒ.

profile
πŸ—‚οΈ hamstern

0개의 λŒ“κΈ€