λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ‹œλ„/ꡭ비지원

[D+14] 클래슀, 좔상화, μ°Έμ‘°νƒ€μž… μž„μ‹œλ³€μˆ˜

by πŸ‡λ°•λ΄‰λ΄‰πŸ‡ 2022. 10. 11.

 

ꡭ비지원 D+14

- 클래슀, 좔상화, μ°Έμ‘°νƒ€μž… μž„μ‹œλ³€μˆ˜ -

 


 

 

클래슀

- ν΄λž˜μŠ€λŠ” 데이터와 λ©”μ†Œλ“œκ°€ κ²°ν•©λœ 데이터 νƒ€μž…μ΄λ‹€.
- λ§Œμ•½ 데이터와 λ©”μ†Œλ“œκ°€ λΆ„λ¦¬λ˜μ–΄ μžˆμ„κ²½μš° λ©”μ†Œλ“œλŠ” λ©”μ†Œλ“œλΌλ¦¬ λ°μ΄ν„°λŠ” 데이터끼리 κ°μžμ—λ§Œ 신경을 μ¨μ„œ 집쀑도가 μ˜¬λΌκ°„λ‹€λŠ” μž₯점이 μžˆμ„ 수 μžˆκ² μ§€λ§Œ μ†ŒμŠ€μ½”λ“œμ˜ 양이 λŠ˜μ–΄κ°€κ³ , κΈ°λŠ₯이 늘고, λ³΅μž‘ν•΄μ§€κΈ° λ•Œλ¬Έμ— 전체적인 ꡬ쑰가 λˆˆμ— 잘 띄지 μ•ŠλŠ”λ‹€λŠ” 큰 단점이 μžˆλ‹€.

=> κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것은 맀우 μœ μš©ν•œ 일이닀.

 


좔상화 (Abstraction)

λ‚΄κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 학사 관리 ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€λΌλŠ” 주문을 λ°›μ•˜λŠ”λ° κ·Έμ€‘μ—μ„œ 학생정보λ₯Ό λ§Œλ“€λ €κ³  ν•œλ‹€.
κ·Έλ ‡λ‹€λ©΄ λ‚˜λŠ” μ•„λ§ˆλ„ ν•™λ²ˆ, 이름, μ£Όμ†Œ 등이 ν•„μš”ν•  것이닀.
λ‚˜λŠ” μ΄λŸ¬ν•œ 정보λ₯Ό μ–΄λ””μ„œλΆ€ν„° κ°€μ Έμ˜¨ κ²ƒμΌκΉŒ?

λ§Œμ•½ μ‹€μ œλ‘œ μ‘΄μž¬ν•˜λŠ” 학생이 μžˆλ‹€κ³  μƒκ°ν•΄λ³΄μž. μš°λ¦¬λŠ” 이 학생을 μ‹€μ„Έκ³„μ˜ 개체라고 ν•  수 μžˆλ‹€.
이 학생이 μ‹€μ œλ‘œ 가지고 μžˆλŠ” μ •λ³΄λŠ” λ¬΄ν•œκ°œλ‘œ 무수히 λ§Žμ„ 것이닀.
κ·Έλ ‡λ‹€λ©΄ μš°λ¦¬κ°€ λ§Œλ“€ ν”„λ‘œκ·Έλž¨μƒμ—μ„œ μ‘΄μž¬ν•˜λŠ” 학생이 μžˆλ‹€κ³  ν•œλ‹€λ©΄ μ΄λŠ” μ‹œμŠ€ν…œμ—μ„œμ˜ 개체라고 ν•  수 μžˆλ‹€.
ν”„λ‘œκ·Έλž¨μƒμ—μ„œμ˜ 학생이 μ‹€μ œκ°€μ§€κ³  μžˆλŠ” μ •λ³΄λŠ” μ‹€μ„Έκ³„μ˜ κ°œμ²΄κ°€ 가지고 μžˆλŠ” μ •λ³΄μ²˜λŸΌ λ§Žμ€ μ–‘μ˜ 정보가 ν•„μš”λ‘œν•˜λŠ” 것이 μ•„λ‹ˆλΌ μš°λ¦¬κ°€ ν•„μš”λ‘œν•˜λŠ” 학생정보에 κ΄€λ ¨λœ 데이터인 ν•™λ²ˆ, 이름, μ£Όμ†Œ 등이 있게 λ˜λŠ” 것이닀.
즉, μ‹œμŠ€ν…œμ—μ„œμ˜ κ°œμ²΄κ°€ 가지고 μžˆλŠ” λ°μ΄ν„°λŠ” μ‹€μ„Έκ³„μ˜ κ°œμ²΄κ°€ 가지고 μžˆλŠ” λ°μ΄ν„°λ“€μ€‘μ—μ„œ 골라온 것이라고 ν•  수 μžˆλŠ” 것이닀.

