JiYoung Dev πŸ–₯

[JAVA] μžλ°” μ‹œμž‘ λ³Έλ¬Έ

full stack/JAVA

[JAVA] μžλ°” μ‹œμž‘

Shinjio 2023. 3. 18. 17:44

2023.03.15 ~ 16 볡슡

 

πŸ”Ž 컴퓨터와 ν”„λ‘œκ·Έλž˜λ°

πŸ“– ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄

ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” 컴퓨터가 μ‹€ν–‰ν•  ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λŠ” μ–Έμ–΄. μ»΄ν“¨ν„°μ˜ CPUλŠ” μ΄μ§„μˆ˜(binary code)인 0κ³Ό 1밖에 μ΄ν•΄ν•˜μ§€ λͺ»ν•˜λ©° μ΄μ§„μˆ˜ λͺ…λ Ήμ–΄λ“€λ‘œ κ΅¬μ„±λœ μ–Έμ–΄λ₯Ό 기계어(machine language)라고 함. μ‚¬λžŒμ΄ 직접 기계어 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λŠ” 것은 νž˜λ“€κΈ° λ•Œλ¬Έμ— κΈ°κ³„μ–΄μ˜ 각 λͺ…령을 ADD, SUB, MOVE λ“± 가급적 ν‘œν˜„ν•˜κΈ° μ‰¬μš΄ 상징적인 λ‹ˆλͺ¨λ‹‰ 기호(mnemonic symbol)둜 μΌλŒ€μΌ λŒ€μ‘μ‹œν‚¨ μ–΄μ…ˆλΈ”λ¦¬μ–΄(assembly language)κ°€ λ§Œλ“€μ–΄μ‘ŒμŒ. μ–΄μ…ˆλΈ”λ¦¬μ–΄ μ—­μ‹œ μ‚¬λžŒμ΄ 닀루기 νž˜λ“€κ³ , λ‹€μ–‘ν•œ ν”„λ‘œκ·Έλž¨μ΄λ‚˜ 자료λ₯Ό ν‘œν˜„ν•˜κΈ°μ—λŠ” ν•œκ³„κ°€ μžˆμ–΄, μ‚¬λžŒμ΄ μ΄ν•΄ν•˜κΈ° 쉽고, λ³΅μž‘ν•œ μ•Œκ³ λ¦¬μ¦˜μ΄λ‚˜ ν”„λ‘œκ·Έλž¨, 자료λ₯Ό 효율적으둜 ν‘œν˜„ν•  수 μžˆλŠ” κ³ κΈ‰μ–Έμ–΄κ°€ 생기기 μ‹œμž‘. κ³ κΈ‰ μ–Έμ–΄λŠ” μ΄ˆκΈ°μ— 절차 지ν–₯ μ–Έμ–΄ ν˜•νƒœλ₯Ό 거쳐 μ§€κΈˆμ˜ 객체 지ν–₯ μ–Έμ–΄λ‘œ 진화. 

 

πŸ“– ν”„λ‘œκ·Έλž¨ 컴파일과 μ‹€ν–‰

ν”„λ‘œκ·Έλž˜λ°μ€ 컴퓨터 μ–Έμ–΄λ‘œ ν”„λ‘œκ·Έλž¨ μ†ŒμŠ€(source) 파일 μž‘μ„±ν•˜λŠ” κ²ƒμœΌλ‘œ μ‹œμž‘. μ»΄ν“¨ν„°λŠ” C/C++κ³Ό 같은 κ³ κΈ‰ μ–Έμ–΄λ‘œ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨μ€ 직접 μ²˜λ¦¬ν•  수 μ—†κΈ° λ•Œλ¬Έμ—, 컴퓨터가 μ‹€ν–‰ν•  수 μžˆλŠ” 기계어 μ½”λ“œλ‘œ λ³€ν™˜ν•˜λŠ” 컴파일(compile) 과정이 ν•„μš”. μ»΄νŒŒμΌμ„ μ „λ‹΄ν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό 컴파일러(compiler)라고 ν•˜λ©°, 각 μ–Έμ–΄λ§ˆλ‹€ μ „μš© μ»΄νŒŒμΌλŸ¬κ°€ 있음. 

 

μžλ°”λŠ” μ†ŒμŠ€ ν”„λ‘œκ·Έλž¨μ˜ ν™•μž₯μžκ°€ .java이고, μžλ°” μ „μš© μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ .class 파일둜 컴파일되며, 클래슀 νŒŒμΌμ€ μžλ°” 가상 기계에 μ˜ν•΄ 싀행됨. 

 

