1. νκ·Έ λ¬λ¦° ν΄λμ€ π§
νκ·Έ λ¬λ¦° ν΄λμ€λ λ κ°μ§ μ΄μμ μλ―Έλ₯Ό ννν μ μμΌλ©°, κ·Έμ€ νμ¬ νννλ μλ―Έλ₯Ό νκ·Έ κ°μΌλ‘ μλ €μ£Όλ ν΄λμ€λ₯Ό λ§νλ€.
μλ μ½λλ μκ³Ό μ¬κ°νμ ννν μ μλ νκ·Έ λ¬λ¦° ν΄λμ€μ΄λ€.
public class Figure {
enum Shape {RECTANGLE, CIRCLE};
// νκ·Έ νλ - νμ¬ λͺ¨μμ λνλΈλ€.
final Shape shape;
// λ€μ νλλ€μ λͺ¨μμ΄ μ¬κ°ν(RECTANGLE)μΌ λλ§ μ°μΈλ€.
double length;
double width;
// λ€μ νλλ λͺ¨μμ΄ μ(CIRCLE)μΌ λλ§ μ°μΈλ€.
double radius;
// μμ© μμ±μ
Figure2(double radius){
shape = Shape.CIRCLE;
this.radius = radius;
}
// μ¬κ°νμ© μμ±μ
Figure2(double length, double width) {
shape = Shape.RECTANGLE;
this.length = length;
this.width = width;
}
double area() {
switch(shape){
case RECTANGLE:
return length * width;
case CIRCLE:
return Math.PI * (radius * radius);
default:
throw new AssertionError(shape);
}
}
}
2. νκ·Έ λ¬λ¦° ν΄λμ€μ λ¬Έμ μ π€
νκ·Έ λ¬λ¦° ν΄λμ€μλ λ¨μ μ΄ λ무λλ λ§λ€.
π λ¨μ 1. μ΄κ±° νμ μ μΈ, νκ·Έ νλ, switch λ¬Έ λ± μΈλ°μλ μ½λκ° λ§λ€.
π λ¨μ 2. μ¬λ¬ ꡬνμ΄ ν ν΄λμ€μ νΌν©λΌ μμ΄μ κ°λ μ±μ΄ λμλ€.
π λ¨μ 3. λ€λ₯Έ μλ―Έλ₯Ό μν μ½λλ μΈμ λ ν¨κ» νλ λ©λͺ¨λ¦¬λ λ§μ΄ μ¬μ©νλ€.
π λ¨μ 4. νλλ€μ finalλ‘ μ μΈνλ €λ©΄ ν΄λΉ μλ―Έμ μ°μ΄μ§ μλ νλλ€κΉμ§ μμ±μμμ μ΄κΈ°νν΄μΌ νλ€.
π λ¨μ 5. λ λ€λ₯Έ μλ―Έλ₯Ό μΆκ°νλ €λ©΄ μ½λλ₯Ό μμ ν΄μΌ νλ€.
μ μ¬κ°νμ λνλ΄λ Squareλ₯Ό μΆκ°νλ€κ³ μκ°ν΄ 보면 area()μ switch λ¬Έμμ μ μλ―Έλ₯Ό μ²λ¦¬νλ μ½λλ₯Ό μΆκ°ν΄μΌ νλ€. νλλΌλ λΉ λ¨λ¦¬λ©΄ λ°νμμ λ¬Έμ κ° μκΈ°κ² λλ€.
λ¨μ 6. μΈμ€ν΄μ€ νμ λ§μΌλ‘λ νμ¬ λνλ΄λ μλ―Έλ₯Ό μ κΈΈμ΄ μ ν μλ€.
Figure νμ μ μ¬μ©νλ€κ³ ν΄μ ν΄λΉ μΈμ€ν΄μ€κ° μμ λνλ΄λ κ²μΈμ§ μ¬κ°νμ λνλ΄λ κ²μΈμ§ μ μκ° μλ€.
3. ν΄λμ€ κ³μΈ΅ ꡬ쑰 (ν΄κ²°μ± ) π»
μμμ μ΄ν΄λ³Έ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μλ ν΄λμ€ κ³μΈ΅κ΅¬μ‘°λ₯Ό νμ©ν΄μΌ νλ€.
μ¬μ©λ²μ μλμ κ°λ€.
- κ³μΈ΅κ΅¬μ‘°μ 루νΈ(root)κ° λ μΆμ ν΄λμ€λ₯Ό μ μνλ€.
- νκ·Έ κ°μ λ°λΌ λμμ΄ λ¬λΌμ§λ λ©μλλ€μ λ£¨νΈ ν΄λμ€μ μΆμ λ©μλλ‘ μ μΈνλ€.
- νκ·Έ κ°μ μκ΄μμ΄ λμμ΄ μΌμ ν λ©μλλ€μ λ£¨νΈ ν΄λμ€μ μΌλ° λ©μλλ‘ μΆκ°νλ€.
- λͺ¨λ νμ ν΄λμ€μμ 곡ν΅μΌλ‘ μ¬μ©νλ λ°μ΄ν° νλλ€λ μ λΆ λ£¨νΈ ν΄λμ€λ‘ μ¬λ¦°λ€.
abstract public class Figure {
// νκ·Έ κ°μ λ°λΌ λμμ΄ λ¬λΌμ§λ λ©μλλ₯Ό μΆμ λ©μλλ‘ μ μΈ
abstract double area();
}
----------
public class Circle extends Figure {
final double radius;
Circle(double radius){
this.radius = radius;
}
@Override
double area() {
return Math.PI * (radius * radius);
}
}
----------
public class Rectangle extends Figure {
final double length;
final double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
double area() {
return length * width;
}
}
μμ κ°μ ν΄λμ€ κ³μΈ΅κ΅¬μ‘°λ νκ·Έ λ¬λ¦° ν΄λμ€μ λ¨μ λ€μ λͺ¨λ μμ λ²λ¦°λ€. μ₯μ μ μλμ κ°λ€.
π μ₯μ 1. κ°κ²°νκ³ λͺ ννκ³ , μΈλ°μλ μ½λλ λͺ¨λ μ¬λΌμ§λ€.
π μ₯μ 2. κ° μλ―Έμ λ 립λ ν΄λμ€μ λ΄μ κ΄λ ¨ μλ λ°μ΄ν° νλλ₯Ό λͺ¨λ μ κ±°νλ€.
π μ₯μ 3. μ΄μλ¨μ νλλ€μ λͺ¨λ finalμ΄λ€.
π μ₯μ 4. μ€μλ‘ λΉΌλ¨Ήμ caseλ¬Έ λλ¬Έμ λ°νμ μ€λ₯κ° λ°μν μΌλ μλ€.
π μ₯μ 5. λ£¨νΈ ν΄λμ€μ μ½λλ₯Ό 건λλ¦¬μ§ μκ³ λ λ€λ₯Έ νλ‘κ·Έλλ¨Έλ€μ΄ λ 립μ μΌλ‘ κ³μΈ΅κ΅¬μ‘°λ₯Ό νμ₯νκ³ ν¨κ» μ¬μ©ν μ μλ€. (μλμ Squareκ° κ·Έ μμμ΄λ€.)
public class Square extends Rectangle {
Square(double side){
super(side, side);
}
}
νκ·Έ λ¬λ¦° ν΄λμ€λ₯Ό μ¨μΌ νλ μν©μ κ±°μ μλ€. κ·Έλ¬λ―λ‘ μλ‘μ΄ ν΄λμ€λ₯Ό μμ±νλ λ° νκ·Έκ° λ±μ₯νλ€λ©΄ νκ·Έλ₯Ό μμ κ³ κ³μΈ΅κ΅¬μ‘°λ‘ λ체νλ λ°©λ²μ μκ°ν΄ 보μ. λν, κΈ°μ‘΄ ν΄λμ€κ° νκ·Έ νλλ₯Ό μ¬μ©νκ³ μλ€λ©΄ κ³μΈ΅κ΅¬μ‘°λ‘ 리ν©ν°λ§ νλ κ±Έ κ³ λ―Όν΄ λ³΄μ.