πŸ—£οΈ/Java

[Java] 상속

sssbin 2022. 2. 23. 18:19

 

클래슀 상속과 객체

- 슈퍼 클래슀 객체와 μ„œλΈŒ 클래슀의 κ°μ²΄λŠ” λ³„κ°œμ΄λ‹€.

- μ„œλΈŒ 클래슀 κ°μ²΄λŠ” 슈퍼 클래슀 멀버λ₯Ό ν¬ν•¨ν•œλ‹€.

- μ„œλΈŒ ν΄λž˜μŠ€λŠ” 슈퍼 클래슀의 private 멀버 μ™Έ λͺ¨λ“  멀버λ₯Ό μ ‘κ·Όν•  수 μžˆλ‹€.

 

상속 μ„ μ–Έκ³Ό 객체

1. 상속 μ„ μ–Έ - extends ν‚€μ›Œλ“œ μ‚¬μš©

class ColorPoint extends Point { ... }

2. μ„œλΈŒ 클래슀 객체 생성

Point p = new Point();
ColorPoint cp = new ColorPoint(); // μ„œλΈŒ 클래슀 객체 생성

 

νŠΉμ§•

- μžλ°”μ—μ„œλŠ” 클래슀의 닀쀑 상속을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.

- μžλ°”μ˜ λͺ¨λ“  ν΄λž˜μŠ€λŠ” μžλ°”μ—μ„œ μ œκ³΅ν•˜λŠ” Object 클래슀λ₯Ό μžλ™μœΌλ‘œ 상속받도둝 μ»΄νŒŒμΌλœλ‹€.


상속과 μƒμ„±μž

μ„œλΈŒ ν΄λž˜μŠ€μ™€ 슈퍼 클래슀의 μƒμ„±μž 호좜 및 μ‹€ν–‰

class A {
	public A() {
		System.out.println("μƒμ„±μžA");
	}
}

class B extends A {
	public B() {
		System.out.println("μƒμ„±μžB");
	}
}

class C extends B {
	public C() {
		System.out.println("μƒμ„±μžC");
	}
}

public class ConstructorEx {
	public static void main(String[] args) {
		C c;
		c = new C();
	}
}

μ‹€ν–‰κ²°κ³Ό

- μ„œλΈŒ 클래슀의 객체가 생성될 λ•Œ, μ„œλΈŒ 클래슀의 μƒμ„±μžμ™€ 슈퍼 클래슀의 μƒμ„±μžκ°€ λͺ¨λ‘ μ‹€ν–‰λœλ‹€.

- μ΄λ•Œ 슈퍼 클래슀의 μƒμ„±μžκ°€ λ¨Όμ € μ‹€ν–‰λœλ‹€.

- μ„œλΈŒ 클래슀의 μƒμ„±μžκ°€ λ¨Όμ € ν˜ΈμΆœλ˜μ§€λ§Œ, 더 λ‚˜μ€‘μ— μ‹€ν–‰λœλ‹€.

 

μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œ 슈퍼 클래슀 μƒμ„±μž 선택

1. 슈퍼 클래슀의 κΈ°λ³Έ μƒμ„±μžκ°€ λ¬΅μ‹œμ μœΌλ‘œ 선택

class A2 {
	public A2() {
		System.out.println("μƒμ„±μžA");
	}
	public A2(int x) {
		System.out.println("μƒμ„±μžA2");
	}
}

class B2 extends A2 {
	public B2() {
		System.out.println("μƒμ„±μžB");
	}
}

public class ConstructorEx2 {
	public static void main(String[] args) {
		B2 b;
		b = new B2(); // μƒμ„±μž 호좜 
	}
}

μ‹€ν–‰κ²°κ³Ό

- μ„œλΈŒ 클래슀의 κΈ°λ³Έ μƒμ„±μžμ— λŒ€ν•΄ μ»΄νŒŒμΌλŸ¬λŠ” μžλ™μœΌλ‘œ 슈퍼클래슀의 κΈ°λ³Έ μƒμ„±μžμ™€ 짝을 λ§ΊλŠ”λ‹€.

