Programming/JAVA

[9μ£Όμ°¨] 좔상 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€ / μΈν„°νŽ˜μ΄μŠ€μ˜ 상속 /μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„κ³Ό νƒ€μž… λ³€ν™˜(1)

mnzy🌱 2022. 5. 3. 13:28

1. 좔상 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€ 

[λ‚˜μ€‘μ— μ°Έκ³ ν•  것] https://limkydev.tistory.com/188

 

(1) 좔상 λ©”μ„œλ“œ: λ©”μ„œλ“œ 본체λ₯Ό μ™„μ„±ν•˜μ§€ λͺ»ν•œ λ©”μ„œλ“œ //κ΅¬ν˜„λΆ€κ°€ μ—†λŠ” λ©”μ„œλ“œ

-> μ„ μ–Έ: abstract λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œμ΄λ¦„();  //μ„Έλ―Έμ½œλ‘  ν•„μˆ˜, λ©”μ„œλ“œ 본체(κ΅¬ν˜„λΆ€) μ—†μŒ

//{..} 이뢀뢄 μ—†μŒ

-> 좔상 λ©”μ„œλ“œλŠ” publicμ΄λ‚˜ protected둜 μ§€μ •ν•  수 있음

 

(2) 좔상 클래슀: 객체λ₯Ό μƒμ„±ν•˜μ§€ λͺ»ν•˜λŠ” 클래슀

- κ΅¬ν˜„ 클래슀λ₯Ό λ§Œλ“œλŠ” λΆ€λͺ¨ 클래슀둜만 μ‚¬μš©λ  뿐 new μ—°μ‚°μžλ‘œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ λͺ»ν•¨ 

// λ„ν˜• 클래슀의  draw()λ©”μ„œλ“œλŠ” μžμ‹ 클래슀의 draw() λ©”μ„œλ“œμ™€ 달리 (μžμ‹: 원, μ‚¬κ°ν˜• ..) ꡬ체적인 ν˜•νƒœκ°€ μ—†μ–΄ ν•¨μˆ˜ κ΅¬ν˜„μ΄ λΆˆκ°€λŠ₯ν•œ 것을 μƒκ°ν•˜μž

-> 주둜 상속 κ³„μΈ΅μ—μ„œ μžμ‹ 멀버(ν•„λ“œ,λ©”μ„œλ“œ)의 이름을 ν†΅μΌν•˜λŠ”λ° μ‚¬μš© 

- μ„ μ–Έ: abstract class ν΄λž˜μŠ€μ΄λ¦„ {..} 

-> public으둜 μ§€μ •ν•  수 있음

-> ν•„λ“œ, μƒμ„±μž, λ©”μ„œλ“œ λ‹€ 올 수 O   // super() ν˜ΈμΆœμ„ μœ„ν•΄

-> 주둜 ν•˜λ‚˜ μ΄μƒμ˜ μΆ”μƒλ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•˜μ§€λ§Œ 없어도 ok

- μΆ”상 ν΄λž˜μŠ€μ•ˆμ— μžˆλŠ” 좔상 λ©”μ„œλ“œλŠ” λ°˜λ“œμ‹œ μžμ‹ ν΄λž˜μŠ€μ— 상속해야 함

-> 좔상 λ©”μ„œλ“œλŠ” publicμ΄λ‚˜ protected둜 μ§€μ •ν•  수 있음

-> λ‚˜λ¨Έμ§€ λ©€λ²„λŠ” μ–΄λ–€ μ ‘κ·Όμ§€μ •μžλ‘œλ„ μ§€μ •ν•  수 있음

 

- 좔상 클래슀의 상속 (μžμ‹ 클래슀)

-> class μžμ‹ν΄λž˜μŠ€μ΄λ¦„ extends λΆ€λͺ¨μΆ”μƒν΄λž˜μŠ€  // 닀쀑상속 X

-> μžμ‹ν΄λž˜μŠ€κ°€ μ˜€λ²„λΌμ΄λ”©ν•΄μ„œ κ΅¬ν˜„ν•΄μ€Œ (extends)