πŸ”Ž μžλ°”μ˜ μΆœν˜„κ³Ό WORA

πŸ“– μžλ°”μ˜ νƒœλ™

썬 λ§ˆμ΄ν¬λ‘œμ‹œμŠ€ν…œμ¦ˆμ˜ μ œμž„μŠ€ 고슬링(James Gosling)κ³Ό λ‹€λ₯Έ 연ꡬ원듀이 κ°œλ°œν•œ (1995) 객체 지ν–₯적 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄.

κ°€μ „μ œν’ˆμ— μ‚¬μš©ν•  μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λͺ©μ μœΌλ‘œ ν”Œλž«νΌ 독립점(platform independant)이며 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 적은 μƒˆλ‘œμš΄ 언어와 μ‹€ν–‰ 체계λ₯Ό 개발.

 

πŸ“– WORA(Write Once Run Anywhere)

μžλ°”λŠ” 개발 λ‹¨κ³„μ—μ„œλΆ€ν„° ν”Œλž«νΌμ— λ…λ¦½μ μœΌλ‘œ μ„€κ³„λ˜μ—ˆμŒ. κΈ°μ‘΄ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ 가진 ν”Œλž«νΌ 쒅속성을 κ·Ήλ³΅ν•˜μ—¬, μš΄μ˜μ²΄μ œλ‚˜ ν•˜λ“œμ›¨μ–΄μ— 상관없이 μžλ°” 가상 기계(JVM)만 있으면 μ–΄λ””μ„œλ‚˜ μžλ°”λ‘œ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨μ— λ™μΌν•œ μ‹€ν–‰ ν™˜κ²½μ„ μ œκ³΅ν•˜λ©° λ™μΌν•œ μ‹€ν–‰ κ²°κ³Όλ₯Ό κΈ°λŒ€ν•  수 있음. 또, μžλ°”λŠ” μ›Ή λΈŒλΌμš°μ €, λΆ„μ‚° ν™˜κ²½μ˜ 지원 λ“±μœΌλ‘œ λ„€νŠΈμ›Œν¬μ— μ—°κ²°λœ μ–΄λŠ ν΄λΌμ΄νŠΈμ—μ„œλ„ 싀행이 κ°€λŠ₯함. μžλ°” ν”„λ‘œκ·Έλž¨μ€ μ–΄λ””μ„œλ“  ν•œ 번 μž‘μ„±ν•˜λ©΄, λ‹€μ‹œ μ»΄νŒŒμΌν•˜κ±°λ‚˜ μˆ˜μ •ν•˜μ§€ μ•Šκ³ , μ–΄λ–€ ν•˜λ“œμ›¨μ–΄μ—μ„œλ‚˜ μš΄μ˜μ²΄μ œμ—μ„œλ„ μ‹€ν–‰μ‹œν‚¬ 수 있음. 이λ₯Ό WORA라고 함. 

 

πŸ“– μžλ°” 가상 기계와 λ°”μ΄νŠΈ μ½”λ“œ

μžλ°”μ˜ ν”Œλž«νΌ 독립성을 κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” 것이 λ°”λ‘œ μžλ°” 가상 기계와 λ°”μ΄νŠΈ μ½”λ“œ λ•Œλ¬Έ.

 

βš™οΈ λ°”μ΄νŠΈ μ½”λ“œ

μžλ°” 가상 κΈ°κ³„μ—μ„œλ§Œ μ‹€ν–‰λ˜λŠ” κΈ°κ³„μ–΄λ‘œ μ–΄λ–€ CPU와도 κ΄€κ³„μ—†λŠ” λ°”μ΄λ„ˆλ¦¬ μ½”λ“œ(binary code). μžλ°” μ»΄νŒŒμΌλŸ¬λŠ” μžλ°” μ†ŒμŠ€ ν”„λ‘œκ·Έλž¨μ„ μ»΄νŒŒμΌν•˜μ—¬ λ°”μ΄νŠΈ μ½”λ“œλ‘œ 된 클래슀 νŒŒμΌμ„ 생성. 이 ν΄λž˜μ„œ νŒŒμΌμ€ μ»΄ν“¨ν„°μ˜ CPU에 μ˜ν•΄ 직접 μ‹€ν–‰λ˜μ§€ μ•Šκ³ , μžλ°” 가상 기계가 인터프리터 λ°©μ‹μœΌλ‘œ μ‹€ν–‰. 이 클래슀 νŒŒμΌμ€ μ–΄λ–€ 운영체제λ₯Ό νƒ‘μž¬ν•˜λ“  CPU의 μ’…λ₯˜κ°€ 무엇이든, PC이든 λ…ΈνŠΈλΆμ΄λ“  λŒ€ν˜• 컴퓨터이든 상관없이 μžλ°” 가상 κΈ°κ³„λ§Œ 있으면, λ°”λ‘œ μ‹€ν–‰ κ°€λŠ₯. 

 