class A3 {
	public A3() {
		System.out.println("μƒμ„±μžA");
	}
	public A3(int x) {
		System.out.println("λ§€κ°œλ³€μˆ˜μƒμ„±μžA");
	}
}

class B3 extends A3 {
	public B3() {
		System.out.println("μƒμ„±μžB");
	}
	public B3(int x) {
		System.out.println("λ§€κ°œλ³€μˆ˜μƒμ„±μžB");
	}
}

public class ConstructorEx3 {
	public static void main(String[] args) {
		B3 b;
		b = new B3(5);
	}
}

μ‹€ν–‰κ²°κ³Ό

- μ„œλΈŒ 클래슀의 맀개 λ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžλ„ 슈퍼 클래슀의 κΈ°λ³Έ μƒμ„±μžμ™€ 짝을 이룬닀.

2. super()λ₯Ό μ΄μš©ν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ 슈퍼 클래슀의 μƒμ„±μž 선택

class A4 {
	public A4() {
		System.out.println("μƒμ„±μžA");
	}
	public A4(int x) {
		System.out.println("λ§€κ°œλ³€μˆ˜μƒμ„±μžA" + x);
	}
}

class B4 extends A4 {
	public B4() {
		System.out.println("μƒμ„±μžB");
	}
	public B4(int x) {
		super(x); // 첫 쀄에 와야 함 
		System.out.println("λ§€κ°œλ³€μˆ˜μƒμ„±μžB" + x);
	}
}

public class ConstructorEx4 {
	public static void main(String[] args) {
		B4 b;
		b = new B4(5);
	}
}

μ‹€ν–‰κ²°κ³Ό


μ—…μΊμŠ€νŒ…κ³Ό instanceof μ—°μ‚°μž

- μΊμŠ€νŒ…: νƒ€μž… λ³€ν™˜ -> μ—…μΊμŠ€νŒ… / λ‹€μš΄μΊμŠ€νŒ…μ—…

 

μ—…μΊμŠ€νŒ…

Person p;
Student s = new Student();
p = s; // μ—…μΊμŠ€νŒ…

- μ„œλΈŒ 클래슀 객체가 슈퍼 클래슀 νƒ€μž…μœΌλ‘œ λ³€ν™˜λ˜λŠ” 것

- 슈퍼 클래슀의 λ ˆνΌλŸ°μŠ€κ°€ μ„œλΈŒ 클래슀 객체λ₯Ό 가리킀도둝 μΉ˜ν™˜λ˜λŠ” 것

- μ—…μΊμŠ€νŒ…ν•œ λ ˆνΌλŸ°μŠ€λ‘œλŠ” 슈퍼 클래슀의 λ©€λ²„λ§Œ μ ‘κ·Όν•  수 μžˆλ‹€.

 

λ‹€μš΄μΊμŠ€νŒ…

Student s = (Student)p; // λ‹€μš΄μΊμŠ€νŒ…, (Student)의 νƒ€μž… λ³€ν™˜μ„ λ°˜λ“œμ‹œ μ§€μ •

- μ—…μΊμŠ€νŒ…λœ μ„œλΈŒ 클래슀 객체λ₯Ό λ‹€μ‹œ μ›λž˜λŒ€λ‘œ λ˜λŒλ¦¬λŠ” 것

 

instanceof μ—°μ‚°μžμ™€ 객체 ꡬ별

객체레퍼런슀 instanceof ν΄λž˜μŠ€νƒ€μž…
// instance μ—°μ‚°μž ν™œμš© 예제

class Person { }
class Student extends Person { }
class Researcher extends Person { }
class Professor extends Researcher { }

public class InstanceOfEx {
	static void print(Person p) {
		if (p instanceof Person)
			System.out.print("Person ");
		if (p instanceof Student) 
			System.out.print("Student ");
		if (p instanceof Researcher) 
			System.out.print("Researcher ");
		if (p instanceof Professor)
			System.out.print("Professor ");
		
		System.out.println();
	}

	public static void main(String[] args) {
		System.out.print("new Student() -> ");
		print(new Student());
		
		System.out.print("new Researcher() -> ");
		print(new Researcher());
		
		System.out.print("new Professor() -> ");
		print(new Professor());
	}
}

