JiYoung Dev πŸ–₯

기술 λ©΄μ ‘ μ€€λΉ„ 5. Java 질문 정리 λ³Έλ¬Έ

Study/Java

기술 λ©΄μ ‘ μ€€λΉ„ 5. Java 질문 정리

Shinjio 2023. 11. 18. 21:07

πŸ’Œ μžλ°” μ–Έμ–΄μ˜ νŠΉμ§• 

1. JVM μœ„μ—μ„œ λŒμ•„κ°€κΈ° λ•Œλ¬Έμ— μš΄μ˜μ²΄μ œμ— 독립적

2. 객체지ν–₯μ–Έμ–΄

3. λ©€ν‹°μ“°λ ˆλ”©μ„ 지원 

4. 동적 λ‘œλ”©μ„ 지원 

5. 가비지 컬렉터가 μžˆμ–΄ μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬ 관리λ₯Ό 진행

 

πŸ’Œ JDK와 JRE의 차이점

JRE Java Runtime Enviroment둜 μžλ°”λ‘œ λ§Œλ“€μ–΄μ§„ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ λΌμ΄λΈŒλŸ¬λ¦¬μ™€ API 그리고 JVM을 ν¬ν•¨ν•˜κ³  있음

JDKλŠ” Java Development kit둜 μžλ°”λ₯Ό κ°œλ°œν•˜λŠ” 데 ν•„μš”ν•œ λΌμ΄λΈŒλŸ¬λ¦¬μ™€ javadoc, javac와 같은 개발 도ꡬ와 JREλ₯Ό  ν¬ν•¨ν•˜λŠ” κ°œλ…

 

πŸ’Œ JVMμ΄λž€?

JVMμ΄λž€ Java Virtual Machine으둜 λ°”μ΄νŠΈ μ½”λ“œμ˜ class 파일둜 컴파일된 νŒŒμΌμ„ CPUκ°€ 읽을 수 μžˆλŠ” λ°”μ΄λ„ˆλ¦¬ μ½”λ“œλ‘œ λ³€ν™˜μ‹œμΌœ ν•΄λ‹Ή ν”„λ‘œκ·Έλž¨μ„ 운영체제 μœ„μ—μ„œ μ‹€ν–‰ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” 가상머신

 

πŸ’Œ μžλ°”μ˜ μ‹€ν–‰ 방식(컴파일 κ³Όμ •)

1. μžλ°” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄ JVM은 OSλ‘œλΆ€ν„° λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ή λ°›μŒ

2. *.java νŒŒμΌμ„ javacλ₯Ό 톡해 λ°”μ΄νŠΈ μ½”λ“œμ˜ *.class 파일둜 컴파일

3. 컴파일된 νŒŒμΌμ„ JVM의 클래슀 λ‘œλ”λ‘œ 전달

3. 클래슀 λ‘œλ”λŠ” λ™μ μœΌλ‘œ ν•„μš”ν•œ ν΄λž˜μŠ€λ“€μ„ λ‘œλ”© 및 λ§ν¬ν•˜μ—¬ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λŸ°νƒ€μž„ 데이터 μ˜μ—­μ— 배치 

4. JVM의 싀행엔진에 μžˆλŠ” JIT μ»΄νŒŒμΌλŸ¬μ™€ 인터프리터가 λŸ°νƒ€μž„ 데이터 μ˜μ—­μ— λ‘œλ”©λœ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ°”μ΄λ„ˆλ¦¬ μ½”λ“œλ‘œ μ‹€ν–‰

 

< JVM의 ꡬ쑰와 μ—­ν•  >
- 클래슀 λ‘œλ”(Class Loader) 
  : JVM λ‚΄λ‘œ 클래슀 파일(*.class)을 λ™μ μœΌλ‘œ λ‘œλ“œν•˜κ³ , 링크λ₯Ό 톡해 λ°°μΉ˜ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λͺ¨λ“ˆ
- λŸ°νƒ€μž„ 데이터 μ˜μ—­(Runtime Data Area) 
   1) JVM의 λ©”λͺ¨λ¦¬ μ˜μ—­μœΌλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λ•Œ μ‚¬μš©λ˜λŠ” 데이터듀을 μ μž¬ν•˜λŠ” μ˜μ—­
   2) λ©”μ„œλ“œ μ˜μ—­(Method Area), νž™(Heap Area), μŠ€νƒ(Stack), PC λ ˆμ§€μŠ€ν„°(PC registers), λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ(Native Method Stacks)  μ˜μ—­μœΌλ‘œ λ‚˜λ‰¨
     : κΈ°κ³„μ–΄λ‘œ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€λŠ” μ˜μ—­
- μ‹€ν–‰ 엔진(Execution Engine) 
   1) 클래슀 λ‘œλ”λ₯Ό 톡해 λŸ°νƒ€μž„ 데이터 μ˜μ—­μ— 배치된 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ μ½μ–΄μ„œ μ‹€ν–‰ 
   2) 인터프리터와 JIT 컴파일러 두가지 방식을 ν˜Όν•©ν•˜μ—¬ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰

 

πŸ’Œ GC(가비지 μ½œλ ‰ν„°)λž€?

1. 가비지 μ½œλ ‰ν„°(Garbage Collector)λž€ 가비지 μ»¬λ ‰μ…˜(Garbage Collection)을 μˆ˜ν–‰ν•˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€. μžλ°”μ—μ„œλŠ” JVM의 μ‹€ν–‰ 엔진에 쑴재

2. 가비지 μ»¬λ ‰μ…˜μ΄λž€, μžλ°”μ˜ λ©”λͺ¨λ¦¬ 관리 방법 쀑 ν•˜λ‚˜λ‘œ JVM의 νž™ μ˜μ—­μ— λ™μ μœΌλ‘œ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ 쀑 더이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό 주기적으둜 μ œκ±°ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€

 

πŸ’Œ GCκ°€ ν•„μš”ν•œ 이유

가비지 컬렉터가 μ—†λŠ” 경우, 직접 운영체제둜 λΆ€ν„° λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›κ³  더이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λŠ” λ°˜ν™˜μ„ ν•΄μ€˜μ•Ό ν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ 있음. μ‹€μ œλ‘œ λ°˜ν™˜ν•˜μ§€ μ•Šκ³  μž‘μ—…μ„ 계속 ν•˜λ‹€λ³΄λ©΄ ν”„λ‘œμ„ΈμŠ€κ°€ 점점 컀져 운영체제둜 λΆ€ν„° μ‹œκ·Έλ„μ„ λ°›μ•„ μ£½κ²Œλ˜λŠ” ν˜„μƒμ΄ λ°œμƒν•  수 있음. μ΄λŸ¬ν•œ μž‘μ—…μ—μ„œ λ²—μ–΄λ‚  수 있게 ν•΄μ£Όλ―€λ‘œ 가비지 컬렉터λ₯Ό μ‚¬μš©

 

πŸ’Œ GC λ™μž‘ 방식

1. 객체가 μƒμ„±λ˜λ©΄ νž™ μ˜μ—­μ˜ Young Generation의 Eden μ˜μ—­μ— ν• λ‹Ή 

2. Eden μ˜μ—­μ΄ 가득차면 MinorGCκ°€ μΌμ–΄λ‚˜ ν•„μš”ν•˜λŠ” λ©”λͺ¨λ¦¬λ₯Ό μ²˜λ¦¬ν•¨ 

3. MinorGCλŠ” Mark and Sweep λ°©μ‹μœΌλ‘œ ν•„μš”μ—†λŠ” λ©”λͺ¨λ¦¬λ₯Ό 식별해 ν•΄μ œν•˜λŠ” λ°©μ‹μœΌλ‘œ 진행됨 

4. MinorGCμ—μ„œ 살아남은 κ°μ²΄λŠ” S0 ν˜Ήμ€ S1 μ˜μ—­μœΌλ‘œ μ΄λ™ν•˜κ³  ageλ₯Ό λΆ€μ—¬λ°›μŒ 

5. S0이 가득차면 S1으둜 이동, S1이 가득차면 S0으둜, μ˜μ—­μ„ μ˜€κ°€λ©΄μ„œ ageκ°€ 계속 증가 

6. νŠΉμ • ageκ°€ λ„˜μœΌλ©΄ Old Generation μ˜μ—­μœΌλ‘œ 이동 

7. Old Generation이 가득차면 MajorGCκ°€ μΌμ–΄λ‚˜ 가비지λ₯Ό μ²˜λ¦¬ν•¨

 

πŸ’Œ λ©€ν‹°μŠ€λ ˆλ“œλž€?

ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ 2개 μ΄μƒμ˜ μŠ€λ ˆλ“œκ°€ μ‘΄μž¬ν•˜μ—¬ λ™μ‹œμ— μ—¬λŸ¬ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” κ²ƒμœΌλ‘œ 말함

 

μŠ€λ ˆλ“œ(thread) : μ–΄λ– ν•œ ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ, 특히 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” νλ¦„μ˜ λ‹¨μœ„

 

πŸ’Œ λ©€ν‹°μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 이유

1. μ‚¬μš©μž 응닡성 ν–₯상 : μ‹±κΈ€ μŠ€λ ˆλ“œ ν”„λ‘œμ„ΈμŠ€μ˜ 경우 ν•˜λ‚˜μ˜ μž‘μ—…μ΄ μ™„μ „νžˆ λλ‚œ ν›„ λ‹€μŒ μž‘μ—…μ„ 진행할 수 있음. 반면, λ©€ν‹° μŠ€λ ˆλ“œλŠ” ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨ μ•ˆμ—μ„œ μ±„νŒ…μ„ ν•˜λŠ” 사진을 λ‹€μš΄ λ°›λŠ” λ“± λ™μ‹œμ— μ—¬λŸ¬ μž‘μ—…μ„ μˆ˜ν–‰ν•  있음. 