-> μžμ‹ 클래슀λ₯Ό 톡해 κ΅¬ν˜„ν•΄μ£Όκ³  μžμ‹ν΄λž˜μŠ€λ₯Ό 톡해 객체 생성함

 

//좔상 클래슀
abstract class Shape {
	double pi = 3.14;

	abstract void draw();	//좔상 λ©”μ„œλ“œ

	public double findArea() {	//κ΅¬ν˜„ λ©”μ„œλ“œ
		return 0.0;
	}
}

- 좔상 ν΄λž˜μŠ€λ„ 멀버 ν•„λ“œλ₯Ό 포함할 수 있음

- 좔상 λ©”μ„œλ“œλŠ” 본체({..})κ°€ μ—†μŒ

- 좔상 ν΄λž˜μŠ€λ„ κ΅¬ν˜„ λ©”μ„œλ“œ(일반 λ©”μ„œλ“œ)λ₯Ό 포함할 수 있음

 

class Rectangle extends Shape { //μΆ”μƒν΄λž˜μŠ€λ₯Ό κ΅¬ν˜„ν•œ μžμ‹ν΄λž˜μŠ€
	int width, height;

	public Rectangle(int width, int height) {
		this.width = width;
		this.height = height;
	}

	public void draw() {	//λΆ€λͺ¨-defaultμ΄λ―€λ‘œ public으둜 κ°€λŠ₯(μžμ‹-ν™•λŒ€λ§Œ κ°€λŠ₯)
		System.out.println("μ‚¬κ°ν˜•μ„ 그리닀.");
	}

	public double findArea() {
		return width * height;
	}
}
public class AbstractClassDemo {
	public static void main(String[] args) {
		// Shape s = new Shape();	

		Circle c = new Circle(3);
		c.draw();
		System.out.printf("μ›μ˜ λ„“μ΄λŠ” %.1f\n", c.findArea());

		Rectangle r = new Rectangle(3, 4);
		r.draw();
		System.out.printf("μ‚¬κ°ν˜•μ˜ λ„“μ΄λŠ” %.1f\n", r.findArea());
	}
}

- Shape ν΄λž˜μŠ€λŠ” 좔상 ν΄λž˜μŠ€μ΄λ―€λ‘œ newμ—°μ‚°μž(λ˜λŠ” μƒμ„±μž)λ₯Ό μ‚¬μš©ν•΄ 객체λ₯Ό 생성할 수 μ—†μŒ


(1) μΈν„°νŽ˜μ΄μŠ€: 클래슀 간에 μƒν˜Έμž‘μš©ν•˜λŠ” 규격으둜, μ‚¬μš© 방법이 같은 클래슀λ₯Ό λ§Œλ“œλŠ” 기술

- μ„ μ–Έ: interface μΈν„°νŽ˜μ΄μŠ€μ΄λ¦„ {...} //ν•„λ“œ, μƒμ„±μž, λ©”μ„œλ“œ λ‹€ 올 수 O

 

- μΈν„°νŽ˜μ΄μŠ€μ˜ ꡬ쑰