μ˜€λΌν΄μ—μ„œ λ°°ν¬ν•˜λŠ” JDK(Java Development Kit)μ—λŠ” μžλ°” 클래슀 νŒŒμΌμ„ λ””μ–΄μ…ˆλΈ”(diassemble)ν•˜μ—¬ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ³Ό 수 μžˆλŠ” 도ꡬ(javap) 제곡 (λ°”μ΄νŠΈ μ½”λ“œ → μ–΄μ…ˆλΈ”λ¦¬ μ½”λ“œλ‘œ μ „ν™˜)

 

β€» CPUκ°€ 이해할 수 μžˆλŠ” μ–Έμ–΄λ₯Ό λ°”μ΄λ„ˆλ¦¬ μ½”λ“œλΌκ³  ν•˜λ©΄, λ°”μ΄νŠΈ μ½”λ“œλŠ” 가상 기계가 이해할 수 μžˆλŠ” μ½”λ“œλ₯Ό μœ„ν•œ 이진 ν‘œν˜„λ²•

 

βš™οΈ μžλ°” 가상 기계 

μžλ°” 가상 κΈ°κ³„λŠ” μ†Œν”„νŠΈμ›¨μ–΄λ‘œμ„œ μ„œλ‘œ λ‹€λ₯Έ ν”Œλž«νΌμ—μ„œ μžλ°” ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” λ™μΌν•œ ν™˜κ²½μ„ 제곡. ν•˜μ§€λ§Œ μžλ°” 가상 κΈ°κ³„λŠ” ν”Œλž«νΌλ§ˆλ‹€ μ„œλ‘œ λ‹€λ₯΄κ²Œ μž‘μ„±λ˜μ–΄ 배포되며 ν”Œλž«νΌ μ’…μ†μ μž„. 

 

πŸ“– μžλ°”μ˜ μ‹€ν–‰ ν™˜κ²½

μ—¬λŸ¬ μ†ŒμŠ€ 파일(.java)둜 λ‚˜λˆ„μ–΄ μž‘μ„±

μžλ°” μ»΄νŒŒμΌλŸ¬λŠ” 각 μ†ŒμŠ€νŒŒμΌμ„ μ»΄νŒŒμΌν•˜μ—¬ 클래슀 파일(.class)을 생성

ν•˜μ§€λ§Œ μžλ°”μ—μ„œλŠ” 이듀을 ν•˜λ‚˜μ˜ μ‹€ν–‰ 파일(.exe)둜 λ­‰μΉ˜λŠ” 링크의 과정이 μ—†μŒ

κ°œλ°œμžλŠ” μ—¬λŸ¬ 클래슀 파일 쀑 ν•˜λ‚˜λ₯Ό μ§€μ •ν•˜μ—¬ 싀행을 μ‹œμž‘ν•˜λ©΄, μžλ°” 가상 κΈ°κ³„λŠ” κ·Έ 클래슀 νŒŒμΌμ„ λ©”λͺ¨λ¦¬μ— λ‘œλ”©ν•˜κ³  싀행함. μ‹€ν–‰ 도쀑 λ‹€λ₯Έ 클래슀 νŒŒμΌμ΄λ‚˜ μžλ°” API의 클래슀 파일이 ν•„μš”ν•˜λ©΄, μžλ°” 가상 κΈ°κ³„λŠ” κ·Έ λ•Œ κ·Έ 클래슀 νŒŒμΌμ„ λ‘œλ”©ν•˜κ³  μ‹€ν–‰. 