μ‹€ν–‰κ²°κ³Ό

- λ ˆνΌλŸ°μŠ€κ°€ κ°€λ¦¬ν‚€λŠ” 객체가 μ–΄λ–€ 클래슀 νƒ€μž…μΈμ§€ κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©

- '레퍼런슀'κ°€ κ°€λ¦¬ν‚€λŠ” 객체가 ν•΄λ‹Ή '클래슀 νƒ€μž…'이면 true, μ•„λ‹ˆλ©΄ false


λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©

class A {
	void f() {
		System.out.println("A의 f() 호좜");
	}
}
class B extends A {
	void f() { // A의 f()λ₯Ό μ˜€λ²„λΌμ΄λ”©
		System.out.println("B의 f() 호좜");
	}
}

- μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œ 슈퍼 ν΄λž˜μŠ€μ— μ„ μ–Έλœ λ©”μ†Œλ“œλ₯Ό 쀑볡 μž‘μ„±ν•˜μ—¬ 슈퍼 ν΄λž˜μŠ€μ— μž‘μ„±λœ λ©”μ†Œλ“œλ₯Ό 무λ ₯ν™”μ‹œν‚΄.

- 그러면 슈퍼 클래슀의 레퍼런슀λ₯Ό μ΄μš©ν•˜λ“  μ„œλΈŒ 클래슀의 레퍼런슀λ₯Ό μ΄μš©ν•˜λ“  항상 μ„œλΈŒ ν΄λž˜μŠ€μ— μ˜€λ²„λΌμ΄λ”©ν•œ λ©”μ†Œλ“œκ°€ μ‹€ν–‰λœλ‹€.

- μ„œλΈŒ ν΄λž˜μŠ€μ— μ˜€λ²„λΌμ΄λ”©ν•œ λ©”μ†Œλ“œλŠ” λ°˜λ“œμ‹œ 슈퍼 ν΄λž˜μŠ€μ— μž‘μ„±λœ λ©”μ†Œλ“œμ˜ 이름, 리턴 νƒ€μž…, 맀개 λ³€μˆ˜ λ¦¬μŠ€νŠΈκ°€ λͺ¨λ‘ 같도둝 μž‘μ„±

 

μ˜€λ²„λΌμ΄λ”©μ˜ λͺ©μ , λ‹€ν˜•μ„± μ‹€ν˜„

Shape 클래슀의 draw() λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•œ 사둀

- μ˜€λ²„λΌμ΄λ”©μ€ 슈퍼 ν΄λž˜μŠ€μ— μ„ μ–Έλœ λ©”μ†Œλ“œλ₯Ό, λ™μΌν•œ μ΄λ¦„μœΌλ‘œ 각 μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œ ν•„μš”ν•œ λ‚΄μš©μœΌλ‘œ μƒˆλ‘œ κ΅¬ν˜„ν•˜λŠ”λ° μžˆλ‹€.

- μ˜€λ²„λΌμ΄λ”©μ€ 상속을 톡해 'ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€μ— μ„œλ‘œ λ‹€λ₯Έ λ‚΄μš© κ΅¬ν˜„'μ΄λΌλŠ” 객체 μ§€ν–₯의 λ‹€ν˜•μ„±μ„ μ‹€ν˜„ν•˜λŠ” 도ꡬ이닀.

class Shape { // λ„ν˜•μ˜ 슈퍼 클래슀
	public void draw() {
		System.out.println("Shape");
	}
}

class Line extends Shape {
	public void draw() { // λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©
		System.out.println("Line");
	}
}

class Rect extends Shape {
	public void draw() { // λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©
		System.out.println("Rect");
	}
}

class Circle3 extends Shape {
	public void draw() { // λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©
		System.out.println("Circle");
	}
}