-> ν•„λ“œ: μƒμˆ˜λ§Œ κ°€λŠ₯ (μƒμˆ˜: public static final -> μƒλž΅ κ°€λŠ₯

-> λ©”μ„œλ“œ: abstract, default, static, private λ‹€ κ°€λŠ₯ (기본은 public abstract -> μƒλž΅ κ°€λŠ₯)

//λ©”μ„œλ“œ λ‹€ κ°€λŠ₯ν•œκ±΄ JDK9λΆ€ν„° 

// κ΅¬ν˜„λΆ€κ°€ μ—†κ³ , μ ‘κ·Ό μ§€μ •μž μƒλž΅λ˜μ–΄ μžˆλŠ” λ©”μ„œλ“œ = public abstract λ©”μ„œλ“œ

// ex. int MAX = 10; = public static final int MAX = 10;

// ex. void sayHello(); = public abstract void sayHello();

 

- μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„ (κ΅¬ν˜„ 클래슀)

-> class μžμ‹ν΄λž˜μŠ€ implements λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€ {..}

-> class μžμ‹ν΄λž˜μŠ€ implements λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€1, λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€2{..}

// μΈν„°νŽ˜μ΄μŠ€- 닀쀑 κ΅¬ν˜„ κ°€λŠ₯ (κ΅¬ν˜„μ€ μƒμ†μ΄λž‘ 거의 λ˜‘κ°™μŒ)

 

- μΈν„°νŽ˜μ΄μŠ€μ˜ 상속 (μžμ‹ μΈν„°νŽ˜μ΄μŠ€) // 뒀에 또 λ‚˜μ˜΄

-> interface μžμ‹μΈν„°νŽ˜μ΄μŠ€ extends λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€ {..}

-> interface μžμ‹μΈν„°νŽ˜μ΄μŠ€ extends λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€1, λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€2 {..}

// μΈν„°νŽ˜μ΄μŠ€ - 닀쀑 상속 κ°€λŠ₯

 

- μΈν„°νŽ˜μ΄μŠ€μ˜ μž₯점

-> μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ€€μˆ˜ν•˜λ©΄ ν†΅ν•©μ— μ‹ κ²½ μ“°μ§€ μ•Šκ³ , λ‹€μ–‘ν•œ ν˜•νƒœλ‘œ μƒˆλ‘œμš΄ 클래슀λ₯Ό κ°œλ°œν•  수 μžˆλ‹€

-> μžλ°”λŠ” 클래슀의 닀쀑 상속을 μ§€μ›ν•˜μ§€ μ•Šμ§€λ§Œ, μΈν„°νŽ˜μ΄μŠ€λ‘œ 닀쀑 상속 효과λ₯Ό κ°„μ ‘μ μœΌλ‘œ 얻을 수 μžˆλ‹€.

 

+) class μžμ‹ν΄λž˜μŠ€ extends λΆ€λͺ¨ν΄λž˜μŠ€ implements λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€1, λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€2{..} κ°€λŠ₯

// ν΄λž˜μŠ€λŠ” 상속 1번만 κ°€λŠ₯, κ·ΈλŸ¬λ‚˜ μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„μ€ μ—¬λŸ¬ 개 κ°€λŠ₯ 


 

#1)

// μΈν„°νŽ˜μ΄μŠ€ A

interface A { 

method1(); //κ΅¬ν˜„λΆ€X-> 좔상 λ©”μ„œλ“œ

method2();

}

 

// μΈν„°νŽ˜μ΄μŠ€ Aλ₯Ό κ΅¬ν˜„ν•œ κ΅¬ν˜„ 클래슀 C1

class C1 implements A {

method1() {..}

}

// μΆ”μƒν΄λž˜μŠ€ ν•˜λ‚˜λ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  수 μ—†μŒ (method2())

 

// μΈν„°νŽ˜μ΄μŠ€ Aλ₯Ό κ΅¬ν˜„ν•œ κ΅¬ν˜„ 클래슀 D1

class D1 implements A {

method1(){..}

method2(){..}

}

//method2()도 κ΅¬ν˜„ν•¨ -> μ‚¬μš©κ°€λŠ₯ 

 

 

#2)음

// μΈν„°νŽ˜μ΄μŠ€ A

interface A {

method1();

method2(){...}  //default λ©”μ„œλ“œ (κ΅¬ν˜„λΆ€λŠ” μžˆμ§€λ§Œ, μ ‘κ·Ό μ§€μ •μžκ°€ μ—†μŒ = default)

}

 

// μΈν„°νŽ˜μ΄μŠ€ Aλ₯Ό κ΅¬ν˜„ν•œ κ΅¬ν˜„ 클래슀  C1

class C1 implements A {

method1(){..}

}

//method2λŠ” μΆ”μƒλ©”μ„œλ“œκ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„ 됨 -> μ‚¬μš© κ°€λŠ₯

 