μ΄λ ‡κ²Œ μ‚¬μš©μžμ˜ μš”κ΅¬μ‚¬ν•­, μ„€κ³„μƒμ˜ μš”κ΅¬μ‚¬ν•­μ— μ˜ν•΄ 무엇이 μ€‘μš”ν•œ 것인지 μΈμ§€ν•˜κ³  λ½‘μ•„λ‚΄λŠ” 것을 좔상화라고 ν•œλ‹€.

λ˜ν•œ, 좔상화λ₯Ό ν†΅ν•΄μ„œ 뽑아낸 섀계적 관점이 λ“€μ–΄κ°„ ν•™λ²ˆ, 이름, μ£Όμ†Œμ™€κ°™μ€ 섀계적인 관점이 λ“€μ–΄κ°„ 데이터λ₯Ό 속성(attribute)이라고 ν•œλ‹€.

좔상화λ₯Ό 길게 κΈ€λ‘œ ν‘œν˜„ν•œκ²ƒμ„ κ°„λ‹¨ν•˜κ²Œ ν‘œν˜„ν•œ 것이며, μΆ”μƒν™”λœ λ°μ΄ν„°λ‚˜ κΈ°λŠ₯을 λ˜λ‹€μ‹œ λ¬Άμ–΄λ‚Έ 것을 더 λ‚˜μ•„κ°€ μΊ‘μŠν™”λΌκ³  ν•˜λ‹ˆ 잘 μ•Œμ•„λ‘λ„λ‘ ν•˜μž.

 

• 좔상화가 ν•„μš”ν•œ 이유

좔상화λ₯Ό μ œλŒ€λ‘œ ν•˜μ§€ μ•ŠμœΌλ©΄ κΈ°λŠ₯이 μ œν•œλ˜λ©°, μœ μ§€λ³΄μˆ˜κ°€ μ–΄λ €μ›Œμ§„λ‹€.
κ·Έλ‘œμΈν•΄ 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μ‹œ μ½”λ“œλ₯Ό κ°ˆμ•„μ—Žμ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μ²˜μŒλΆ€ν„° λ§ν•œμ½”λ“œκ°€ λ˜μ–΄λ²„λ¦¬λŠ” 것이닀.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 좔상화λ₯Ό 잘 μ‚¬μš©ν•˜λ©΄ 데이터와 ν˜„μ‹€μ΄ μ–ΌλΌμΈλ˜μ–΄μ„œ μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μšΈ λΏλ§Œμ•„λ‹ˆλΌ κΈ°λŠ₯이 μ œν•œλ  κ°€λŠ₯성이 적기 λ•Œλ¬Έμ— 좔상화λ₯Ό μ‚¬μš©ν•  수 있으면 λ°˜λ“œμ‹œ μ‚¬μš©ν•˜λ„λ‘ ν•œλ‹€.

 


μ°Έμ‘°νƒ€μž… μž„μ‹œλ³€μˆ˜

String str1 = "박봉봉";
String str2 = new String("박봉봉");

boolean result = str1.equals(str2);

