λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
이둠/Study

객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° Object-Oriented Programming(OOP)μ΄λž€

by 6161990 2021. 7. 15.

πŸ“Œ κ°μ²΄ 지ν–₯ ν”„λ‘œκ·Έλž˜λ° Object-Oriented Programming(OOP)

 

πŸ“ κ°μ²΄λž€

  • ν˜„μ‹€μ— μ‘΄μž¬ν•˜λŠ” λ…λ¦½μ μ΄λ©΄μ„œ ν•˜λ‚˜λ‘œ μ·¨κΈ‰λ˜λŠ” μ‚¬λ¬Όμ΄λ‚˜ κ°œλ…μ„ λ§ν•œλ‹€.
  • 객체 지ν–₯ μ–Έμ–΄μ—μ„œ 객체의 κ°œλ…μ€ 클래슀의 μ˜ν•΄ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλœ κ²°κ³Όλ¬Ό(Object)이닀.


πŸ“ κ°μ²΄μ˜ ν• λ‹Ή

  • newμ—°μ‚°μžμ™€ μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 객체λ₯Ό μƒμ„±ν•˜λ©΄,

heap λ©”λͺ¨λ¦¬ 곡간에 μ„œλ‘œ λ‹€λ₯Έ μžλ£Œν˜•μ˜ 데이터가 μ—°μ†μœΌλ‘œ λ‚˜μ—΄ ν• λ‹Ήλœ 객체 곡간이 λ§Œλ“€μ–΄μ§„λ‹€.이것을 μΈμŠ€ν„΄μŠ€Instance 라고 ν•œλ‹€.


🚩 new μ˜ μ—­ν• 1. 자유 λ©”λͺ¨λ¦¬ 곡간 heap에 객체(μΈμŠ€ν„΄μŠ€)λ₯Ό λ§Œλ“ λ‹€.

2. μƒμ„±μžλ₯Ό ν†΅ν•΄μ„œ μ΄ˆκΈ°ν™” μ²˜λ¦¬ν•œλ‹€. (κΈ°λ³Έ μƒμ„±μžλ©΄ μ€€λΉ„λœ κΈ°λ³Έ κ°’μœΌλ‘œ μ΄ˆκΈ°κ°’ 기둝함)

=> μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ˜ heap μ£Όμ†Œκ°€ 레퍼런슀 λ³€μˆ˜ s에 기둝이 λ˜λ©΄μ„œ

stack λ©”λͺ¨λ¦¬μ— μžˆλŠ” sκ°€ heap에 μžˆλŠ” μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•˜κ²Œλœλ‹€.

 

πŸ“ ν΄λž˜μŠ€

  • μžλ£Œν˜•μ΄ λ‹€λ₯Έ λ³€μˆ˜λ“€μ˜ 연속 λ‚˜μ—΄ (클래슀의 멀버 λ³€μˆ˜)
  • 객체의 νŠΉμ„±μ— λŒ€ν•œ μ •μ˜λ₯Ό ν•œ κ²ƒμœΌλ‘œ μΊ‘μŠν™”λ₯Ό 톡해 κΈ°λŠ₯ ν¬ν•¨ν•œ κ°œλ….
  • μ™ΈλΆ€μ—μ„œ ν΄λž˜μŠ€λ‚΄λΆ€μ˜ ν•„λ“œμ—λŠ” μ ‘κ·Όν•˜μ§€ λͺ»ν•˜μ§€λ§Œ, λ©€λ²„ν•¨μˆ˜μ—λŠ” μ ‘κ·Όκ°€λŠ₯.
  • μ‚¬λ¬Όμ΄λ‚˜ κ°œλ…μ˜ 곡톡 μš”μ†Œλ₯Ό μΆ”μƒν™”ν•˜μ—¬ μ •μ˜ν•¨. ex) μ œν’ˆμ˜ 섀계도


🚩 ν΄λž˜μŠ€ 멀버