// μΈν„°νŽ˜μ΄μŠ€ Aλ₯Ό κ΅¬ν˜„ν•œ κ΅¬ν˜„ 클래슀  C1

class D1 implements A {

method1(){...}

method2(){...}

}

//method2()λ₯Ό μΈν„°νŽ˜μ΄μŠ€μ—μ„œ 상속받아 μ˜€λ²„λΌμ΄λ”© ν•΄μ€Œ

 

- λ””ν΄νŠΈ λ©”μ„œλ“œλŠ” μ˜€λ²„λΌμ΄λ”© 될 수 μžˆμ§€λ§Œ, 정적 λ©”μ„œλ“œλŠ” μ˜€λ²„λΌμ΄λ”© 될 수 μ—†λ‹€.

// μ˜€λ²„λΌμ΄λ”©: 상속관계- μžμ‹μ—μ„œ λ‹€μ‹œ μ •μ˜ (λΆ€λͺ¨κΊΌλ₯Ό λ‚΄κ»„λ‘œ λ§Œλ“ λ‹€!λŠ” λŠλ‚Œ)

// μΆ”μƒλ©”μ„œλ“œλ₯Ό μžμ‹ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•˜λŠ” 것도 μ˜€λ²„λΌμ΄λ”©μž„

- λ””ν΄νŠΈ λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ΄λ―€λ‘œ 객체λ₯Ό μƒμ„±ν•œ ν›„ ν˜ΈμΆœν•˜μ§€λ§Œ, 정적 λ©”μ„œλ“œλŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œ 직접 ν˜ΈμΆœν•œλ‹€.


- μΈν„°νŽ˜μ΄μŠ€ vs 좔상 클래슀

λΆ„λ₯˜ μΈν„°νŽ˜μ΄μŠ€ μΆ”μƒν΄λž˜μŠ€
κ΅¬ν˜„ λ©”μ„œλ“œ 포함 λΆˆκ°€(단, λ””ν΄νŠΈ λ©”μ„œλ“œμ™€ 정적 λ©”μ„œλ“œλŠ” μ˜ˆμ™Έ0) 포함 κ°€λŠ₯
μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 포함 λΆˆκ°€λŠ₯ 포함 κ°€λŠ₯
닀쀑 상속 κ°€λŠ₯ λΆˆκ°€λŠ₯
λ””ν΄νŠΈ λ©”μ„œλ“œ μ„ μ–Έ κ°€λŠ₯ μ„ μ–Έ λΆˆκ°€λŠ₯
μƒμ„±μžμ™€ main()  μ„ μ–Έ λΆˆκ°€λŠ₯ μ„ μ–Έ κ°€λŠ₯
μƒμ†μ—μ„œμ˜ λΆ€λͺ¨ μΈν„°νŽ˜μ΄μŠ€ μΈν„°νŽ˜μ΄μŠ€, 좔상 클래슀
μ ‘κ·Ό λ²”μœ„ λͺ¨λ“  멀버λ₯Ό 곡개 좔상 λ©”μ„œλ“œλ₯Ό μ΅œμ†Œν•œ μžμ‹μ—κ²Œ 곡개

2. μΈν„°νŽ˜μ΄μŠ€μ˜ 상속

(1) μΈν„°νŽ˜μ΄μŠ€ 상속 //상속 - λΆ€λͺ¨κΊΌ μ‚¬μš©

- interface μžμ‹μΈν„°νŽ˜μ΄μŠ€ extends λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€{..}

- interface μžμ‹μΈν„°νŽ˜μ΄μŠ€ extends λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€1, λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€2{..}

-> μΈν„°νŽ˜μ΄μŠ€λŠ” 닀쀑 상속 κ°€λŠ₯ //상속할 μΈν„°νŽ˜μ΄μŠ€κ°€ μ—¬λŸ¬κ°œλΌλ©΄ μ‰Όν‘œ(,)둜 μ—°κ²°ν•œλ‹€

 

(2) μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„ 

