λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’» 개발자 이야기/✏️ μ •λ¦¬λ…ΈνŠΈ

2λΆ€ μ½”λ“œμ„€κ³„ > 6μž₯ 클래슀 섀계 > data, sealed, abstract ν•œμ •μž / ν•¨μˆ˜νƒ€μž… / νƒœκ·Έν΄λž˜μŠ€

by μ •μ„ ν•œ 2022. 9. 2.
728x90
λ°˜μ‘ν˜•
2λΆ€ μ½”λ“œμ„€κ³„ > 6μž₯ 클래슀 섀계 > 데이터 μ§‘ν•© ν‘œν˜„μ— dataν•œμ •μžλ₯Ό μ‚¬μš©ν•˜λΌ
2λΆ€ μ½”λ“œμ„€κ³„ > 6μž₯ 클래슀 섀계 > μ—°μ‚° λ˜λŠ” μ•‘μ…˜μ„ 전달할 λ•ŒλŠ” μΈν„°νŽ˜μ΄μŠ€ λŒ€μ‹  ν•¨μˆ˜νƒ€μž…μ„ μ‚¬μš©ν•˜λΌ
2λΆ€ μ½”λ“œμ„€κ³„ > 6μž₯ 클래슀 섀계 > νƒœκ·Έ 클래슀 λ³΄λ‹€λŠ” 클래슀 계측을 μ‚¬μš©ν•˜λΌ
 
였늘의 TIL 3쀄 μš”μ•½
  • data ν•œμ •μž, 데이터 클래슀의 μž₯점
  • ν•¨μˆ˜νƒ€μž…μœΌλ‘œ μ–»λŠ” μ½”λ“œμ˜ 자유
  • νƒœκ·Έ 클래슀 vs. 클래슀 계측 (sealed, abstractν•œμ •μž)

1. μ±…μ—μ„œ κΈ°μ–΅ν•˜κ³  싢은 λ‚΄μš©

data ν•œμ •μž, 데이터듀을 ν•œκΊΌλ²ˆμ— 전달해야 ν•  λ•Œ μ‚¬μš©ν•˜λŠ” ν΄λž˜μŠ€μ— λΆ™μ–΄μžˆλŠ” 것을 확인할 수 μžˆλ‹€. 이 ν•œμ •μžλ₯Ό 뢙이면 μ•„λž˜μ˜ ν•¨μˆ˜λ“€μ΄ μžλ™μœΌλ‘œ μƒμ„±λœλ‹€.
- toString :  둜그 좜λ ₯ 및 디버그 μ‹œ ν™œμš©
- equals, hashCode
- copy : immuatable 데이터 클래슀λ₯Ό λ§Œλ“€ λ•Œ 편리, κΈ°λ³Έ μƒμ„±μž ν”„λ‘œνΌν‹°κ°€ 같은 μƒˆλ‘œμš΄ 객체λ₯Ό 볡제
- componentN : μœ„μΉ˜λ₯Ό 기반으둜 객체λ₯Ό ν•΄μ œ (μœ„μΉ˜λ₯Ό 잘λͺ» μ§€μ •ν•˜μ—¬ ν•΄μ œν•  λ•Œ, λ‹€μ–‘ν•œ λ¬Έμ œκ°€ λ°œμƒν•  수 있음)

μ½”ν‹€λ¦°μ˜ νŠœν”ŒμΈ Pair, Triple : νŠœν”Œμ€ Serializable기반으둜 μƒμ„±λ˜μ–΄ toString을 μ‚¬μš©ν•  수 μžˆλŠ” μ œλ„€λ¦­ 데이터 ν΄λž˜μŠ€μ΄λ‹€.

νŠœν”Œμ„ μ‚¬μš©ν•˜λŠ” 경우
- 값에 κ°„λ‹¨ν•˜κ²Œ 이름을 뢙일 λ•Œ
- ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ λ³Ό 수 μžˆλŠ” κ²ƒμ²˜λŸΌ 미리 μ•Œ 수 μ—†λŠ” aggregateλ₯Ό ν‘œν˜„ν•  λ•Œ
이 κ²½μš°λ“€μ„ μ œμ™Έν•˜κ³ λŠ” 무쑰건 데이터 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