μœ„μ™€ 같은 방식은 μ²˜μŒλΆ€ν„° λͺ¨λ“  클래슀 νŒŒμΌμ„ λ‘œλ”©ν•΄λ†“μ„ ν•„μš” 없이 λ‹Ήμž₯ μ‹€ν–‰ν•  클래슀 파일만 λ‘œλ”©ν•˜μ—¬ μ‹€ν–‰ν•  수 μžˆμœΌλ―€λ‘œ, 적은 λŸ‰μ˜ λ©”λͺ¨λ¦¬λ₯Ό 가진 μ»΄ν“¨ν„°μ—μ„œ μ–Όλ§ˆλ“ μ§€ 큰 μžλ°” μ‘μš©ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  수 있음. 이것이 λ°”λ‘œ ν”Œλž«νΌ 독립성과 ν•¨κ»˜ λ‹¬μ„±ν•˜κ³ μž ν•˜λŠ” μžλ°” μ–Έμ–΄μ˜ 본질. λ©”λͺ¨λ¦¬κ°€ μΆ©λΆ„ν•œ PCμ—μ„œλŠ” μ‹€ν–‰ 쀑에 클래슀 λ‘œλ”©μœΌλ‘œ μΈν•œ μ‹œκ°„μ„ 쀄이기 μœ„ν•΄, μ‚¬μš©μž 클래슀 파일과 ν•„μš”ν•œ μžλ°” 클래슀 νŒŒμΌμ„ 미리 λ‘œλ”©ν•˜μ—¬ λ‘ . 

 

μžλ°”μ™€ C/C++ μ‹€ν–‰ ν™˜κ²½ 및 μ‹€ν–‰ κ³Όμ • 차이

μžλ°”
1. μžλ°”λŠ” μ»΄νŒŒμΌλŸ¬κ°€ λ°”λ‘œ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μƒμ„±ν•˜λ©°, 링크 과정이 μ—†μŒ
2. λ°”μ΄νŠΈ μ½”λ“œλŠ” μžλ°” 가상 κΈ°κ³„μ—μ„œλ§Œ μ‹€ν–‰
3. μžλ°”λŠ” μ‹€ν–‰μ‹œκ°„μ—, ν•„μš”ν•œ ν΄λž˜μŠ€λ“€μ΄ μžλ°” 가상 기계에 μ˜ν•΄ 링크되며 클래슀 λ‘œλ”κ°€ ν•„μš”ν•œ 클래슀λ₯Ό λ™μ μœΌλ‘œ λ‘œλ”©
4. ClassLoader 객체λ₯Ό μ΄μš©ν•˜μ—¬ κ°œλ°œμžκ°€ 직접 클래슀λ₯Ό λ‘œλ”©ν•  수 있음

C/C++
1. μ»΄νŒŒμΌλŸ¬κ°€ 쀑간 단계인 λͺ©μ  μ½”λ“œλ₯Ό μƒμ„±ν•œ ν›„ 링컀가 ν•„μš”ν•œ λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ„ λ§ν¬ν•˜μ—¬ μ΅œμ’… μ‹€ν–‰ κ°€λŠ₯ν•œ .exeνŒŒμΌμ„ λ§Œλ“¦
2. 정적 라이브러리의 경우 μ‹€ν–‰ νŒŒμΌμ— ν¬ν•¨μ‹œν‚€λ―€λ‘œ μ‹€ν–‰ 파일 크기가 컀짐
3. 동적 라이브러리의 경우 μ‹€ν–‰ μ‹œκ°„μ— 링크가 일어남
4. λͺ©μ  μ½”λ“œ 및 μ‹€ν–‰ νŒŒμΌμ€ ν”Œλž«νΌμ— 따라 λ‹€λ₯΄λ―€λ‘œ, ν”Œλž«νΌμ΄ λ°”λ€Œλ©΄ μ†ŒμŠ€ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜κ±°λ‚˜, 컴파일과 링크λ₯Ό μƒˆλ‘œ ν•΄μ•Ό 함. 

 

πŸ”Ž κ°œλ°œ 도ꡬ와 μžλ°” ν”Œλž«νΌ

πŸ“– JDK와 JRE

βš™οΈ JDK(Java Development Kit)

μžλ°” 개발자λ₯Ό μœ„ν•œ μƒμ—…μš© μ†Œν”„νŠΈμ›¨μ–΄

μžλ°” 컴파일러 λ“±μ˜ 개발 도ꡬ와 JRE(Java Runtime Enviroment)둜 ꡬ성

 