- class ν΄λž˜μŠ€μ΄λ¦„ implements μΈν„°νŽ˜μ΄μŠ€μ΄λ¦„ {..}

- class μžμ‹ν΄λž˜μŠ€ implements λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€1, λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€2{..}

-> μΈν„°νŽ˜μ΄μŠ€λŠ” 닀쀑 κ΅¬ν˜„ κ°€λŠ₯ //κ΅¬ν˜„ν•  μΈν„°νŽ˜μ΄μŠ€κ°€ μ—¬λŸ¬κ°œλΌλ©΄ μ‰Όν‘œ(,)둜 μ—°κ²°ν•œλ‹€

 

+) class μžμ‹ν΄λž˜μŠ€ extends λΆ€λͺ¨ν΄λž˜μŠ€ implements λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€1, λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€2{..} κ°€λŠ₯

+) ν΄λž˜μŠ€λŠ” 닀쀑상속 λΆˆκ°€λŠ₯인거 μžŠμ§€λ§κΈ°!

 

<정리>
* 상속- ν΄λž˜μŠ€λŠ” 클래슀끼리, μΈν„°νŽ˜μ΄μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€λΌλ¦¬ 상속 (상속은 κ°™μ€μ• λ“€λΌλ¦¬λ§Œ!)
* κ΅¬ν˜„- μΈν„°νŽ˜μ΄μŠ€λ₯Ό 클래슀둜 κ΅¬ν˜„ κ°€λŠ₯ (ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œ κ΅¬ν˜„ λΆˆκ°€λŠ₯)  //당연함

(3) μΈν„°νŽ˜μ΄μŠ€μ™€ μƒμˆ˜

interface Coin {
	int PENNY = 1, NICKEL = 5, DIME = 10, QUARTER = 25;
}

public class Coin1Demo {
	public static void main(String[] args) {
		System.out.println("Dime은 " + Coin.DIME + "μ„ΌνŠΈμž…λ‹ˆλ‹€.");
	}
}

- Coin μΈν„°νŽ˜μ΄μŠ€μ—μ„œ λ³€μˆ˜(ν•„λ“œ)κ°€ μƒμˆ˜λ‘œ μ΄ˆκΈ°ν™”λ˜μ–΄μžˆμŒ 

//μΈν„°νŽ˜μ΄μŠ€μ˜ ν•„λ“œλŠ” μƒμˆ˜λ‘œλ§Œ κ°€λŠ₯ν•˜λ―€λ‘œ λ¬Έμ œμ—†μŒ

- Coin.DIME

-> μΈν„°νŽ˜μ΄μŠ€μ˜ ν•„λ“œ(μƒμˆ˜) μ ‘κ·Ό 방법: μΈν„°νŽ˜μ΄μŠ€μ΄λ¦„.ν•„λ“œλͺ…

 

public class Coin2Demo implements Coin {
	public static void main(String[] args) {

		System.out.println("Dime은 " + DIME + "μ„ΌνŠΈμž…λ‹ˆλ‹€.");

	}
}

-> 클래슀 Coin2DemoλŠ” Coin μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•¨ (implements)

// Coin μΈν„°νŽ˜μ΄μŠ€κ°€ μΆ”μƒλ©”μ„œλ“œ ν¬ν•¨ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λ©”μ„œλ“œ κ΅¬ν˜„ν•  ν•„μš”μ—†μ΄ κ·Έλƒ₯ μ‚¬μš©ν•˜λ©΄ 됨

-> Coin μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„ ν΄λž˜μŠ€μ΄λ―€λ‘œ μƒμˆ˜λ₯Ό 직접 μ‚¬μš©ν•  수 있음 

// μ›λž˜λŠ” 클래슀.μƒμˆ˜ but, '클래슀.' ꡳ이 μ•ˆν•΄λ„ OK (κ΅¬ν˜„ 클래슀 내뢀이기 λ•Œλ¬Έ) 


(4) Comparable μΈν„°νŽ˜μ΄μŠ€ : 객체λ₯Ό λΉ„κ΅ν•˜κΈ° μš°ν•œ 규격으둜 μ‚¬μš©λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€

