Day 12(21.09.16) - Gomserker/Java-101 GitHub Wiki

β€» 듀어가기에 μ•žμ„œ
λ³Έ 정리글은 μˆ˜μ—…μ˜ μ§„ν–‰λŒ€λ‘œ μ •λ¦¬ν•˜κ³  μžˆκΈ°μ— λ‚΄μš©μ— 따라 μˆœμ„œκ°€ 뒀죽박죽일 수 μžˆμŠ΅λ‹ˆλ‹€.

15. 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)의 νŠΉμ§•

(1) μΊ‘μŠν™”(Encapsulation)

ν•„λ“œ, λ©”μ†Œλ“œλ₯Ό ν•˜λ‚˜λ‘œ λ¬Άκ³  μ‹€μ œ κ΅¬ν˜„ λ‚΄μš©μ„ κ°μΆ”λŠ” 것을 λ§ν•œλ‹€. μ™ΈλΆ€ κ°μ²΄λŠ” 객체 λ‚΄λΆ€μ˜ ꡬ쑰λ₯Ό μ•Œ 수 μ—†μœΌλ©° 객체가 κ²‰μœΌλ‘œ λ“œλŸ¬λ‚˜μ„œ μ œκ³΅ν•˜λŠ” ν•„λ“œμ™€ λ©”μ†Œλ“œλ§Œ μ œκ³΅ν•  수 μžˆλ‹€. μ‰½κ²Œ λ§ν•˜λ©΄ μ™ΈλΆ€ κ°μ²΄μ—μ„œλŠ” μΊ‘μŠν™”λœ 객체의 ν•„λ“œμ— μ ‘κ·Όν•  수 없단 μ–˜κΈ°λ‹€.
μ΄λ ‡κ²Œ μΊ‘μŠν™”λ₯Ό 톡해 객체 정보λ₯Ό λ³΄ν˜Έν•˜λŠ” μ΄μœ λŠ” μ™ΈλΆ€μ˜ 잘λͺ»λœ μ‚¬μš©μœΌλ‘œ 인해 객체가 μ†μƒλ˜μ§€ μ•Šλ„λ‘ ν•˜κΈ° μœ„ν•¨μ΄λ‹€. 예λ₯Ό λ“€μ–΄, μžλ™μ°¨μ˜ μ€‘μš” λΆ€ν’ˆμ΄ κ²‰μœΌλ‘œ λ“œλŸ¬λ‚˜ 좩격 λ“±μ˜ 외뢀적 μš”μΈμ— μ˜ν•΄ 망가지지 μ•Šλ„λ‘ 차체 내뢀에 μˆ¨κΈ°λŠ” κ²ƒμ΄λ‚˜ λ§ˆμ°¬κ°€μ§€λ‹€. μ΄λŸ¬ν•œ μΊ‘μŠν™”λŠ” μ™ΈλΆ€μ—μ„œ 접근을 ν—ˆλ½ν•  것인가λ₯Ό κ²°μ •ν•˜κΈ° μœ„ν•΄ **μ ‘κ·Ό μ œν•œμž(Access Modifier)**λ₯Ό μ‚¬μš©ν•œλ‹€. μ ‘κ·Ό μ œν•œμžμ˜ μ’…λ₯˜μ—λŠ” private, default, protected, public이 μžˆλŠ”λ° 이듀에 λŒ€ν•œ λ‚΄μš©μ€ μ•„λž˜μ— μž‘μ„±ν•  μ˜ˆμ •μ΄λ‹€.

(2) 상속(Inheritance)

μƒμ†μ΄λž€ 일반적으둜 λΆ€λͺ¨κ°€ κ°€μ§€κ³  μžˆλŠ” 것을 μžμ‹μ—κ²Œ λ¬Όλ €μ£ΌλŠ” 것을 λ§Œν•œλ‹€. 객체 μ§€μ–‘ ν”„λ‘œκ·Έλž˜λ°μ—μ„œλ„ λΆ€λͺ¨ 역할을 ν•˜λŠ” μƒμœ„ 객체와 μžμ‹ μ—­ν• μ˜ ν•˜μœ„ 객체가 μžˆλŠ”λ°, μƒμœ„ κ°μ²΄λŠ” μžμ‹ μ΄ κ°€μ§€κ³  μžˆλŠ” ν•„λ“œμ™€ λ©”μ†Œλ“œλ₯Ό ν•˜μœ„ κ°μ²΄μ—κ²Œ 물렀쀄 수 μžˆλ‹€. μ΄λŸ¬ν•œ 상속은 μƒμœ„ 객체λ₯Ό μž¬μ‚¬μš©ν•˜μ—¬ ν•˜μœ„ 객체λ₯Ό 쉽고 λΉ λ₯΄κ²Œ 섀계할 수 μžˆλ„λ‘ 도와주며, 이미 개발된 객체λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ 반볡된 μ½”λ“œμ˜ 쀑볡을 쀄여쀀닀. λ˜ν•œ, μƒμœ„ 객체의 μˆ˜μ •ν•¨μœΌλ‘œμ„œ ν•˜μœ„ 객체λ₯Ό μˆ˜μ •ν•˜λŠ” νš¨κ³Όκ°€ μžˆμœΌλ―€λ‘œ μœ μ§€ 보수 μ‹œκ°„μ„ μ΅œμ†Œν™”μ‹œμΌœ 주기도 ν•œλ‹€.

