Notice
Recent Posts
Recent Comments
Β«   2024/12   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
In Total
관리 메뉴

A Joyful AI Research Journey🌳😊

[34] 230215 Java Ch. 7 상속: 1. 상속 [K-디지털 νŠΈλ ˆμ΄λ‹ 34일] λ³Έλ¬Έ

🌳Bootcamp Revision 2023✨/Spring Framework, Java

[34] 230215 Java Ch. 7 상속: 1. 상속 [K-디지털 νŠΈλ ˆμ΄λ‹ 34일]

yjyuwisely 2023. 2. 15. 12:37

230215 Wed 34th class

Ch. 7 상속
진도: p. 310 ~ (ꡐ재: 혼자 κ³΅λΆ€ν•˜λŠ” μžλ°”, μ €μž: μ‹ μš©κΆŒ)
ν•œλΉ›λ―Έλ””μ–΄_혼곡자_μš©μ–΄μ§‘.pdf
μš©μ–΄ μ°Έκ³ 

 

혼자 κ³΅λΆ€ν•˜λŠ” μžλ°” | μ‹ μš©κΆŒ - ꡐ보문고

혼자 κ³΅λΆ€ν•˜λŠ” μžλ°” | 혼자 해도 μΆ©λΆ„ν•˜λ‹€! 1:1 κ³Όμ™Έν•˜λ“― λ°°μš°λŠ” μžλ°” ν”„λ‘œκ·Έλž˜λ° μžμŠ΅μ„œ (JAVA 8 &11 지원) 이 책은 λ…ν•™μœΌλ‘œ μžλ°”λ₯Ό λ°°μš°λŠ” μž…λ¬Έμžκ°€ ‘κΌ­ ν•„μš”ν•œ λ‚΄μš©μ„ μ œλŒ€λ‘œ’ ν•™μŠ΅ν•  수 μžˆλ„

product.kyobobook.co.kr

였늘 배운 것 쀑 κΈ°μ–΅ν•  것을 μ •λ¦¬ν–ˆλ‹€. 


μ§€λ‚œ μˆ˜μ—… λ•Œ 배운 것 쀑 λ‹€μ‹œ κΈ°μ–΅ν•  것

public class A{
          //ν•„λ“œ
          public int a;

          //μƒμ„±μž
          public A(){}

          //λ©”μ„œλ“œ
          public void add(){}
          (protected / default(μƒλž΅) / private) 

- μ˜€λ²„λ‘œλ”©: 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬ 개 κ°€μ§€λ©΄μ„œ 맀개 λ³€μˆ˜λ₯Ό λ‹€λ₯΄κ²Œ (개수, νƒ€μž…) μ •μ˜ν•˜λŠ” 것
ν•΄λ‹Ήλ˜λŠ” νƒ€μž…μ„ μΆ”κ°€ν•˜λŠ” 것
상속과 κ΄€λ ¨ μ—†λ‹€. 

2023.02.10 - [1. Revision 2023/Java] - [31] 230210 Ch. 6 클래슀(2): λ©”μ„œλ“œ

- μ˜€λ²„λΌμ΄λ”©: μƒμœ„ 클래슀(λΆ€λͺ¨ 클래슀)κ°€ κ°–κ³  μžˆλŠ” λ©”μ„œλ“œ(μžμ‹ 클래슀)λ₯Ό ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•΄ μ‚¬μš©ν•˜λŠ” 것
λ‚΄μš©μ„ μˆ˜μ •ν•œλ‹€. 


ν΄λž˜μŠ€μ—λŠ” 객체가 κ°€μ Έμ•Ό ν•  ꡬ성 멀버가 μ„ μ–Έλœλ‹€. ꡬ성 λ©€λ²„μ—λŠ” ν•„λ“œ, μƒμ„±μž, λ©”μ„œλ“œκ°€ μžˆλ‹€. 이 ꡬ성 멀버듀은 μƒλž΅λ˜κ±°λ‚˜ 볡수의 개수둜 μž‘μ„±λ  수 μžˆλ‹€.
ν•„λ“œ: 객체의 데이터가 μ €μž₯λ˜λŠ” κ³³
μƒμ„±μž: 객체 생성 μ‹œ μ΄ˆκΈ°ν™”(initialze: λ³€μˆ˜μ— μ΄ˆκΈ°κ°’μ„ μ£ΌλŠ” ν–‰μœ„) μ—­ν•  λ‹΄λ‹Ή
λ©”μ„œλ“œ: 객체의 λ™μž‘μ— ν•΄λ‹Ήν•˜λŠ” μ‹€ν–‰ 블둝

public class ClassName{
//ν•„λ“œ
int fieldname;

//μƒμ„±μž
ClassName(){...}

//λ©”μ„œλ“œ
void methodName(){...}
}

2023.02.09 - [1. Revision 2023/Java] - [30] 230209 Ch. 6 클래슀(1): 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°, ν•„λ“œ, μƒμ„±μž

μΈμŠ€ν„΄μŠ€: ν΄λž˜μŠ€λ‘œλΆ€ν„° λ§Œλ“€μ–΄μ§„ 객체
μΈμŠ€ν„΄μŠ€ν™”
: ν΄λž˜μŠ€λ‘œλΆ€ν„° 객체λ₯Ό λ§Œλ“œλŠ” κ³Όμ •

개발자  [섀계] → ν΄λž˜μŠ€(섀계도) → [μΈμŠ€ν„΄μŠ€ν™”] → μΈμŠ€ν„΄μŠ€(객체)

'this.ν•„λ“œ'λŠ” thisλΌλŠ” μ°Έμ‘° λ³€μˆ˜λ‘œ ν•„λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것과 λ™μΌν•˜λ‹€.

this μ°Έμ‘° λ³€μˆ˜
this μ°Έμ‘° λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€κ°€ λ°”λ‘œ 자기 μžμ‹ μ„ μ°Έμ‘°ν•˜λŠ” λ° μ‚¬μš©ν•˜λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.
μ΄λŸ¬ν•œ this μ°Έμ‘° λ³€μˆ˜λŠ” ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œλ₯Ό 가리킀고 μžˆμŠ΅λ‹ˆλ‹€.

μ°Έκ³ : http://www.tcpschool.com/java/java_methodConstructor_this


2023.02.06 - [1. Revision 2023/Java] - [27] 230206 Ch. 5 μžλ°” μ°Έμ‘° νƒ€μž…(1): μ°Έμ‘° νƒ€μž…κ³Ό μ°Έμ‘° λ³€μˆ˜

- λ©”μ„œλ“œ μ˜μ—­(Method Area)μ—λŠ” 정적 ν•„λ“œ, μƒμˆ˜, λ©”μ„œλ“œ μ½”λ“œ, μƒμ„±μž μ½”λ“œκ°€ μœ„μΉ˜ν•˜λ©°, (κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•œλ‹€.) 
νž™ μ˜μ—­(Heap Area)μ—λŠ” κ°μ²΄κ°€ μƒμ„±λœλ‹€.
- μŠ€νƒ μ˜μ—­(Stack)μ—λŠ” λ³€μˆ˜κ°€ μƒμ„±λœλ‹€.


μ ‘κ·Ό μ œν•œμž
public: μ ‘κ·Ό μ œν•œμ΄ μ—†λ‹€.
protected: 같은 νŒ¨ν‚€μ§€μ— μžˆλŠ” ν΄λž˜μŠ€λŠ” μ ‘κ·Ό κ°€λŠ₯, λ‹€λ₯Έ νŒ¨ν‚€μ§€μ— μžˆλŠ” ν΄λž˜μŠ€λŠ” μ ‘κ·Ό λΆˆκ°€λŠ₯
* 상속을 ν•˜λ©΄ λ‹€λ₯Έ νŒ¨ν‚€μ§€μ— μžˆλŠ” ν΄λž˜μŠ€λŠ” μ ‘κ·Ό κ°€λŠ₯ * 
(default): 같은 νŒ¨ν‚€μ§€μ— μžˆλŠ” ν΄λž˜μŠ€λŠ” μ ‘κ·Ό κ°€λŠ₯, λ‹€λ₯Έ νŒ¨ν‚€μ§€μ— μžˆλŠ” ν΄λž˜μŠ€λŠ” μ ‘κ·Ό λΆˆκ°€λŠ₯
* 상속을 해도 λ‹€λ₯Έ νŒ¨ν‚€μ§€μ— μžˆλŠ” 클래슀 μ ‘κ·Ό λΆˆκ°€λŠ₯ *
private: μ™ΈλΆ€μ—μ„œ 접근이 λΆˆκ°€λŠ₯(같은 클래슀 λ‚΄μ—μ„œλ§Œ μ ‘κ·Ό)

쑰건문:

int a = 10;
if(a > 20){
	System.out.println("aκ°€ 20보닀 ν½λ‹ˆλ‹€.")
}

int a = 30;
if(a > 20){
	System.out.println("aκ°€ 20보닀 ν½λ‹ˆλ‹€.")
}

Ch. 7 상속

μ±…μ˜ λͺ©μ°¨
07-1 상속
07-2 νƒ€μž… λ³€ν™˜κ³Ό λ‹€ν˜•μ„±
07-3 좔상 클래슀

7.1 상속 (inheritance)