2. μžμ›μ˜ μ‚¬μš©μ˜ νš¨μœ¨μ„± ν–₯상 : ν”„λ‘œμ„ΈμŠ€μ˜ μŠ€νƒ μ˜μ—­μ„ μ œμ™Έν•œ νž™, 데이터, μ½”λ“œ μ˜μ—­, μžλ°”μ—μ„œλŠ” νž™, λ©”μ†Œλ“œ μ˜μ—­μ„ κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— μžμ›μ˜ 생성과 κ΄€λ¦¬μ˜ 쀑볡을 μ΅œμ†Œν™”ν•  수 있음 

 

<ν”„λ‘œμ„ΈμŠ€μ˜ μžμ› ꡬ쑰>
1. TEXT : μ½”λ“œ μ˜μ—­μœΌλ‘œ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μž‘μ„±ν•œ μ½”λ“œκ°€ CPUκ°€ 해석 κ°€λŠ₯ν•œ 기계어 ν˜•νƒœλ‘œ μ €μž₯λ˜μ–΄ 있음
2. DATA : μ½”λ“œκ°€ μ‹€ν–‰λ˜λ©΄μ„œ μ‚¬μš©ν•˜λŠ” μ „μ—­ λ³€μˆ˜λ‚˜ 각쒅 데이터가 λͺ¨μ—¬ 있음 
3. HEAP : μƒμ„±μž, μΈμŠ€ν„΄μŠ€μ™€ 같은 λ™μ μœΌλ‘œ ν• λ‹Ήλ˜λŠ” 데이터듀이 μ‘΄μž¬λ˜λŠ” κ³΅κ°„μœΌλ‘œ μ‚¬μš©μžμ— μ˜ν•΄ λ©”λͺ¨λ¦¬ 곡간이 λ™μ μœΌλ‘œ ν• λ‹Ήλ˜κ³  ν•΄μ œλ¨ 
4. STACK : 지역 λ³€μˆ˜μ™€ ν˜ΈμΆœν•œ ν•¨μˆ˜κ°€ μ’…λ£Œλ˜λ©΄ λ˜λŒμ•„μ˜¬ μž„μ‹œμ μΈ 자료λ₯Ό μ €μž₯ν•˜λŠ” 독립적인 곡간

Q. ν”„λ‘œμ„ΈμŠ€ μžμ›κ΅¬μ‘°μ˜ μ–΄λŠ μ˜μ—­μ—μ„œ JVM의 6가지 μ˜μ—­λ“€μ΄ λ§Œλ“€μ–΄μ§€λŠ” κ²ƒμΌκΉŒ?
JVM의 6가지 μ˜μ—­λ“€μ€ Runtime Data Areaμ•ˆμ— 있고, 이 Runtime Data AreaλŠ” OSκ°€ ν•΄λ‹Ή λ©”λͺ¨λ¦¬μ—κ²Œ ν• λ‹Ήν•΄μ€Œ(κ·ΈλŸ¬λ‹ˆ ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€μ˜ Heap)μ˜μ—­, 고둜 ν”„λ‘œμ„ΈμŠ€μ˜ Heap μ˜μ—­ μ•ˆμ— JVM이 Runtime Data Areaλ₯Ό λ§Œλ“€μ–΄ 6가지 μ˜μ—­μœΌλ‘œ μͺΌκ°œμ–΄ μ‚¬μš©ν•˜λŠ” κ²ƒμž„μ„ μ•Œ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. (GC 같은 κ²½μš°λŠ” JVM의 Heapμ˜μ—­λ§Œ 관리)

JVM의 데이터 μ˜μ—­κ³Ό ν”„λ‘œμ„ΈμŠ€ μžμ› ꡬ쑰의 차이에 λŒ€ν•œ κΈ€ : https://dkswnkk.tistory.com/440

 

 

[Java] JVM의 λ©”λͺ¨λ¦¬ κ΅¬μ„±μš”μ†Œμ™€ μ˜μ—­μ— κ΄€ν•œ κ³ μ°°

μ„œλ‘  μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λ©΄, JVM은 μ‹œμŠ€ν…œμœΌλ‘œλΆ€ν„° ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν–‰ν•˜λŠ”λ° ν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›κ³  JVM은 이 λ©”λͺ¨λ¦¬λ₯Ό μš©λ„μ— 따라 μ—¬λŸ¬ μ˜μ—­μœΌλ‘œ λ‚˜λˆ„μ–΄ κ΄€λ¦¬ν•©λ‹ˆλ‹€. κ·Έλ ‡μ§€λ§Œ μ—¬κΈ°μ„œ μ—¬

dkswnkk.tistory.com

좜처 γ…£ https://velog.io/@kangyun9957/JVM-%EA%B4%80%EC%A0%90%EC%9D%98-%EC%8A%A4%EB%A0%88%EB%93%9C

JVMμ—μ„œμ˜ μŠ€λ ˆλ“œμ™€ λ©”λͺ¨λ¦¬ ꡬ성 
μžλ°” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ → JVM ν”„λ‘œμ„ΈμŠ€ μ‹œμž‘ 및 main thread 생성 
JVM은 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•˜λ©΄μ„œ OSλ‘œλΆ€ν„° Runtime Data Area λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ή λ°›μŒ

JVM Runtime Data Area ꡬ성
1. Method Area : 클래슀 정보, 정적 λ³€μˆ˜ λ“± JVM ν”„λ‘œμ„ΈμŠ€κ°€ μ‹œμž‘λ  λ•Œ 데이터가 ν• λ‹Ή 
2. Heap : λ™μ μœΌλ‘œ 데이터가 ν• λ‹Ήλ˜λŠ” μ˜μ—­μœΌλ‘œ 레퍼런슀 νƒ€μž… 객체 μƒμ„±μ‹œ μ‹€μ œ 객체가 μ˜¬λΌκ°€λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­
3. PC(Program Counter) Register
   - ν•΄λ‹Ή μŠ€λ ˆλ“œμ—μ„œμ˜ λͺ…λ Ή 흐름을 μΆ”μ ν•˜κ³  관리
   - ν˜„μž¬ μˆ˜ν–‰μ€‘μΈ JVM λͺ…λ Ήμ˜ μ£Όμ†Œ μ €μž₯,
   - 연산을 μœ„ν•΄ ν•„μš”ν•œ ν”Όμ—°μ‚°μžλ₯Ό μž„μ‹œλ‘œ μ €μž₯
4. Stack
   - λ©”μ„œλ“œ ν˜ΈμΆœμ‹œ 호좜된 λ©”μ„œλ“œλ₯Ό μœ„ν•œ frame 생성
   - λ©”μ„œλ“œ scope λ‚΄μ—μ„œ λ°œμƒν•˜λŠ” μ§€μ—­λ³€μˆ˜, λ§€κ°œλ³€μˆ˜, 리턴값 등이 frame에 μ €μž₯됨
   - λ©”μ„œλ“œ scopeκ°€ λ¦¬ν„΄λ˜λ©΄ frame에 ν• λ‹Ήλ˜μ—ˆλ˜ λ³€μˆ˜λ“€κ³Ό frame은 λ°˜ν™˜λ¨ 
   - λ©”μ„œλ“œ λ‚΄μ—μ„œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 경우, 호좜된 λ©”μ„œλ“œ frame이 λ°”λ‘œ μœ„μ— μƒκΈ°λ©΄μ„œ μ‹€ν–‰ 흐름이 ν•΄λ‹Ή λ©”μ„œλ“œλ‘œ λ„˜μ–΄κ°
5. Native Methd Stack :  μžλ°”κ°€ μ•„λ‹Œ λ‹€λ₯Έ μ–Έμ–΄λ₯Ό JNIλ₯Ό 톡해 μ‹€ν–‰ν•˜κΈ° μœ„ν•œ μ½”λ“œ 곡간 

JVM의 μŠ€λ ˆλ“œ μ’…λ₯˜ 
1. 데λͺ¬ μŠ€λ ˆλ„ 
 - 데λͺ¬ μŠ€λ ˆλ“œλŠ” λ‹€λ₯Έ 비데λͺ¬ μŠ€λ ˆλ“œκ°€ μ—†λ‹€λ©΄ λ™μž‘μ„ 쀑지함 
 - JVM의 가비지 μ»¬λ ‰μ…˜, λͺ¨λ‹ˆν„°λ§ λ“± μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μš΄μš©μ„ μœ„ν•΄ μ‚¬μš©ν•˜λ‹€κ°€ μ£Όμš” μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ˜λ©΄ ν•¨κ»˜ μ’…λ£Œ
