Covenant

πŸ“˜ λͺ…μ €λ‘œ λ‹€μ‹œλ³΄λŠ” μžλ°”μ™€ λ©”λͺ¨λ¦¬ 이야기 1편





λ„μž…


  쒋은 μ‹€λ ₯을 κ°–μΆ˜ κ°œλ°œμžκ°€ 되기 μœ„ν•΄μ„œ λ‹¨μˆœνžˆ 자기의 μ½”λ“œκ°€ λŒμ•„κ°”λ‹€ 뿐 μ•„λ‹ˆλΌ μžμ‹ μ˜ μ½”λ“œκ°€ 컴퓨터 λ‚΄λΆ€μ—μ„œ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€λ₯Ό 이해해야 ν•©λ‹ˆλ‹€. λ³Έ 글은 κ°„λ‹¨ν•œ JAVA μ½”λ“œκ°€ λ©”λͺ¨λ¦¬μ—μ„œ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ μ‚΄νŽ΄λ³Ό κ²ƒμž…λ‹ˆλ‹€.




main() λ©”μ„œλ“œμ™€ T λ©”λͺ¨λ¦¬


- Tλ©”λͺ¨λ¦¬λŠ” μœ„μ™€ 같은 κ΅¬μ‘°μž…λ‹ˆλ‹€.



- JREλŠ” ν”„λ‘œκ·Έλž¨ μ•ˆμ— main() λ©”μ„œλ“œκ°€ μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
- main() λ©”μ„œλ“œλ₯΄ ν™•μΈν•˜λ©΄ JREλŠ” ν”„λ‘œκ·Έλž¨ 싀행을 μœ„ν•œ 사전 μ€€λΉ„λ₯Ό ν•©λ‹ˆλ‹€.
- JVM에 전원을 λ„£μ–΄μ„œ λΆ€νŒ…ν•©λ‹ˆλ‹€.
- JVM은 λͺ©μ  νŒŒμΌμ„ λ°›μ•„μ„œ λͺ©μ  νŒŒμΌμ„ μ‹€ν–‰ν•©λ‹ˆλ‹€.



- λͺ¨λ“  μžλ°” ν”„λ‘œκ·Έλž¨μ΄ λ°˜λ“œμ‹œ ν¬ν•¨ν•˜λŠ” νŒ¨ν‚€μ§€μΈ `java.lang` νŒ¨ν‚€μ§€λ₯Ό T λ©”λͺ¨λ¦¬μ˜ μŠ€νƒœν‹± μ˜μ—­μ— κ°€μ Έ λ†“μŠ΅λ‹ˆλ‹€.



- JAVM은 κ°œλ°œμžκ°€ μž‘μ„±ν•œ λͺ¨λ“  ν΄λž˜μŠ€μ™€ μž„ν¬νŠΈ νŒ¨ν‚€μ§€λ₯Ό μŠ€νƒœν‹± μ˜μ—­μ— κ°€μ Έλ‹€ λ†“μŠ΅λ‹ˆλ‹€.
- μŠ€νƒœν‹±μ˜ 별λͺ…은 ν΄λž˜μŠ€λ“€μ˜ 놀이터 라고 ν•©λ‹ˆλ‹€.

μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

main() λ©”μ„œλ“œκ°€ μ‹€ν–‰λ˜κΈ° μ „ JVMμ—μ„œ μˆ˜ν–‰ν•˜λŠ” μ „μ²˜λ¦¬ μž‘μ—…λ“€
- java.lang νŒ¨ν‚€μ§€λ₯Ό T λ©”λͺ¨λ¦¬μ˜ μŠ€νƒœν‹± μ˜μ—­μ— λ°°μΉ˜ν•œλ‹€.
- imort 된 νŒ¨ν‚€μ§€λ₯Ό T λ©”λͺ¨λ¦¬μ˜ μŠ€νƒœν‹± μ˜μ—­μ— λ°°μΉ˜ν•œλ‹€.
- ν”„λ‘œκ·Έλž¨ μƒμ˜ λͺ¨λ“  클래슀λ₯Ό T λ©”λͺ¨λ¦¬μ˜ μŠ€νƒœν‹± μ˜μ—­μ— λ°°μΉ˜ν•œλ‹€. 