[μ ‘κ·Όμ œν•œμž] [μ˜ˆμ•½μ–΄] class 클래슀λͺ…{

//λ©€λ²„λ³€μˆ˜ Field, new ν•  λ•Œ λ©”λͺ¨λ¦¬μ— μ—°μ†μœΌλ‘œ ν• λ‹Ήλ˜λŠ” λ³€μˆ˜.

μžλ£Œν˜• λ³€μˆ˜λͺ…;

μžλ£Œν˜• λ³€μˆ˜λͺ…;

 

//μƒμ„±μž Constructor [μ ‘κ·Όμ œν•œμž] μƒμ„±μžλͺ…(){}

 

//멀버 ν•¨μˆ˜ Method κΈ°λŠ₯μ •μ˜μ„€μ •

[μ ‘κ·Όμ œν•œμž] 리턴λͺ… λ©”μ†Œλ“œλͺ…(λ§€κ°œλ³€μˆ˜){

      κΈ°λŠ₯μ •μ˜

       }

}


🚩 μžλ°”μ—μ„œ λ§Œλ“€ 수 μžˆλŠ” λ„€ 가지 클래슀 ν˜•νƒœ

[μ ‘κ·Όμ œν•œμž] [μ˜ˆμ•½μ–΄] class 클래슀λͺ…{}

public class 클래슀λͺ…{...} //1

class 클래슀λͺ…{...} //2

public abstract class 클래슀λͺ… {...} //3

public final class 클래슀λͺ… {...} //4

 

1. κ°€μž₯ 일반적인 ν˜•νƒœ

2. default class = package private class.

3. abstract = "λ―Έμ™„μ„±μ˜" μƒμ†μ—μ„œ λΆ€λͺ¨μ˜ 역할을 μˆ˜ν–‰ν•œλ‹€. νƒœμ–΄λ‚œ λͺ©μ μ΄ 'λΆ€λͺ¨'의 역할을 ν•˜κΈ° μœ„ν•΄μ„œλ‹€.

클래슀 λ‚΄ 좔상 λ©”μ„œλ“œκ°€ μ„ μ–Έλ˜μ–΄ μžˆλŠ” 좔상 클래슀, λ°˜λ“œμ‹œ 후손이 μ™„μ„±ν•΄μ•Όν•œλ‹€

.4. final μ’…λ‹¨ν΄λž˜μŠ€ : 더 이상 후손을 λ§Œλ“€μ§€ λͺ»ν•˜λŠ” 클래슀 , 클래슀의 κΈ°λŠ₯ ν™•μž₯을 ν•˜μ§€ λͺ»ν•˜κ²Œ ν•˜λ €κ³  λ§Œλ“  클래슀,변경될 수 μ—†λŠ” ν΄λž˜μŠ€μ΄λ‹€.=> finalκ³Ό abstract 두 μ˜ˆμ•½μ–΄λ₯Ό λ™μ‹œμ— μ‚¬μš©ν•  수 μ—†λ‹€.

상속 λΆˆκ°€μΈ final, λ°˜λ“œμ‹œ μƒμ†ν•΄μ•Όν•˜λŠ” abstract, λ°˜λŒ€μ˜ κ°œλ…μ„ 가지고 있기 λ•Œλ¬Έμ΄λ‹€.


🚩 ν΄λž˜μŠ€ ν•„λ“œ