μš°λ¦¬λŠ” 이전에 λ¬Έμžμ—΄μ΄ λ™μΌν•œμ§€ νŒŒμ•…ν•˜κΈ° μœ„ν•΄μ„œλŠ” λΉ„κ΅μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ•„λ‹ˆλΌ equalsλ₯Ό μ‚¬μš©ν•΄ λ¬Έμžμ—΄μ„ λΉ„κ΅ν•œλ‹€κ³  ν•™μŠ΅ν•˜μ˜€λ‹€.
μ΄λ•Œ μš°λ¦¬λŠ” 이전에 str1κ³Ό str2λΌλŠ” μ°Έμ‘°λ³€μˆ˜λ₯Ό λ§Œλ“  후에 equalsλ₯Ό μ‚¬μš©ν•΄μ£Όμ—ˆλ‹€.

 

String nickName = new String("박봉봉");

boolean result = nickName.equals(new String("박봉봉"));

κ·Έλ ‡λ‹€λ©΄ μ΄λ²ˆμ—λŠ” μ°Έμ‘°λ³€μˆ˜μ•ˆμ— λ¬Έμžμ—΄μ˜ μœ„μΉ˜μ •λ³΄λ₯Ό 넣지 μ•Šκ³  λ°”λ‘œ equals μ•ˆμ— new String()을 ν•΄μ„œ 값을 λ„£κ²Œλ˜λ©΄ μ˜¬λ°”λ₯Έ 결과값이 λ‚˜μ˜€κ²Œ 될까?
사싀 이 μ½”λ“œμ—μ„œ 였λ₯˜λŠ” λ‚˜νƒ€λ‚˜μ§€ μ•ŠμœΌλ©° trueλΌλŠ” κ²°κ³Όλ₯Ό λ‚΄λ†“λŠ”λ‹€.
ν•˜μ§€λ§Œ μš°λ¦¬κ°€ κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€λŠ” 것을 μ€‘μ μœΌλ‘œ 봐야할 것이 μ•„λ‹ˆλΌ μœ„μ˜ μ½”λ“œκ°€ κ³Όμ—° trueλΌλŠ” 결과값이 λ‚˜μ˜€κΈ°κΉŒμ§€ μ–΄λ–€ λ™μž‘κ³Όμ •μ„ κ±°μΉ˜λŠ”μ§€ 이해할 ν•„μš”κ°€ μžˆλ‹€.

 

μš°λ¦¬κ°€ 기쑴에 λ°°μ› λ˜ Stringνƒ€μž…μ€ Heap에 데이터가 μœ„μΉ˜ν•΄μ„œ μ‹œμž‘μ •λ³΄λ₯Ό λ°›μœΌλ©΄ 이 μ‹œμž‘μ •λ³΄λ₯Ό μŠ€νƒμ— μžˆλŠ” μ°Έμ‘°λ³€μˆ˜ μ•ˆμ— λ„£μ–΄μ£ΌλŠ” ν˜•μ‹μœΌλ‘œ λ°°μ› λ‹€.
μ΄λŸ¬ν•œ 논리라면 사싀상 equalsμ•ˆμ— λ“€μ–΄κ°„ Stringνƒ€μž…λ„ λ³€μˆ˜μ•ˆμ— 참쑰값을 λ„£μ–΄μ•Ό ν•˜λŠ”λ° μ°Έμ‘°λ³€μˆ˜κ°€ μ—†κΈ° λ•Œλ¬Έμ— 참쑰값을 넣을 곳이 λ§ˆλ ¨λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄ μ–΄λ–»κ²Œ μ½”λ“œκ°€ μ œλŒ€λ‘œ μ‹€ν–‰λ˜λŠ” κ²ƒμΌκΉŒ?

 

newλ₯Ό μ‚¬μš©ν•΄μ„œ 싀행될 경우 λ°˜λ“œμ‹œ μŠ€νƒν”„λ ˆμž„μ„ ν†΅ν•΄μ„œ λ„˜κ²¨μ€˜μ•Ό ν•˜λŠ”λ° 사싀상 받을 수 μžˆλŠ”κ²Œ μ—†λŠ” μƒνƒœμ΄λ‹€.
그런데 μ΄λ•Œ μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ μ½”λ“œλ₯Ό 훑어보고 μ‚¬μš©μžκ°€ μ ‘κ·Όν•  수 μ—†λŠ” λŒ€μΆ© 이름을 μ§€μ–΄μ„œ μž„μ‹œλ³€μˆ˜λ₯Ό λ§Œλ“€μ–΄λ²„λ¦°λ‹€.
그리고 κ·Έ 값을 λ³€μˆ˜μ— λ„£μ–΄μ„œ equals에 λ„£μ–΄λ²„λ €μ„œ μ½”λ“œκ°€ μž‘λ™ν•˜κ²Œ λ˜λŠ” 것이닀.

 