JDK μ„€μΉ˜ ν›„ bin 디렉터리에 λ“€μ–΄μžˆλŠ” μ£Όμš” 개발 μ†Œν”„νŠΈμ›¨μ–΄
• javac : μžλ°” 컴파일러둜 μžλ°” μ†ŒμŠ€λ₯Ό λ°”μ΄νŠΈ μ½”λ“œλ‘œ λ³€ν™˜
• java : μžλ°” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰κΈ°. μžλ°” 가상 기계λ₯Ό μž‘λ™μ‹œμΌœ μžλ°” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰
• javadoc :  μžλ°” μ†ŒμŠ€λ‘œλΆ€ν„° HTML ν˜•μ‹μ˜ API λ„κ·œλ¨ΌνŠΈ 생성
• jar : μžλ°” 클래슀 νŒŒμΌμ„ μ••μΆ•ν•œ μžλ°” μ•„μΉ΄μ΄λΈŒ 파일(.jar) 생성, 관리
• jmod : μžλ°”μ˜ λͺ¨λ“ˆ 파일(.jmod)을 λ§Œλ“€κ±°λ‚˜ λͺ¨λ“ˆ 파일의 λ‚΄μš© 좜λ ₯
• jlink : μ‘μš©ν”„λ‘œκ·Έλž¨μ— 맞좘 λ§žμΆ€ν˜•(custom) JRE 생성
• jdb : μžλ°” μ‘μš©ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 쀑 였λ₯˜λ₯Ό μ°ΎλŠ” 데 μ‚¬μš©λ˜λŠ” 디버거
• javap : 클래슀 파일의 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ†ŒμŠ€μ™€ ν•¨κ»˜ λ³΄μ—¬μ£ΌλŠ” λ””μ–΄μ…ˆλΈ”λŸ¬

 

βš™οΈ JRE(Java Runtime Enviroment)

μžλ°” μ‘μš©ν”„λ‘œκ·Έλž¨μ΄ 싀행될 λ•Œ ν•„μš”ν•œ μ†Œν”„νŠΈμ›¨μ–΄λ“€λ‘œ κ°œλ°œμžκ°€ ν™œμš©ν•  수 μžˆλŠ” μžλ°” API(이미 컴파일된 λ‹€μ–‘ν•œ 클래슀 라이브러리)와 μžλ°” 가상 기계λ₯Ό 포함

 

πŸ“– μžλ°”μ˜ 배포판

Java SE(Standard Edition)

- μžλ°” ν‘œμ€€ 배포판, λ°μŠ€ν¬ν†± μ‘μš©ν”„λ‘œκ·Έλž¨κ³Ό μ„œλ²„ μ‘μš©ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•˜κΈ° μœ„ν•œ JDK

Java ME(Micro Edition)

- λͺ¨λ°”μΌμš© 배포판, IoT, TV, λΈ”λ£¨λ ˆμ΄, μ…‹ν†±λ°•μŠ€ λ“± μž‘μ€ ν•˜λ“œμ›¨μ–΄ μžμ›μ„ κ°–λŠ” μž₯μΉ˜μ— μ ν•©ν•œ JDK

Java EE(Enterprise Edition)

- κΈ°μ—…μš© 배포판

 

πŸ“– Java 9λΆ€ν„° μ‹œμž‘λœ λͺ¨λ“ˆ ν”„λ‘œκ·Έλž˜λ°

λͺ¨λ“ˆμ΄λž€ μžλ°” νŒ¨ν‚€μ§€λ“€κ³Ό 이미지, XML 파일 λ“±μ˜ μžμ›λ“€μ„ 묢은 λ‹¨μœ„μ΄λ©°, μžλ°” μ‘μš©ν”„λ‘œκ·Έλž¨μ„ 마치 μ§μ†Œ 퍼즐을 μ—°κ²°ν•˜λ“―μ΄ ν•„μš”ν•œ λͺ¨λ“ˆμ„ μ—°κ²°ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ΅¬μ„±λ˜κ²Œ 함.

λͺ¨λ“ˆν™”μ˜ λͺ©μ μ€ μ„Έλ°€ν•œ λͺ¨λ“ˆν™”λ₯Ό 톡해 μžλ°” μ‘μš©ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ”λ° ν•„μš” μ—†λŠ” λͺ¨λ“ˆμ„ λ°°μ œν•˜μ—¬ μž‘μ€ 크기둜 배포할 수 μžˆλ„λ‘ 함에 있음. ν•˜λ“œμ›¨μ–΄κ°€ μ—΄μ•…ν•œ μ†Œν˜• IoT μž₯μΉ˜μ—μ„œλ„ ν•„μš”ν•œ λͺ¨λ“ˆλ‘œλ§Œ κ΅¬μ„±λœ μž‘μ€ 크기의 μžλ°” μ‘μš©ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ ν™˜κ²½μ„ λ§Œλ“€μ–΄ μ‹€ν–‰μ‹œν‚€κ³  μ„±λŠ₯을 μœ μ§€ν•˜κ²Œ 함. 

 

πŸ“– μžλ°” API

κ°œλ°œμžλ“€μ΄ μ‚¬μš©ν•˜λ„λ‘ 미리 λ§Œλ“€μ–΄λ†“μ€ μœ μš©ν•œ μžλ°” ν΄λž˜μŠ€λ“€μ˜ 집합