   ν˜„μ‹€μ—μ„œ 상속(inheritance)은 λΆ€λͺ¨κ°€ μžμ‹μ—μ„œ λ¬Όλ €μ£ΌλŠ” ν–‰μœ„λ₯Ό λ§ν•œλ‹€. μžμ‹μ€ 상속을 ν†΅ν•΄μ„œ λΆ€λͺ¨κ°€ λ¬Όλ €μ€€ 것을 μžμ—°μŠ€λŸ½κ²Œ μ΄μš©ν•  수 μžˆλ‹€.
객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œλ„ λΆ€λͺ¨ 클래슀의 멀버λ₯Ό μžμ‹ ν΄λž˜μŠ€μ—κ²Œ 물렀쀄 수 μžˆλ‹€.
ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” λΆ€λͺ¨ 클래슀λ₯Ό μƒμœ„ 클래슀라고 λΆ€λ₯΄κ³ , μžμ‹ 클래슀λ₯Ό ν•˜μœ„ / νŒŒμƒ 클래슀라고 λΆ€λ₯Έλ‹€.

쀑볡 μ½”λ“œλ₯Ό μ΅œμ†Œν™”ν•˜λ €κ³  상속을 μ“΄λ‹€. 

상속을 μ΄μš©ν•˜λ©΄ λΆ€λͺ¨ 클래슀의 μˆ˜μ •μœΌλ‘œ λͺ¨λ“  μžμ‹ ν΄λž˜μŠ€λ“€λ„ μˆ˜μ •λ˜λŠ” 효과λ₯Ό κ°€μ Έμ˜€κΈ° λ•Œλ¬Έμ— μœ μ§€ 보수 μ‹œκ°„μ„ μ΅œμ†Œν™”ν•  수 μžˆλ‹€.

ν•„λ“œ, λ©”μ„œλ“œλŠ” μƒμ†ν•˜λŠ” 데 μƒμ„±μžλŠ” 상속 X


7.1.1 클래슀 상속 p. 311

ν˜„μ‹€μ—μ„œ 상속은 λΆ€λͺ¨κ°€ μžμ‹μ„ μ„ νƒν•΄μ„œ λ¬Όλ €μ£Όμ§€λ§Œ, ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” μžμ‹μ΄ λΆ€λͺ¨λ₯Ό μ„ νƒν•œλ‹€.
μžμ‹ 클래슀λ₯Ό μ„ μ–Έν•  λ•Œ μ–΄λ–€ λΆ€λͺ¨ 클래슀λ₯Ό 상속받을 것인지 κ²°μ •ν•˜κ³ , μ„ νƒλœ λΆ€λͺ¨ ν΄λž˜μŠ€λŠ” extends 뒀에 κΈ°μˆ ν•œλ‹€.

class μžμ‹ν΄λž˜μŠ€ extends λΆ€λͺ¨ν΄λž˜μŠ€{
     //ν•„λ“œ
     //μƒμ„±μž
     //λ©”μ„œλ“œ
}

λ‹€μŒμ€ Car 클래슀λ₯Ό μƒμ†ν•΄μ„œ SportsCar 클래슀λ₯Ό μ„€κ³„ν•œλ‹€.

class SportsCar extends Car{
}

μžλ°”μ—μ„œ μƒμ†μ˜ νŠΉμ§•
1) μ—¬λŸ¬ 개의 λΆ€λͺ¨ 클래슀λ₯Ό 상속할 수 μ—†λ‹€. extends λ’€μ—λŠ” 단 ν•˜λ‚˜μ˜ λΆ€λͺ¨ 클래슀만 와야 ν•œλ‹€.
2) λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ private μ ‘κ·Ό μ œν•œμ„ κ°–λŠ” ν•„λ“œμ™€ λ©”μ„œλ“œλŠ” 상속 λŒ€μƒμ—μ„œ μ œμ™Έλœλ‹€.
λΆ€λͺ¨ ν΄λž˜μŠ€μ™€ μžμ‹ ν΄λž˜μŠ€κ°€ λ‹€λ₯Έ νŒ¨ν‚€μ§€μ— μ‘΄μž¬ν•œλ‹€λ©΄ default μ ‘κ·Ό μ œν•œμ„ κ°–λŠ” ν•„λ“œμ™€ λ©”μ„œλ“œλ„ 상속 λŒ€μƒμ—μ„œ μ œμ™Έλœλ‹€.