2. 비데λͺ¬ μŠ€λ ˆλ“œ 
 - ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ§„μž…μ μΈ main thread(static void main(String[] args)λŠ” 비데λͺ¬ μŠ€λ ˆλ„λ‘œ 생성
 - 이 μŠ€λ ˆλ“œκ°€ λ™μž‘μ„ μ€‘μ§€ν•˜κ±°λ‚˜ μ’…λ£Œν•˜λ©΄ λ‹€λ₯Έ 데λͺ¬ μŠ€λ ˆλ“œλ“€λ„ ν•¨κ»˜ 쀑지


참고 자료 : https://velog.io/@kangyun9957/JVM-%EA%B4%80%EC%A0%90%EC%9D%98-%EC%8A%A4%EB%A0%88%EB%93%9C
 

JVM κ΄€μ μ˜ μŠ€λ ˆλ“œ

μžλ°” μ•± μ‹€ν–‰ => JVM ν”„λ‘œμ„ΈμŠ€ μ‹œμž‘ 및 main thread 생성JVM은 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•˜λ©΄μ„œ OSλ‘œλΆ€ν„° Runtime Data Area λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›μŠ΅λ‹ˆλ‹€.Method AreadJVM μŠ€λ ˆλ“œμ˜ μ’…λ₯˜\-데λͺ¬ μŠ€λ ˆλ“œλ°λͺ¬ μŠ€λ ˆλ“œλŠ” λ‹€λ₯Έ 비데

velog.io

 

πŸ’Œ μžλ°”μ˜ λ™μ‹œμ„±(κ³΅μœ μžμ›  μ ‘κ·Ό) 이슈

- λ™μΌν•œ ν•˜λ‚˜μ˜ 데이터에 λŒ€ν•΄ 2개 μ΄μƒμ˜ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— μ œμ–΄ν•  λ•Œ λ‚˜νƒ€λ‚˜λŠ” 문제둜,

  ν•˜λ‚˜μ˜ μ„Έμ…˜μ΄ 데이터λ₯Ό μˆ˜μ •μ€‘μΌ λ•Œ λ‹€λ₯Έ μ„Έμ…˜μ—μ„œ μˆ˜μ • μ „μ˜ 데이터λ₯Ό μ‘°νšŒν•΄ λ‘œμ§μ„ μ²˜λ¦¬ν•¨μœΌλ‘œμ¨

  λ°μ΄ν„°μ˜ 정합성이 κΉ¨μ§€λŠ” 것

- ν•΄λ‹Ή μžμ›μ„ μ‚¬μš©ν•  λ•Œ 동기화 ν•„μš”

 

πŸ’Œ μžλ°” 데이터 νƒ€μž… 쀑 κΈ°λ³Έν˜•κ³Ό μ°Έμ‘°ν˜•μ˜ 차이 

1. κΈ°λ³Έν˜• νƒ€μž…μ€ κ°’ 자체λ₯Ό μŠ€νƒ μ˜μ—­μ— μ €μž₯ν•˜λŠ” 반면 μ°Έμ‘°ν˜•μ€ 값이 μ•„λ‹Œ 값이 μ €μž₯된 μ£Όμ†Œλ₯Ό μŠ€νƒ μ˜μ—­μ— μ €μž₯ν•˜κ³  μ‹€μ œ 값은 νž™ μ˜μ—­μ— μ €μž₯ 

2. κΈ°λ³Έν˜•μ€ null을 κ°€μ§ˆ 수 μ—†μœΌλ‚˜ μ°Έμ‘°ν˜•μ€ null값을 κ°€μ§ˆ 수 있음(κΈ°λ³Έν˜•μ€ defaut값이 μ •ν•΄μ Έ 있음. int - 0, double - 0.0, char - '0', boolean - false)

 

πŸ’Œ μžλ°”μ˜ μ›μ‹œ νƒ€μž… μ’…λ₯˜μ™€ 크기

1. μ •μˆ˜ν˜• - byte(1byte), short(2byte), int(4byte), long(8byte)

2. μ‹€μˆ˜ν˜• - float(4byte), double(8byte)

3. λ¬Έμžν˜• - char(2byte)

4. λ…Όλ¦¬ν˜• - boolean(1byte)

 

πŸ’Œ μžλ°”μ—μ„œ λ™μΌν•œ String을 μƒˆλ‘œ λ§Œλ“€λ•Œλ§ˆλ‹€ 객체가 μƒμ„±λ˜λŠ”κ°€?  (예 : String a = Apple; String b= Apple; 의 경우 곡간이 μƒˆλ‘œ ν• λ‹Ήλ˜λŠ”μ§€) 

String을 생성할 λ•Œ μ˜ˆμ‹œμ™€ 같이 λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•˜λŠ” 경우 Heap μ˜μ—­μ˜ String pool에 값이 μ €μž₯됨

String b μ—­μ‹œ λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν–ˆκ³ , aλ₯Ό μ„ μ–Έν•  λ•Œ "Apple"을 String pool에 μ €μž₯ν•˜μ˜€μœΌλ―€λ‘œ Heap μ˜μ—­μ—λŠ” μƒˆλ‘œ 곡간 할당이 λ˜μ§€ μ•Šκ³ , 기쑴에 μ €μž₯된 λ¬Έμžμ—΄μ„ μž¬μ‚¬μš©ν•¨. λ§Œμ•½ newλ₯Ό 톡해 μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜κ²Œ λœλ‹€λ©΄ κ·Έλ•Œμ—λŠ” λ³„λ„μ˜ Heap 곡간을 ν• λ‹Ήν•˜κ²Œ 됨

좜처 : https://deveric.tistory.com/123
https://deveric.tistory.com/123

Java String Pool ( == String Constant Pool)
Javaμ—μ„œ λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄μ„ μ €μž₯ν•˜λŠ” λ…λ¦½λœ μ˜μ—­

μ†ŒμŠ€μ½”λ“œμ—μ„œ λ¦¬ν„°λŸ΄("Hello")둜 μ„ μ–Έλœ λ¬Έμžμ—΄μ΄ μ €μž₯λ˜λŠ” κ³΅κ°„μœΌλ‘œ λ™μ μœΌλ‘œ μƒμ„±λœ λ¬Έμžμ—΄μ€ μ €μž₯λ˜μ§€ μ•ŠμŒ
그리고 ν•œ 번 μ €μž₯된 λ¬Έμžμ—΄μ€ μ†ŒμŠ€μ½”λ“œμ—μ„œ λ™μΌν•œ λ¬Έμžμ—΄μ— λŒ€ν•΄ μž¬μ‚¬μš©ν•˜μ—¬ λ©”λͺ¨λ¦¬λ₯Ό μ ˆμ•½ν•˜λŠ” 역할을 함
String str = "Hello"; //String pool에 μ €μž₯ 
String str2 = new String("Hello") //heap μ˜μ—­μ— μ €μž₯​


String pool에 μ €μž₯된 λ¬Έμžμ—΄μ€ λͺ¨λ‘ 같은 객체λ₯Ό μž¬μƒμš©ν•¨

String str = "Hello"; //String pool에 μ €μž₯ 
String str2 = "Hello"; //String pool에 μ €μž₯ 
String str3 = new String("Hello"); //λ³„λ„μ˜ heap μ˜μ—­μ— μ €μž₯

System.out.println(str == str2); //true
System.out.println(str == str3); //false
System.out.pringln(str.equals(str3)); //true


참고자료 : https://deveric.tistory.com/123

 

[Java] 많이 ν—·κ°ˆλ €ν•˜λŠ” String constant poolκ³Ό Runtime Constant pool, Class file constant pool

String Constant Poolκ³Ό Constant Pool 이 두 κ°€μ§€λŠ” μ™„μ „νžˆ λ‹€λ₯Έ κ°œλ…μž…λ‹ˆλ‹€. μš©μ–΄κ°€ λΉ„μŠ·ν•œ ν˜•νƒœμ΄κΈ° λ•Œλ¬Έμ— 이 두 가지λ₯Ό ν˜Όμš©ν•˜μ—¬ ν—·κ°ˆλ¦¬λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€λ§Œ, μ €μž₯λ˜λŠ” μœ„μΉ˜λΆ€ν„° μ €μž₯ν•˜λŠ” λ°μ΄ν„°μ˜

deveric.tistory.com

 

πŸ’Œ μ£Όμ†Œκ°’ 비ꡐ(==)와 κ°’ 비ꡐ(equals)의 차이점과 String을 ==둜 λΉ„κ΅ν•˜λ©΄ μ•ˆλ˜λŠ” 이유

- μ£Όμ†Œκ°’ λΉ„κ΅λŠ” ν•΄λ‹Ή λ³€μˆ˜μ˜ 데이터가 μ‘΄μž¬ν•˜λŠ” μ£Όμ†Œκ°€ 같은지λ₯Ό 확인

- κ°’ λΉ„κ΅λŠ” ν•΄λ‹Ή λ³€μˆ˜μ˜ μ‹€μ œ 데이터λ₯Ό λΉ„κ΅ν•˜λŠ” 것 

 

λ§Œμ•½ 

String a = "a";
String b = "a";

 

이 경우 String pool에 μ˜ν•΄ λ³€μ„œ a와 bλŠ” 같은 μ£Όμ†Œμ™€ 값을 가지고 μžˆμœΌλ‚˜

 

String a = "a";
String b = new String("a");

 

μœ„μ™€ 같이 λ™μ μœΌλ‘œ 객체가 μƒμ„±λ˜λŠ” κ²½μš°μ— λ³€μˆ˜ bκ°€ κ°€μ§€λŠ” λ¦¬ν„°λŸ΄ "a"λŠ” String pool이 μ•„λ‹Œ λ³„λ„μ˜ νž™ μ˜μ—­μ— μ €μž₯되기 λ•Œλ¬Έμ— μ£Όμ†Œκ°’μ΄ 닀름. λ”°λΌμ„œ μ£Όμ†Œκ°’μœΌλ‘œ λΉ„κ΅ν•˜κ²Œ 되면 false, κ°’μœΌλ‘œ λΉ„κ΅ν•˜λ©΄ trueκ°€ λ‚˜μ˜΄

 

πŸ’Œ Java의 세가지 λ³€μˆ˜μ— λŒ€ν•΄ JVM λ©”λͺ¨λ¦¬μ™€ 연관지어 μ„€λͺ…

1. 클래슀 λ³€μˆ˜ :  클래슀 내에 μ„ μ–Έλœ λ³€μˆ˜ 쀑 static ν‚€μ›Œλ“œλ₯Ό 뢙인 λ³€μˆ˜λ‘œ JVM의 λ©”μ„œλ“œ μ˜μ—­μ— μ €μž₯됨. λ”°λΌμ„œ ν΄λž˜μŠ€κ°€ λ‘œλ”©λ˜μ—ˆμ„ λ•Œ μƒμ„±λ˜κ³  ν”„λ‘œκ·Έλž¨ μ’…λ£ŒκΉŒμ§€ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ©°, μΈμŠ€ν„΄μŠ€κ°„ λ³€μˆ˜λ₯Ό κ³΅μœ ν•  수 있음

   - μ°Έμ‘° μžλ£Œν˜• : κΈ°λ³Έ μžλ£Œν˜•κ³Ό μŠ€νŠΈλ§μ„ μ œμ™Έν•œ μ°Έμ‘° μžλ£Œν˜•μ˜ 경우 클래슀 λ³€μˆ˜μ— ν• λ‹Ήλœ κ°μ²΄λŠ” heap에 생성해두고 referenceλ₯Ό runtime constant pool에 μ €μž₯ 

2. μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(κΈ°λ³Έ/μ°Έμ‘° μžλ£Œν˜•) : 클래슀 내에 μ„ μ–Έλœ λ³€μˆ˜λ‘œ JVM의 Heap μ˜μ—­μ— μ €μž₯됨. μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ—ˆμ„ λ•Œ 생성, 단, Heap μ˜μ—­μ— μ €μž₯된 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” 레퍼런슀 λ³€μˆ˜μ˜ 경우 Stack μ˜μ—­μ— μ €μž₯. μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” λ©”λͺ¨λ¦¬ 호좜이 λλ‚˜λ„ μ‚­μ œλ˜μ§€ μ•Šκ³  μœ μ§€λ˜λ©° GC에 μ˜ν•΄ λ©”λͺ¨λ¦¬ 관리됨 

3. 지역 λ³€μˆ˜ : λ©”μ„œλ“œ 내에 μƒμ„±λ˜κ±°λ‚˜ μ „λ‹¬λœ λ³€μˆ˜

   - κΈ°λ³Έ μžλ£Œν˜• : Stack에 μ €μž₯, λ©”μ†Œλ“œκ°€ μ’…λ£Œλ˜λ©΄ κ·ΈλŒ€λ‘œ μ†Œλ©Έ

   - μ°Έμ‘° μžλ£Œν˜• : λ°°μ—΄, 클래슀 객체 λ“± new μ—°μ‚°μžλ‘œ μƒμ„±λœ μ°Έμ‘° μžλ£Œν˜•μ˜ 경우, μ‹€μ œ κ°μ²΄λŠ” Heap에 μ €μž₯되고, Heap에 μ €μž₯된 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” referenceκ°€ stack에 μ €μž₯

λ³€μˆ˜(Variable) : 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ 할당받은 λ©”λͺ¨λ¦¬ 곡간 
λ³€μˆ˜ μ„ μ–Έ μœ„μΉ˜μ— 따라 3κ°€μ§€λ‘œ ꡬ뢄할 수 있음 : 지역 λ³€μˆ˜, 클래슀 λ³€μˆ˜, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
public class Example{
	int level; //μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 
    static int cream; //클래슀 λ³€μˆ˜ 
    void attack(){
    	int score; //μ§€μ—­λ³€μˆ˜
    }
}​


1. μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
    - 클래슀 내에 μ„ μ–Έλœ λ³€μˆ˜ 
    - μΈμŠ€ν„΄μŠ€ 생성 μ‹œλ§ˆλ‹€ 맀번 μƒˆλ‘œμš΄ λ³€μˆ˜κ°€ 생성됨 
    - 클래슀 λ³€μˆ˜μ™€ 달리 κ³΅μœ λ˜μ§€ μ•ŠμŒ
2. 클래슀 λ³€μˆ˜
    - ν΄λž˜κ°€ λ©”λͺ¨λ¦¬μ— 올라갈 λ•Œ 생성 (static ν‚€μ›Œλ“œλ‘œ μ„ μ–Έ)
    - 처음 JVM이 μ‹€ν–‰λ˜μ–΄ ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— 올라갈 λ•Œ ~ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ  λ•ŒκΉŒμ§€ μœ μ§€
    - λ™μΌν•œ 클래슀의 λͺ¨λ“  객체듀에 μ˜ν•΄ 곡유됨
3. 지역 λ³€μˆ˜ 
    - λ©”μ†Œλ“œ λΈ”λŸ­ μ•ˆμ— μ„ μ–Έλœ λ³€μˆ˜ 
    - λ©”μ†Œλ“œ 호좜 μ‹œμ  ~ λ©”μ†Œλ“œ μ’…λ₯˜ μ‹œμ  λ™μ•ˆ μœ μ§€

참고자료 : https://8iggy.tistory.com/230, https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EB%B3%B4%EB%8A%94-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD%EC%8A%A4%ED%83%9D-%ED%9E%99

 

Java 객체와 λ³€μˆ˜ λ°μ΄ν„°μ˜ μ €μž₯

읽기 μ „ λΆˆν•„μš”ν•œ μ½”λ“œλ‚˜ 잘λͺ» μž‘μ„±λœ λ‚΄μš©μ— λŒ€ν•œ 지적은 μ–Έμ œλ‚˜ ν™˜μ˜ν•©λ‹ˆλ‹€. 개인적으둜 μ‚¬μš©ν•΄λ³΄λ©΄μ„œ 배운 점을 μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€. 문제 제기 λ³€μˆ˜ μ €μž₯에 λŒ€ν•΄ 물어보면 으레 지역/맀개 λ³€μˆ˜

8iggy.tistory.com

 

 

β˜• 그림으둜 λ³΄λŠ” μžλ°” μ½”λ“œμ˜ λ©”λͺ¨λ¦¬ μ˜μ—­(μŠ€νƒ & νž™)

μžλ°”μ˜ λ©”λͺ¨λ¦¬ μ˜μ—­ 이번 ν¬μŠ€νŒ…μ—μ„  μžλ°”(JAVA)λ₯Ό μ‚¬μš©ν•˜λŠ” μž…μž₯μ—μ„œ μ•Œμ•„μ•Ό ν•  λ©”λͺ¨λ¦¬ ꡬ쑰 및 νŠΉμ§•μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ €κ³  ν•œλ‹€. μžλ°” ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λ©΄ JVM(μžλ°” 가상 λ¨Έμ‹ )은 OSλ‘œλΆ€ν„° λ©”λͺ¨

inpa.tistory.com

πŸ’Œ Staticμ΄λž€?

- static ν‚€μ›Œλ“œκ°€ λΆ™μ–΄ 클래슀 λ‘œλ”©μ‹œ μƒμ„±λ˜λŠ” λ³€μˆ˜ ν˜Ήμ€ λ©”μ„œλ“œ

- JVM의 λ©”μ„œλ“œ μ˜μ—­μ— μ €μž₯ 

- 클래슀 λ‘œλ”© ν›„λΆ€ν„° ν”„λ‘œκ·Έλž¨ μ’…λ£Œλ  λ•ŒκΉŒμ§€ μ‚¬μš© κ°€λŠ₯ 

- 동일 클래슀의 λͺ¨λ“  객체듀에 곡유되며 μΈμŠ€ν„΄μŠ€ 생성 없이 λ°”λ‘œ μ‚¬μš© κ°€λŠ₯ 

- ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©λ˜λŠ” 데이터λ₯Ό 관리할 λ•Œ, main λ©”μ„œλ“œμ™€ 같이 ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ ν›„λΆ€ν„° μ’…λ£ŒκΉŒμ§€ 가비지 μ»¬λ ‰ν„°μ—μ˜ν•΄ μ •λ¦¬λ˜μ§€ μ•Šκ³  싀행이 λ˜μ–΄μ•Ό ν•  λ•Œ μ‚¬μš©

 

πŸ’Œ 객체가 JVM λ©”λͺ¨λ¦¬μ— μ €μž₯될 λ•Œ 어디에 μ €μž₯λ˜λŠ”κ°€?

κ°μ²΄λŠ” JVM의 νž™ μ˜μ—­μ— μ €μž₯되고, 객체가 μ €μž₯된 값을 κ°€μ§€λŠ” 레퍼런슀 λ³€μˆ˜λŠ” μŠ€νƒ μ˜μ—­μ— μ €μž₯

 

πŸ’Œ μƒμ„±μž

μžλ°”μ—μ„œ 객체λ₯Ό 생성될 λ•Œ μžλ™μœΌλ‘œ ν˜ΈμΆœλ˜λŠ” νŠΉμˆ˜ν•œ λ©”μ†Œλ“œλ‘œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ›ν•˜λŠ” κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•  수 있음

1. 클래슀의 이름과 λ©”μ„œλ“œλͺ…이 κ°™μŒ 

2. λ°˜ν™˜νƒ€μž…μ΄ μ—†μŒ

3. λ§€κ°œλ³€μˆ˜ 쑰건에 따라 μ—¬λŸ¬κ°œ μž‘μ„±ν•  수 있음 (μ˜€λ²„λ‘œλ”©)

4. μƒμ„±μžλŠ” ν΄λž˜μŠ€μ— 1κ°œλŠ” μžˆμ–΄μ•Ό ν•˜λ©°, 생성가 μ½”λ“œκ°€ μ—†μœΌλ©΄ μ»΄νŒŒμΌλŸ¬κ°€ κΈ°λ³Έ μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ 생성 

    (** μƒμ„±μž μ½”λ“œκ°€ ν•˜λ‚˜λΌλ„ 있으면, μ»΄νŒŒμΌλŸ¬λŠ” κΈ°λ³Έ μƒμ„±μžκ°€ 없더라도 μžλ™μœΌλ‘œ μƒμ„±ν•˜μ§€ μ•ŠμŒ)

 

πŸ’Œ μ˜€λ²„λΌμ΄λ”©κ³Ό μ˜€λ²„λ‘œλ”©μ€ 무엇이며 μ–΄λ–€ 차이점이 μžˆλŠ”κ°€?

μ˜€λ²„λ‘œλ”©(Overloading)은 λ§€κ°œλ³€μˆ˜μ˜ 개수, μœ ν˜•μ„ λ‹€λ₯΄κ²Œ ν•˜μ—¬ λ™μΌν•œ λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬κ°œ μ‚¬μš©ν•˜λŠ” 것

μ˜€λ²„λΌμ΄λ”©(Overriding)은 μƒμœ„ ν΄λž˜μŠ€κ°€ 가지고 μžˆλŠ” λ©”μ„œλ“œλ₯Ό ν•˜μœ„ ν΄λž˜μŠ€κ°€ μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것 

 

πŸ’Œ 좔상 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ 차이

- 좔상 ν΄λž˜μŠ€λŠ” 주둜 상속을 λ°›μ•„μ„œ κΈ°λŠ₯을 ν™•μž₯ν•˜λŠ”λ° λͺ©μ μ΄ 있고, μΈν„°νŽ˜μ΄μŠ€λŠ” λ™μΌν•œ μ‹€ν–‰ κΈ°λŠ₯을 보μž₯ν•˜κΈ° μœ„ν•΄ 주둜 μ‚¬μš©.

- μΆ”μƒν΄λž˜μŠ€λŠ” 일반 λ©”μ„œλ“œ μ •μ˜κ°€ κ°€λŠ₯ν•˜λ©°, extends ν‚€μ›Œλ“œλ₯Ό 톡해 상속. 닀쀑상속이 λΆˆκ°€λŠ₯ν•˜λ©° λ³€μˆ˜μ™€ μ ‘κ·Όμ œν•œμž μ‚¬μš©μ— μ œν•œ μ—†μŒ. 

- μΈν„°νŽ˜μ΄μŠ€λŠ” κ·Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” λͺ¨λ“  ν΄λž˜μŠ€μ— λŒ€ν•΄ νŠΉμ •ν•œ λ©”μ„œλ“œκ°€ λ°˜λ“œμ‹œ μ‘΄μž¬ν•˜λ„λ‘ κ°•μ œν•¨. static, defalut λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  수 있고, implements ν‚€μ›Œλ“œλ₯Ό 톡해 상속. λ˜ν•œ 닀쀑 상속이 κ°€λŠ₯ν•˜λ©° μ ‘κ·Όμ œν•œμžλŠ” public, λ³€μˆ˜λŠ” static final μƒμˆ˜λ§Œ μ‚¬μš© κ°€λŠ₯. 

 

< 좔상 클래슀 vs μΈν„°νŽ˜μ΄μŠ€ >

곡톡점 
1. 객체λ₯Ό 생성(μΈμŠ€ν„΄μŠ€ν™”) ν•  수 μ—†λ‹€.
2. 좔상 λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•œλ‹€. 
3. μƒμ†λ°›λŠ” ν΄λž˜μŠ€μ—μ„œλŠ” 좔상 λ©”μ„œλ“œλ₯Ό λ°˜λ“œμ‹œ μž¬μ •μ˜ν•˜μ—¬ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€. 

차이점
ν•­λͺ© 좔상 클래슀 μΈν„°νŽ˜μ΄μŠ€
κ°œλ…κ³Ό λͺ©μ  상속 λ°›μ•„μ„œ κΈ°λŠ₯을 ν™•μž₯μ‹œν‚€λŠ”λ° λͺ©μ  κ΅¬ν˜„ 객체의 λ™μΌν•œ μ‹€ν–‰ κΈ°λŠ₯을 보μž₯ν•˜κΈ° μœ„ν•œ λͺ©μ 
일반 λ©”μ„œλ“œ 일반 λ©”μ„œλ“œ μ •μ˜κ°€ κ°€λŠ₯ 일반 λ©”μ„œλ“œ μ •μ˜ λΆˆκ°€λŠ₯
(Java 8  이후 static, default λ©”μ„œλ“œ μ •μ˜ κ°€λŠ₯)
상속 ν‚€μ›Œλ“œ  extends implements
닀쀑 상속 λΆˆκ°€λŠ₯ κ°€λŠ₯
μ‚¬μš© κ°€λŠ₯ λ³€μˆ˜ μ œν•œ μ—†μŒ staic final(μƒμˆ˜)
μ‚¬μš© κ°€λŠ₯ μ ‘κ·Ό μ œν•œμž μ œν•œ μ—†μŒ public
참고자료 :
1. https://hahahoho5915.tistory.com/70
2. https://devlog-wjdrbs96.tistory.com/370

 

 

[Java] μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 클래슀 μ°¨μ΄λŠ” λ¬΄μ—‡μΌκΉŒ?

μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 클래슀 μ°¨μ΄λŠ”? 이번 κΈ€μ—μ„œλŠ” μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 클래슀의 차이에 λŒ€ν•΄μ„œ μ •λ¦¬ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ 이 μ§ˆλ¬Έμ€ λ©΄μ ‘μ—μ„œλ„ 자주 λ¬Όμ–΄λ³΄λŠ” 질문이고, μ•½κ°„ μ•Œλ“― 말듯 ν•œλ°

devlog-wjdrbs96.tistory.com

 

πŸ’Œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

1. 닀쀑 상속이 ν•„μš”ν•  λ•Œ

2. κ΅¬ν˜„ λ‚΄μš©μ€ λ‹€λ₯΄λ‚˜ νŠΉμ • κΈ°λŠ₯을 보μž₯ν•˜κ³  싢을 λ•Œ μ‚¬μš© 

3. ν˜‘μ—…μ‹œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μž‘μ„±ν•˜μ—¬ κΈ°λŠ₯을 보μž₯ν•˜κ³  λ©”μ„œλ“œλͺ… 등을 미리 μ •ν•  수 있음 

 

참고자료 

https://mungto.tistory.com/314

 

μžλ°”(Java) - Interfaceλž€ 무엇인가(μ •μ˜, μ‚¬μš©μ΄μœ , 예제)?

1. μΈν„°νŽ˜μ΄μŠ€λž€? μΈν„°νŽ˜μ΄μŠ€λŠ” μžλ°”μ—μ„œ ν΄λž˜μŠ€λ“€μ΄ κ΅¬ν˜„ν•΄μ•Όν•˜λŠ” λ™μž‘μ„ μ§€μ •ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©λ˜λŠ” 좔상 μžλ£Œν˜•μ΄λ‹€. class λŒ€μ‹  interfaceλΌλŠ” ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ μ„ μ–Έν•  수 있으며 λ©”μ†Œλ“œ μ‹œκ·Έ

mungto.tistory.com

 

πŸ’Œ μ˜ˆμ™Έ 처리 (Exception Handling)

- ν”„λ‘œκ·Έλž¨ μ‹€ν–‰μ‹œ λ°œμƒν•  수 μžˆλŠ” 예기치 λͺ»ν•œ μ˜ˆμ™Έμ˜ λ°œμƒμ— λŒ€λΉ„ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” ν–‰μœ„

- μ˜ˆμ™Έ λ°œμƒμœΌλ‘œ μΈν•œ 싀행쀑인 ν”„λ‘œκ·Έλž¨μ˜ κ°‘μž‘μŠ€λŸ° 비정상 μ’…λ£Œλ₯Ό 막고, 정상적인 μ‹€ν–‰μƒνƒœλ₯Ό μœ μ§€ν•˜λŠ” 것

- μ’…λ₯˜ 

  1) try ~ catch : μ˜ˆμ™Έμ— λŒ€ν•œ μ΅œμ’…μ μΈ μ±…μž„μ„ 지고 μ²˜λ¦¬ν•˜λŠ” 방식

  2) throws : λ°œμƒν•œ μ˜ˆμ™Έμ˜ μ±…μž„μ„ ν˜ΈμΆœν•˜λŠ” μͺ½μ΄ μ±…μž„μ§€λ„λ‘ ν•˜λŠ” 방식 (주둜 ν˜ΈμΆœν•˜λŠ” μͺ½μ— μ˜ˆμ™Έλ₯Ό 보고할 λ•Œ μ‚¬μš©ν•¨)

 