- main λ©”μ„œλ“œκ°€ 놀기 μœ„ν•΄ μŠ€νƒ ν”„λ ˆμž„μ΄ μŠ€νƒμ˜μ—­μ— ν• λ‹Ήλ©λ‹ˆλ‹€.
- 여기에 λ©”μ„œλ“œμ˜ 인자 argsλ₯Ό μ €μž₯ν•œ λ³€μˆ˜ 곡간을 μŠ€νƒ ν”„λ ˆμž„μ˜ 맨 밑에 ν™•λ³΄ν•©λ‹ˆλ‹€.
- 이 λ‹€μŒμ— `System.out.println("Hello OOP");` ꡬ문이 μ‹€ν–‰λ©λ‹ˆλ‹€. 이 λ•Œ T λ©”λͺ¨λ¦¬μ— λ³€ν™”λŠ” μ—†μŠ΅λ‹ˆλ‹€.



- main λ©”λͺ¨λ¦¬μ˜ λ‹«λŠ” μ€‘κ΄„ν˜Έλ₯Ό λ§Œλ‚˜κ²Œ 되면 μŠ€νƒ ν”„λ ˆμž„μ€ μ†Œλ©Έν•©λ‹ˆλ‹€.
- μ΄λ ‡κ²Œ μŠ€νƒ ν”„λ ˆμž„μ€ μ—¬λŠ” μ€‘κ΄„ν˜Έλ₯Ό λ§Œλ‚˜λ©΄ μŠ€νƒ ν”„λ ˆμž„μ΄ 생기며, λ‹«λŠ” μ€‘κ΄„ν˜Έλ₯Ό λ§Œλ‚˜λ©΄ μ†Œλ©Έν•©λ‹ˆλ‹€.
- main() λ©”μ„œλ“œκ°€ λλ‚˜λ©΄ JREλŠ” JVM을 μ’…λ£Œν•˜κ³  JRE μžμ²΄λ„ 운영체제 μƒμ˜ λ©”λͺ¨λ¦¬μ—μ„œ μ‚¬λΌμ§‘λ‹ˆλ‹€. 그러면 T λ©”λͺ¨λ¦¬λ„ 운λͺ…을 λ‹€ν•˜κ³  μ‚¬λΌμ§‘λ‹ˆλ‹€.




λ³€μˆ˜μ™€ T λ©”λͺ¨λ¦¬


- 2번째 쀄을 μ‹€ν–‰ν•œ 상황은 μœ„μ™€ κ°™μŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν‘œν˜„λ˜λŠ” μ΄μœ λŠ” `main() λ©”μ„œλ“œμ™€ T λ©”λͺ¨λ¦¬` μ—μ„œ μ„€λͺ…ν–ˆμŠ΅λ‹ˆλ‹€.



- ? μ—λŠ” μ•Œ 수 μ—†λŠ” 값이 λ“€μ–΄κ°€ μžˆλ‹€λŠ” λœ»μž…λ‹ˆλ‹€.
- λ³€μˆ˜ i와 같이 μ„ μ–Έλ§Œ ν•˜κ³  μ΄ˆκΈ°ν™”λ₯Ό ν•˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ 좜λ ₯ν•˜λ €κ³  ν•˜λ©΄ μžλ°” 컴파일러(javac)λŠ” "The local variable i may not have been initailized" κ²½κ³ λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.



- 6번째 쀄을 μ‹€ν–‰ν•œ ν›„ T λ©”λͺ¨λ¦¬μ˜ μƒνƒœλŠ” μœ„μ™€ κ°™μŠ΅λ‹ˆλ‹€.




블둝 ꡬ뢄과 λ©”λͺ¨λ¦¬: 블둝 μŠ€νƒ ν”„λ ˆμž„


- `λ³€μˆ˜μ™€ T λ©”λͺ¨λ¦¬` μ—μ„œ 4번 λΌμΈκΉŒμ§€ μ‹€ν–‰ν•˜λ©΄ T λ©”λͺ¨λ¦¬μ— μ–΄λ–»κ²Œ μ €μž₯λ˜λŠ”μ§€ μ„€λͺ…ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
- if문은 T λ©”λͺ¨λ¦¬μ— μ–΄λ–»κ²Œ κΈ°λ‘λ κΉŒμš”? if λŠ” 쑰건문에 따라 λΆ„κΈ°κ°€ μΌμ–΄λ‚©λ‹ˆλ‹€. i 에 μ €μž₯된 값이 10μ΄λ―€λ‘œ 참인 λΈ”λ‘μ˜ μŠ€νƒ ν”„λ ˆμž„μ΄ λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€.