// 기본적으둜 제곡 (λ”°λ‘œ μ„ μ–Έν•  ν•„μš”X) ??? λ§žλ‚˜

public interface Comparable {
	int compareTo(Object other);
}

- compareTo(): λ‹€λ₯Έ 객체보닀 크면 μ–‘μˆ˜, λ™μΌν•˜λ©΄ 0, μž‘μœΌλ©΄ 음수λ₯Ό λ°˜ν™˜ν•¨ // μ—₯ μΆ”μƒλ©”μ„œλ“œλΌλ©°..?????

-> compareTo()λŠ” μΆ”μƒλ©”μ„œλ“œμž„ (κ΅¬ν˜„λΆ€ X)

- Object 클래슀: Object ν΄λž˜μŠ€λŠ” μ΅œμƒμœ„ ν΄λž˜μŠ€μž„ (μ—…μΊμŠ€νŒ… κ°€λŠ₯)

 

class Circle implements Comparable {
	double radius;

	public Circle(double radius) {
		this.radius = radius;
	}

	@Override
	public int compareTo(Object o) {	
		Circle c = (Circle) o;	
		if(this.radius > c.radius) return 1;
		else if (this.radius == c.radius) return 0;
		else return -1;
	}



public class CircleDemo {
	public static void main(String[] args) {
		Circle c1 = new Circle(5.0);
		Circle c2 = new Circle(6.0);

		if (c1.compareTo(c2) > 0)
			System.out.println("첫 번째 원이 두 번째 원보닀 크닀.");
		else if (c1.compareTo(c2) == 0)
			System.out.println("두 μ›μ˜ 크기가 κ°™λ‹€.");
		else
			System.out.println("첫 번째 원이 두 번째 원보닀 μž‘λ‹€.");
	}
}

- Comparable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” Circle 클래슀

-> Comparable μΈν„°νŽ˜μ΄μŠ€μ— ν¬ν•¨λœ 좔상 λ©”μ„œλ“œ compareTo()λ₯Ό κ΅¬ν˜„ν•΄μ€˜μ•Ό μ‚¬μš©κ°€λŠ₯함

-> compareTo(): λ‹€λ₯Έ 객체보닀 크면 μ–‘μˆ˜(1), λ™μΌν•˜λ©΄ 0, μž‘μœΌλ©΄ 음수(-1)λ₯Ό λ°˜ν™˜ν•¨

 

- Circle 클래슀의 객체 2개 생성

-> c1: radius = 5.0

-> c2: radius = 6.0

 

- compareTo()에 Circle 클래슀λ₯Ό λ°›μ•„μ„œ μ—…μΊμŠ€νŒ… // ObjectλŠ” μ΅œμƒμœ„ 클래슀, λ”°λΌμ„œ λͺ¨λ“  ν΄λž˜μŠ€κ°€ λ‹€ 올 수 있음

-> Object o = c1

- Circle c = (Circle) o;  (λ‹€μš΄ μΊμŠ€νŒ…)

// Circle 클래슀둜 μ—…μΊμŠ€νŒ…λœ Object 클래슀의 객체(o)λ₯Ό λ‹€μ‹œ Circle 클래슀둜 λ‹€μš΄ μΊμŠ€νŒ…ν•˜μ—¬ μ‚¬μš©ν•œλ‹€.

-> c1.compareTo(c2) // thisκ°€ c1(κΈ°μ€€), cκ°€ c2κ°€ λ˜μ–΄ 비ꡐ함

-> this.radius > c.radius


3. μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„κ³Ό νƒ€μž… λ³€ν™˜

public interface Controllable {
	default void repair() {
		System.out.println("μž₯λΉ„λ₯Ό μˆ˜λ¦¬ν•œλ‹€.");
	}

	static void reset() {
		System.out.println("μž₯λΉ„λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€.");
	}