< μžλ°” 였λ₯˜(Error)와 μ˜ˆμ™Έ(Exception) >
1. 였λ₯˜(Error)
- ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰ 쀑 μ–΄λ–€ 원인에 μ˜ν•΄μ„œ μ˜€μž‘λ™μ„ ν•˜κ±°λ‚˜ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜λŠ” 경우
- μ‹œμŠ€ν…œμ΄ μ’…λ£Œλ˜μ–΄μ•Ό ν•  μˆ˜μ€€κ³Ό 같이 μˆ˜μŠ΅ν•  수 μ—†λŠ” μ‹¬κ°ν•œ 문제둜 개발자 미리 μ˜ˆμΈ‘ν•˜μ—¬ 방지할 수 μ—†μŒ
  1) 컴파일 μ—λŸ¬ : ν”„λ‘œκ·Έλž¨ μ½”λ“œ μž‘μ„± 쀑 λ°œμƒν•˜λŠ” 문법적 였λ₯˜, 컴파일 μ‹œμ μ— λ°œμƒν•˜λŠ” μ˜ˆμ™Έ
  2) λŸ°νƒ€μž„ μ—λŸ¬ : 싀행쀑인 ν”„λ‘œκ·Έλž¨μ΄ μ˜λ„ν•˜μ§€ μ•Šμ€ λ™μž‘μ„ ν•˜κ±°λ‚˜ ν”„λ‘œκ·Έλž¨μ΄ μ€‘μ§€λ˜λŠ” 였λ₯˜, ν”„λ‘œκ·Έλž¨ μ‹€ν–‰μ‹œ λ°œμƒ