public class MethodOverridingEx {
	static void paint(Shape p) { // Shape을 상속받은 λͺ¨λ“  객체듀이 λ§€κ°œλ³€μˆ˜λ‘œ λ„˜μ–΄μ˜¬ 수 있음
		p.draw(); // pκ°€ κ°€λ¦¬ν‚€λŠ” 객체에 μ˜€λ²„λΌμ΄λ”©ν•œ draw() 호좜. 동적 바인딩 
	}
	public static void main(String[] args) {
		Line line = new Line();
		paint(line); // Line의 draw() μ‹€ν–‰. "Line" 좜λ ₯
		
		// λ‹€μŒ ν˜ΈμΆœλ“€μ€ λͺ¨λ‘ paint() λ©”μ†Œλ“œ λ‚΄μ—μ„œ Shape에 λŒ€ν•œ 레퍼런슀 p둜 μ—…μΊμŠ€νŒ…λ¨
		paint(new Shape()); // Shape의 draw() μ‹€ν–‰. "Shape" 좜λ ₯
		paint(new Line()); // μ˜€λ²„λΌμ΄λ”©λœ λ©”μ†Œλ“œ Line()의 draw() μ‹€ν–‰, "Line" 좜λ ₯
		paint(new Rect()); // μ˜€λ²„λΌμ΄λ”©λœ λ©”μ†Œλ“œ Rect()의 draw() μ‹€ν–‰, "Rect" 좜λ ₯
		paint(new Circle3()); // μ˜€λ²„λΌμ΄λ”©λœ λ©”μ†Œλ“œ Circle()의 draw() μ‹€ν–‰, "Circle" 좜λ ₯
	}

}

 

동적 바인딩

- μ‹€ν–‰ν•  λ©”μ†Œλ“œλ₯Ό 컴파일 μ‹œμ— κ²°μ •ν•˜μ§€ μ•Šκ³  μ‹€ν–‰ μ‹œμ— κ²°μ •ν•˜λŠ” 것

- μžλ°”μ—μ„œλŠ” 동적 바인딩을 톡해 μ˜€λ²„λΌμ΄λ”©λœ λ©”μ†Œλ“œκ°€ 항상 μ‹€ν–‰λ˜λ„λ‘ 보μž₯ν•œλ‹€.

public class SuperObject {
	
	protected String name;
	
	public void paint() {
		draw();
	}
	
	public void draw() {
		System.out.println("Super Object");
	}

	public static void main(String[] args) {
		SuperObject a = new SuperObject();
		a.paint();
	}
}

μ‹€ν–‰κ²°κ³Ό

public class SuperObject {
	protected String name;
	
	public void paint() {
		draw();
	}
	
	public void draw() {
		System.out.println("Super Object");
	}
}

public class SubObject extends SuperObject {
	public void draw() {
		System.out.println("Sub Object");
	}
	
	public static void main(String [] args) {
		SuperObject b = new SubObject();
		b.paint();
	}
}

μ‹€ν–‰κ²°κ³Ό
μ˜€λ²„λΌμ΄λ”©λœ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 동적바인딩

 

μ˜€λ²„λΌμ΄λ”©κ³Ό super ν‚€μ›Œλ“œ

- μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œ super ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜λ©΄ 정적 바인딩을 톡해 슈퍼 클래슀의 멀버에 μ ‘κ·Όν•  수 μžˆλ‹€.

super.μŠˆνΌν΄λž˜μŠ€μ˜λ©€λ²„

 

@Override

- μ˜€λ²„λΌμ΄λ”©ν•˜λŠ” λ©”μ†Œλ“œ μ•žμ— λΆ™μž„

- μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ˜€λ²„λΌμ΄λ”©μ΄ μ •ν™•ν•œμ§€ ν™•μΈν•˜λ„λ‘ μ§€μ‹œ

 

μ˜€λ²„λ‘œλ”©(overloading) vs μ˜€λ²„λΌμ΄λ”©(overriding)