	void turnOn();	
	void turnOff();
}

- public μΈν„°νŽ˜μ΄μŠ€ Controllable 

- λ””ν΄νŠΈ λ©”μ„œλ“œ repair()

- 정적 λ©”μ„œλ“œ reset()

-> repair()κ³Ό reset()은 μ˜€λ²„λΌμ΄λ”© μ•ˆν•΄μ€˜λ„ 상관X (해도 γ„±γ…Š)

// 좔상 λ©”μ„œλ“œλ§Œ μ˜€λ²„λΌμ΄λ”© ν•„μˆ˜μž„

- 좔상 λ©”μ„œλ“œ turnon(), turnoff()  //κ΅¬ν˜„λΆ€κ°€ μ—†λŠ” 좔상 λ©”μ„œλ“œμ΄λ―€λ‘œ κ΅¬ν˜„ν•  λ•Œ λ°˜λ“œμ‹œ μ˜€λ²„λΌμ΄λ”© ν•΄μ€˜μ•Ό 함 

// μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μƒλž΅- public abstract 

public class TV implements Controllable {

	@Override
	public void turnOn() {
		System.out.println("TVλ₯Ό μΌ λ‹€.");
	}

	@Override
	public void turnOff() {
		System.out.println("TVλ₯Ό λˆλ‹€.");
	}

	@Override
	public void repair() {
		System.out.println("TVλ₯Ό μˆ˜λ¦¬ν•œλ‹€.");
	}
}

- Controllable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” TV클래슀 (implements)

-> Controllable μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ 좔상 λ©”μ„œλ“œλ“€μ€ κ΅¬ν˜„ ν΄λž˜μŠ€μ—μ„œ 무쑰건 κ΅¬ν˜„ν•΄μ€˜μ•Ό 함 

- turnon()κ³Ό turnoff() μ˜€λ²„λΌμ΄λ”© (κ΅¬ν˜„)

-> 좔상 λ©”μ„œλ“œμ΄λ―€λ‘œ μ˜€λ²„λΌμ΄λ”© μ•ˆν•˜λ©΄ μ—λŸ¬ λ°œμƒ

-> 무쑰건 public이어야 함

-> μΈν„°νŽ˜μ΄μŠ€) 좔상 λ©”μ„œλ“œ μ ‘κ·Όμ§€μ •μž μƒλž΅- public abstract 

-> λΆ€λͺ¨μΈ μΈν„°νŽ˜μ΄μŠ€λ³΄λ‹€ μ ‘κ·Όλ²”μœ„κ°€ 쒁으면 μ•ˆλ˜κΈ° λ•Œλ¬Έ (상속과 λΉ„μŠ·ν•¨)

- repair()은 μ˜€λ²„λΌμ΄λ”© ν•  μ˜λ¬΄λŠ” μ—†μ§€λ§Œ 해도 상관 μ—†μŒ (ν•„μˆ˜λŠ” X, ν•„μš”μ‹œμ—λ§Œ ν•΄μ£Όλ©΄ 됨)

 

public class Computer implements Controllable {
	public void turnOn() {
		System.out.println("컴퓨터λ₯Ό μΌ λ‹€.");
	}

	public void turnOff() {
		System.out.println("컴퓨터λ₯Ό λˆλ‹€.");
	}
	
	@Override
	public void repair() {
		System.out.println("컴퓨터λ₯Ό μˆ˜λ¦¬ν•œλ‹€.");
	}
}

- controllable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” Computer 클래슀

- TV ν΄λž˜μŠ€μ™€ 동일함 

//@overrideλŠ” κ·Έλƒ₯ ν”„λ‘œκ·Έλž¨λ‚΄μ—μ„œ μΆ”κ°€ν•˜λƒ λ‚΄κ°€ μ˜€λ²„λΌμ΄λ”©μ„ 직접 μž‘μ„±ν•˜λƒμ˜ μ°¨μ΄μž„ (λ‚΄κ°€ 걍 μ¨μ€˜λ„ γ„±γ…Š)

 