2. μ˜ˆμ™Έ(Exception)
- κ°œλ°œμžκ°€ κ΅¬ν˜„ν•œ λ‘œμ§μ—μ„œ λ°œμƒν•œ μ‹€μˆ˜λ‚˜ μ‚¬μš©μžμ˜ 영ν–₯에 μ˜ν•΄ λ°œμƒ.
- κ°œλ°œμžκ°€ 미리 μ˜ˆμΈ‘ν•˜μ—¬ 방지할 수 μžˆμœΌλ―€λ‘œ 상황에 λ§žλŠ” μ˜ˆμ™Έ μ²˜λ¦¬κ°€ ν•„μš”
 1) Checked Exception 
     - μ˜ˆμ™Έ μ²˜λ¦¬κ°€ ν•„μˆ˜μ΄λ©°, μ²˜λ¦¬ν•˜μ§€ μ•ŠμœΌλ©΄ μ»΄νŒŒμΌλ˜μ§€ μ•ŠμŒ 
     - 컴파일 λ‹¨κ³„μ—μ„œ λͺ…ν™•ν•˜κ²Œ Exception 체크가 κ°€λŠ₯함 
     - μ˜ˆμ™Έ λ°œμƒμ‹œ νŠΈλžœμž­μ…˜μ„ roll-backν•˜μ§€ μ•Šκ³  μ˜ˆμ™Έλ₯Ό 던져쀌 
     - JVM 외뢀와 톡신할 λ•Œ 주둜 μ“°μž„
 2) Unckecked Exception
    - Runtime Exception ν•˜μœ„μ˜ λͺ¨λ“  μ˜ˆμ™Έ 
    - NullPointerException, IndexOutOfBoundException λ“±
    - μ‹€ν–‰κ³Όμ • 쀑 μ–΄λ– ν•œ νŠΉμ • 논리에 μ˜ν•΄ 발견
    - μ˜ˆμ™Έ λ°œμƒμ‹œ νŠΈλžœμž­μ…˜μ„ roll-back
    - λͺ…μ‹œμ μΈ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•˜μ§€ μ•Šμ•„λ„ 됨