μžλ°” APIλŠ” μ›Œλ‚™ κ΄‘λ²”μœ„ ν•˜μ—¬, κ°œλ°œμžλŠ” 이 APIλ₯Ό μ΄μš©ν•˜μ—¬ 쉽고 λΉ λ₯΄κ²Œ μžλ°” ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•  수 있음.

 

 

Overview (Java SE 17 & JDK 17)

This document is divided into two sections: Java SE The Java Platform, Standard Edition (Java SE) APIs define the core Java platform for general-purpose computing. These APIs are in modules whose names start with java. JDK The Java Development Kit (JDK) AP

docs.oracle.com

 

πŸ“– μžλ°” IDE(Intergrated Development Enviroment)

μ†ŒμŠ€ μ½”λ“œ νŽΈμ§‘, 컴파일, 디버깅을 ν•œκΊΌλ²ˆμ— ν•  수 μžˆλŠ” 톡합 개발 ν™˜κ²½(μ†Œν”„νŠΈμ›¨μ–΄)

 

β€» 디버깅 λ˜λŠ” λ””λ²„κ·ΈλŠ” 컴퓨터 ν”„λ‘œκ·Έλž¨ 개발 단계 쀑에 λ°œμƒν•˜λŠ” μ‹œμŠ€ν…œμ˜ 논리적인 였λ₯˜λ‚˜ 비정상적 연산을 μ°Ύμ•„λ‚΄κ³  κ·Έ 원인을 밝히고 μˆ˜μ •ν•˜λŠ” μž‘μ—… 과정을 λœ»ν•œλ‹€. 

 

 

πŸ”Ž μžλ°” ν”„λ‘œκ·Έλž¨ 개발

μžλ°”μ—μ„œλŠ” 클래슀 이름과 μ†ŒμŠ€ 파일의 이름이 μΌμΉ˜ν•΄μ•Ό 함

 

public class Hello2030 {
  public static void main(String[] args) {
    int n = 2030;
    System.out.println("ν—¬λ‘œ" + n);
  }
}

 

public class Hello2030

이름이 Hello2030인 클래슀λ₯Ό μ„ μ–Έ

 

public static void main(String[] args)

main() λ©”μ†Œλ“œλ₯Ό μ„ μ–Έν•˜λŠ” μ½”λ“œ

μžλ°”μ—μ„œλŠ” ν•¨μˆ˜λ₯Ό λ©”μ†Œλ“œλΌκ³  λΆ€λ₯΄λ©°, λ©”μ†Œλ“œλŠ” {둜 μ‹œμž‘ν•˜μ—¬ }둜 끝남.

μžλ°” ν΄λž˜μŠ€λŠ” μ—¬λŸ¬ 개의 λ©”μ†Œλ“œλ₯Ό 포함할 수 있으며, ν”„λ‘œκ·Έλž¨ 싀행은 λ°˜λ“œμ‹œ main() λ©”μ†Œλ“œλΆ€ν„° μ‹œμž‘

 

int n = 2030

지역 λ³€μˆ˜ n을 μ„ μ–Έν•˜κ³  2030으둜 μ΄ˆκΈ°ν™”

 

System.out.println("ν—¬λ‘œ" + n);

"ν—¬λ‘œ" + n의 κ²°κ³ΌλŠ” "ν—¬λ‘œ2030" λ¬Έμžμ—΄μ΄λ©°, 이λ₯Ό 좜λ ₯ν•˜λŠ” μ‹€ν–‰λ¬Έ.

System.out.println()은 JDK에 ν¬ν•¨λ˜μ–΄ κ°œλ°œμžμ—κ²Œ μ œκ³΅λ˜λŠ” μžλ°” APIλ‘œμ„œ, κ°œλ°œμžλŠ” 화면에 μˆ«μžμ™€ 문자, λ¬Έμžμ—΄ 듀을 좜λ ₯

 

πŸ”Ž μžλ°”μ˜ νŠΉμ§•

ν˜Έν™˜μ„±(ν”Œλž«νΌ 독립성)

μžλ°”λŠ” ν•˜λ“œμ›¨μ–΄, 운영체제 λ“± ν”Œλž«νΌμ— μ’…μ†λ˜μ§€ μ•ŠλŠ” 독립적인 λ°”μ΄νŠΈ μ½”λ“œλ‘œ 컴파일되며 JVM(Java Virtual Machine) μœ„μ—μ„œ λŒμ•„κ°€κΈ° λ•Œλ¬Έμ— 운영체제(OS)의 μ’…λ₯˜μ— 상관없이 μ‹€ν–‰

 