- if 블둝 쀑 참일 λ–„μ˜ 블둝을 μ’…λ£Œν•˜λŠ” λ‹«λŠ” μ€‘κ΄„ν˜Έλ₯Ό λ§Œλ‚˜λ©΄ if 블둝 μŠ€νƒ ν”„λ ˆμž„μ€ μŠ€νƒ μ˜μ—­μ—μ„œ μ‚¬λΌμ§‘λ‹ˆλ‹€.
- if 블둝 μŠ€νƒ ν”„λ ˆμž„ μ•ˆμ— μƒμ£Όν•˜λ˜ λ³€μˆ˜μ˜ μ €μž₯ 곡간도 μ‚¬λΌμ§‘λ‹ˆλ‹€.
- 라인 20번의 주석을 ν•΄μ œν•˜λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”? μ—λŸ¬κ°€ λ‚˜μ˜¬ κ²ƒμž…λ‹ˆλ‹€.
- m은 if 블둝 μŠ€νƒ ν”„λ ˆμž„μ΄ μ’…λ£Œλ˜λ©° μ‚¬λΌμ‘ŒμŠ΅λ‹ˆλ‹€. mainμ΄λΌλŠ” μ™ΈλΆ€ μŠ€νƒ ν”„λ ˆμž„μ—μ„œ λ‚΄λΆ€ λ³€μˆ˜ mμ—λŠ” μ ‘κ·Ό ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
- λ‹€μŒ 사싀을 κΈ°μ–΅ν•΄ μ£Όμ„Έμš”. "μ™ΈλΆ€ μŠ€νƒ ν”„λ ˆμž„μ—μ„œ λ‚΄λΆ€ μŠ€νƒ ν”„λ ˆμž„μ˜ λ³€μˆ˜μ— μ ‘κ·Όν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•˜λ‚˜ κ·Έ 역은 κ°€λŠ₯ν•˜λ‹€."




λ©”μ„œλ“œ 호좜과 λ©”λͺ¨λ¦¬: λ©”μ„œλ“œ μŠ€νƒ ν”„λ ˆμž„


- 6번째 쀄: square() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. μ œμ–΄μ˜ 흐름이 square() λ©”μ„œλ“œκ°€ μ„ μ–Έλœ 9번째 μ€„λ‘œ 이동할 κ²ƒμž…λ‹ˆλ‹€.
- μœ„μ˜ 그림은 12번째 μ€„μ˜ 싀행을 λ§ˆμ³€μ„ λ•Œ T λ©”λͺ¨λ¦¬μ˜ μŠ€νƒ­μƒ·μž…λ‹ˆλ‹€.
- μ£Όλͺ©ν•΄μ•Όν•  것은 main() λ©”μ„œλ“œκ°€ κ°€μ§„ λ³€μˆ˜ k와 square() λ©”μ„œλ“œκ°€ κ°€μ§„ λ³€μˆ˜ kκ°€ 이름은 κ°™μ§€λ§Œ μ‹€μ œλ‘œλŠ” λ³„λ„μ˜ 곡간에 μ‘΄μž¬ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이것을 `Call by Value(값에 μ˜ν•œ 호좜)` 이라고 ν•©λ‹ˆλ‹€.
- λ”°λΌμ„œ square() λ©”μ„œλ“œ μ•ˆμ˜ λ³€μˆ˜μ— μ–΄λ– ν•œ 값을 λ³€κ²½ν•˜λ”λΌλ„ main() λ©”μ„œλ“œ μ•ˆμ˜ k λ³€μˆ˜λŠ” 영ν–₯이 μ—†μŠ΅λ‹ˆλ‹€.



  • 6번째 쀄을 μ‹€ν–‰ν•œ ν›„ T λ©”λͺ¨λ¦¬ μƒνƒœμž…λ‹ˆλ‹€.



μ „μ—­ λ³€μˆ˜μ™€ λ©”λͺ¨λ¦¬