참고자료 : https://velog.io/@jipark09/Java-Error%EC%99%80-Exception-%EC%B0%A8%EC%9D%B4
 

[Java] Error와 Exception 차이

javaλŠ” 였λ₯˜κ°€ λ°œμƒν•˜κ±°λ‚˜ λ°œμƒν•  여지가 μžˆλŠ” μ—¬λŸ¬μƒν™©μ— λŒ€ν•œ μ˜ˆμ™Έλ₯Ό λ§Œλ“€μ–΄λ‘μ—ˆλ‹€. μš°λ¦¬μ—κ²Œ μ΅μˆ™ν•œ IllegalArgumentException을 λΉ„λ‘―ν•΄ 원인을 μ°ΎκΈ° νž˜λ“  NullPointerException도 μžˆλ‹€. λ˜ν•œ, 파일 처리λ₯Ό

velog.io

 

πŸ’Œ μžλ°” 8, 11, 17의 νŠΉμ •(곡톡점 & 차이점)

Java 8

- 2030λ…„κΉŒμ§€ 지원

- 였라클이 μžλ°”λ₯Ό μΈμˆ˜ν•œ ν›„ μΆœμ‹œν•œ 첫번째 LTS 버전

- 32bitλ₯Ό μ§€μ›ν•˜λŠ” λ§ˆμ§€λ§‰ 곡식 Java 버전

- Oracle JDK(유료)와 OpenJDK(무료)둜 λ‚˜λ‰¨

- μƒˆλ‘œμš΄ λ‚ μ§œμ™€ μ‹œκ°„ API(LocalDateTime  λ“±)

- λžŒλ‹€μ‹(Lamda), Stream API

- PermGen μ˜μ—­ μ‚­μ œ 

- Static Link JNI Library

 

Java 11

- 2026λ…„ 9μ›”κΉŒμ§€ 지원

- Oracle JDK와 OpenJDK 톡합

- Oracle JDKκ°€ κ΅¬λ…ν˜• 유료 λͺ¨λΈλ‘œ μ „ν™˜ 

- λžŒλ‹€ 지역 λ³€μˆ˜ μ‚¬μš©λ²• λ³€κ²½

- Third Party JDK둜의 이전 ν•„μš” 

- HTTP ν΄λΌμ΄μ–ΈνŠΈ ν‘œμ€€ν™” κΈ°λŠ₯

 

Java 17

- 2029λ…„ 9μ›”κΉŒμ§€ 지원(κ°€μž₯ μ΅œμ‹  LTS 버전)

- 봉인 클래슀(Sealed Class) 정식 μΆ”κ°€ 

- νŒ¨ν„΄ 맀칭 프리뷰 단계 

- Incubator (Foreign Function & Memory API) 

- μ• ν”Œ M1 및 이후 ν”„λ‘œμ„Έμ„œ νƒ‘μž¬ μ œν’ˆκ΅°μ— λŒ€ν•œ 정식 지원 

- λ‚œμˆ˜ 생성 API μΆ”κ°€ 

- Spring Boot 3.0의 μ΅œμ†Œλ²„μ „

 

πŸ’Œ μžλ°” λΆˆλ³€ 객체

- 객체 생성 이후 λ‚΄λΆ€μ˜ μƒνƒœκ°€ λ³€ν•˜μ§€ μ•ŠλŠ” 객체 (ex. String, Integer, Boolean λ“±)

- μ›μ‹œ νƒ€μž…μ˜ 경우 final ν‚€μ›Œλ“œλ₯Ό 톡해 생성 κ°€λŠ₯ 

- μ°Έμ‘° νƒ€μž…μΌ 경우 좔가적인 μž‘μ—…μ΄ ν•„μš” 

  1) 객체 : ν•„λ“œμ˜ μ°Έμ‘° λ³€μˆ˜λ„ λΆˆλ³€ 객체둜 λ³€κ²½(private final), setter λ―Έμ‚¬μš©

  2) λ°°μ—΄ : 배열을 λ°›μ•„ copyν•˜μ—¬ μ €μž₯ν•˜κ³ , getterλ₯Ό clone으둜 λ°˜ν™˜(방어적 볡사)

 

πŸ’Œ λΆˆλ³€ κ°μ²΄λ‚˜ final을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 이유

1. Thread에 μ•ˆμ „ν•΄ 동기화λ₯Ό κ³ λ €ν•˜μ§€ μ•Šμ•„λ„ 됨

    - κ³΅μœ μžμ›μ΄ λΆˆλ³€μ΄λ―€λ‘œ 항상 λ™μΌν•œ 값을 λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έ

2. μ‹€νŒ¨ μ›μžμ μΈ λ©”μ†Œλ“œλ₯Ό λ§Œλ“€ 수 있음

    - κ°€λ³€ 객체λ₯Ό 톡해 μž‘μ—…μ„ ν•˜λŠ” 도쀑 μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ”λΌλ„ λ©”μ„œλ“œ 호좜 μ „μ˜ μƒνƒœλ₯Ό μœ μ§€ν•  수 μžˆμ–΄ μ˜ˆμ™Έ λ°œμƒ μ „κ³Ό λ˜‘κ°™μ€ μƒνƒœλ‘œ λ‹€μŒ λ‘œμ§μ„ μ²˜λ¦¬ν•  수 있음 

3. λΆ€μˆ˜νš¨κ³Όλ₯Ό ν”Όν•΄ 였λ₯˜λ₯Ό μ΅œμ†Œν™” ν•  수 있음 

    - λΆˆλ³€ 객체의 값을 μˆ˜μ •ν•  수 μ—†μœΌλ―€λ‘œ λ‹€λ₯Έ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜μ–΄λ„ 객체의 μƒνƒœκ°€ μœ μ§€λ˜μ–΄ μ•ˆμ „μ—κ²Œ 객체λ₯Ό λ‹€μ‹œ μ‚¬μš©ν•  수 있음

4. λ©”μ†Œλ“œ 호좜 μ‹œ νŒŒλΌλ―Έν„° 값이 λ³€ν•˜μ§€ μ•ŠμŒμ„ 보μž₯ν•  수 있음

5. 가비지 μ»¬λ ‰μ…˜μ„ μ„±λŠ₯을 높일 수 있음

 

참고자료. https://mangkyu.tistory.com/131

 

[Java] λΆˆλ³€ 객체(Immutable Object) 및 final을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 이유