public class 클래슀λͺ… { μ ‘κ·Όμ œν•œμž [μ˜ˆμ•½μ–΄] μžλ£Œν˜• λ³€μˆ˜λͺ… [=μ΄ˆκΈ°κ°’]; }

  • 클래슀 ν•„λ“œ λ„€ 가지 μ ‘κ·Ό μ œν•œμž1. public + : μ „μ²΄κ³΅κ°œ2. protected # : 상속이 μ•ˆλ˜μ—ˆμ„ λ•ŒλŠ” default 와 κ°™λ‹€. νŒ¨ν‚€μ§€ μ•ˆμ— μžˆλŠ” 클래슀만 μ ‘κ·Όν•  수 μžˆλ‹€.상속이 λ˜μ—ˆμ„ λ•ŒλŠ” μƒμ†λœ 후손 λ‚΄λΆ€μ—μ„œλ§Œ λΆ€λͺ¨μ˜ 것을 μ“Έ 수 μžˆλ‹€.3. default ~ : package privateμœΌλ‘œλ„ λΆˆλ¦°λ‹€.μƒλž΅ν•  수 μžˆλ‹€.4. private - : ν•΄λ‹Ή 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©κ°€λŠ₯ν•˜λ‹€. (μΊ‘μŠν™”μ˜ 원칙)
  • 클래슀 ν•„λ“œ μ˜ˆμ•½μ–΄
    • static : 같은 νƒ€μž…μ˜ μ—¬λŸ¬ 객체가 κ³΅μœ ν•  λͺ©μ μ˜ ν•„λ“œμ— μ‚¬μš©ν•˜λ©°, ν”„λ‘œκ·Έλž¨ μ‹œμž‘μ‹œ 정적 λ©”λͺ¨λ¦¬ μ˜μ—­μ— μžλ™ ν• λ‹Ήλœλ‹€.
    • final : ν•˜λ‚˜μ˜ κ°’λ§Œ 계속 μ €μž₯ν•΄μ•Όν•˜λŠ” λ³€μˆ˜μ— μ‚¬μš©ν•œλ‹€. λ©”μ†Œλ“œ μ•ˆμ— μ§€μ—­λ³€μˆ˜μ—λ„ final μ‚¬μš©κ°€λŠ₯ν•˜λ‹€.

=> static + final = 값을 λ³€κ²½ν•  수 μ—†λŠ” μƒμˆ˜ 의 μ˜λ―Έλ‹€. λ³€μˆ˜μ™€μ˜ ꡬ뢄을 μœ„ν•΄ λŒ€λ¬Έμžλ‘œ μ„ μ–Έν•œλ‹€.

 


🚩 ν΄λž˜μŠ€ μ΄ˆκΈ°ν™” λΈ”λŸ­

  • μ΄ˆκΈ°ν™” μˆœμ„œ
    • 클래슀 λ³€μˆ˜JVM κΈ°λ³Έκ°’ -> λͺ…μ‹œμ  μ΄ˆκΈ°κ°’ -> 클래슀 μ΄ˆκΈ°ν™” 블둝 μ΄ˆκΈ°κ°’
    • μΈμŠ€ν„΄μŠ€ 블둝JVM κΈ°λ³Έκ°’ -> λͺ…μ‹œμ  μ΄ˆκΈ°κ°’ -> μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” 블둝 μ΄ˆκΈ°κ°’ -> μƒμ„±μžλ₯Ό ν†΅ν•œ μ΄ˆκΈ°κ°’

🚩 κ°μ²΄ 지ν–₯ class의 핡심?μžλ£Œν˜•μ΄ λ‹€λ₯Έ λ³€μˆ˜λ“€μ˜ λ¬ΆμŒμ„ private(-)ν•˜κ²Œ λ³΄κ΄€ν•œλ‹€

.=> μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜κ²Œ μΊ‘μŠν™” ν•˜λŠ” 과정이 λ³€μˆ˜λ“€μ— λŒ€ν•΄ μ—°μ‚°μ²˜λ¦¬(λ©”μ†Œλ“œ)등을 ν•΄μ•Όν•˜λŠ” κΈ°λŠ₯듀이 외뢀에 μ‘΄μž¬ν•˜κ²Œ 되면클래슀 μ•ˆμ— 멀버에 μ ‘κ·Όν•  수 μ—†κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή κΈ°λŠ₯듀을 클래슀 μ•ˆμœΌλ‘œ μ§‘μ–΄λ„£μ–΄μ„œ μ²˜λ¦¬ν•œλ‹€.

 