ν•Έλ“œν°(CellPhone) 클래슀λ₯Ό μƒμ†ν•΄μ„œ DMB(DmbCellPhone) 클래슀λ₯Ό μžμ„ν•œ κ²ƒμœΌλ‘œ, ν•Έλ“œν°μ΄ λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ 되고 DMB폰이 μžμ‹ ν΄λž˜μŠ€κ°€ λœλ‹€. 

예제 1) λΆ€λͺ¨ 클래슀

package ch07;
//ν†΅ν™”λ§Œ κ°€λŠ₯ν•œ 폰
public class CellPhone {
	//ν•„λ“œ (μΈμŠ€ν„΄μŠ€ ν•„λ“œ) 
	//λͺ¨λΈ
	String model;
	//색상
	String color;
	//μƒμ„±μž
/*	CellPhone(String model, String color){
		this.model=model;
		this.color=color;
	}*/
	
	//λ©”μ„œλ“œ
	//전원을 μΌ λ‹€.
	void powerOn() {System.out.println("전원을 μΌ­λ‹ˆλ‹€.");}
	//전원을 λˆλ‹€.
	void powerOff() {System.out.println("전원을 λ•λ‹ˆλ‹€.");}
	//벨을 μšΈλ¦°λ‹€.
	void bell() {System.out.println("전원을 μΌ­λ‹ˆλ‹€.");}
	//λ©”μ‹œμ§€λ₯Ό μ†‘μ‹ ν•œλ‹€.
	void sendVoice(String message) {System.out.println("자기: " + message);}
	//λ©”μ‹œμ§€λ₯Ό μˆ˜μ‹ ν•œλ‹€.
	void receiveVoice(String message) {System.out.println("μƒλŒ€λ°©: " + message);}
	//μ „ν™”λ₯Ό λŠλŠ”λ‹€. 
	void hangUp() {System.out.println("μ „ν™”λ₯Ό λŠμŠ΅λ‹ˆλ‹€");}
}


예제 2) μžμ‹ 클래슀
예제 2의 μƒμ„±μž μ„ μ–Έκ³Ό
예제 3의 DmbCellPhone dmbCellPhone = new DmbCellPhone("μžλ°”ν°","κ²€μ •",10); 체크해 λ³Έλ‹€. 

package ch07;
//톡화+dmbκΈ°λŠ₯κΉŒμ§€ μž₯μ°©ν•œ 폰
public class DmbCellPhone extends CellPhone {
				//μžμ‹(ν•˜μœ„) extends λΆ€λͺ¨(μƒμœ„)  
	//ν•„λ“œ
	//λͺ¨λΈ(CellPhoneν΄λž˜μŠ€μ—μ„œ μƒμ†λ°›μ•˜μœΌλ―€λ‘œ λ”°λ‘œ μ„ μ–Έ μ•ˆ 함.)
	//색상(CellPhoneν΄λž˜μŠ€μ—μ„œ μƒμ†λ°›μ•˜μœΌλ―€λ‘œ λ”°λ‘œ μ„ μ–Έ μ•ˆ 함.)
	//채널
	int channel;
	
	//μƒμ„±μž(맀개 λ³€μˆ˜κ°€ 3개인 μƒμ„±μž) μ„ μ–Έ
	DmbCellPhone(String model, String color, int channel){
		this.model = model;
		this.color = color;
		this.channel = channel;
	}
	
	//λ©”μ„œλ“œ 
	//dmb κ΄€λ ¨ κΈ°λŠ₯
	void turnOnDmb() {
		System.out.println("채널 "+channel+"번 DMB 방솑 μˆ˜μ‹ μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.");
	}
	void changeChannelDmb(int channel) {
		this.channel = channel;
		System.out.println("채널 "+channel+"번으둜 λ°”κΏ‰λ‹ˆλ‹€.");
	}
	void turnOffDmb() {
		System.out.println("DMB 방솑 μˆ˜μ‹ μ„ 멈μΆ₯λ‹ˆλ‹€.");
	}
}


예제 3) μžμ‹ 클래슀 μ‚¬μš©

package ch07;

public class DmbCellPhoneExample {
	public static void main(String[] args) {
		//DmbCellPhone 객체 생성
		//CellPhone cp = new CellPhone();
		DmbCellPhone dmbCellPhone = new DmbCellPhone("μžλ°”ν°","κ²€μ •",10);
		
		//CellPhone ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 ν•„λ“œ
		System.out.println("λͺ¨λΈ: " + dmbCellPhone.model);
		System.out.println("색상: " + dmbCellPhone.color);
		
		//DmbCellPhone 클래슀의 ν•„λ“œ
		System.out.println("채널: " + dmbCellPhone.channel);
		
		//CellPhone ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 λ©”μ„œλ“œ 호좜
		dmbCellPhone.powerOn();
		dmbCellPhone.powerOff();
		dmbCellPhone.sendVoice("μ—¬λ³΄μ„Έμš”");
		dmbCellPhone.receiveVoice("μ•ˆλ…•ν•˜μ„Έμš”! μ €λŠ” ν™κΈΈλ™μΈλ°μš”.");
		dmbCellPhone.sendVoice("μ•„~ 예 λ°˜κ°‘μŠ΅λ‹ˆλ‹€.");
		dmbCellPhone.hangUp();
		
		//DmbCellPhone 클래슀의 λ©”μ„œλ“œ 호좜
		dmbCellPhone.turnOnDmb();
		dmbCellPhone.changeChannelDmb(12);
		dmbCellPhone.turnOffDmb();
	}
}

7.1.2 λΆ€λͺ¨ μƒμ„±μž 호좜 (super)

super: λΆ€λͺ¨ν΄λž˜μŠ€ μƒμ„±μž 호좜