- share λ³€μˆ˜μ— static ν‚€μ›Œλ“œκ°€ λΆ™μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
- share λ³€μˆ˜λŠ” T λ©”λͺ¨λ¦¬μ˜ μŠ€νƒœν‹± μ˜μ—­μ— λ³€μˆ˜ 곡간이 ν• λ‹Ήλ©λ‹ˆλ‹€.
- 3번째 쀄을 μ‹€ν–‰ν•˜λ©΄ T λ©”λͺ¨λ¦¬μ— main() λ©”μ„œλ“œ μŠ€νƒ ν”„λ ˆμž„μ΄ λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€.
- μ΄λ ‡κ²Œ share λ³€μˆ˜μ™€ 같은 λ³€μˆ˜λ₯Ό μ „μ—­ λ³€μˆ˜λΌκ³  ν•©λ‹ˆλ‹€.
- μ „μ—­ λ³€μˆ˜λŠ” μ½”λ“œ μ–΄λŠ κ³³μ—μ„œλ‚˜ 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€. μ—¬λŸ¬ λ©”μ„œλ“œλ“€μ΄ κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•œλ‹€κ³  ν•΄μ„œ 곡유 λ³€μˆ˜λΌκ³ λ„ ν•©λ‹ˆλ‹€.
- κ·ΈλŸ¬λ‚˜ ν”„λ‘œμ νŠΈκ°€ μ»€μ Έμ„œ μ—¬λŸ¬ λ©”μ„œλ“œλ“€μ΄ μ „μ—­ λ³€μˆ˜μ˜ 값을 λ³€κ²½ν•˜λ©΄ μ „μ—­ λ³€μˆ˜μ— μ–΄λ–€ 값이 μ €μž₯ λ˜μ–΄ μžˆλŠ”μ§€ νŒŒμ•…ν•˜κΈ° 쉽지 μ•ŠμŠ΅λ‹ˆλ‹€.
- `Math.PI` 처럼 읽기 μ „μš©μœΌλ‘œ 값을 κ³΅μœ ν•΄μ„œ μ „μ—­ μƒμˆ˜λ‘œ μ“°λŠ” 것은 μΆ”μ²œν•©λ‹ˆλ‹€.




λ©€ν‹° μŠ€λ ˆλ“œ / λ©€ν‹° ν”„λ‘œμ„ΈμŠ€μ˜ 이해




- λ©€ν‹° μŠ€λ ˆλ“œμ˜ T λ©”λͺ¨λ¦¬ λͺ¨λΈμ€ μŠ€νƒ μ˜μ—­μ„ μŠ€λ ˆλ“œ 개수만큼 λΆ„ν• ν•΄μ„œ μ“°λŠ” κ²ƒμž…λ‹ˆλ‹€.
- λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λŠ” λ‹€μˆ˜μ˜ 데이터 μ €μž₯μ˜μ—­, 즉 λ‹€μˆ˜μ˜ T λ©”λͺ¨λ¦¬λ₯Ό κ°–λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.
- λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λŠ” 각 ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ 각자의 T λ©”λͺ¨λ¦¬κ°€ 있고 각자 고유의 κ³΅κ°„μ΄λ―€λ‘œ μ„œλ‘œ μ°Έμ‘°ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
- λ©€ν‹° μŠ€λ ˆλ“œλŠ” ν•˜λ‚˜μ˜ T λ©”λͺ¨λ¦¬λ§Œ μ‚¬μš©ν•˜λŠ”λ° μŠ€νƒ μ˜μ—­λ§Œ λΆ„ν• ν•΄μ„œ μ‚¬μš©ν•˜λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.
- λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λŠ” ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ T λ©”λͺ¨λ¦¬ μ˜μ—­μ„ μ ˆλŒ€ μΉ¨λ²” ν•  수 μ—†λŠ” λ©”λͺ¨λ¦¬ μ•ˆμ „ν•œ κ΅¬μ‘°μ΄μ§€λ§Œ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ€ κ·Έ 만큼 ν½λ‹ˆλ‹€.
- λ©€ν‹° μŠ€λ ˆλ“œλŠ” ν•˜λ‚˜μ˜ T λ©”λͺ¨λ¦¬ μ•ˆμ—μ„œ μŠ€νƒ μ˜μ—­λ§Œ λΆ„ν• ν•œ 것이기 떄문에 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œμ—μ„œ λ‹€λ₯Έ μŠ€λ ˆλ“œμ˜ μŠ€νƒ μ˜μ—­μ—λŠ” μ ‘κ·Όν•  수 μ—†μ§€λ§Œ μŠ€νƒœν‹± μ˜μ—­κ³Ό νž™ μ˜μ—­μ€ κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•˜λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€. λ”°λΌμ„œ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€ λŒ€λΉ„ λ©”λͺ¨λ¦¬λ₯Ό 적게 μ‚¬μš©ν•  수 μžˆλŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.