클래슀 생성과정 (μ°Έμ‘° μžλ£Œν˜•)



πŸ“ μΆ”상화

  • μœ μ—°μ„±μ„ ν™•λ³΄ν•˜κΈ° μœ„ν•΄ ꡬ체적인 것은 μ œκ±°ν•œλ‹€λŠ” 의미
  • ν”„λ‘œκ·Έλž¨μ—μ„œ ν•„μš”ν•œ 곡톡점을 μΆ”μΆœν•˜κ³ , λΆˆν•„μš”ν•œ 곡톡점을 μ œκ±°ν•˜λŠ” κ³Όμ •

=> ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€λ €λ©΄ ν•„μš”ν•œ data듀이 μžˆλŠ”λ° 그게 μ–΄λ–€ 것인지 μΆ”μΆœν•˜λŠ” κ³Όμ •

 

ex) κ΅­κ°€μ—μ„œ κ΅­λ―Ό 정보 κ΄€λ¦¬μš© ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€λ €κ³  ν•  λ•Œ, ν”„λ‘œκ·Έλž¨μ—μ„œ μš”κ΅¬λ˜λŠ” "κ΅­λ―Ό ν•œ μ‚¬λžŒ"의 정보λ₯Ό 좔상화 ν•œλ‹€λ©΄?κ΅­λ―Ό ν•œ μ‚¬λžŒ'λ‹Ή' ν•„μš”ν•œ 정보 : 이름, μ£Όμ†Œ, 성별, μ „ν™”λ²ˆν˜Έ, λ‚˜μ΄, 주민번호 => 좔상화해야할 dataλ“€.

  • μΆ”μƒν™”ν•œ 결과물을 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ₯Ό μ‚¬μš©ν•΄μ„œ λ³€μˆ˜λͺ…(데이터 이름)κ³Ό μžλ£Œν˜•(데이터 νƒ€μž…)을 정리함.-> κ·Έ λ‹€μŒ μ •λ¦¬ν•œ λ‚΄μš©μ„ λ‹€μ΄μ–΄κ·Έλž¨μœΌλ‘œ ν‘œν˜„ν•œλ‹€

=> μΆ”μΆœλœ data듀을 같은 μ’…λ₯˜μ”© μ •λ¦¬ν•˜λŠ” DB λͺ¨λΈλ§ κ³Όμ •.

 

 

πŸ“ κ°μ²΄ 지ν–₯의 3λŒ€ 원칙

1. μΊ‘μŠν™” : 클래슀의 λ©€λ²„λ³€μˆ˜λŠ” λ°˜λ“œμ‹œ privateμ²˜λ¦¬ν•œλ‹€.

  • 좔상화λ₯Ό 톡해 μ •λ¦¬λœ 데이터듀과 κΈ°λŠ₯을 ν•˜λ‚˜λ‘œ λ¬Άμ–΄ κ΄€λ¦¬ν•˜λŠ” 기법을 λ§ν•œλ‹€.클래슀의 κ°€μž₯ μ€‘μš”ν•œ λͺ©μ μΈ λ°μ΄ν„°μ˜ μ ‘κ·Όμ œν•œμ„ μ›μΉ™μœΌλ‘œ ν•˜μ—¬ 클래슀 μ™ΈλΆ€μ—μ„œ λ°μ΄ν„°μ˜ 직접 접근을 막고,λŒ€μ‹  데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•¨μˆ˜λ“€μ„ 클래슀 내뢀에 μž‘μ„±ν•˜λŠ” 방법을 μΊ‘μŠν™”λΌκ³  ν•œλ‹€.
  • μΊ‘μŠν™”μ˜ μ›μΉ™ν΄λž˜μŠ€μ˜ 멀버 λ³€μˆ˜μ— λŒ€ν•œ μ ‘κ·ΌκΆŒν•œμ€ private을 μ›μΉ™μœΌλ‘œ ν•œλ‹€.클래슀의 멀버 λ³€μˆ˜μ— λŒ€ν•œ μ—°μ‚°μ²˜λ¦¬λ₯Ό λͺ©μ μœΌλ‘œν•˜λŠ” ν•¨μˆ˜λ“€μ„ 클래슀 내뢀에 μž‘μ„±ν•œλ‹€.멀버 ν•¨μˆ˜λŠ” 클래슀 λ°–μ—μ„œ μ ‘κ·Όν•  수 μžˆλ„λ‘ public으둜 μ„€μ •ν•œλ‹€.

