κ°μμκ°μ λ°°μ΄ μμ κ°λ μ μΆκ°λ‘ 곡λΆν λ΄μ©μ μ 리ν΄λ³Έλ€ βοΈ
μμ
λ¨Όμ μμμ΄λ ?
κΈ°μ‘΄μ ν΄λμ€λ₯Ό μ¬μ¬μ©νμ¬ μλ‘μ΄ ν΄λμ€λ₯Ό μμ±νλ κ²μ΄λ€.
μμ λ₯Ό 보λͺ
μ μμμ νμμ±μ νμ
ν΄λ³΄μ !
Example
μΉ΄νμμ 컀νΌμ μ°¨λ₯Ό ν맀νλ€.
컀νΌμ μ°¨λ₯Ό μ€λΉνλ κ³Όμ μ μ΄ν΄λ³΄μ.
컀νΌ
- λ¬Όμ λμΈλ€.
- 컀νΌλ¨Έμ μΌλ‘ 컀νΌλ₯Ό λ΄λ¦°λ€.
- μ»΅μ λΆλλ€.
- μ€νκ³Ό μ°μ λ₯Ό μΆκ°νλ€.
μ°¨
- λ¬Όμ λμΈλ€.
- μ°¨ ν°λ°±μ λ΄κ·Όλ€.
- μ»΅μ λΆλλ€.
- λ λͺ¬μ μΆκ°νλ€.
κ·Έλ λ€λ©΄ κ°κ°μ κ³Όμ λ€μ μ½λλ‘ κ΅¬νν΄λ³Έλ€.
public class Coffee {
void prepareRecipe() {
boilWater();
brewCoffeeMachine();
pourInCup();
addSugarAndMilk();
}
public void boilWater() {
System.out.println("λ¬Όμ λμΈλ€.");
}
public void brewCoffeeMachine() {
System.out.println("컀νΌλ¨Έμ μΌλ‘ 컀νΌλ₯Ό λ΄λ¦°λ€.");
}
public void pourInCup() {
System.out.println("μ»΅μ λΆλλ€.");
}
public void addSugarAndMilk() {
System.out.println("μ€νκ³Ό μ°μ λ₯Ό μΆκ°νλ€.");
}
}
public class Tea {
void prepareRecipe() {
boilWater();
steepTeaBag();
pourInCup();
addLemon();
}
public void boilWater() {
System.out.println("λ¬Όμ λμΈλ€.");
}
public void steepTeaBag() {
System.out.println("ν°λ°±μ λ΄κ·Όλ€.");
}
public void pourInCup() {
System.out.println("μ»΅μ λΆλλ€.");
}
public void addLemon() {
System.out.println("λ λͺ¬μ μΆκ°νλ€.");
}
}
Coffee ν΄λμ€μ Tea ν΄λμ€λ₯Ό λΉκ΅ν΄λ³΄λ©΄ μ΄μν μ μ λλ μ μλ€.
prepareRecipe()
, boilWater()
, pourInCup()
μ΄ μΈκ°μ§ λ©μλλ 곡ν΅λ κΈ°λ₯μ νμ§ μλκ°??
κ·Έλ λ€λ©΄ βμ΄ μ€λ³΅λ λΆλΆμ μ΄λ»κ² μ κ±°νλλ?βμ λν ν΄λ΅μΌλ‘
λ°λ‘ μμμ΄ λμ¨λ€.
κ·Έλ λ€λ©΄ λ ν΄λμ€μμ 곡ν΅λ λΆλΆμ μΆμΆνμ¬ λΆλͺ¨ ν΄λμ€λ₯Ό λ§λ€μ΄λ³Έλ€.
public class Beverage {
protected void boilWater() {
System.out.println("λ¬Όμ λμΈλ€.");
}
protected void pourInCup() {
System.out.println("μ»΅μ λΆλλ€.");
}
}
곡ν΅λ κΈ°λ₯μ λ¬Άμ λΆλͺ¨ ν΄λμ€μΈ Beverageλ₯Ό μμ λ°λ κ°κ°μ ν΄λμ€λ₯Ό λ§λ€μ΄λ³Έλ€.
public class Coffee extends Beverage {
void prepareRecipe() {
boilWater();
brewCoffeeMachine();
pourInCup();
addSugarAndMilk();
}
public void brewCoffeeMachine() {
System.out.println("νν°λ₯Ό νμ©ν΄ 컀νΌλ₯Ό λ΄λ¦°λ€.");
}
public void addSugarAndMilk() {
System.out.println("μ€νκ³Ό μ°μ λ₯Ό μΆκ°νλ€.");
}
}
public class Tea extends Beverage {
void prepareRecipe() {
boilWater();
steepTeaBag();
pourInCup();
addLemon();
}
public void steepTeaBag() {
System.out.println("ν°λ°±μ λ΄κ·Όλ€.");
}
public void addLemon() {
System.out.println("λ λͺ¬μ μΆκ°νλ€.");
}
}
extends
μ΄λ κ² μμμ extends
ν€μλλ‘ μ΄λ£¨μ΄ μ§λ€.
μμμ ν κ²½μ° λ©€λ² νλμ λ©μλλ₯Ό νμ ν΄λμ€μμ κ·Έλλ‘ μμνκ² λλλ°,
ν€μλμ μλ―Έλλ‘ μμ ν΄λμ€κ° μ‘°μ ν΄λμ€λ₯Ό νμ₯νλ μλ―Έλ‘ ν΄μν μ μλ€.
μ¬κΈ°μ μ£Όμμ !
- μμ±μμ μ΄κΈ°ν λΈλμ μμλμ§ μλλ€. λ©€λ²λ§ μμλλ€.
- μμ ν΄λμ€μ λ©€λ² κ°μλ μ‘°μ ν΄λμ€λ³΄λ€ νμ κ°κ±°λ λ§λ€.
- private, defaultλ μμλμ§ μλλ€κΈ° 보λ€λ μμμ λ°μ§λ§ μμ ν΄λμ€λ‘λΆν°μ μ κ·Όμ΄ μ νλλ€.
- μλ°μμλ λ€μ€ μμμ μ§μνμ§ μλλ€.
μ€λ²λΌμ΄λ©
μ‘°μ ν΄λμ€λ‘λΆν° μμ λ°μ λ©μλμ λ΄μ©μ λ³κ²°νλ κ²
μμ ν΄λμ€μμ λΆλͺ¨ ν΄λμ€ λ©μλλ₯Ό λ§κ² λ³κ²½νλ κ²½μ° μ€λ²λΌμ΄λ©μ νλ€.
μ€λ²λΌμ΄λ©μ 쑰건
μμ ν΄λμ€μ λ©μλμμ λΆλͺ¨ ν΄λμ€μ λ©μλμ λ€μ 쑰건λ€μ΄ κ°μμΌ νλ€.
- λ©μλ λͺ
- 맀κ°λ³μ
- λ°ννμ
μ€λ²λΌμ΄λ© μ£Όμμ
- μ κ·Ό μ μ΄μλ₯Ό μ‘°μ ν΄λμ€μ λ©μλλ³΄λ€ μ’μ λ²μλ‘ λ³κ²½ν μ μλ€.
- μμΈλ μ‘°μ ν΄λμ€μ λ©μλλ³΄λ€ λ§μ΄ μ μΈν μ μλ€.
- μΈμ€ν΄μ€λ©μλλ₯Ό static λ©μλ, λλ κ·Έ λ°λλ‘ λ³κ²½ν μ μλ€.
π€ μ‘°μ ν΄λμ€μ μ μλ static λ©μλλ₯Ό μμ ν΄λμ€μμ λκ°μ μ΄λ¦μ static λ©μλλ‘ μ μν μ μλ?
κ°λ₯μ νμ§λ§ κ° ν΄λμ€μ λ³κ°μ static λ©μλλ₯Ό μ μν κ²μΌ λΏ μ€λ²λΌμ΄λ©μ΄ μλλ€.
μμμ μ₯μ
- μ€λ³΅λ μ½λλ₯Ό μ€μΌ μ μλ€.
- 곡ν΅μ νλλ₯Ό μΆκ°νκ±°λ, μμ ν λ λΆλͺ¨ ν΄λμ€μλ§ μμ ν΄μ£Όλ©΄ λλ€.
ν΄λμ€κ°μ κ΄κ³
μμμ ν΅ν΄ ν΄λμ€κ°μ κ΄κ³λ₯Ό λ§Ίμ΄μ£Όλλ°,
μ΄λ μκΈ°λ κ΄κ³λ₯Ό λͺ κ°μ§ μ νμΌλ‘ λλ λ³Ό μ μλ€.
is-a κ΄κ³ (is a relationship)
is-a κ΄κ³λ μΌλ°μ μΈ κ°λ
κ³Ό ꡬ체μ μΈ κ°λ
κ³Όμ κ΄κ³λ₯Ό λ§νλ€.
μ¬κΈ°μ μΌλ°μ μΈ κ°λ
ν΄λμ€λ μμ ν΄λμ€μΈ λΆλͺ¨ ν΄λμ€λ₯Ό λ»νκ³ ,
ꡬ체μ μΈ κ°λ
ν΄λμ€λ νμ ν΄λμ€μΈ μμ ν΄λμ€λ₯Ό λ»νλ€.
λ§ κ·Έλλ‘ β~μ ~μ΄λ€.βλΌλ λ¬Έμ₯μ΄ μ±λ¦½λμ΄μΌ νλ€.
- Example ```java public class Person{ String name; int age; }
public class Student extends Person{ int number; int major; }
μ μμ μμλ Student ν΄λμ€κ° Person ν΄λμ€λ₯Ό μμλ°κ³ μλ€.
"νμμ μ¬λμ΄λ€."μ²λΌ μ΄λ¬ν κ΄κ³λ₯Ό is-a κ΄κ³λΌκ³ νλ€.
#### has-a κ΄κ³ (composition)
has-a κ΄κ³λ ν ν΄λμ€κ° λ€λ₯Έ ν΄λμ€λ₯Ό μμ ν κ΄κ³μ΄λ€.
λ§ κ·Έλλ‘ **"~μ ~μ κ°μ§κ³ μλ€."λΌλ λ¬Έμ₯μ΄ μ±λ¦½λμ΄μΌ νλ€.**
* Example
```java
class Circle {
Point point;
int r;
}
class Point {
int x;
int y;
}
μ μμ μμλ Point ν΄λμ€λ₯Ό μ¬μ¬μ©ν΄μ Circle ν΄λμ€λ₯Ό μμ±νλ€.
νλμ κ±°λν ν΄λμ€λ₯Ό μμ±νλ κ²λ³΄λ€ λ¨μλ³λ‘ μ¬λ¬ κ°μ ν΄λμ€λ₯Ό μμ±ν ν,
μ΄ λ¨μ ν΄λμ€λ€μ ν¬ν¨κ΄κ³λ‘ μ¬μ¬μ©νλ©΄ λ³΄λ€ κ°κ²°νκ³ μμ½κ² ν΄λμ€λ₯Ό μμ±ν μ μλ€.
λ μμ±λ λ¨μ ν΄λμ€λ€μ λ€λ₯Έ ν΄λμ€λ₯Ό μμ±νλλ° μ¬μ¬μ©λ μ μλ€.
β~μ ~μ΄λ€.β λλ β~μ ~μ κ°μ§κ³ μλ€.β λ¬Έμ₯μ λ§λ€μ΄λ³΄κ³
λ μ ν©ν κ΄κ³λ₯Ό ꡬννλ κ²μ΄ μ’λ€.
(μ΄νν°λΈ μλ°μ βμμλ³΄λ¨ μ‘°ν©βμ΄λΌλ κ°λ μ΄ μλλ° μ΄ λΆλΆλ μ 리ν΄λ³΄μμΌκ² λ€.)
μΊμ€ν
π€ μΊμ€ν
μ΄λ ?
νμ
μ λ³ννλ κ²μ λ§νλ©°, νλ³νμ΄λΌκ³ λ νλ€.
κΈ°λ³Έν λ³μμ κ°μ΄ μ°Έμ‘°λ³μλ νλ³νμ΄ κ°λ₯νλ°, μμ κ΄κ³μ μλ ν΄λμ€ μ¬μ΄μμλ§ κ°λ₯νλ€.
μ΄λ, κΈ°λ³Έν μ°Έμ‘°ν λ³μμ νλ³νμμ μμ νμ
μ μ°Έμ‘°λ³μλ₯Ό μ‘°μνμ
μΌλ‘
νλ³ννλ κ²½μ°μλ νλ³νμ μλ΅ν μ μλ€.
μ μΊμ€ν
μμ ν΄λμ€μ μ°Έμ‘°λ³μλ₯Ό λΆλͺ¨ ν΄λμ€μ μ°Έμ‘°λ³μλ‘ λ³ννλ©°, νλ³ν μλ΅μ΄ κ°λ₯νλ€.
λΆλͺ¨ ν΄λμ€μ μ°Έμ‘° λ³μκ° μμ ν΄λμ€λ‘ κ°μ²΄νλ μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¬ μ μλ€.
λλ¬Έμ λ€νμ±μ μν΄ μ¬μ©λλ€.
ex) νμμ μ¬λμ΄λ€.
μμμ λ€λ€λ Student μμ λ‘ νμΈν΄λ³΄μ.
// μ°Έμ‘°λ³μ studentλ₯Ό μ΄μ©νλ©΄ number, majorμ μ κ·Ό κ°λ₯
Student student = new Student();
// λ νΌλ°μ€ personμ μ΄μ©νλ©΄ Student κ°μ²΄μ λ©€λ² μ€
// μ€μ§ Person ν΄λμ€μ λ©€λ²λ§ μ κ·Όμ΄ κ°λ₯νλ€.
Person person = student;
person.name = "amazzi";
person.age = 10;
// μλ λ¬Έμ₯μ μ»΄νμΌ μ€λ₯κ° λλ€.
person.number = "12345678";
μ΄μ²λΌ μ μΊμ€ν μ νκ²λλ©΄ λΆλͺ¨ ν΄λμ€μ νλ, λ©μλμλ§ μ κ·Όμ΄ κ°λ₯νλ€.
λ€μ΄μΊμ€ν
μμ ν΄λμ€μ μ°Έμ‘°λ³μλ₯Ό μμ νμ
μ μ°Έμ‘°λ³μλ‘ λ³ννλ©°, νλ³ν μλ΅μ΄ λΆκ°λ₯νλ€.
μμ μ κ³ μ ν νΉμ±μ μμ μλΈ ν΄λμ€μ κ°μ²΄λ₯Ό λ€μ 볡ꡬ μμΌμ£Όλ κ²μ λ§νλ€. (μ
μΊμ€ν
볡ꡬ?)
// μ
μΊμ€ν
λ¨Όμ
Person person = new Student();
// λ€μ΄μΊμ€ν
Student student = (Student) person;
// Ok
student.name = "amazzi";
student.number = "12345678";
κΌ μ
μΊμ€ν
μ΄ λ¨Όμ μ νμ΄ λμ΄μΌ νλ€.
λ§μ½ λ€μκ³Ό κ°μ κ²½μ°λ μ»΄νμΌ μ€λ₯λ λμ§ μμ§λ§ ClassCastException
λ°νμ μ€λ₯κ° λ°μνλ€.
Student student = (Student) new Person();