객체 지ν–₯적

객체듀을 κ²°ν•©ν•΄μ„œ ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“¦

 

클래슀둜 μΊ‘μŠν™”

μžλ°”λŠ” 객체 지ν–₯ μ—…μ–΄μ˜ μΊ‘μŠν™”(encapsulation) 원칙을 μ² μ €νžˆ μ§€μΌœ, λ³€μˆ˜λ‚˜ λ©”μ†Œλ“œλŠ” λ°˜λ“œμ‹œ 클래슀 λ‚΄μ—μ„œ κ΅¬ν˜„ν•˜λ„λ‘ 함. ν΄λž˜μŠ€μ— μ†ν•˜μ§€ μ•Šμ€ λ³€μˆ˜λ‚˜ λ©”μ†Œλ“œλŠ” μžˆμ„ 수 μ—†μŒ. μžλ°”λŠ” 클래슀 μ•ˆμ— μƒˆλ‘œμš΄ 클래슀, 즉 λ‚΄λΆ€ 클래슀λ₯Ό λ§Œλ“€ 수 있음. 

 

μ†ŒμŠ€μ™€ 클래슀 파일

클래슀 νŒŒμΌμ—λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜μ˜ μžλ°” 클래슀만 λ“€μ–΄μžˆμŒ. κ·ΈλŸ¬λ―€λ‘œ ν•˜λ‚˜μ˜ μžλ°” μ†ŒμŠ€ νŒŒμΌμ— μ—¬λŸ¬ 개의 클래슀λ₯Ό μž‘μ„±ν•œ 경우, 컴파일 ν•˜λ©΄ ν΄λž˜μŠ€λ§ˆλ‹€ λ³„λ„μ˜ 클래슀 파일이 생성됨. 

 

μ‹€ν–‰ μ½”λ“œ 배포

μžλ°” μ‘μš©ν”„λ‘œκ·Έλž¨μ€ ν•œ 개의 클래슀 파일 λ˜λŠ” λ‹€μˆ˜μ˜ 클래슀 파일둜 ꡬ성. λ‹€μˆ˜μ˜ 클래슀 νŒŒμΌμ„ jar 파일 ν˜•νƒœλ‘œ μ••μΆ•ν•˜μ—¬ λ°°ν¬ν•˜κ±°λ‚˜ μ‹€ν–‰ν•  수 있음. μžλ°”μ˜ 싀행은 main() λ©”μ†Œλ“œμ—μ„œ μ‹œμž‘λ˜λ©°, ν•˜λ‚˜μ˜ 클래슀 νŒŒμΌμ— 두 개 μ΄μƒμ˜ main() λ©”μ†Œλ“œκ°€ μžˆμ„ 수 μ—†μŒ. κ·ΈλŸ¬λ‚˜ 각 클래슀 파일이 main() λ©”μ†Œλ“œλ₯Ό κ°€μ§€λŠ” 것은 상관 μ—†μŒ

 

νŒ¨ν‚€μ§€ 

μ„œλ‘œ κ΄€λ ¨ μžˆλŠ” ν΄λž˜μŠ€λŠ” νŒ¨ν‚€μ§€λ‘œ λ¬Άμ–΄μ„œ 관리

 

λ©€ν‹°μŠ€λ ˆλ“œ

ν•˜λ‚˜μ˜ μžλ°” ν”„λ‘œκ·Έλž¨μ΄ λ™μ‹œμ— μ—¬λŸ¬ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ λ‹€μˆ˜μ˜ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— μ‹€ν–‰ν•  수 μžˆλŠ” ν™˜κ²½μ„ 지원. λŒ€μš©λŸ‰ μž‘μ—…μ„ 빨리 μ²˜λ¦¬ν•  수 있음

 

λ©”λͺ¨λ¦¬ μžλ™ 관리(가비지 μ»¬λ ‰μ…˜)

μžλ°” μ–Έμ–΄λŠ” λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›λŠ” κΈ°λŠ₯은 μžˆμ§€λ§Œ, λ©”λͺ¨λ¦¬λ₯Ό λ°˜ν™˜ν•˜λŠ” κΈ°λŠ₯은 μ—†μŒ. 

κ°œλ°œμžκ°€ 직접 λ©”λͺ¨λ¦¬μ— μ ‘κ·Όν•  수 없도둝 섀계, 가비지 컬렉터

 