2. 상속 : μ†ŒμŠ€μ½”λ“œ 쀑볡을 쀄이기 μœ„ν•œ 방법둠.

  • λ‹€λ₯Έ ν΄λž˜μŠ€κ°€ 가지고 μžˆλŠ” 멀버(ν•„λ“œμ™€ λ©”μ†Œλ“œ)듀을 μƒˆλ‘œ μž‘μ„±ν•  ν΄λž˜μŠ€μ—μ„œ 직접 λ§Œλ“€μ§€ μ•Šκ³ , 상속을 λ°›μŒμœΌλ‘œμ¨μƒˆ ν΄λž˜μŠ€κ°€ μžμ‹ μ˜ λ©€λ²„μ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλŠ” κΈ°λŠ₯, 클래슀λ₯Ό μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λ©° μ—¬λŸ¬ ν”„λ‘œμ νŠΈμ— 같은 κΈ°λŠ₯의 ν΄λž˜μŠ€κ°€ ν•„μš”ν•œ κ²½μš°μ—λ„ 상속을 μ‚¬μš©ν•œλ‹€.
  • 보닀 적은 μ–‘μ˜ μ½”λ“œλ‘œ μƒˆλ‘œμš΄ 클래슀λ₯Ό μž‘μ„±ν•  수 있고, μ½”λ“œλ₯Ό κ³΅ν†΅μ μœΌλ‘œ κ΄€λ¦¬ν•˜κΈ° λ•Œλ¬Έμ— μ½”λ“œμ˜ μΆ”κ°€ 및 변경이 μš©μ΄ν•˜λ‹€.=> μ½”λ“œμ˜ 쀑볡을 μ œκ±°ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ˜ 생산성과 μœ μ§€λ³΄μˆ˜κ°€ 쒋아진닀.

3. λ‹€ν˜•μ„± : 상속을 μ΄μš©ν•΄ λ‹€μ–‘ν•œ νƒ€μž… ( = λ‹€μ–‘ν•œ 클래슀)'μ„œλ‘œ λ‹€λ₯Έ ν˜•νƒœ'λ₯Ό μ§€μΉ­ν•˜λŠ” 말둜 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 3λŒ€ νŠΉμ§• 쀑 ν•˜λ‚˜μ΄λ©°, ν•˜λ‚˜μ˜ ν–‰λ™μœΌλ‘œ μ—¬λŸ¬κ°€μ§€ 일을 μˆ˜ν–‰ν•˜λŠ” κ°œλ…μ΄λ‹€.상속을 μ΄μš©ν•œ 기술둜, λΆ€λͺ¨ νƒ€μž…μœΌλ‘œλΆ€ν„° νŒŒμƒλœ μ—¬λŸ¬ 가지 νƒ€μž…μ„ ν•˜λ‚˜μ˜ νƒ€μž…μΈ 것 처럼 μ²˜λ¦¬ν•  수 μžˆλ‹€.

  • μ—¬λŸ¬ μ’…λ₯˜μ˜ 클래슀λ₯Ό ν•œ 가지 νƒ€μž…μœΌλ‘œ ν•΄κ²°ν•˜λŠ” 기술.
  • λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ 후손 클래슀의 레퍼런슀 정보λ₯Ό 받을 수 있음.
  • λΆ€λͺ¨μ˜ 데이터 νƒ€μž…μœΌλ‘œ λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ λ©”μ†Œλ“œμ˜ μ˜€λ²„λ‘œλ”©μ„ 쀄일 수 있음
  • 클래슀 μ•ˆμ—μ„œ 같은 λ©”μ†Œλ“œ 이름을 μ€‘λ³΅μž‘μ„±ν•΄μ•Όν•  경우, λ‹€ν˜•μ„± 이용.