데이터 클래슀의 μž₯점
- ν•¨μˆ˜μ˜ 리턴 νƒ€μž…μ΄ 더 λͺ…ν™•ν•΄ μ§„λ‹€.
- 리턴 νƒ€μž…μ΄ 더 μ§§μ•„μ§€λ©°, μ „λ‹¬ν•˜κΈ° μ‰¬μ›Œμ§„λ‹€.
- μ‚¬μš©μžκ°€ 데이터 ν΄λž˜μŠ€μ— μ ν˜€ μžˆλŠ” 것과 λ‹€λ₯Έ 이름을 ν™œμš©ν•΄ λ³€μˆ˜λ₯Ό ν•΄μ œν•˜λ©΄, κ²½κ³ κ°€ 좜λ ₯λœλ‹€.
데이터 ν΄λž˜μŠ€λŠ” μ½”ν‹€λ¦°μ—μ„œ 큰 λΉ„μš© 없이 μ‚¬μš©ν•  수 μžˆλŠ” 쒋은 λ„κ΅¬μ΄λ―€λ‘œ 적극적으둜 ν™œμš©ν•  것.

λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—λŠ” ν•¨μˆ˜ νƒ€μž…μ˜ κ°œλ…μ΄ μ—†μ–΄ SAM μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™œμš©ν•œλ‹€.
SAM Interface : Single-Abstract Method Interface (μ—°μ‚° λ˜λŠ” μ•‘μ…˜μ„ 전달할 λ•Œ λ©”μ„œλ“œκ°€ ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€)

ν•¨μˆ˜ νƒ€μž…μœΌλ‘œ μ–»λŠ” μ½”λ“œμ˜ 자유
- λžŒλ‹€ ν‘œν˜„μ‹ λ˜λŠ” 읡λͺ… ν•¨μˆ˜λ‘œ 전달
  - λžŒλ‹€ ν‘œν˜„μ‹ μ‚¬μš© μ‹œ destructure argument도 μ‚¬μš© κ°€λŠ₯
- ν•¨μˆ˜ 레퍼런슀 λ˜λŠ” μ œν•œλœ ν•¨μˆ˜ 레퍼런슀둜 전달
- μ„ μ–Έλœ ν•¨μˆ˜ νƒ€μž…μ„ κ΅¬ν˜„ν•œ 객체둜 전달
- νƒ€μž… 별칭을 톡해 ν•¨μˆ˜ νƒ€μž…λ„ 이름을 뢙일 수 μžˆλ‹€.

SAM을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 경우, 코틀린이 μ•„λ‹Œ λ‹€λ₯Έ μ–Έμ–΄μ—μ„œ μ‚¬μš©ν•  클래슀λ₯Ό 섀계할 λ•Œ.
javaμ—μ„œλŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ 더 λͺ…ν™•ν•˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ νƒ€μž…μœΌλ‘œ λ§Œλ“€μ–΄μ§„ ν΄λž˜μŠ€λŠ” μžλ°”μ—μ„œ νƒ€μž… 별칭과 IDE의 지원을 μ œλŒ€λ‘œ 받을 수 μ—†λ‹€.

μƒμˆ˜(constant) λͺ¨λ“œλ₯Ό νƒœκ·ΈλΌκ³  λΆ€κ·Έλ‘œ μ΄λŸ¬ν•œ νƒœκ·Έλ₯Ό ν¬ν•¨ν•œ 클래슀λ₯Ό νƒœκ·Έ 클래슀라고 함.
νƒœκ·Έ 클래슀의 문제
- μ„œλ‘œ λ‹€λ₯Έ μ±…μž„μ„ ν•œ ν΄λž˜μŠ€μ— νƒœκ·Έλ‘œ κ΅¬λΆ„ν•΄μ„œ λ„£λŠ”λ‹€λŠ” κ²ƒμ—μ„œλΆ€ν„° μ‹œμž‘ν•œλ‹€.
- ν•œ ν΄λž˜μŠ€μ— μ—¬λŸ¬ λͺ¨λ“œλ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μƒμš©κ΅¬κ°€ μΆ”κ°€λœλ‹€.
- μ—¬λŸ¬ λͺ©μ μœΌλ‘œ μ‚¬μš©ν•΄μ•Ό ν•˜λ―€λ‘œ ν”„λ‘œνΌν‹°κ°€ 일관적이지 μ•Šκ²Œ μ‚¬μš©λ˜κ³  더 λ§Žμ€ ν”„λ‘œνΌν‹°κ°€ ν•„μš”ν•˜λ‹€.
- μš”μ†Œκ°€ μ—¬λŸ¬ λͺ©μ μ„ κ°€μ§€κ³ , μ—¬λŸ¬ λ°©λ²•μœΌλ‘œ μ„€μ •ν•  수 μžˆλŠ” κ²½μš°μ—λŠ” μƒνƒœμ˜ 일관성과 정확성을 μ§€ν‚€κΈ° μ–΄λ ΅λ‹€.
- νŒ©ν† λ¦¬ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€.