비ꡐ μš”μ†Œ λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”© λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©
μ„ μ–Έ 같은 ν΄λž˜μŠ€λ‚˜ 상속 κ΄€κ³„μ—μ„œ λ™μΌν•œ μ΄λ¦„μ˜ λ©”μ†Œλ“œ 쀑볡 μž‘μ„± μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œ 슈퍼 ν΄λž˜μŠ€μ— μžˆλŠ” λ©”μ†Œλ“œμ™€λ™μΌν•œ μ΄λ¦„μ˜ λ©”μ†Œλ“œ μž¬μž‘μ„±
관계 λ™μΌν•œ 클래슀 λ‚΄ ν˜Ήμ€ 상속 관계 상속 관계
λͺ©μ  이름이 같은 μ—¬λŸ¬ 개의 λ©”μ†Œλ“œλ₯Ό 쀑볡 μ„ μ–Έν•˜μ—¬ μ‚¬μš©μ˜ νŽΈλ¦¬μ„± ν–₯상 슈퍼 ν΄λž˜μŠ€μ— κ΅¬ν˜„λœ λ©”μ†Œλ“œλ₯Ό λ¬΄μ‹œν•˜κ³  μ„œλΈŒν΄λž˜μŠ€μ—μ„œ μƒˆλ‘œμš΄ κΈ°λŠ₯의 λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•˜κ³ μž 함
쑰건 λ©”μ†Œλ“œ 이름은 λ°˜λ“œμ‹œ 동일함. λ©”μ†Œλ“œμ˜ 인자의 κ°œμˆ˜λ‚˜ 인자의 νƒ€μž…μ΄ 달라야 성립 λ©”μ†Œλ“œμ˜ 이름, 인자의 νƒ€μž…, 인자의 개수, 리턴 νƒ€μž… 등이 λͺ¨λ‘ λ™μΌν•˜μ—¬μ•Ό 성립
바인딩 정적 바인딩. 컴파일 μ‹œμ— μ€‘λ³΅λœ λ©”μ†Œλ“œ 쀑 ν˜ΈμΆœλ˜λŠ” λ©”μ†Œλ“œ κ²°μ • 동적 바인딩. μ‹€ν–‰ μ‹œκ°„μ— μ˜€λ²„λΌμ΄λ”©λœ λ©”μ†Œλ“œ μ°Ύμ•„ 호좜

 


좔상 클래슀

좔상 λ©”μ†Œλ“œ

- abstract ν‚€μ›Œλ“œμ™€ ν•¨κ»˜ μ›ν˜•λ§Œ μ„ μ–Έλ˜κ³ , μ½”λ“œλŠ” μž‘μ„±λ˜μ§€ μ•Šμ€ λ©”μ†Œλ“œ

abstract public String getName();	// 좔상 λ©”μ†Œλ“œ
abstract public String fail() { return "Good Bye"; }	// 좔상 λ©”μ†Œλ“œ μ•„λ‹˜. 컴파일 였λ₯˜

 

좔상 클래슀

- 좔상 λ©”μ†Œλ“œλ₯Ό μ΅œμ†Œ ν•œ 개 이상 κ°€μ§€κ³  abstract둜 μ„ μ–Έλœ 클래슀

- 좔상 λ©”μ†Œλ“œκ°€ 없어도 abstract둜 μ„ μ–Έν•œ 클래슀

// 좔상 λ©”μ†Œλ“œλ₯Ό κ°€μ§„ 좔상 클래슀
abstract class Shape { // 좔상 클래슀 μ„ μ–Έ
	public Shape() { ... }
	public void edit() { ... }
	
	abstract public void draw(); // 좔상 λ©”μ†Œλ“œ μ„ μ–Έ 
}
// 좔상 λ©”μ†Œλ“œ μ—†λŠ” 좔상 클래슀
abstract class Jcomponent { // 좔상 클래슀 μ„ μ–Έ
	String name;
	public void load(String name) {
		this.name = name;
	}
}

- 좔상 λ©”μ†Œλ“œλ₯Ό κ°€μ§€κ³  있으면 λ°˜λ“œμ‹œ 좔상 클래슀둜 μ„ μ–Έλ˜μ–΄μ•Ό ν•œλ‹€.

- 좔상 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†λ‹€.