ν΄λ¦°μ½”λ“œλ₯Ό 읽어도, μ΄νŽ™ν‹°λΈŒ μžλ°”λ₯Ό 읽어도, κ°œλ°œμ„ μž˜ν•˜λŠ” νŒ€μ˜ μ–˜κΈ°λ₯Ό 듀어도 항상 쒋은 μ½”λ“œλ₯Ό μ–˜κΈ°ν•  λ•Œλ©΄ λΆˆλ³€μ˜ 객체λ₯Ό ν•„μ—°μ μœΌλ‘œ μ ‘ν•˜κ²Œ λ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μ΄λ²ˆμ—λŠ” λΆˆλ³€μ˜ 객

mangkyu.tistory.com

 

πŸ’Œ μ œλ„€λ¦­(Generic)μ΄λž€?

클래슀 λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•  데이터 νƒ€μž…μ„ μ™ΈλΆ€μ—μ„œ μ§€μ •ν•˜λŠ” 기법

- μ»΄νŒŒμΌμ‹œ νƒ€μž… 체크λ₯Ό ν•  수 있음 (μ—λŸ¬λ₯Ό 사전에 방지)

- νƒ€μž… λ³€ν™˜ λΆˆν•„μš”

- λΉ„μŠ·ν•œ κΈ°λŠ₯을 μ§€μ›ν•˜λŠ” 경우 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ΄ 높아짐

** JDK 1.7λΆ€ν„°λŠ” μ•žμ— μ„ μ–Έλœ νƒ€μž…μœΌλ‘œ μ»΄νŒŒμΌλŸ¬μ—μ„œ 좔츑이 κ°€λŠ₯ν•˜μ—¬ 뒀에 μƒμ„±μžμ—μ„œ μ œλ„€λ¦­μ„ μƒλž΅ν•  수 있음

 

νƒ€μž… νŒŒλΌλ―Έν„° 
E - Element (μ»¬λ ‰μ…˜ ν΄λž˜μŠ€μ™€ 같이 λ°°μ—΄ 기반으둜 λ˜μ–΄ μžˆλŠ” κ΅¬μ‘°μ—λŠ” Eκ°€ μ–΄μšΈλ¦Ό)
K - Key
N - Number
V - Value
T - Type
? - μ™€μΌλ“œμΉ΄λ“œ (μ•Œμˆ˜ μ—†λŠ” νƒ€μž…/ νŒŒλΌλ―Έν„°μ˜ κ°’μ˜ νƒ€μž…μ΄ λͺ…ν™•ν•˜μ§€ μ•Šμ„ λ•Œ)

 

πŸ’Œ μ ‘κ·Ό μ œν•œμž(Access Modifier)의 μ’…λ₯˜μ™€ μ„€λͺ…

λ³€μˆ˜ λ˜λŠ” λ©”μ„œλ“œμ˜ μ ‘κ·Ό λ²”μœ„λ₯Ό μ„€μ •ν•΄μ£ΌκΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ˜ˆμ•½μ–΄

1. public : μ ‘κ·Ό μ œν•œμ΄ μ—†μŒ (같은 ν”„λ‘œμ νŠΈ λ‚΄ μ–΄λ””μ„œλ“  μ‚¬μš© κ°€λŠ₯)

2. private : ν•΄λ‹Ή ν΄λž˜μ„œμ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯

3. protected : ν•΄λ‹Ή νŒ¨ν‚€μ§€ λ‚΄, λ‹€λ₯Έ νŒ¨ν‚€μ§€μ—μ„œ 상속받은 μžμ† ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯ 

4. default : ν•΄λ‹Ή νŒ¨ν‚€μ§€ λ‚΄μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯

 

πŸ’Œ 클래슀(Class)와 객체(Object)

클래슀 

- 객체λ₯Ό μ •μ˜ν•œ μ„€κ³„λ„λ‘œ 객체λ₯Ό μƒμ„±ν•˜λŠ”λ° μ‚¬μš© 

객체

- ν΄λž˜μŠ€μ— μ˜ν•΄ μ •μ˜λ˜κ³  μ„€κ³„λœ λ‚΄μš©μ„ 기반으둜 생성

- μƒμ„±λœ 객체λ₯Ό μΈμŠ€ν„΄μŠ€λΌκ³  함

 

πŸ’Œ μžλ°”μ—μ„œ null을 μ•ˆμ „ν•˜κ²Œ λ‹€λ£¨λŠ” 법

μžλ°”μ—μ„œ κ°€μž₯ 많이 λ°œμƒν•˜λŠ” 였λ₯˜λŠ” NPE(NullPointException)으둜 μ—¬λŸ¬ 방법이 μžˆμœΌλ‚˜ Optional을 μ‚¬μš©ν•  수 있음

Optional의 λ©”μ„œλ“œλ₯Ό 톡해 null μ—¬λΆ€λ₯Ό ν™•μΈν•˜κ³  κΈ°λ³Έ κ°’μœΌλ‘œ μ„€μ •ν•˜κ±°λ‚˜ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œμΌœ μ²˜λ¦¬ν•  수 있음

 

Optional 클래슀

  - Java 8에 λ„μž…λœ Optional λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ κ°’μ˜ 쑴재 μ—¬λΆ€λ₯Ό μ²΄ν¬ν•˜κ³  값이 μ—†λŠ” κ²½μš°μ— λŒ€ν•œ 기본처리λ₯Ό ν•  수 있음

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        String str = "Hello, World!";

        // Optional 객체 생성
        Optional<String> optionalStr = Optional.of(str);

        // κ°’μ˜ 쑴재 유무 확인
        boolean isPresent = optionalStr.isPresent();
        System.out.println("κ°’μ˜ 쑴재 유무: " + isPresent);  // 좜λ ₯: κ°’μ˜ 쑴재 유무: true

        // κ°’ μΆ”μΆœ
        String value = optionalStr.get();
        System.out.println("κ°’: " + value);  // 좜λ ₯: κ°’: Hello, World!

        // κ°’ λ³€κ²½
        optionalStr = optionalStr.map(s -> s.toUpperCase());
        value = optionalStr.get();
        System.out.println("λ³€κ²½λœ κ°’: " + value);  // 좜λ ₯: λ³€κ²½λœ κ°’: HELLO, WORLD!

        // 값이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ λŒ€μ²΄ κ°’ μ„€μ •
        String defaultValue = "Default Value";
        String result = optionalStr.orElse(defaultValue);
        System.out.println("값이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ λŒ€μ²΄ κ°’: " + result);  // 좜λ ₯: 값이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ λŒ€μ²΄ κ°’: HELLO, WORLD!

        // 값이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ μ˜ˆμ™Έ λ°œμƒ
        String nonNullValue = optionalStr.orElseThrow(IllegalStateException::new);
        System.out.println("값이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ μ˜ˆμ™Έ λ°œμƒ: " + nonNullValue);
    }

 

참고자료. https://velog.io/@gun_123/Java%EC%9D%98-Optional-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Null-%EC%95%88%EC%A0%84%EC%84%B1%EA%B3%BC-%EA%B0%92%EC%9D%98-%EC%A1%B4%EC%9E%AC-%EC%9C%A0%EB%AC%B4%EB%A5%BC-%ED%91%9C%ED%98%84%ED%95%98%EB%8A%94-%ED%81%B4%EB%9E%98%EC%8A%A4

 

Java의 Optional 자료ꡬ쑰: Null μ•ˆμ „μ„±κ³Ό κ°’μ˜ 쑴재 유무λ₯Ό ν‘œν˜„ν•˜λŠ” 클래슀

Javaμ—μ„œλŠ” μ½”λ“œ μž‘μ„± μ‹œ NullPointerException λ“±μ˜ μ˜ˆμ™Έλ₯Ό λ°©μ§€ν•˜κ³ , κ°’μ˜ 쑴재 유무λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•΄ Optionalμ΄λΌλŠ” νŠΉλ³„ν•œ 자료ꡬ쑰λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. Optional은 null κ°’ 처리λ₯Ό μ•ˆμ „ν•˜κ²Œ λ‹€λ£° 수 μžˆλ„λ‘

velog.io

 

πŸ’Œ μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬

- λ‹€μˆ˜μ˜ 데이터λ₯Ό 쉽고 효과적으둜 관리할 수 μžˆλŠ” ν‘œμ€€ν™”λœ 방법을 μ œκ³΅ν•˜λŠ” 클래슀의 집합

- 데이터λ₯Ό μ €μž₯ν•˜λŠ” 자료 ꡬ쑰와 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬μ‘°ν™”ν•˜μ—¬ 클래슀둜 κ΅¬ν˜„ν•΄ 놓은 것

 

