πŸ“™ Java 12

[Java] JVM(Java Virtual Machine)

JVMμ΄λž€? JVM은 μžλ°”λ‘œ μž‘μ„±ν•œ μ½”λ“œλ₯Ό ν•΄μ„ν•΄μ„œ μ‹€ν–‰ν•΄μ£ΌλŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€. JVM은 각 μš΄μ˜μ²΄μ œμ— μ ν•©ν•˜κ²Œ κ°œλ°œλ˜μ–΄ 있고 μžλ°”λŠ” JVM을 맀개둜 μš΄μ˜μ²΄μ œμ™€ μ†Œν†΅ν•˜κΈ° λ•Œλ¬Έμ— μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° 독립적이닀. (C++κ³Ό 차이점) JVM μž‘λ™ κ³Όμ • μžλ°”λ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•œ 후에 μ‹€ν–‰ν•˜λ©΄ λ¨Όμ € μ»΄νŒŒμΌλŸ¬κ°€ μ‹€ν–‰λ˜κ³  컴파일이 μ§„ν–‰λœλ‹€. κ·Έ κ²°κ³Ό .java 파일(μžλ°” μ½”λ“œ 파일)은 .class 파일(λ°”μ΄νŠΈ μ½”λ“œ 파일)둜 λ³€ν™˜λœλ‹€. JVM은 μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° 싀행에 ν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›λŠ”λ‹€. κ·Έλ¦Όμ—μ„œ Runtime Data Areaκ°€ 이λ₯Ό 가리킨닀. κ·Έ ν›„, 클래슀 λ‘œλ”(Class Loader)κ°€ .class νŒŒμΌμ„ JVM으둜 λΆˆλŸ¬λ“€μ—¬ Runtime Data Area에 λ‘œλ“œμ‹œν‚¨λ‹€. λ‘œλ“œκ°€ μ™„λ£Œλ˜λ©΄ μ‹€ν–‰ 엔진(Execution E..

πŸ“™ Java 2022.09.19

[Java] μŠ€λ ˆλ“œ(Thread)

μŠ€λ ˆλ“œλž€? ν”„λ‘œμ„ΈμŠ€λŠ” μ‹€ν–‰ 쀑인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ˜λ―Έν•˜λ©° ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” μ†ŒμŠ€ μ½”λ“œμ˜ μ‹€ν–‰ 흐름을 μŠ€λ ˆλ“œλΌκ³  ν•œλ‹€. ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ₯Ό κ°€μ§€λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹±κΈ€ μŠ€λ ˆλ“œ ν”„λ‘œμ„ΈμŠ€, μ—¬λŸ¬ 개의 μŠ€λ ˆλ“œλ₯Ό κ°€μ§€λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό λ©€ν‹° μŠ€λ ˆλ“œ ν”„λ‘œμ„ΈμŠ€λΌκ³  λΆ€λ₯Έλ‹€. μžλ°”λ₯Ό μ‹€ν–‰ν•˜λ©΄ κ°€μž₯ λ¨Όμ € μ‹€ν–‰λ˜λŠ” λ©”μ„œλ“œλŠ” main이며, 메인 μŠ€λ ˆλ“œκ°€ main λ©”μ„œλ“œλ₯Ό μ‹€ν–‰μ‹œν‚¨λ‹€. μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜λŠ” 2가지 방법 μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  μ½”λ“œλŠ” run() λ©”μ„œλ“œ 내에 μž‘μ„±ν•΄μ•Ό ν•˜λ©° run() λ©”μ„œλ“œλŠ” Runnable μΈν„°νŽ˜μ΄μŠ€(방법 1)와 Thread 클래슀(방법 2)에 μ •μ˜λ˜μ–΄ μžˆλ‹€. 방법 1. Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ—μ„œ run()을 κ΅¬ν˜„ Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  클래슀λ₯Ό μž‘μ„±ν•œ ν›„, run()의 바디에 μŠ€λ ˆλ“œ..

πŸ“™ Java 2022.09.18

[Java] 슀트림(Stream)

μŠ€νŠΈλ¦Όμ΄λž€?! μŠ€νŠΈλ¦Όμ€ λ°°μ—΄, μ»¬λ ‰μ…˜μ˜ μš”μ†Œλ“€μ„ 순차적으둜 μ°Έμ‘°ν•˜μ—¬ λžŒλ‹€μ‹μœΌλ‘œ μ²˜λ¦¬ν•  수 있게 ν•΄μ£ΌλŠ” λ°˜λ³΅μžμ΄λ‹€. μŠ€νŠΈλ¦Όμ„ ν™œμš©ν•˜λ©΄ λ§Žμ€ μ–‘μ˜ 데이터에 λ³΅μž‘ν•œ 연산을 μˆ˜ν–‰ν•  수 있고 가독성과 μž¬μ‚¬μš©μ„±μ΄ 높은 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€. νŠΉμ§• μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ μ½”λ“œλ₯Ό μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ— λ‚΄λΆ€μ˜ λ™μž‘ 원리λ₯Ό λͺ¨λ₯΄λ”라도 λ©”μ„œλ“œ 이름을 보고 무슨 일을 ν•˜λŠ”μ§€ μ΄ν•΄ν•˜κΈ°κ°€ μ‰½λ‹€λŠ” μž₯점이 μžˆλ‹€. λ˜ν•œ forλ¬Έ, whileλ¬Έμ—μ„œ indexλ‚˜ iteratorλ₯Ό μ‚¬μš©ν•˜μ—¬ μ½”λ“œλ‘œ 직접 λͺ¨λ“  μš”μ†Œλ₯Ό λ°˜λ³΅ν•˜λŠ” μ™ΈλΆ€ λ°˜λ³΅μžμ™€ 달리 λ‚΄λΆ€ 반볡자λ₯Ό μ΄μš©ν•˜μ—¬ 병렬 μ²˜λ¦¬κ°€ 쉽닀. λ‚΄λΆ€ 반볡자λ₯Ό μ΄μš©ν•˜λ©΄ μ»¬λ ‰μ…˜ λ‚΄λΆ€μ—μ„œ μ–΄λ–»κ²Œ μš”μ†Œλ₯Ό λ°˜λ³΅μ‹œν‚€λŠ”μ§€λŠ” μΆ”μƒν™”μ‹œν‚€κ³  κ°œλ°œμžλŠ” μ²˜λ¦¬ν•΄μ•Ό ν•  μ½”λ“œλ§Œ μž‘μ„±ν•˜λ©΄ 되기 λ•Œλ¬Έμ΄λ‹€. λ˜ν•œ μŠ€νŠΈλ¦Όμ€ 데이터λ₯Ό λ³€κ²½..

πŸ“™ Java 2022.09.17

[Java] λžŒλ‹€μ‹κ³Ό ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€

λžŒλ‹€μ‹μ΄λž€? λžŒλ‹€μ‹(Lambda Expression)은 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 기법을 μ§€μ›ν•˜λŠ” μžλ°”μ˜ 문법 μš”μ†Œμ΄λ‹€. λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ μ‹μœΌλ‘œ ν‘œν˜„ν•œ κ²ƒμœΌλ‘œ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ³  λͺ…ν™•ν•˜κ²Œ μž‘μ„±ν•  수 μžˆλ‹€λŠ” μž₯점을 κ°–λŠ”λ‹€. λžŒλ‹€μ‹μ—μ„œλŠ” 기본적으둜 λ°˜ν™˜ νƒ€μž…κ³Ό ν•¨μˆ˜ 이름을 μƒλž΅ν•˜κΈ° λ•Œλ¬Έμ— 읡λͺ… ν•¨μˆ˜λΌκ³  λΆ€λ₯΄κΈ°λ„ ν•œλ‹€. 이둠적으둜 κ³΅λΆ€ν•˜κΈ°λ³΄λ‹€ μ½”λ“œλ‘œ 보면 더 λͺ…ν™•ν•˜κ²Œ 이해할 수 μžˆλ‹€. // κΈ°μ‘΄ 방식 int sum(int num1, int num2) { return num1 + num2; } // λžŒλ‹€μ‹ (int num1, int num2) -> { num1 + num2 } // λ©”μ„œλ“œ 바디에 싀행문이 ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•  λ•Œ μ€‘κ΄„ν˜Έ μƒλž΅ κ°€λŠ₯ (int num1, int num2) -> num1 + num2 // λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„..

πŸ“™ Java 2022.09.17

[Java] μ»¬λ ‰μ…˜(Collection)

μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬μ˜ ꡬ쑰 List λ°μ΄ν„°μ˜ μˆœμ„œκ°€ μœ μ§€λ˜λ©° 쀑볡이 κ°€λŠ₯ν•˜λ‹€. ArrayList, Vector, Stack, LinkedList 등이 List μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€. Set λ°μ΄ν„°μ˜ μˆœμ„œκ°€ μœ μ§€λ˜μ§€ μ•Šκ³  쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€. HashSet, TreeSet 등이 Set μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€. Map ν‚€(key)와 κ°’(value) 쌍으둜 데이터λ₯Ό μ €μž₯ν•œλ‹€. λ°μ΄ν„°μ˜ μˆœμ„œκ°€ μœ μ§€λ˜μ§€ μ•ŠμœΌλ©° ν‚€λŠ” 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•Šμ§€λ§Œ κ°’μ—λŠ” μ€‘λ³΅λœ 값을 μ €μž₯ν•  수 μžˆλ‹€. HashMap, HashTable, TreeMap, Properties 등이 Map μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€. Collection λ©”μ„œλ“œ μΆ”κ°€ add(Object o): 객체 및 μ»¬λ ‰μ…˜μ˜ 객체듀을 μ»¬λ ‰μ…˜μ— μΆ”κ°€ addAll(Collection ..

πŸ“™ Java 2022.09.17

[Java] μ œλ„€λ¦­κ³Ό μ˜ˆμ™Έ 처리

μ œλ„€λ¦­(Generic) ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•  λ•Œ, νƒ€μž…μ„ ꡬ체적으둜 μ§€μ •ν•˜λŠ” 것이 μ•„λ‹ˆκ³ , 좔후에 μ§€μ •ν•˜λ„λ‘ μΌλ°˜ν™”μ‹œν‚€λŠ” 것을 λ§ν•œλ‹€. (C++의 ν…œν”Œλ¦Ώκ³Ό λ™μΌν•œ λŠλ‚Œμ΄λ‹€!) μ œλ„€λ¦­μ΄ μ‚¬μš©λœ 클래슀λ₯Ό μ œλ„€λ¦­ 클래슀라고 ν•˜λ©° νŠΉμ • λ©”μ„œλ“œλ§Œ μ œλ„€λ¦­μœΌλ‘œ μ„ μ–Έν•  경우 μ œλ„€λ¦­ λ©”μ„œλ“œλΌκ³  λΆ€λ₯Έλ‹€. class GenericEx { private T item; public GenericEx(T item) { this.item = item; } public T getItem() { return item; } public void setItem(T item) { this.item = item; } } μœ„μ˜ μ½”λ“œμ—μ„œ 클래슀 선언뢀에 내뢀에 μž‘μ„±ν•œ Tλ₯Ό νƒ€μž… λ§€κ°œλ³€μˆ˜λΌκ³  ν•œλ‹€. 클래슀 이름 μ˜†μ— 클래슀 λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•  타..

πŸ“™ Java 2022.09.16

[Java] 좔상화(Abstraction)

μžλ°”μ—μ„œλŠ” 좔상 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™œμš©ν•˜μ—¬ 좔상화λ₯Ό κ΅¬ν˜„ν•œλ‹€. abstract μ œμ–΄μž ‘좔상적인’μ΄λΌλŠ” 의미λ₯Ό κ°–κ³  μžˆλŠ” abstract μ œμ–΄μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 좔상 λ©”μ„œλ“œμ™€ 좔상 클래슀λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 좔상 λ©”μ„œλ“œλŠ” λ©”μ„œλ“œμ˜ μ‹œκ·Έλ‹ˆμ²˜(이름, λ§€κ°œλ³€μˆ˜)만 있고 κ΅¬μ²΄ν™”λœ λ°”λ””λŠ” μ—†λŠ” λ©”μ„œλ“œμ΄λ©° 좔상 λ©”μ„œλ“œκ°€ ν•˜λ‚˜ 이상 λ“€μ–΄μžˆλŠ” 클래슀λ₯Ό 좔상 클래슀라고 ν•œλ‹€. κ΅¬μ²΄ν™”λ˜μ§€ μ•Šμ€ 좔상 ν΄λž˜μŠ€λ§Œμ„ 기반으둜 객체 생성은 ν•  수 μ—†λ‹€. ν•˜μ§€λ§Œ μƒμ†κ΄€κ³„μ˜ μƒμœ„ ν΄λž˜μŠ€μ—μ„œ 이λ₯Ό ν™œμš©ν•˜λ©΄ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ 좔상 λ©”μ„œλ“œμ˜ λ°”λ””λ₯Ό κ΅¬ν˜„ν•˜μ—¬ 각 상황에 맞게 효율적으둜 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€. final μ œμ–΄μž final μ œμ–΄μžκ°€ μ•žμ— λΆ™μœΌλ©΄ κ°’ 변경이 λΆˆκ°€λŠ₯ν•˜κ±°λ‚˜ ν™•μž₯λ˜μ§€ μ•ŠλŠ” μ„±μ§ˆμ„ λ‚˜νƒ€λ‚Έλ‹€. λ©”μ„œλ“œ μ•žμ— 있으면 ν•΄λ‹Ή λ©”μ„œλ“œλŠ” μ˜€λ²„..

πŸ“™ Java 2022.09.07

[Java] λ‹€ν˜•μ„±(Polymorphism)

λ‹€ν˜•μ„± λ‹€ν˜•μ„±μ΄λž€ ν•˜λ‚˜μ˜ 객체가 μ—¬λŸ¬ ν˜•νƒœλ₯Ό κ°€μ§ˆ 수 μžˆλŠ” 것을 λœ»ν•œλ‹€. μžλ°”μ—μ„œλŠ” ν•œ νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ₯Ό 톡해 μ—¬λŸ¬ νƒ€μž…μ˜ 객체듀을 μ°Έμ‘°ν•  수 있게 ν•΄μ£ΌλŠ” 것을 μ˜λ―Έν•œλ‹€. μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž… λ³€ν™˜ μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž… λ³€ν™˜μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” λ©€λ²„μ˜ 개수λ₯Ό μ‘°μ ˆν•  수 μžˆλ‹€. νƒ€μž… λ³€ν™˜μ€ 상속 관계에 μžˆλŠ” 클래슀 μ‚¬μ΄μ—μ„œλ§Œ κ°€λŠ₯ν•˜λ‹€. μ—…μΊμŠ€νŒ…(ν•˜μœ„→μƒμœ„ 클래슀 νƒ€μž… λ³€ν™˜)은 ν˜•λ³€ν™˜ μ—°μ‚°μžμΈ κ΄„ν˜Έλ₯Ό μƒλž΅ν•  수 μžˆμ§€λ§Œ, κ·Έ λ°˜λŒ€μΈ λ‹€μš΄μΊμŠ€νŒ…(μƒμœ„→ν•˜μœ„ 클래슀 νƒ€μž… λ³€ν™˜)의 κ²½μš°μ—λŠ” λ°˜λ“œμ‹œ κ΄„ν˜Έλ₯Ό μž‘μ„±ν•΄μ€˜μ•Όν•œλ‹€. 클래슀의 규λͺ¨κ°€ 컀지면 μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž… λ³€ν™˜μ΄ κ°€λŠ₯ν•œμ§€ μ—¬λΆ€λ₯Ό instanceof μ—°μ‚°μžλ₯Ό 톡해 μ•Œ 수 있으며 이λ₯Ό ν™œμš©ν•˜μ—¬ μ—λŸ¬λ₯Ό μ΅œμ†Œν™”ν•  수 μžˆλ‹€. μ°Έμ‘° λ³€μˆ˜ instanceof νƒ€μž…μ˜ λ°˜ν™˜ 값이 f..

πŸ“™ Java 2022.09.07

[Java] μΊ‘μŠν™” πŸ’Š

μΊ‘μŠν™” μΊ‘μŠν™”λž€ 객체와 κ΄€λ ¨λœ 속성과 κΈ°λŠ₯을 캑슐둜 λ§Œλ“€μ–΄ μ™ΈλΆ€λ‘œλΆ€ν„° 정보λ₯Ό λ³΄ν˜Έν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. μΊ‘μŠν™”μ˜ κ°€μž₯ 큰 μž₯점은 정보λ₯Ό 은닉할 수 μžˆλ‹€λŠ” 것이닀. 객체의 κΈ°λŠ₯κ³Ό 속성이 μ™ΈλΆ€λ‘œλΆ€ν„° ν•¨λΆ€λ‘œ λ³€κ²½λ˜μ§€ λͺ»ν•˜κ²Œ ν•΄ μ€€λ‹€. 또 각각의 객체가 λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— μ½”λ“œ ν™•μž₯ μ‹œμ—λ„ 였λ₯˜λ₯Ό μ΅œμ†Œν™”ν•  수 μžˆμ–΄μ„œ μœ μ§€λ³΄μˆ˜μ— μš©μ΄ν•˜λ‹€. μžλ°”μ—μ„œλŠ” μ ‘κ·Ό μ œμ–΄μž(Access Modifier)와 getter, setter λ©”μ„œλ“œλ₯Ό μ€‘μ‹¬μœΌλ‘œ μΊ‘μŠν™”λ₯Ό μˆ˜ν–‰ν•œλ‹€. μ ‘κ·Ό μ œμ–΄μž(Access Modifier) μžλ°”μ—μ„œ μ œμ–΄μžλŠ” μ ‘κ·Ό μ œμ–΄μžμ™€ 기타 μ œμ–΄μž(static, final, abstract, native, transient, synchronized λ“±)둜 ꡬ뢄할 수 μžˆλ‹€. ν•˜λ‚˜μ˜ λŒ€μƒμ— λŒ€ν•΄ μ—¬λŸ¬ μ œμ–΄μžλ₯Ό μ‚¬μš©ν• ..

πŸ“™ Java 2022.09.06

[Java] 상속(Inheritance)

상속 μžλ°”μ—μ„œ μƒμ†μ΄λž€ 기쑴의 클래슀λ₯Ό μž¬ν™œμš©ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” 기법이닀. 두 κ°€μ§€μ˜ 클래슀λ₯Ό μƒμœ„ ν΄λž˜μŠ€μ™€ ν•˜μœ„ 클래슀둜 λ‚˜λˆ„μ–΄ μƒμœ„ 클래슀의 멀버(ν•„λ“œ, λ©”μ„œλ“œ, μ΄λ„ˆ 클래슀)λ₯Ό ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ³΅μœ ν•  수 있으며 두 클래슀λ₯Ό 상속 관계에 μžˆλ‹€κ³  ν•œλ‹€. ν•˜μœ„ ν΄λž˜μŠ€λŠ” μƒμœ„ ν΄λž˜μŠ€λ‘œλΆ€ν„° ν™•μž₯된 κ°œλ…μ΄κΈ° λ•Œλ¬Έμ— ν•˜μœ„ 클래슀의 멀버 κ°œμˆ˜λŠ” μƒμœ„ ν΄λž˜μŠ€λ³΄λ‹€ 항상 λ§Žκ±°λ‚˜ κ°™λ‹€. 클래슀λ₯Ό 상속할 λ•ŒλŠ” extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©°, extends 으둜 μ •μ˜ν•œλ‹€. 상속을 μ‚¬μš©ν•˜λ©΄ μƒμœ„ ν΄λž˜μŠ€μ™€ μ€‘λ³΅λ˜λŠ” μ½”λ“œλ₯Ό 쀄일 수 μžˆλ‹€λŠ” 이점을 κ°–λŠ”λ‹€. μžλ°”μ—μ„œλŠ” 단일 μƒμ†λ§Œμ„ ν—ˆμš©ν•˜λ©° μΈν„°νŽ˜μ΄μŠ€(interface)λΌλŠ” 문법 μš”μ†Œλ₯Ό 톡해 닀쀑 상속과 λΉ„μŠ·ν•œ κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆλ‹€. 포함 관계 포함 κ΄€κ³„λŠ” μƒμ†μ²˜λŸΌ ..

πŸ“™ Java 2022.09.06