System.out.println("κ°™λ‹€" + ".");

λΉ„μŠ·ν•œ 예둜 "κ°™λ‹€"와 "."을 ν•©μ³μ„œ 화면에 λ„μ›Œμ£ΌλŠ” μ½”λ“œμΈλ° ν”„λ¦°νŠΈλ₯Ό ν• λ•Œμ—λŠ” ν•©μΉœ κ²°κ³Όλ₯Ό λ©”λͺ¨λ¦¬ 블둝을 λ§Œλ“€μ–΄μ„œ 넣은 λ‹€μŒμ— μ‹œμž‘μ •λ³΄λ₯Ό λ„£μ–΄μ€€ λ‹€μŒμ— 화면에 λ„μ›Œμ€˜μ•Όν•˜λŠ” 것이닀.
κ·Έλž˜μ„œ μž„μ‹œλ³€μˆ˜λ₯Ό ν†΅ν•΄μ„œ ν•©μΉœκ°’μ„ λ©”λͺ¨λ¦¬μ— λ„£κ³  ν•©μΉœ 참쑰값을 λ³€μˆ˜μ— λ„£μ–΄ μ‹€ν–‰ν•΄μ£Όλ©΄ μ œλŒ€λ‘œλœ κ²°κ³Όλ₯Ό λ³Ό 수 있게 λ˜λŠ” 것이닀.

 

System.out.println(1 + 2 + 3);

μ΄λ˜ν•œ μž„μ‹œλ³€μˆ˜κ°€ μ‚¬μš©λœ μ˜ˆμ΄λ‹€.
ν•΄λ‹Ή μ½”λ“œλŠ” μ „ν˜€ λ¬Έμ œκ°€ μ—†μ–΄λ³΄μ΄μ§€λ§Œ 사싀 보편적인 μ»΄ν“¨ν„°λŠ” 연산을 2κ°œμ΄μƒ ν•œκΊΌλ²ˆμ— μ²˜λ¦¬ν•˜μ§€ λͺ»ν•œλ‹€.
κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 사싀상 1+2+3은 1+2λ₯Ό λ”ν•œλ‹€μŒμ— λ‚˜μ˜¨ 결과값에 3을 λ”ν•΄μ£ΌλŠ” 과정이 μƒλž΅λ˜μ–΄μžˆλŠ” 것이닀.
κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ¨Όμ„œ λ”ν•œ 값을 μž„μ‹œλ³€μˆ˜λ₯Ό 톡해 λ„£μ–΄μ€€ λ‹€μŒμ— 이후에 λ‹€μŒ 값을 λ”ν•˜λŠ” 과정을 ν†΅ν•΄μ„œ 결과값이 λ‚˜μ˜€κ²Œ λ˜λŠ” 것이닀.

 

μž„μ‹œλ³€μˆ˜ μ‚¬μš©μ‹œ μ£Όμ˜μ‚¬ν•­ )

μž„μ‹œλ³€μˆ˜λŠ” μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ μ“Έ 수 있으며, κ·Έλ‘œμΈν•΄ μ§κ΄€μ μ΄λΌλŠ” νŠΉμ§•μ„ 가지고 μžˆμ§€λ§Œ μž„μ‹œλ³€μˆ˜λŠ” μ‚¬μš©μžκ°€ μ ‘κ·Όν•  수 μ—†κΈ° λ•Œλ¬Έμ— νŒŒλΌλ―Έν„°λ‘œ μ‚¬μš©λ˜κ³  λ°”λ‘œ λ©”λͺ¨λ¦¬λ₯Ό μžƒμ–΄λ²„λ¦¬κ²Œ λœλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ‚΄κ°€ νŒŒλΌλ―Έν„°λ‘œ 넣은 λ°°μ—΄μ˜ 값을 ν™•μΈν•˜κ³  싢을 λ•Œμ—λŠ” λ©”μ†Œλ“œμ—μ„œ 해당배열을 λ¦¬ν„΄μ‹œμΌœμ£Όμ–΄μ•Ό 값을 μžƒμ–΄λ²„λ¦¬μ§€ μ•Šκ³  확인할 수 있게 λœλ‹€.

 