μžμ‹ν΄λž˜μŠ€μ˜ λͺ¨λ“  μƒμ„±μžμ— λΆ€λͺ¨ 클래슀의 κΈ°λ³Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” super()κ°€ μƒλž΅λ˜μ–΄ μžˆλ‹€.
λ§€κ°œλ³€μˆ˜ μž…λ ₯ μ‹œ, 그에 λ§žλŠ” λΆ€λͺ¨ 클래슀 μƒμ„±μž ν˜ΈμΆœν•œλ‹€.
λ§€κ°œλ³€μˆ˜ λ―Έμž…λ ₯ λ˜λŠ” super() μƒλž΅ μ‹œ, λΆ€λͺ¨ 클래슀 κΈ°λ³Έ μƒμ„±μž ν˜ΈμΆœν•œλ‹€.

μ°Έκ³ : https://pathas.tistory.com/134

μžλ°”μ—μ„œ μžμ‹ 객체λ₯Ό μƒμ„±ν•˜λ©΄, λΆ€λͺ¨ 객체가 λ¨Όμ € μƒμ„±λ˜κ³  κ·Έλ‹€μŒμ— μžμ‹ 객체가 μƒμ„±λœλ‹€.
DmbCellPhone 객체만 μƒμ„±ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ, 사싀은 λ‚΄λΆ€μ μœΌλ‘œ λΆ€λͺ¨μΈ CellPhone 객체가 λ¨Όμ € μƒμ„±λ˜κ³  μžμ‹μΈ DmbCellPhoner객체가 μƒμ„±λœλ‹€.

DmbCellPhone dmbCellPhone = new DmbCellPhone();

DmbCellPhone의 μƒμ„±μžκ°€ λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έλ˜μ§€ μ•Šμ•˜λ‹€λ©΄ μ»΄νŒŒμΌλŸ¬λŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό μƒμ„±ν•œλ‹€.

public DmbCellPhone{
	super();
}

super()은 λΆ€λͺ¨μ˜ κΈ°λ³Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€. 즉 CellPhone 클래슀의 λ‹€μŒ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€.
CellPhone의 μƒμ„±μžκ°€ μ„ μ–Έλ˜μ§€ μ•Šμ•˜μ§€λ§Œ μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ κΈ°λ³Έ μƒμ„±μžκ°€ λ§Œλ“€μ–΄μ§€λ―€λ‘œ λ¬Έμ œμ—†μ΄ μ‹€ν–‰λœλ‹€.

public CellPhone{
}



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

μžμ‹ν΄λž˜μŠ€(λ§€κ°œλ³€μˆ˜μ„ μ–Έ, ...){
	super(λ§€κ°œκ°’, ...);
    ...
}

super(λ§€κ°œκ°’, ...): λ§€κ°œκ°’μ˜ νƒ€μž…κ³Ό μΌμΉ˜ν•˜λŠ” λΆ€λͺ¨ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€. 
λΆ€λͺ¨ ν΄λž˜μŠ€μ— κΈ°λ³Έ μƒμ„±μžκ°€ μ—†κ³  맀개 λ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžκ°€ μžˆλ‹€λ©΄ μžμ‹ μƒμ„±μžμ—μ„œ λ°˜λ“œμ‹œ λΆ€λͺ¨ μƒμ„±μž ν˜ΈμΆœμ„ μœ„ν•΄ super(λ§€κ°œκ°’, ...)을 λͺ…μ‹œμ μœΌλ‘œ ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€. 
super(λ§€κ°œκ°’,...)λŠ” λ°˜λ“œμ‹œ μžμ‹ μƒμ„±μž 첫 쀄에 μœ„μΉ˜ν•΄μ•Ό ν•œλ‹€.

예제 1) λΆ€λͺ¨ 클래슀

package ch07;

public class People {
	//ν•„λ“œ
	//이름
	public String name;
	//주민번호
	public String ssn;
	//μƒμ„±μž
	//λ§€κ°œλ³€μˆ˜κ°€ 2개인 μƒμ„±μž μ„ μ–Έ
	public People(String name, String ssn) {
		this.name = name;
		this.ssn = ssn;
	}
	//λ©”μ„œλ“œ
}

예제 2) μžμ‹ 클래슀

package ch07;

public class Student extends People {
	//ν•„λ“œ
	//ν•™μƒλ²ˆν˜Έ
	public int studentNo;
	
	public Student(String name, String ssn, int studentNo) {
		super(name, ssn);
		this.studentNo = studentNo;
	}
}

예제 3) μžμ‹ 객체 이용

package ch07;

public class StudentExample {
	public static void main(String[] args) {
		Student student = new Student("홍길동", "123456-1234567", 1);
		System.out.println("name: "+student.name);
		System.out.println("ssn: "+student.ssn);
		System.out.println("studentNo: "+student.studentNo);
	}
}

κ²°κ³Ό)

name: 홍길동
ssn: 123456-1234567
studentNo: 1

7.1.3 λ©”μ„œλ“œ μž¬μ •μ˜ (Overriding μ˜€λ²„λΌμ΄λ”©) 

λΆ€λͺ¨ 클래슀의 λͺ¨λ“  λ©”μ„œλ“œκ°€ μžμ‹ ν΄λž˜μŠ€μ— 맞게 μ‚¬μš©ν•  수 μžˆλ‹€λ©΄ κ°€μž₯ 이상적인 μƒμ†μ΄μ§€λ§Œ, μ–΄λ–€ λ©”μ„œλ“œλŠ” μžμ‹ ν΄λž˜μŠ€κ°€ μ‚¬μš©ν•˜κΈ°μ— μ ν•©ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€.
μƒμ†λœ 일뢀 λ©”μ„œλ“œλŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ‹€μ‹œ μˆ˜μ •ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©(method overriding)

μ•žμ„œ 배운 μ˜€λ²„λ‘œλ”©(overloading)μ΄λž€ μ„œλ‘œ λ‹€λ₯Έ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό κ°–λŠ” μ—¬λŸ¬ λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ μ΄λ¦„μœΌλ‘œ μ •μ˜ν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.
μ˜€λ²„λΌμ΄λ”©(overriding)μ΄λž€ 상속 관계에 μžˆλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ 이미 μ •μ˜λœ λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ 같은 μ‹œκ·Έλ‹ˆμ³λ₯Ό κ°–λŠ” λ©”μ„œλ“œλ‘œ λ‹€μ‹œ μ •μ˜ν•˜λŠ” 것이라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
 