πŸ‘ ν΄λž˜μŠ€ ν˜•λ³€ν™˜ up casting (μž‘μ€ κ²ƒμ—μ„œ λ§Žμ€ κ²ƒμœΌλ‘œ ν•™μž₯)상속 관계에 μžˆλŠ” λΆ€λͺ¨, μžμ‹ 클래슀 간에 λΆ€λͺ¨νƒ€μž…μ˜ λ ˆνΌλŸ°μŠ€κ°€ λͺ¨λ“  후손 νƒ€μž…μ˜ 객체의 μ£Όμ†Œλ₯Ό 받을 수 μžˆλ‹€.

//Sonata ν΄λž˜μŠ€κ°€ Car 클래슀의 ν›„μ†μž„ Car c = new Sonata(); Sonata ν΄λž˜μŠ€ν˜• -> Car 클래슀 ν˜•μœΌλ‘œ λ°”λ€œ

 

 

πŸ‘Ž ν΄λž˜μŠ€ ν˜•λ³€ν™˜ down casting (λ§Žμ€ κ²ƒμ—μ„œ μž‘μ€ κ²ƒμœΌλ‘œ μΆ•μ†Œ)후손 객체의 μ£Όμ†Œλ₯Ό 받은 λΆ€λͺ¨ 레퍼런슀λ₯Ό 가지고 ν›„μ†μ˜ 멀버λ₯Ό μ°Έμ‘°ν•΄μ•Όν•  κ²½μš°μ—λŠ”, 후손 클래슀 νƒ€μž…μœΌλ‘œ 레퍼런슀λ₯Ό ν˜•λ³€ν™˜ν•΄μ•Όν•œλ‹€.이 λ•Œ λΆ€λͺ¨ 클래슀 νƒ€μž…μ„ 후손 클래슀 νƒ€μž…μœΌλ‘œ λ°”κΎΈλŠ” 것을 down casting 이라고 ν•˜λ©°, μžλ™μœΌλ‘œ μ²˜λ¦¬λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ°˜λ“œμ‹œ 후손 νƒ€μž…μ„ λͺ…μ‹œν•΄μ„œ ν˜•λ³€ν™˜ν•΄μ•Όν•œλ‹€. κ°μ²΄λŠ” 상속이 λ˜μ§€ μ•ŠλŠ”λ‹€. (ν΄λž˜μŠ€μ™€ 객체의 차이)

//Sonata ν΄λž˜μŠ€κ°€ Car 클래슀의 ν›„μ†μž„ Car c = new Sonata(); (Car)c.moveSonata();

 

(( 주의 )) 같은 μΈ΅μœ„μ˜ κ°μ²΄λΌλ¦¬λŠ” μ—…, λ‹€μš΄ μΊμŠ€νŒ…μ„ ν•  수 μ—†λ‹€.

 

🚩 instanceof μ—°μ‚°μž

주둜 down casting ν•  λ•Œ, ν˜„μž¬ λ ˆνΌλŸ°μŠ€κ°€ μ–΄λ–€ ν΄λž˜μŠ€ν˜•μ˜ 객체 μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•˜κ³  μžˆλŠ”μ§€ 확인이 ν•„μš”ν•  λ•Œ μ‚¬μš©ν•¨.

if(레퍼런슀 instanceof 클래슀 νƒ€μž…){

         μ°ΈμΌ λ•Œ μ²˜λ¦¬ν•  λ‚΄μš©

        //ν•΄λ‹Ή 클래슀 νƒ€μž…μœΌλ‘œ down casting

}