List : μˆœμ„œκ°€ μžˆλŠ” λ°μ΄ν„°μ˜ 집합, λ°μ΄ν„°μ˜ 쀑볡 ν—ˆμš©

 - ArrayList

   1) 배열을 μ΄μš©ν•˜λŠ” 클래슀둜 인덱슀λ₯Ό μ΄μš©ν•΄ λ°°μ—΄μ˜ μš”μ†Œμ— λΉ λ₯΄κ²Œ μ ‘κ·Όν•  수 있음 → O(1)

   2) λ°°μ—΄κ³Ό λ‹€λ₯΄κ²Œ 배열을 μΆ”κ°€ν•˜κ³  μ‚­μ œν•˜λŠ” λ©”μ„œλ“œκ°€ 쑴재 → O(N)

   3) 데이터 μΆ”κ°€μ‹œ 더 큰 μš©λŸ‰μ˜ μž„μ‹œ 배열을 λ§Œλ“€μ–΄ 볡사 

 - LinkedList

   1) μ—°κ²°λœ λ…Έλ“œλ“€μ˜ μ§‘ν•©μœΌλ‘œ 각 λ…Έλ“œλŠ” 데이터와 ν¬μΈν„°λ‘œ 이루어짐 

   2) 데이터 μΆ”κ°€μ‹œ μƒˆλ‘œμš΄ 데이터 λ…ΈνŠΈλ₯Ό λ§Œλ“€κ³  이전 λ…Έλ“œμ˜ 포인터λ₯Ό μƒˆ λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€κ²Œ λ§Œλ“¦

   3) 각 λ…Έλ“œλŠ” μ•ž, λ’€μ˜ λ…ΈνŠΈμ˜ μœ„μΉ˜λ₯Ό μ €μž₯

   4) νƒμƒ‰μ‹œ μ΅œλŒ€ O(N), μ‚½μž…/μ‚­μ œμ‹œ O(1) λ³΅μž‘λ„λ₯Ό 가짐

 - Stack(LIFO)

 - Queue(FIFO)

Set : μˆœμ„œ μ—†λŠ” λ°μ΄ν„°μ˜ μ§‘ν•©μœΌλ‘œ λ°μ΄ν„°μ˜ 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠμŒ

 - HashSet, TreeSet

Map : 킀와 κ°’μ˜ ν•œ 쌍으둜 μ΄λ£¨μ–΄μ§€λŠ” λ°μ΄ν„°μ˜ μ§‘ν•©μœΌλ‘œ μˆœμ„œκ°€ μ—†μŒ

 - ν‚€λŠ” 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•Šμ§€λ§Œ, 값은 쀑볡을 ν—ˆμš© 

 - HashMap, TreeMap, HashTable, Properties

 

참고자료. 

https://velog.io/@mdy0102/ArrayList-LinkedList%EC%9D%98-%ED%8A%B9%EC%A7%95%EA%B3%BC-%EC%B0%A8%EC%9D%B4

 

ArrayList, LinkedList의 νŠΉμ§•κ³Ό 차이

쀑볡을 ν—ˆμš©ν•˜κ³  μˆœμ„œλ₯Ό μœ μ§€ν•˜λ©° 인덱슀둜 μ›μ†Œλ“€μ„ κ΄€λ¦¬ν•œλ‹€λŠ” μ μ—μ„œ Array와 λΉ„μŠ·ν•˜μ§€λ§Œ ArrayListλŠ” λ°°μ—΄κ³Ό λ‹€λ₯΄κ²Œ 배열을 μΆ”κ°€ν•˜κ³  μ‚­μ œν•˜λŠ” λ©”μ„œλ“œκ°€ μ‘΄μž¬λ°μ΄ν„° μΆ”κ°€μ‹œ 더 큰 μš©λŸ‰μ˜ μž„μ‹œ

velog.io

 

πŸ’Œ List와 Map의 차이

ListλŠ” μˆœμ„œκ°€ 있고 쀑볡을 ν—ˆμš©ν•˜μ§€λ§Œ, Map은 key-value 쌍으둜 이루어진 μ§‘ν•©μœΌλ‘œ μˆœμ„œκ°€ μ—†μŒ

πŸ’Œ Java 데이터 νƒ€μž… μ„€λͺ… (Array, ArrayList, Map, LinkedList, HashMap)

1. Array λ°°μ—΄ : λ™μΌν•œ 데이터 νƒ€μž…μ˜ 집합

2. ArrayList : μžλ°” μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬μ—μ„œ  List μΈν„°νŽ˜μ΄μŠ€μ— μ†ν•˜λ©° μˆœμ„œκ°€ 있고, 쀑볡이 ν—ˆμš©λ˜λ©°, λ°°μ—΄κ³Ό 달리 μ‚½μž…, μ‚­μ œ λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•¨. 자료 탐색에 용이 

3. LinkedList : ArrayList의 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ λ“±μž₯ν•œ κ²ƒμœΌλ‘œ μ—°κ²°λœ λ…Έλ“œ κ°„μ˜ 집합을 μ˜λ―Έν•¨. λ…Έλ“œλŠ” 데이터와 포인터λ₯Ό 포함해 ν¬μΈν„°λŠ” λ…Έλ“œμ˜ μ•ž, λ’€ μœ„μΉ˜λ₯Ό μ €μž₯. μ‚½μž…, μ‚­μ œκ°€ λΉˆλ²ˆν•  κ²½μš°μ— μ‚¬μš©ν•˜λ©΄ μ’‹μŒ 

4. Map: key-value 쌍의 μ§‘ν•©μœΌλ‘œ μˆœμ„œκ°€ μ—†λŠ” 데이터 νƒ€μž…

5. HashMap : ν•΄μ‹±(Hashing)된 맡(Map)으둜 해싱을 μ‚¬μš©ν•˜μ—¬ λ§Žμ€ μ–‘μ˜ 데이터λ₯Ό κ²€μƒ‰ν•˜λŠ”λ° λ›°μ–΄λ‚œ μ„±λŠ₯을 λ³΄μž„

 

πŸ’Œ μ–΄λ…Έν…Œμ΄μ…˜(Anotation)

- μ†ŒμŠ€ μ½”λ“œμ— μΆ”κ°€ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλŠ” 메타 λ°μ΄ν„°μ˜ μΌμ’…μœΌλ‘œ @ 기호λ₯Ό μ•žμ— λΆ™μ—¬ μ‚¬μš©

- 메타 λ°μ΄ν„°λž€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ²˜λ¦¬ν•΄μ•Όν•  데이터가 μ•„λ‹ˆλΌ 컴파일 κ³Όμ •κ³Ό μ‹€ν–‰ κ³Όμ •μ—μ„œ μ½”λ“œλ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ”μ§€ μ•Œλ €μ£ΌκΈ° μœ„ν•œ μΆ”κ°€ 정보

 

πŸ’Œ 직렬화(Serialization) & 역직렬화(Deserialization)

직렬화 : μžλ°” μ‹œμŠ€ν…œ λ‚΄λΆ€μ—μ„œ μ‚¬μš©λ˜λŠ” 객체 λ˜λŠ” 데이터λ₯Ό μ™ΈλΆ€μ˜ μ‹œμŠ€ν…œμ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ°”μ΄νŠΈ ν˜•νƒœλ‘œ 데이터λ₯Ό λ³€ν™˜ν•˜λŠ” 기술 

역직렬화 : μ§λ ¬ν™”λœ 데이터λ₯Ό λ‹€μ‹œ μžλ°” 객체의 ν˜•νƒœλ‘œ λ§Œλ“œλŠ” κ³Όμ •

 

πŸ’Œ MVC κ΅¬μ‘°λž€

- Model - View - Controller둜 GUI 기반의 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ— μ‚¬μš©λœ λ””μžμΈ νŒ¨ν„΄

- ν™”λ©΄κ³Ό 데이터 처리λ₯Ό 뢄리해 μ½”λ“œ κ°„μ˜ 쒅속성을 쀄이고 ꡬ성 μš”μ†Œ κ°„μ˜ 역할을 λͺ…ν™•ν•˜κ²Œ ν•¨μœΌλ‘œμ¨ μ½”λ“œ 뢄리가 쉽고 ν˜‘μ—…μ„ μš©μ΄ν•˜κ²Œ 함 

- Model :  데이터 처리 μ˜μ—­ (λ°μ΄ν„°λ² μ΄μŠ€ 연동을 μœ„ν•œ DAO, 데이터 ꡬ쑰λ₯Ό ν‘œν˜„ν•˜λŠ” DO둜 ꡬ성)

- View : 화면을 λ‹΄λ‹Ήν•˜λŠ” λΆ€λΆ„ (JSP λ“±)

- Controller : μ‚¬μš©μž μš”μ²­μ„ 처리. μ»¨νŠΈλ‘€λŸ¬λŠ” νŠΉμ • λ·°λ₯Ό 지정해야 ν•˜κΈ° λ•Œλ¬Έμ— 뷰와 쒅속관계가 λ°œμƒν•  수 밖에 μ—†λŠ” ꡬ쑰. λ”°λΌμ„œ 컨트둀러의 역할이 μ»€μ§€λ―€λ‘œ Service단이 생김. 

 

πŸ’Œ DAO, DTO, VO

DAO(Data Access Object)

- DB의 데이터에 μ ‘κ·Όν•˜κΈ° μœ„ν•œ 객체

- 직접 DB에 μ ‘κ·Όν•˜μ—¬ 데이터λ₯Ό μ‚½μž…, μ‚­μ œ, 쑰회

- ν˜„μž¬ 많이 μ“°μ΄λŠ” MyBatis 등을 μ‚¬μš©ν•  경우 컀λ„₯μ…˜ν’€κΉŒμ§€ μ œκ³΅ν•˜λ―€λ‘œ DAOλ₯Ό λ³„λ„λ‘œ λ§Œλ“œλŠ” κ²½μš°λŠ” λ“œλ―ˆλ‹€.

 

DTO(Data Transfer Object) 

- 계측 κ°„(Controller, View, Business Layer) 데이터 κ΅ν™˜μ„ μœ„ν•œ Java Bean

- λ‘œμ§μ„ 가지지 μ•ŠλŠ” 데이터 객체둜 getter/setter λ©”μ„œλ“œλ§Œ 가진 클래슀

 

VO(Value Object)

- Read-Only 속성을 가진 κ°’ 였브젝트(λΆˆλ³€)