μžλ°”μ—μ„œ μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 private 멀버λ₯Ό μ œμ™Έν•œ λͺ¨λ“  λ©”μ„œλ“œλ₯Ό μƒμ†λ°›μŠ΅λ‹ˆλ‹€.
μ΄λ ‡κ²Œ 상속받은 λ©”μ„œλ“œλŠ” κ·ΈλŒ€λ‘œ μ‚¬μš©ν•΄λ„ 되고, ν•„μš”ν•œ λ™μž‘μ„ μœ„ν•΄ μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
즉, λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©μ΄λž€ 상속받은 λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

1) λ©”μ„œλ“œ μž¬μ •μ˜ 방법

λ©”μ„œλ“œ μž¬μ •μ˜: μžμ‹ ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό λ‹€μ‹œ μ •μ˜ν•˜λŠ” 것

κ·œμΉ™
- λΆ€λͺ¨μ˜ λ©”μ„œλ“œμ™€ λ™μΌν•œ μ‹œκ·Έλ„ˆμ²˜(리턴 νƒ€μž…, λ©”μ„œλ“œ 이름, 맀개 λ³€μˆ˜ λͺ©λ‘)λ₯Ό κ°€μ Έμ•Ό ν•œλ‹€.

- μ ‘κ·Ό μ œν•œμ„ 더 κ°•ν•˜κ²Œ (↓(X)) μž¬μ •μ˜ν•  수 μ—†λ‹€. (public → default X, private X) (defualt → default O, public O)
ex) λΆ€λͺ¨ λ©”μ„œλ“œκ°€ public μ ‘κ·Ό μ œν•œμ„ 가지고 μžˆμ„ 경우 μž¬μ •μ˜ν•˜λŠ” μžμ‹ λ©”μ„œλ“œλŠ” defaultλ‚˜ private μ ‘κ·Ό μ œν•œμœΌλ‘œ μˆ˜μ •ν•  수 μ—†λ‹€.
ex) λΆ€λͺ¨ λ©”μ„œλ“œκ°€ default μ ‘κ·Ό μ œν•œμ„ 가지면 μžμ‹ λ©”μ„œλ“œλŠ” default λ˜λŠ” public μ ‘κ·Ό μ œν•œμ„ κ°€μ§ˆ 수 μžˆλ‹€. 


- μƒˆλ‘œμš΄ μ˜ˆμ™Έ(Exception)λ₯Ό throwsν•  수 μ—†λ‹€. (Ch10μ—μ„œ ν•™μŠ΅)

μžλ°”μ—μ„œ λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜κΈ° μœ„ν•œ 쑰건은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
 
1. μ˜€λ²„λΌμ΄λ”©μ΄λž€ λ©”μ„œλ“œμ˜ λ™μž‘λ§Œμ„ μž¬μ •μ˜ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ, λ©”μ„œλ“œμ˜ μ„ μ–ΈλΆ€λŠ” κΈ°μ‘΄ λ©”μ†Œλ“œμ™€ μ™„μ „νžˆ κ°™μ•„μ•Ό ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ©”μ†Œλ“œμ˜ λ°˜ν™˜ νƒ€μž…μ€ λΆ€λͺ¨ 클래슀의 λ°˜ν™˜ νƒ€μž…μœΌλ‘œ νƒ€μž… λ³€ν™˜ν•  수 μžˆλŠ” νƒ€μž…μ΄λΌλ©΄ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2. λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ³΄λ‹€ μ ‘κ·Ό μ œμ–΄μžλ₯Ό 더 쒁은 λ²”μœ„λ‘œ λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€

3. λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ³΄λ‹€ 더 큰 λ²”μœ„μ˜ μ˜ˆμ™Έλ₯Ό μ„ μ–Έν•  수 μ—†μŠ΅λ‹ˆλ‹€.

예제 1) λΆ€λͺ¨ 클래슀

package ch07;

public class Calculator {
	//μ ‘κ·Όμ œν•œμž: default 
	double areaCircle(double r) {
		System.out.println("Calculator 객체의 areaCircle() μ‹€ν–‰");
		return 3.14159 * r * r;
	}
}

예제 2) μžμ‹ 클래슀

package ch07;

public class Computer extends Calculator {
	@Override //이전 버전은 뢙인닀.
	//μ ‘κ·Όμ œν•œμž: default 
	double areaCircle(double r) {
		System.out.println("Computer 객체의 areaCircle() μ‹€ν–‰"); //μž¬μ •μ˜
		return Math.PI * r * r;
	}
}

예제 3) λ©”μ„œλ“œ μž¬μ •μ˜ ν…ŒμŠ€νŠΈ

μΈμŠ€ν„΄μŠ€ν™”: ν΄λž˜μŠ€λ‘œλΆ€ν„° 객체λ₯Ό λ§Œλ“œλŠ” κ³Όμ •

package ch07;

public class ComputerExample {
	public static void main(String[] args) {
		int r = 10;
		
		//Calculator 클래슀λ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•΄μ„œ 객체 생성(λΆ€λͺ¨ 클래슀 객체 생성)
		Calculator calculator = new Calculator();
		System.out.println("원면적: " + calculator.areaCircle(r));
		System.out.println();
		
		//Computer 클래슀λ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•΄μ„œ 객체 생성(μžμ‹ 클래슀 객체 생성)
		Computer computer = new Computer();
		System.out.println("원면적: " + computer.areaCircle(r)); //μž¬μ •μ˜λœ λ©”μ„œλ“œ 호좜
	}
}

κ²°κ³Ό) 

Calculator 객체의 areaCircle() μ‹€ν–‰
원면적: 314.159

Computer 객체의 areaCircle() μ‹€ν–‰
원면적: 314.1592653589793

2) λΆ€λͺ¨ λ©”μ„œλ“œ 호좜 p. 319

μžμ‹ ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜κ²Œ 되면 λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλŠ” μˆ¨κ²¨μ§€κ³  μž¬μ •μ˜λœ μžμ‹ λ©”μ„œλ“œλ§Œ μ‚¬μš©ν•˜κ²Œ λœλ‹€. μžμ‹ 클래슀 λ‚΄λΆ€μ—μ„œ μž¬μ •μ˜λœ λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•˜λŠ” 상황이 λ°œμƒν•œλ‹€λ©΄ λͺ…μ‹œμ μœΌλ‘œ super ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ„œ λΆ€λͺ¨ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.

super.λΆ€λͺ¨λ©”μ„œλ“œ();