public class ControllableDemo {
	public static void main(String[] args) {
		TV tv = new TV();
		Computer com = new Computer();

		tv.turnOn();
		tv.turnOff();
		tv.repair();
		com.turnOn();
		com.turnOff();
		com.repair();
		Controllable.reset();
		// tv.reset();
		// com.reset();
	}
}

- TV tv = new TV();

- Computer com = new Computer();

-> μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„ ν΄λž˜μŠ€λ“€μ˜ 객체λ₯Ό 생성

// μΈν„°νŽ˜μ΄μŠ€λŠ” 객체 생성을 λͺ»ν•¨

- 정적 λ©”μ„œλ“œλŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œ 직접 ν˜ΈμΆœν•΄μ•Ό 함

- reset()은 정적 λ©”μ„œλ“œμ΄λ―€λ‘œ 객체둜 μ ‘κ·Ό λΆˆκ°€ (μΈν„°νŽ˜μ΄μŠ€ μ†Œμ†μž„)

-> 객체둜 μ ‘κ·Όν•˜λ©΄ 였λ₯˜

// μ›λž˜λ„ μ •μ λ©”μ„œλ“œλŠ” μƒμ†λΆˆκ°€μΈκ±° μžŠμ§€λ§κΈ°

 

 

(Notebook 클래슀 μΆ”κ°€)

interface Portable {
	void inMyBag();	
}

public class Notebook extends Computer implements Portable {

	public void inMyBag() {
		System.out.println("λ…ΈνŠΈλΆμ€ 가방에 μžˆλ‹€.");
	}

	public void turnOn() {
		System.out.println("λ…ΈνŠΈλΆμ„ μΌ λ‹€.");
	}

	public void turnOff() {
		System.out.println("λ…ΈνŠΈλΆμ„ λˆλ‹€.");
	}

	public static void main(String[] args) {
		Notebook n = new Notebook();

		n.turnOn();
		n.turnOff();
		n.inMyBag();
	}

}

- Portable μΈν„°νŽ˜μ΄μŠ€

- void inMyBag();

-> κ΅¬ν˜„λΆ€κ°€ μ—†λŠ” 좔상 λ©”μ„œλ“œμž„ (public abstract)

-> κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ ν•„μš”ν•¨ (μ•ˆν•˜λ©΄ μ—λŸ¬)

 

- class Notebook extends Computer implements Portable{..}

-> Notebook ν΄λž˜μŠ€λŠ” Computer 클래슀λ₯Ό 상속받고 Portable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•¨ 

// Computer ν΄λž˜μŠ€μ™€ Portable μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ‘˜ λ‹€ λ°›μ•„μ˜€λŠ” λŠλ‚Œ..

- public void inMyBag() {..}

-> 좔상 λ©”μ„œλ“œ κ΅¬ν˜„(μ˜€λ²„λΌμ΄λ”©)ν•΄μ€Œ 

// κ·Έλƒ₯ μžμ‹ 클래슀 λΆ€λΆ„μ—μ„œ λ©”μ„œλ“œλ₯Ό μƒˆλ‘œ μ •μ˜ν•˜κ±°λ‚˜ κ΅¬ν˜„ν•˜λŠ” 것도 λ‹€ μ˜€λ²„λΌμ΄λ”©μž„

- turnon(), turnoff()을 ν•„μš”μ— 따라 μ˜€λ²„λΌμ΄λ”© (ν•„μˆ˜X)

-> 이미 Computer ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•΄μ£Όμ—ˆκΈ° λ•Œλ¬Έμ— ν•„μˆ˜λŠ” X

-> Computer ν΄λž˜μŠ€μ—μ„œ Controllable μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•œ λ©”μ„œλ“œλ₯Ό μžμ‹ μ— 맞게 μ˜€λ²„λΌμ΄λ”© ν•΄μ€Œ

// Notebook ν΄λž˜μŠ€λŠ” Computer 클래슀λ₯Ό μƒμ†λ°›μœΌλ―€λ‘œ Computer 클래슀의 λ©”μ„œλ“œλ₯Ό μƒμ†λ°›μŒ