(3) λ‹€ν˜•μ„±(Polymorphism)

같은 νƒ€μž…μ΄μ§€λ§Œ μ‹€ν–‰ κ²°κ³Όκ°€ λ‹€μ–‘ν•œ 객체λ₯Ό μ΄μš©ν•  수 μžˆλŠ” μ„±μ§ˆμ„ λ§ν•œλ‹€. ν”„λ‘œκ·Έλž˜λ° μΈ‘λ©΄μ—μ„œλŠ” ν•˜λ‚˜μ˜ νƒ€μž…μ— μ—¬λŸ¬ 객체λ₯Ό λŒ€μž…ν•˜μ—¬ λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ΄μš©ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” 것이닀. μžλ°”μ—μ„  이λ₯Ό μœ„ν•΄ λΆ€λͺ¨ 클래슀 λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ νƒ€μž… λ³€ν™˜μ„ ν—ˆμš©ν•˜κ³  μžˆλ‹€. λΆ€λͺ¨ νƒ€μž…μ—λŠ” λͺ¨λ“  μžμ‹ 객체가 λŒ€μž…λ  수 있으며, μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ—λŠ” λͺ¨λ“  κ΅¬ν˜„ 객체가 λŒ€μž…λ  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, μžλ™μ°¨ ν•œλŒ€κ°€ μžˆμ„ λ•Œ, 타이어라면 K 타이어든, H 타이어든 μ „λΆ€ μ‚¬μš©ν•  수 μžˆμœΌλ‚˜ μ„±λŠ₯이 λ‹€λ₯΄κ²Œ λ‚˜μ˜€λŠ” 것과 λ§ˆμ°¬κ°€μ§€μ΄λ‹€.

16. μƒμ„±μž(Constructor)

μƒμ„±μžλŠ” new μ—°μ‚°μžμ™€ 같이 μ‚¬μš©λ˜λ©° ν΄λž˜μŠ€λ‘œλΆ€ν„° 객체λ₯Ό μƒμ„±ν• λ•Œ ν˜ΈμΆœλ˜μ–΄ 객체의 μ΄ˆκΈ°ν™”λ₯Ό λ‹΄λ‹Ήν•œλ‹€. μ—¬κΈ°μ„œ 객체의 μ΄ˆκΈ°ν™”λž€ ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•˜κ±°λ‚˜, λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œ 객체λ₯Ό μ‚¬μš©ν•  μ€€λΉ„λ₯Ό ν•˜λŠ” 것을 λ§ν•œλ‹€. 이 μƒμ„±μžλ₯Ό μ‹€ν–‰μ‹œν‚€μ§€ μ•Šκ³ μ„œλŠ” 객체λ₯Ό λ§Œλ“€ 수 μ—†μœΌλ©°, new μ—°μ‚°μžλ‘œ 객체가 μƒμ„±λ˜λ©΄ heap μ˜μ—­μ— 객체가 μƒμ„±λ˜κ³ , stack μ˜μ—­μ— 객체의 μ£Όμ†Œκ°€ λ¦¬ν„΄λœλ‹€.γ€€γ€€

(1) κΈ°λ³Έ μƒμ„±μž

λͺ¨λ“  ν΄λž˜μŠ€μ—λŠ” ν•˜λ‚˜ μ΄μƒμ˜ μƒμ„±μžκ°€ λ°˜λ“œμ‹œ μ‘΄μž¬ν•œλ‹€.
ν΄λž˜μŠ€κ°€ public class둜 μ„ μ–Έλ˜λ©΄ κΈ°λ³Έ μƒμ„±μžμ—λ„ public이 λΆ™μ§€λ§Œ, public 없이 class둜만 μ„ μ–Έλœ ν΄λž˜μŠ€μ—λŠ” κΈ°λ³Έ μƒμ„±μžμ—λ„ public이 λΆ™μ§€ μ•ŠλŠ”λ‹€. publicκ³Ό default 에 λŒ€ν•œ μ–˜κΈ°λŠ” λ‹€μŒ νŒŒνŠΈμ—μ„œ ν™•μΈν•˜κΈ°λ‘œ ν•œλ‹€.

(2) μƒμ„±μž μ„ μ–Έ