μ‹€μ‹œκ°„ μ‘μš© μ‹œμŠ€ν…œμ— 뢀적합

μžλ°” μ‘μš©ν”„λ‘œκ·Έλž¨μ€ μ‹€ν–‰ 도쀑 μ˜ˆμΈ‘ν•  수 μ—†λŠ” μ‹œμ μ— 가비지 μ»¬λ ‰μ…˜μ΄ μ‹€ν–‰λ˜λ―€λ‘œ ν”„λ‘œκ·Έλž¨ 싀행이 μΌμ‹œμ μœΌλ‘œ 쀑단됨. 이런 문제둜 일정 μ‹œκ°„(dead line) 내에 λ°˜λ“œμ‹œ μ‹€ν–‰ κ²°κ³Όλ₯Ό λ‚΄μ•Όλ§Œ ν•˜λŠ” μ‹€μ‹œκ°„ μ‹œμŠ€ν…œμ—λŠ” μžλ°” μ–Έμ–΄κ°€ μ ν•©ν•˜μ§€ μ•ŠμŒ

 

μ•ˆμ „μ„±

μžλ°” μ–Έμ–΄λŠ” νƒ€μž… 체크가 맀우 μ—„κ²©ν•˜λ©°, C/C++κ³Ό 달리 λ©”λͺ¨λ¦¬μ˜ 물리적 μ£Όμ†Œλ₯Ό μ‚¬μš©ν•˜λŠ” ν¬μΈν„°μ˜ κ°œλ…μ΄ μ—†κΈ° λ•Œλ¬Έμ—, 잘λͺ»λœ μžλ°” ν”„λ‘œκ·Έλž¨μœΌλ‘œ 인해 μ‹œμŠ€ν…œμ΄ μ€‘λ‹¨λ˜λŠ” 일이 μ—†μŒ

 

ν”„λ‘œκ·Έλž¨ μž‘μ„±μ΄ 쉬움

ν¬μΈν„°μ˜ κ°œλ…μ΄ μ—†κΈ° λ•Œλ¬Έμ— ν”„λ‘œκ·Έλž¨ μž‘μ„±μ— 뢀담이 적고 ν”„λ‘œκ·Έλž¨ κ°œλ°œμ„ μ‰½κ²Œ λ„μ™€μ£ΌλŠ” λ‹€μ–‘ν•œ λΌμ΄λΈŒλŸ¬λ¦¬μ™€ μŠ€μœ™ λ“± κ°•λ ₯ν•œ GUI 라이브러리λ₯Ό 지원

 

λ‹€μ–‘ν•œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ 개발

λ‹€μ–‘ν•œ μš΄μ˜μ²΄μ œμ—μ„œ μ‹€ν–‰λ˜λŠ” λ‹€μ–‘ν•œ ν”„λ‘œκ·Έλž¨ (μ½˜μ†”, μœˆλ„μš° μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜, μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜, λͺ¨λ°”일 μ•±) 개발 κ°€λŠ₯

 

동적 λ‘œλ”© 지원

객체가 ν•„μš”ν•œ μ‹œμ μ— 동적 λ‘œλ”©ν•΄μ„œ 객체 생성

 

μ‹€ν–‰ 속도λ₯Ό κ°œμ„ ν•˜κΈ° μœ„ν•΄ JIT 컴파일러 μ‚¬μš©

μžλ°”λŠ” μžλ°” 가상 기계가 인터프리터 λ°©μ‹μœΌλ‘œ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ―€λ‘œ 일반적으둜 C/C++둜 μž‘μ„±λœ ν”„λ‘œκ·Έλž¨λ³΄λ‹€ 싀행이 λŠλ¦¬λ‹€κ³  μ•Œλ €μ Έ μžˆμ§€λ§Œ, μ΅œκ·Όμ—λŠ” μ‹€ν–‰ν•˜λŠ” 도쀑 μžλ°” ν”„λ‘œκ·Έλž¨μ„ ν•΄λ‹Ή CPU의 기계어 μ½”λ“œλ‘œ μ»΄νŒŒμΌν•˜κ³  CPUκ°€ λ°”λ‘œ 기계어λ₯Ό μ‹€ν–‰ν•˜λ„λ‘ ν•˜λŠ” JIT(Just in time) 컴파일링 기법을 μ΄μš©ν•˜λ―€λ‘œ, μ‹€ν–‰ μ„±λŠ₯이 C/C++κ³Ό λΉ„μŠ·ν•˜λ„λ‘ κ°œμ„ λ¨

 

 

 

μžλ°” 버전 확인 방법