Airplane 클래슀λ₯Ό μƒμ†ν•΄μ„œ SupersonicAirplane 클래슀λ₯Ό λ§Œλ“€μ–΄λ³Έλ‹€. Airplane fly() λ©”μ„œλ“œλŠ” 일반 λΉ„ν–‰μ΄μ§€λ§Œ SupersonicAirplane의 fly() λ©”μ„œλ“œλŠ” μ΄ˆμŒμ† λΉ„ν–‰ λͺ¨λ“œμ™€ 일반 λΉ„ν–‰ λͺ¨λ“œ 두 κ°€μ§€λ‘œ λ™μž‘ν•œλ‹€. 

예제 1) super λ³€μˆ˜ Airplane.java

package ch07;

public class Airplane {
	//μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ„ μ–Έ 
	public void land() {
		System.out.println("μ°©λ₯™ν•©λ‹ˆλ‹€.");
	}
	
	public void fly() {
		System.out.println("μΌλ°˜λΉ„ν–‰ν•©λ‹ˆλ‹€.");
	}
	
	public void takeOff() {
		System.out.println("이λ₯™ν•©λ‹ˆλ‹€.");
	}
}

예제 2) super λ³€μˆ˜ SupersonicAirplane.java
final:
λ³€κ²½ν•  수 μ—†λŠ” 

package ch07;
//μžμ‹ 클래슀
public class SupersonicAirplane extends Airplane {
	//μƒμˆ˜(ν•œ 번 μ €μž₯ν•œ 값은 λ³€κ²½ν•  수 μ—†λ‹€.)
	public static final int NORMAL = 1;
	//μƒμˆ˜(ν•œ 번 μ €μž₯ν•œ 값은 λ³€κ²½ν•  수 μ—†λ‹€.)
	public static final int SUPERSONIC = 2; //static: 정적 ν•„λ“œ
	//λ³€μˆ˜
	public int flyMode = NORMAL; 
	//μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ„ μ–Έ
	public void fly() {
		if(flyMode == SUPERSONIC) {
			System.out.println("μ΄ˆμŒμ†λΉ„ν–‰ν•©λ‹ˆλ‹€.");
		}else {
			//μΈμ„œν„΄μŠ€ λ©”μ„œλ“œ 호좜: Airplane(λΆ€λͺ¨) 객체의 fly()λ©”μ„œλ“œ 호좜
			super.fly(); //super. 은 λΆ€λͺ¨ 클래슀λ₯Ό 호좜
		}
	}
}

예제 3) super λ³€μˆ˜ SupersonicAirPlaneExample.java

package ch07;

public class SupersonicAirplaneExample {
	public static void main(String[] args) {
		SupersonicAirplane sa = new SupersonicAirplane();
		sa.takeOff(); //"이λ₯™ν•©λ‹ˆλ‹€."
		sa.fly(); //"μΌλ°˜λΉ„ν–‰ν•©λ‹ˆλ‹€."
		sa.flyMode = SupersonicAirplane.SUPERSONIC; //ν΄λž˜μŠ€μ΄λ¦„ (정적 static) 2 == 2 
		sa.fly(); //"μ΄ˆμŒμ†λΉ„ν–‰ν•©λ‹ˆλ‹€."
		sa.flyMode = SupersonicAirplane.NORMAL; // 1 =/= 2 
		sa.fly(); //"μΌλ°˜λΉ„ν–‰ν•©λ‹ˆλ‹€."
		sa.land(); //"μ°©λ₯™ν•©λ‹ˆλ‹€."
	}
}

κ²°κ³Ό)

이λ₯™ν•©λ‹ˆλ‹€.
μΌλ°˜λΉ„ν–‰ν•©λ‹ˆλ‹€.
μ΄ˆμŒμ†λΉ„ν–‰ν•©λ‹ˆλ‹€.
μΌλ°˜λΉ„ν–‰ν•©λ‹ˆλ‹€.
μ°©λ₯™ν•©λ‹ˆλ‹€.

7.1.4 final ν΄λž˜μŠ€μ™€ final λ©”μ„œλ“œ p. 322

final ν‚€μ›Œλ“œλŠ” 클래슀, ν•„λ“œ λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•  λ•Œ μ‚¬μš©ν•  수 μžˆλŠ”λ°, ν•΄λ‹Ή 선언이 μ΅œμ’… μƒνƒœμ΄κ³  κ²°μ½” μˆ˜μ •λ  수 μ—†μŒμ„ λœ»ν•œλ‹€. 
final ν‚€μ›Œλ“œλŠ” 클래슀, ν•„λ“œ, λ©”μ„œλ“œ 선언에 μ‚¬μš©λ  경우 해석이 μ‘°κΈˆμ”© λ‹¬λΌμ§€λŠ”λ°,
ν•„λ“œλ₯Ό μ„ μ–Έν•  λ•Œ (Ch6 μ°Έκ³ ) final이 μ§€μ •λ˜λ©΄ μ΄ˆκΈ°κ°’ μ„€μ • ν›„ 더 이상 값을 λ³€κ²½ν•  수 μ—†λ‹€. = μƒμˆ˜κ°€ λœλ‹€.

ν΄λž˜μŠ€μ™€ λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•  λ•Œ final ν‚€μ›Œλ“œκ°€ μ§€μ •λ˜λ©΄ 상속과 관련이 μžˆλ‹€λŠ” μ˜λ―Έμ΄λ‹€. 

1) 상속할 수 μ—†λŠ” final 클래슀

클래슀λ₯Ό μ„ μ–Έν•  λ•Œ final ν‚€μ›Œλ“œλ₯Ό class μ•žμ— 뢙이면 이 ν΄λž˜μŠ€λŠ” μ΅œμ’…μ μΈ ν΄λž˜μŠ€μ΄λ―€λ‘œ 상속할 수 μ—†λŠ” ν΄λž˜μŠ€κ°€ λœλ‹€.
즉, final ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ 될 수 μ—†μ–΄ μžμ‹ 클래슀λ₯Ό λ§Œλ“€ 수 μ—†λ‹€λŠ” 것이닀.

public final class 클래슀 {...}

//final 클래슀의 λŒ€ν‘œμ μΈ 예: μžλ°” ν‘œμ€€ APIμ—μ„œ μ œκ³΅ν•˜λŠ” String 클래슀
public final class String
//public class NewString extends String{...} //μ•ˆ λœλ‹€.


2) μž¬μ •μ˜ν•  수 μ—†λŠ” final λ©”μ„œλ“œ

λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•  λ•Œ final ν‚€μ›Œλ“œλ₯Ό 뢙이면 이 λ©”μ„œλ“œλŠ” μ΅œμ’…μ μΈ λ©”μ„œλ“œμ΄λ―€λ‘œ μž¬μ •μ˜ν•  수 μ—†λŠ” λ©”μ„œλ“œκ°€ λœλ‹€. 
즉, λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μƒμ†ν•΄μ„œ μžμ‹ 클래슀λ₯Ό μ„ μ–Έν•  λ•Œ λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ μ„ μ–Έλœ final λ©”μ„œλ“œλŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ ν•  수 μ—†λ‹€.

예제 1) μž¬μ •μ˜ν•  수 μ—†λŠ” final λ©”μ„œλ“œ Car.java

package ch07;

public class Car {
	//ν•„λ“œ
	public int speed;
	//μƒμ„±μž
	
	//λ©”μ„œλ“œ
	//speedλ₯Ό 1μ”© 증가
	public void speedUp() {speed += 1;}
	
	//final λ©”μ„œλ“œ 
	public final void stop() {
		System.out.println("μ°¨λ₯Ό 멈좀");
		speed = 0;
	}
}

예제 2) μž¬μ •μ˜ν•  수 μ—†λŠ” fianl λ©”μ„œλ“œ SportsCar.java

package ch07;

public class SportCar extends Car{
	//speedλ₯Ό 10μ”© 증가(λΆ€λͺ¨ 클래슀의 speedUpλ©”μ„œλ“œμ˜ λ‚΄μš© λ³€κ²½: μ˜€λ²„λΌμ΄λ”©)
	public void speedUp() {speed += 10;}
	
	//μ°¨λ₯Ό 멈좀 좜λ ₯
	public void stop() {
		System.out.println("슀포츠카λ₯Ό 멈좀");
		speed = 0;
	}
}

 


protected μ ‘κ·Ό μ œν•œμž p. 325

protected μ ‘κ·Ό μ œν•œμžκ°™μ€ νŒ¨ν‚€μ§€ λ˜λŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•œλ‹€.
같은 νŒ¨ν‚€μ§€μ— μ†ν•˜λŠ” ν΄λž˜μŠ€μ—μ„œ μƒμ„±μž 호좜 κ°€λŠ₯ν•˜λ‹€. λ‹€λ₯Έ νŒ¨ν‚€μ§€μ— μ†ν•œ ν΄λž˜μŠ€κ°€ ν•΄λ‹Ή μžμ‹ ν΄λž˜μŠ€λΌλ©΄ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  μˆ˜ μžˆλ‹€.
상속 O

protectedλŠ” 같은 νŒ¨ν‚€μ§€μ—μ„œ default와 같이 μ ‘κ·Ό μ œν•œμ΄ μ—†μ§€λ§Œ λ‹€λ₯Έ νŒ¨ν‚€μ§€μ—μ„œλŠ” μžμ‹ 클래슀만 접근을 ν—ˆμš©ν•œλ‹€.

protected μ ‘κ·Ό μ œν•œμž

 

예제 1) protected μ ‘κ·Ό μ œν•œμž

package ch07.pack1;

public class A {
	String field1; //μ ‘κ·Ό μ œν•œμž: default
	protected String field2; //μ ‘κ·Ό μ œν•œμž: protected
	
	protected A() {}
	
	void method1() {} //μ ‘κ·Ό μ œν•œμž: default
	
	protected void method2() {} //μ ‘κ·Ό μ œν•œμž: protected
}

예제 2) protected μ ‘κ·Ό μ œν•œμž ν…ŒμŠ€νŠΈ
동일 νŒ¨ν‚€μ§€:
A 클래슀의 proteced ν•„λ“œ, μƒμ„±μž, λ©”μ„œλ“œμ— μ ‘κ·Ό κ°€λŠ₯

package ch07.pack1;

public class B {
	public void method() {
		A a = new A();
		
		//같은 νŒ¨ν‚€μ§€(ch07.pack1)μ—μ„œ default μ ‘κ·Όμ œν•œμž μ ‘κ·Ό κ°€λŠ₯
		a.field1 = "value1"; //μ ‘κ·Ό κ°€λŠ₯
		//같은 νŒ¨ν‚€μ§€(ch07.pack1)μ—μ„œ protected μ ‘κ·Όμ œν•œμž μ ‘κ·Ό κ°€λŠ₯
		a.field2 = "value1"; //μ ‘κ·Ό κ°€λŠ₯
		
		//같은 νŒ¨ν‚€μ§€(ch07.pack1)μ—μ„œ protected μ ‘κ·Όμ œν•œμž μ ‘κ·Ό κ°€λŠ₯
		a.method1();
		//같은 νŒ¨ν‚€μ§€(ch07.pack1)μ—μ„œ protected μ ‘κ·Όμ œν•œμž μ ‘κ·Ό κ°€λŠ₯
		a.method2();
	}
}

예제 3) protected μ ‘κ·Ό μ œν•œμž ν…ŒμŠ€νŠΈ
λ‹€λ₯Έ νŒ¨ν‚€μ§€:
A 클래슀의 proteced ν•„λ“œ, μƒμ„±μž, λ©”μ„œλ“œμ— μ ‘κ·Ό λΆˆκ°€λŠ₯ 

package ch07.pack2;

import ch07.pack1.A;

public class C {
	public void method() {
		A a = new A(); //μ ‘κ·Ό λΆˆκ°€λŠ₯ 
		
		//같은 νŒ¨ν‚€μ§€(ch07.pack1)μ—μ„œ default μ ‘κ·Όμ œν•œμž μ ‘κ·Ό λΆˆκ°€λŠ₯
		a.field1 = "value1"; 
		//같은 νŒ¨ν‚€μ§€(ch07.pack1)μ—μ„œ protected μ ‘κ·Όμ œν•œμž μ ‘κ·Ό λΆˆκ°€λŠ₯
		a.field2 = "value1";
		
		//같은 νŒ¨ν‚€μ§€(ch07.pack1)μ—μ„œ protected μ ‘κ·Όμ œν•œμž μ ‘κ·Ό λΆˆκ°€λŠ₯
		a.method1();
		//같은 νŒ¨ν‚€μ§€(ch07.pack1)μ—μ„œ protected μ ‘κ·Όμ œν•œμž μ ‘κ·Ό λΆˆκ°€λŠ₯
		a.method2();
	}
}