κ·Έλž˜μ„œ 일반적으둜 sealed 클래슀λ₯Ό 많이 μ‚¬μš©ν•œλ‹€.
ν•œ ν΄λž˜μŠ€μ— μ—¬λŸ¬ λͺ¨λ“œλ₯Ό λ§Œλ“œλŠ” 방법 λŒ€μ‹ μ—, 각각의 λͺ¨λ“œλ₯Ό μ—¬λŸ¬ 클래슀둜 λ§Œλ“€κ³  νƒ€μž… μ‹œμŠ€ν…œκ³Ό λ‹€ν˜•μ„±μ„ ν™œμš©.

sealed ν•œμ •μž
- μ™ΈλΆ€ νŒŒμΌμ—μ„œ 좔가적인 μ„œλΈŒ 클래슀λ₯Ό λ§Œλ“œλŠ” ν–‰μœ„ 자체λ₯Ό μ œν•œν•œλ‹€.
- μ™ΈλΆ€μ—μ„œ 좔가적인 μ„œλΈŒ 클래슀λ₯Ό λ§Œλ“€ 수 μ—†μœΌλ―€λ‘œ, νƒ€μž…μ΄ μΆ”κ°€λ˜μ§€ μ•Šμ„ 것이 보μž₯λœλ‹€.
- whenμ ˆμ—μ„œ elseλ₯Ό λ”°λ‘œ λ§Œλ“€ ν•„μš”κ°€ μ—†λ‹€.
- 클래슀의 μ„œλΈŒ 클래슀λ₯Ό μ œμ–΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” sealed ν•œμ •μžλ₯Ό μ‚¬μš©ν•œλ‹€.

abstract ν•œμ •μž
- λ‹€λ₯Έ κ°œλ°œμžκ°€ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.
- 계측에 μƒˆλ‘œμš΄ ν΄λž˜μŠ€κ°€ 좔가될 수 μžˆλŠ” μ—¬μ§€λ₯Ό 남기기 λ•Œλ¬Έμ— 상속과 κ΄€λ ¨λœ 섀계λ₯Ό ν•  λ•Œ μ‚¬μš©ν•œλ‹€.

μƒνƒœ νŒ¨ν„΄(status pattern)
- 객체의 λ‚΄λΆ€ μƒνƒœκ°€ λ³€ν™”ν•  λ•Œ, 객체의 λ™μž‘μ΄ λ³€ν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄ λ””μžμΈ νŒ¨ν„΄.
- ν”„λ‘ νŠΈμ—”νŠΈ 컨트둀러, ν”„λ ˆμ  ν„°, λ·° λͺ¨λΈμ„ 섀계할 λ•Œ 많이 μ‚¬μš©λœλ‹€.
- μƒνƒœ νŒ¨ν„΄μ„ μ‚¬μš©ν•˜μ—¬ ν”„λ‘œμ νŠΈμ— 적용 μ‹œ μ„œλ‘œ λ‹€λ₯Έ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 클래슀 계측ꡬ쑰λ₯Ό λ§Œλ“€κ²Œ 되며, ν˜„μž¬ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ 읽고 μ“Έ 수 μžˆλŠ” ν”„λ‘œνΌν‹°λ„ λ§Œλ“€κ²Œ λœλ‹€. λ”°λΌμ„œ μƒνƒœλŠ” 더 λ§Žμ€ μ±…μž„μ„ κ°€μ§„ 큰 클래슀이며 변경될 수 μžˆλ‹€.
- (νƒ€μž… 계측) νƒœκ·Έ ν΄λž˜μŠ€λ³΄λ‹€λŠ” sealed 클래슀 κ³„μΈ΅μœΌλ‘œ λ§Œλ“€μ–΄μ§€λ©°, 이λ₯Ό immutable 객체둜 λ§Œλ“€κ³  λ³€κ²½ν•΄μ•Ό ν•  λ•Œλ§ˆλ‹€, state ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½ν•˜λ©° viewμ—μ„œ ν•΄λ‹Ή λ³€ν™”λ₯Ό observe ν•˜λ„λ‘ ν•œλ‹€.

μ½”ν‹€λ¦°μ—μ„œλŠ” νƒœκ·Έ ν΄λž˜μŠ€λ³΄λ‹€ νƒ€μž… 계측을 μ‚¬μš©ν•˜λŠ” 것이 더 μ’‹κ³  μ΄λŸ¬ν•œ νƒ€μž… 계측은 sealed 클래슀λ₯Ό μ‚¬μš©ν•œλ‹€. 이 것은 μƒνƒœ νŒ¨ν„΄κ³ΌλŠ” λ‹€λ₯΄λ―€λ‘œ ꡬ별은 ν•΄μ•Ό ν•œλ‹€. νƒ€μž… 계측과 μƒνƒœ νŒ¨ν„΄μ€ μ‹€μ§ˆμ μœΌλ‘œ ν•¨κ»˜ μ‚¬μš©λ˜λŠ” ν˜‘λ ₯ 관계에 μžˆλ‹€.

728x90
λ°˜μ‘ν˜•