Jcomponent p; // 였λ₯˜ μ—†μŒ. 좔상 클래슀의 레퍼런슀 μ„ μ–Έ
p = new JComponent(); // 컴파일 였λ₯˜. 좔상 클래슀의 μΈμŠ€ν„΄μŠ€ 생성 λΆˆκ°€
Shape obj = new Shape(); // 컴파일 였λ₯˜. 좔상 클래슀의 μΈμŠ€ν„΄μŠ€ 생성 λΆˆκ°€

 

좔상 클래슀의 상속

- 좔상 λ©”μ†Œλ“œλ₯Ό κ°€μ§„ 좔상 클래슀λ₯Ό μƒμ†λ°›λŠ” μ„œλΈŒ ν΄λž˜μŠ€λŠ” μžλ™μœΌλ‘œ 좔상 ν΄λž˜μŠ€κ°€ λœλ‹€.

- κ·ΈλŸ¬λ―€λ‘œ μ„œλΈŒ ν΄λž˜μŠ€μ— abstractλ₯Ό λΆ™μ—¬ 좔상 ν΄λž˜μŠ€μž„μ„ λͺ…μ‹œν•΄μ•Ό 함.

abstract class A { // 좔상 클래슀 
	abstract public int add(int x, int y); // 좔상 λ©”μ†Œλ“œ 
}
abstract class B extends A { // 좔상 클래슀. 좔상 λ©”μ†Œλ“œ add()λ₯Ό 상속받기 λ•Œλ¬Έ
	public void show() { System.out.println("B"); }
}

 

좔상 클래슀의 κ΅¬ν˜„

- μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œ 슈퍼 클래슀의 λͺ¨λ“  좔상 λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œλ‘œ κ΅¬ν˜„ν•˜λŠ” 것

- 좔상 클래슀λ₯Ό κ΅¬ν˜„ν•œ μ„œλΈŒ ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆλ‹€.

class C extends A { // 좔상 클래슀 κ΅¬ν˜„. CλŠ” 정상 클래슀
	@Override
	public int add(int x, int y) { return x+y; } // 좔상 λ©”μ†Œλ“œ κ΅¬ν˜„. μ˜€λ²„λΌμ΄λ”©
	public void show() { System.out.println("C"); }
}

 

좔상 클래슀의 λͺ©μ 

- 상속을 μœ„ν•œ 슈퍼 클래슀둜 ν™œμš©ν•˜κΈ° μœ„ν•œ 것

- 좔상 ν΄λž˜μŠ€λŠ” 좔상 λ©”μ†Œλ“œλ₯Ό 톡해 μ„œλΈŒ ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•  λ©”μ†Œλ“œμ˜ μ›ν˜•μ„ μ•Œλ €μ£ΌλŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ μ—­ν• 

- μ„œλΈŒ 클래슀의 λ‹€ν˜•μ„±μ„ μ‹€ν˜„

abstract class Calculator {
	public abstract int add(int a, int b); // 두 μ •μˆ˜μ˜ 합을 κ΅¬ν•˜μ—¬ 리턴 
	public abstract int subtract(int a, int b); // 두 μ •μˆ˜μ˜ μ°¨λ₯Ό κ΅¬ν•˜μ—¬ 리턴 
	public abstract double average(int[] a); // μ •μˆ˜ λ°°μ—΄μ˜ 평균 리턴 
}

public class GoodCalc extends Calculator {
	@Override
	public int add(int a, int b) { // 좔상 λ©”μ†Œλ“œ κ΅¬ν˜„
		return a+b;
	}
	@Override
	public int subtract(int a, int b) { // 좔상 λ©”μ†Œλ“œ κ΅¬ν˜„
		return a-b;
	}
	@Override
	public double average(int[] a) { // 좔상 λ©”μ†Œλ“œ κ΅¬ν˜„
		double sum = 0;
		for (int i=0; i<a.length; i++)
			sum += a[i];
		return sum/a.length;
	}
	
	public static void main(String[] args) {
		GoodCalc c = new GoodCalc();
		System.out.println(c.add(2, 3));
		System.out.println(c.subtract(2, 3));
		System.out.println(c.average(new int [] {2, 3, 4}));

	}

}

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