예제 4) protected μ ‘κ·Ό μ œν•œμž
λ‹€λ₯Έ νŒ¨ν‚€μ§€ + μžμ‹ 클래슀:
A 클래슀의 proteced ν•„λ“œ, μƒμ„±μž, λ©”μ„œλ“œμ— μ ‘κ·Ό κ°€λŠ₯ 
단 new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ„œ μƒμ„±μžλ₯Ό 직접 ν˜ΈμΆœν•  μˆ˜λŠ” μ—†κ³ , μžμ‹ μƒμ„±μžμ—μ„œ super()둜 A μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€. 

package ch07.pack2;

import ch07.pack1.A;

public class D extends A {
	public D() {
		super();
		//같은 νŒ¨ν‚€μ§€(ch07.pack1)μ—μ„œ default μ ‘κ·Όμ œν•œμž μ ‘κ·Ό λΆˆκ°€λŠ₯
		field1 = "value1"; 
		//같은 νŒ¨ν‚€μ§€(ch07.pack1)μ—μ„œ protected μ ‘κ·Όμ œν•œμž μ ‘κ·Ό κ°€λŠ₯
		field2 = "value1"; 
		
		//같은 νŒ¨ν‚€μ§€(ch07.pack1)μ—μ„œ protected μ ‘κ·Όμ œν•œμž μ ‘κ·Ό λΆˆκ°€λŠ₯
		method1();
		//같은 νŒ¨ν‚€μ§€(ch07.pack1)μ—μ„œ protected μ ‘κ·Όμ œν•œμž μ ‘κ·Ό κ°€λŠ₯
		method2();
	}
}

마무리 p. 328
4가지 ν‚€μ›Œλ“œλ‘œ λλ‚΄λŠ” 핡심 포인트

1) 상속: λΆ€λͺ¨ 클래슀의 ν•„λ“œμ™€ λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•œλ‹€.

2) λ©”μ„œλ“œ μž¬μ •μ˜: λΆ€λͺ¨ λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ‹€μ‹œ μ •μ˜ν•˜λŠ” 것을 λ§ν•œλ‹€.

3) final 클래슀:
final ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀둜 μ‚¬μš©ν•  수 μ—†λŠ” final ν΄λž˜μŠ€μ΄λ‹€.


4) final λ©”μ„œλ“œ:
final ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ©”μ„œλ“œλŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•  수 μ—†λŠ” final λ©”μ„œλ“œμ΄λ‹€.

class 닀쀑상속 ν—ˆμš© X 
interface 닀쀑상속 ν—ˆμš© O

Q4) Parent 클래슀λ₯Ό μƒμ†ν•΄μ„œ Child 클래슀λ₯Ό μž‘μ„±ν•œλ‹€. 
예제 1)

package ch07;

public class Parent1 {
	public String name; //μ ‘κ·Όμ œν•œμžκ°€ public인 μΈμŠ€ν„΄μŠ€ ν•„λ“œ
	
	public Parent1(String name) { //μ ‘κ·Όμ œν•œμžκ°€ public인 λ§€κ°œλ³€μˆ˜
		this.name = name;
	}
}

예제 2) this.name λŒ€μ‹  super(name);을 λ„£λŠ”λ‹€. 

package ch07;

public class Child1 extends Parent1{
	private int studentNo;
	
	public Child1(String name, int studentNo) {
		super(name);
		this.studentNo = studentNo;
	}
}

Q5) Parent 클래슀λ₯Ό 상속받아 Child 클래슀λ₯Ό μž‘μ„±ν•œλ‹€. ChildExample 클래슀λ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ ν˜ΈμΆœλ˜λŠ” 각 클래슀의 μƒμ„±μžμ˜ μˆœμ„œλ₯Ό μƒκ°ν•˜λ©΄μ„œ 좜λ ₯ κ²°κ³Ό μž‘μ„±ν•œλ‹€. 
예제 1)

package ch07;

public class Parent {
	public String nation;
	
	public Parent() { //κΈ°λ³Έμƒμ„±μž
		this("λŒ€ν•œλ―Όκ΅­"); //λ§€κ°œλ³€μˆ˜ 1개인 μƒμ„±μž 
		System.out.println("Parent() call");//[2]
	}	
		
	public Parent(String nation) {
		this.nation = nation;
		System.out.println("Parent(String nation) call");//[1]
	}
}


예제 2) super()κ°€ μƒλž΅λ¨

package ch07;

public class Child extends Parent {
	private String name;
	
	public Child() { //μžμ‹ 클래슀의 κΈ°λ³Έ μƒμ„±μž
		//super();// μƒλž΅λ˜μ–΄ μžˆλ‹€. 
		this("홍길동");
		System.out.println("Child() call");//[4]
	}
	
	public Child(String name) {
		this.name = name;
		System.out.println("Child(String name) call");//[3]
	}
}


예제 3) 

package ch07;

public class ChildExample {
	public static void main(String[] args) {
			Child child = new Child();
	}
}

κ²°κ³Ό) super()κ°€ μƒλž΅λ¨.

super: λΆ€λͺ¨ν΄λž˜μŠ€ μƒμ„±μž 호좜

μžμ‹ν΄λž˜μŠ€μ˜ λͺ¨λ“  μƒμ„±μžμ— λΆ€λͺ¨ 클래슀의 κΈ°λ³Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” super()κ°€ μƒλž΅λ˜μ–΄ μžˆλ‹€.
λ§€κ°œλ³€μˆ˜ μž…λ ₯ μ‹œ, 그에 λ§žλŠ” λΆ€λͺ¨ 클래슀 μƒμ„±μž ν˜ΈμΆœν•œλ‹€.
λ§€κ°œλ³€μˆ˜ λ―Έμž…λ ₯ λ˜λŠ” super() μƒλž΅ μ‹œ, λΆ€λͺ¨ 클래슀 κΈ°λ³Έ μƒμ„±μž ν˜ΈμΆœν•œλ‹€.

μ°Έκ³ : https://pathas.tistory.com/134

this("λŒ€ν•œλ―Όκ΅­")에 μ˜ν•΄ Parent(String name) call이 λ¨Όμ € μ‹€ν–‰λœλ‹€.
this("홍길동")에 μ˜ν•΄ Child(String name) call이 λ¨Όμ € μ‹€ν–‰λœλ‹€.

Parent(String nation) call
Parent() call
Child(String name) call
Child() call

728x90
λ°˜μ‘ν˜•
Comments