κΈ°λ³Έ μƒμ„±μž λŒ€μ‹  μƒμ„±μžλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•˜λ €λ©΄ λ‹€μŒκ³Ό 같은 ν˜•νƒœλ‘œ μž‘μ„±ν•œλ‹€.

Class (Parameter 1, Parameter 2, ...) {
 //객체의 μ΄ˆκΈ°ν™” μ½”λ“œ
}

μƒμ„±μžλŠ” λ©”μ†Œλ“œμ™€ λΉ„μŠ·ν•œ ν˜•νƒœλ₯Ό ν•˜κ³  μžˆμœΌλ‚˜ 리턴 νƒ€μž…μ΄ μ—†κ³ , 클래슀 이름과 λ™μΌν•˜λ‹€. μƒμ„±μž 블둝 λ‚΄λΆ€μ—λŠ” 객체 μ΄ˆκΈ°ν™” μ½”λ“œκ°€ μž‘μ„±λ˜λŠ”λ°, 일반적으둜 ν•„λ“œμ˜ μ΄ˆκΈ°κ°’μ΄λ‚˜ λ©”μ†Œλ“œ 호좜 λ“±μ˜ 객체 μ‚¬μš© 전에 ν•„μš”ν•œ μ€€λΉ„λ₯Ό ν•œλ‹€. λ‹€μŒ μ˜ˆμ‹œλ₯Ό 보자.

Car myCar = new Car("Grandeur", "black", 300);

μœ„μ—μ„œ Car μƒμ„±μžλ₯Ό ν˜ΈμΆœν• λ•Œ μ„Έ 개의 값을 μ œκ³΅ν•œλ‹€κ³  ν•œλ‹€λ©΄, λ‹€μŒκ³Ό 같이 μƒμ„±μžλ₯Ό μ„ μ–Έν•΄μ•Ό ν•œλ‹€.

public class Car {
 //μƒμ„±μž
 Car(String model, String color, int maxSpeed)
}

ν΄λž˜μŠ€μ— μƒμ„±μžκ°€ λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έλ˜μ–΄ μžˆμ„ 땐 λ°˜λ“œμ‹œ μ„ μ–Έλœ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•΄μ„œ 객체λ₯Ό μƒμ„±ν•΄μ•Όλ§Œν•œλ‹€.