interface PhoneInterface { // μΈν„°νŽ˜μ΄μŠ€ μ„ μ–Έ
	public static final int TIMEOUT = 10000; // μƒμˆ˜ ν•„λ“œ. public static final μƒλž΅ κ°€λŠ₯
	public abstract void sendCall(); // 좔상 λ©”μ†Œλ“œ. public static abstract μƒλž΅ κ°€λŠ₯
	public abstract void receiveCall(); // 좔상 λ©”μ†Œλ“œ. public static abstract μƒλž΅ κ°€λŠ₯
	public default void printLogo() { // λ””ν΄λ“œ λ©”μ†Œλ“œλŠ” public μƒλž΅ κ°€λŠ₯
		System.out.println("** Phone **");
	} // λ””ν΄νŠΈ λ©”μ†Œλ“œ 
}

- interface ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έ

- 5 μ’…λ₯˜μ˜ λ©€λ²„λ‘œ κ΅¬μ„±λ˜λ©°, ν•„λ“œ(멀버 λ³€μˆ˜)λ₯Ό λ§Œλ“€ 수 μ—†λ‹€.

   · μƒμˆ˜, 좔상 λ©”μ†Œλ“œ, default λ©”μ†Œλ“œ, private λ©”μ†Œλ“œ, static λ©”μ†Œλ“œ

   · μƒμˆ˜: public static final 속성이며, 속성은 μƒλž΅ κ°€λŠ₯

   · 좔상 λ©”μ†Œλ“œ: public abstract 속성이며, 속성은 μƒλž΅ κ°€λŠ₯

   · default λ©”μ†Œλ“œ: μ ‘κ·Ό μ§€μ • public으둜 κ³ μ •

   · private λ©”μ†Œλ“œ: μΈν„°νŽ˜μ΄μŠ€ λ‚΄μ˜ λ‹€λ₯Έ λ©”μ†Œλ“œμ—μ„œλ§Œ 호좜 κ°€λŠ₯

   · static λ©”μ†Œλ“œ: μ ‘κ·Ό 지정이 μƒλž΅λ˜λ©΄ public이며, private으둜 μ§€μ • κ°€λŠ₯

   · default, private, static λ©”μ†Œλ“œλ“€μ€ μ½”λ“œκ°€ μž‘μ„±λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€.

- μΈν„°νŽ˜μ΄μŠ€λŠ” 객체λ₯Ό 생성할 수 μ—†λ‹€.

 

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

- 상속을 톡해 κΈ°μ‘΄ μΈν„°νŽ˜μ΄μŠ€μ— μƒˆλ‘œμš΄ κ·œκ²©μ„ μΆ”κ°€ν•œ μƒˆλ‘œμš΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“ λ‹€.

interface MobilePhoneInterface extends PhoneInterface {
	void sendSMS(); // 좔상 λ©”μ†Œλ“œ
	void receiveSMS(); // 좔상 λ©”μ†Œλ“œ 
}

- μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨, MobilePhoneInterface μΈν„°νŽ˜μ΄μŠ€λŠ” 총 6개의 멀버λ₯Ό κ°€μ§€κ²Œ λœλ‹€.

- μΈν„°νŽ˜μ΄μŠ€λŠ” 콀마둜 μ—°κ²°ν•˜μ—¬ 2개 μ΄μƒμ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 닀쀑 상속할 수 μžˆλ‹€.

interface MusicPhoneInterface extends PhoneInterface, MP3Interface {
	...
}

 

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

- implements ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨λ“  좔상 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•œ 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” 것

class SamsungPhone implements PhoneInterface { // μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„
	// PhoneInterface의 λͺ¨λ“  좔상 λ©”μ†Œλ“œ κ΅¬ν˜„
	public void sendCall() { System.out.println("띠리리리링"); }
	public void receiveCall() { System.out.println("μ „ν™”κ°€ μ™”μŠ΅λ‹ˆλ‹€."); }
	
	// λ©”μ†Œλ“œ μΆ”κ°€ μž‘μ„±
	public void flash() { System.out.println("전화기에 뢈이 μΌœμ‘ŒμŠ΅λ‹ˆλ‹€."); }
}