Bubble Sort 정리

μ €λ²ˆλΆ€ν„° ν•™μŠ΅ν–ˆλ˜ Bubble Sortλ₯Ό 기반으둜 ν”„λ‘œκ·Έλž¨μ΄ μ–΄λ–»κ²Œ μ œμž‘λ˜μ–΄μ§€λŠ”μ§€μ— λŒ€ν•œ 정보λ₯Ό 그림으둜 ν‘œν˜„ν•œ 것이닀.

κ°„λ‹¨ν•˜κ²Œ μ„€λͺ…ν•΄λ³΄μžλ©΄ λ²„λΈ”μ†ŒνŠΈλ‘œ μ •λ ¬ν• μˆ˜μžˆλŠ” ν”„λ‘œκ·Έλž¨μ€ μ½”λ“œλ₯Ό μ§€λ•Œ ν•„μš”ν•œ 데이터λ₯Ό λ„μ§‘μ–΄λ‚΄λŠ” 좔상화와 μ΄λŸ¬ν•œ 것듀을 λΉ„μŠ·ν•œ 것 끼리 λ¬ΆλŠ” μΊ‘μŠν™” 과정을 ν†΅ν•΄μ„œ λ§Œλ“€μ–΄ μ§€κ²Œλœλ‹€.

μ΄λ•Œμ˜ BubbleSort()λΌλŠ” ν΄λž˜μŠ€λŠ” 좔상화λ₯Ό 톡해 뽑아낸 데이터인 Attribute와 Method둜 μ΄λ£¨μ–΄μ Έμžˆλ‹€.

κ°„λ‹¨ν•˜κ²Œ λ™μž‘λ˜λŠ” μ½”λ“œλ₯Ό λ§Œλ“€μ—ˆλ‹€λ©΄ μš°λ¦¬λŠ” μ½”λ“œμ˜ μ•Œκ³ λ¦¬μ¦˜μ„ λΆ„μ„ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ΄ 쒀더 효율적으둜 λ™μž‘λ˜κ²Œ ν•˜κΈ° μœ„ν•΄ μ΅œμ ν™” 과정을 κ±°μΉ˜κ²Œλœλ‹€.
λ˜ν•œ μ™„μ„±λœ 버블정렬을 톡해 μš°λ¦¬λŠ” Sort의 일반적인 ꡬ쑰λ₯Ό 확인할 수 있으며 sort 방식, sort κΈ°μ€€, swap으둜 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ 쒋은 ν•¨μˆ˜λ₯Ό λ―Όλ“€κΈ° μœ„ν•΄μ„œλŠ” νŒŒλΌλ―Έν„°μ™€ 리턴벨λ₯˜λ₯Ό μ‹ κ²½μ¨μ€˜μ•Ό ν•˜λŠ”λ° νŒŒλΌλ―Έν„°μ—μ„œλŠ” enum을 μ‚¬μš©ν•΄ μ½”λ“œμ˜ 가독성과 강건성을 λ†’μ—¬μ£Όκ³  리턴벨λ₯˜μ—μ„œλŠ” μ½”λ“œμ•ˆμ—μ„œ μž„μ‹œλ³€μˆ˜λ₯Ό μƒμ„±ν•˜κ³  μ‚¬μš©ν•  일이 생겼을 경우 κΌ­ μž„μ‹œλ³€μˆ˜μ•ˆμ— μžˆλŠ” 값을 λ¦¬ν„΄ν•΄μ£ΌλŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ μ£Όμ–΄μ•Ό ν•œλ‹€.


λ°˜μ‘ν˜•

λŒ“κΈ€