//Car.java
public class Car {
 Car(String color, int cc) {
 }
}
//CarExample.java
public class CarExample {
 public static void main(String[] args) {
   Car myCar = new Car("black", 3000);
 //Car myCar = new Car(); // μœ„μ—μ„œ μƒμ„±μžκ°€ λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έλ˜μ—ˆκΈ°μ— κΈ°λ³Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  수 μ—†λ‹€.

κ΄€λ‘€μ μœΌλ‘œλŠ” μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜λ‘œ ν•„λ“œμ™€ λ™μΌν•œ 이름을 κ°–λŠ” λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ”λ°, 이 경우 ν•„λ“œμ™€ 맀개 λ³€μˆ˜μ˜ 이름이 λ™μΌν•˜κΈ° 떄문에 μƒμ„±μž λ‚΄λΆ€μ—μ„œ ν•„λ“œμ— μ ‘κ·Όν•  수 μ—†λ‹€. λ™μΌν•œ μ΄λ¦„μ˜ 맀개 λ³€μˆ˜κ°€ μ‚¬μš© μš°μ„ μˆœμœ„κ°€ λ†’κΈ° 떄문인데, μ΄λ•Œμ˜ ν•΄κ²° 방법은 ν•„λ“œμ— ν•΄λ‹Ήν•˜λŠ” λ³€μˆ˜ μ•žμ— "this."을 뢙이면 λœλ‹€. μ΄λŠ” 객체가 자기 μžμ‹ μ„ this라고 λΆ€λ₯΄λŠ” κ²ƒμœΌλ‘œ μ°Έμ‘° λ³€μˆ˜λ‘œ ν•„λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것과 λ™μΌν•˜λ‹€.

17. μ ‘κ·Ό μ œν•œμž(Access Modifier)

main() λ©”μ†Œλ“œλ₯Ό κ°€μ§€μ§€ μ•ŠλŠ” λŒ€λΆ€λΆ„μ˜ ν΄λž˜μŠ€λŠ” μ™ΈλΆ€μ—μ„œ μ΄μš©ν•  λͺ©μ μœΌλ‘œ μ„€κ³„λœ 라이브러리 ν΄λž˜μŠ€μ΄λ‹€. 이 라이브러리 클래슀λ₯Ό 섀계할 λ•Œμ—” μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μžˆλŠ” 멀버와 μ ‘κ·Όν•  수 μ—†λŠ” λ©€λ²„λ‘œ κ΅¬λΆ„ν•΄μ„œ μ„€κ³„ν•˜λŠ” 것이 λ°”λžŒμ§ν•˜λ‹€. μ΄λ•Œ μ‚¬μš©κ°€λŠ₯ν•œ 것이 λ°”λ‘œ μ ‘κ·Ό μ œν•œμž(Access Modifier)이닀.

μ ‘κ·Ό μ œν•œμžμ˜ μ’…λ₯˜

(1) public

적용 λŒ€μƒ : 클래슀, ν•„λ“œ, μƒμ„±μž, λ©”μ†Œλ“œ
μ ‘κ·Όν•  수 μ—†λŠ” 클래슀 : μ—†μŒ

(2) protected

적용 λŒ€μƒ : ν•„λ“œ, μƒμ„±μž, λ©”μ†Œλ“œ
μ ‘κ·Όν•  수 μ—†λŠ” 클래슀 : μžμ‹ ν΄λž˜μŠ€κ°€ μ•„λ‹Œ λ‹€λ₯Έ νŒ¨ν‚€μ§€μ— μ†Œμ†λœ 클래슀

(3) default

적용 λŒ€μƒ : 클래슀, ν•„λ“œ, μƒμ„±μž, λ©”μ†Œλ“œ
μ ‘κ·Όν•  수 μ—†λŠ” 클래슀 : ν•„λ“œ, μƒμ„±μž, λ©”μ†Œλ“œ

(4) private

적용 λŒ€μƒ : ν•„λ“œ, μƒμ„±μž, λ©”μ†Œλ“œ
μ ‘κ·Όν•  수 μ—†λŠ” 클래슀 : λͺ¨λ“  μ™ΈλΆ€ 클래슀

18. Getter와 Setter λ©”μ†Œλ“œ

μœ„μ™€ 같은 μ ‘κ·Ό μ œν•œμžμ˜ μš©λ„λŠ” 객체 μ™ΈλΆ€μ—μ„œ 객체 데이터에 μ§μ ‘μ μœΌλ‘œ μ ‘κ·Όν•˜λŠ” 것을 막기 μœ„ν•¨μ΄λ‹€. κ·Έ μ΄μœ λŠ” 객체의 데이터λ₯Ό μ™ΈλΆ€μ—μ„œ λ§ˆμŒλŒ€λ‘œ 읽고 λ³€κ²½ν•  경우 객체의 무결성이 깨질 수 있기 λ•Œλ¬Έμ΄λ‹€. 예λ₯Ό λ“€μ–΄ μžλ™μ°¨μ˜ 속λ ₯을 μ •ν• λ•Œ μ™ΈλΆ€μ—μ„œ -100μ΄λ‚˜ 4250 같은 비정상적인 데이터λ₯Ό μž…λ ₯ν•  경우 λ¬Έμ œκ°€ λ°œμƒν•  수 있기 λ•Œλ¬Έμ΄λ‹€. μ΄λŸ¬ν•œ λ¬Έμ œμ μ„ 사전에 λ°©μ§€ν•˜κ³  ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” λ©”μ†Œλ“œλ₯Ό ν†΅ν•΄μ„œ 데이터λ₯Ό λ³€κ²½ν•˜λŠ” 방법을 μ„ ν˜Έν•œλ‹€. μ΄λŸ¬ν•œ 역할을 ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό Setter라고 ν•˜λŠ”λ°, μžλ™μ°¨μ˜ 속도λ₯Ό setSpeed() λ©”μ†Œλ“œλ‘œ λ³€κ²½ν•  경우 μž…λ ₯λ˜λŠ” 값에 쑰건을 λΆ€μ—¬ν•  수 μžˆμ–΄ 사전에 κ²€μ¦ν•˜λŠ” 과정을 κ±°μΉ  μˆ˜κ°€ μžˆλ‹€.

μ™ΈλΆ€μ—μ„œ 객체의 데이터λ₯Ό 읽을 κ²½μš°μ—λ„ λ³„λ„μ˜ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 쒋은데, μ™ΈλΆ€μ—μ„œ 객체의 ν•„λ“œ 값을 μ‚¬μš©ν•˜κΈ°μ— λΆ€μ μ ˆν•œ κ²½μš°κ°€ 있기 λ•Œλ¬Έμ΄λ‹€. 예λ₯Ό λ“€λ©΄ ν‚¬λ‘œλ―Έν„°λ‚˜ 마일과 같이 λ‹¨μœ„κ°€ λ‹€λ₯Έ κ²½μš°κ°€ μžˆλŠ”λ°, μ΄λŸ΄λ•Œ Getter λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ ν•„λ“œκ°’μ„ μ•ˆμ „ν•˜κ²Œ λ³€κ²½ 및 μ‚¬μš©ν•  수 μžˆλ‹€.

Getter Setter λ©”μ†Œλ“œ μ—°μŠ΅

result

color is Yellow
speed is 120