23. νκ·Έ λ¬λ¦° ν΄λμ€λ³΄λ€λ ν΄λμ€ κ³μΈ΅ ꡬ쑰 νμ©νκΈ°
νκ·Έ λ¬λ¦° ν΄λμ€ π μμ νλλ μΈν°νμ΄μ€, μ΄κ±°ν(enum) λ±μ νμ©ν΄μ νΉμ κ°μ²΄κ° μ΄λ€ μΉ΄ν κ³ λ¦¬μ μνλμ§ μλ³
class Figure {
enum Shape {RECTANGLE, CIRCLE};
// νκ·Έ νλ - νμ¬ λͺ¨μμ λνλΈλ€.
final Shape shape;
// λ€μ νλλ€μ λͺ¨μμ΄ μ¬κ°ν(RECTANGLE)μΌ λλ§ μ°μΈλ€.
double length;
double width;
// λ€μ νλλ λͺ¨μμ΄ μ(CIRCLE)μΌ λλ§ μ°μΈλ€.
double radius;
// μμ© μμ±μ
Figure(double radius) {
shape = Shape.CIRCLE;
this.radius = radius;
}
// μ¬κ°νμ© μμ±μ
Figure(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);
}
}
}
- μ΄κ±°νμ μ μΈ, νκ·Έ νλ, switch λ¬Έ λ± μΈλ° μλ μ½λκ° λ§μ
- μ¬λ¬ ꡬνμ΄ ν ν΄λμ€ μμ νΌν©λΌ μμ΄μ κ°λ μ±μ΄ λμ¨
- λ€λ₯Έ μλ―Έλ₯Ό μν μ½λλ μΈμ λ ν¨κ» ν΄ λ©λͺ¨λ¦¬λ₯Ό λ§μ΄ μ¬μ©
- μλ‘μ΄ μλ―Έλ₯Ό μΆκ°ν λλ§λ€ λͺ¨λ switchλ¬Έμ μ°Ύμ μ μλ―Έλ₯Ό μ²λ¦¬νλ μ½λλ₯Ό μΆκ°ν΄μΌ ν¨
- μΈμ€ν΄μ€μ νμ λ§μΌλ‘λ νμ¬ λνλ΄λ μλ―Έλ₯Ό μ μ μμ
π νκ·Έ λ¬λ¦° ν΄λμ€λ μ₯ν©νκ³ μ€λ₯λ₯Ό λ΄κΈ° μ½κ³ , λΉν¨μ¨μ μ
β³οΈ νκ·Έ λ¬λ¦° ν΄λμ€λ₯Ό ν΄λμ€ κ³μΈ΅ κ΅¬μ‘°λ‘ λ°κΎΈκΈ°
- κ³μΈ΅ ꡬ쑰μ 루νΈκ° λ μΆμ ν΄λμ€ μ μνκ³ νκ·Έ κ°μ λ°λΌ λμμ΄ λ¬λΌμ§λ λ©μλλ€μ λ£¨νΈ ν΄λμ€μ μΆμ λ©μλλ‘ μ μΈ
π μμ μ½λμμ areaμ ν΄λΉ - νκ·Έ κ°μ μκ΄μμ΄ λμμ΄ μΌμ ν λ©μλλ€μ λ£¨νΈ ν΄λμ€μ μΌλ° λ©μλλ‘ μΆκ°
- λͺ¨λ νμ ν΄λμ€μμ 곡ν΅μΌλ‘ μ¬μ©νλ λ°μ΄ν° νλλ€μ μ λΆ λ£¨νΈ ν΄λμ€λ‘ μ¬λ¦Ό
- λ£¨νΈ ν΄λμ€λ₯Ό νμ₯ν ꡬ체 ν΄λμ€λ₯Ό μλ―Έλ³λ‘ νλμ© μ μ
abstract class Figure{
abstract double area();
}
class Circle extends Figure{
final double radius;
Circle(double radius) { this.radius = radius; }
@Override
double area() {
return Math.PI * (radius * radius);
}
}
class Rectangle extends Figure{
final double length;
final double width;
Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
double area() {
return length * width;
}
}
24. λ©€λ² ν΄λμ€λ λλλ‘μ΄λ©΄ staticμΌλ‘ λ§λ€κΈ°
μ€μ²© ν΄λμ€λ λ€λ₯Έ ν΄λμ€ μμ μ μλ ν΄λμ€
π μ’ λ₯ : μ μ λ©€λ² ν΄λμ€, (λΉμ μ ) λ©€λ² ν΄λμ€, μ΅λͺ ν΄λμ€, μ§μ ν΄λμ€
β³οΈ μ μ λ©€λ² ν΄λμ€
- λ€λ₯Έ ν΄λμ€ μμ μ μΈλ¨
- λ°κΉ₯ ν΄λμ€μ ν¨κ» μ°μΌ λλ§ μ μ©ν public λμ°λ―Έ ν΄λμ€λ‘ μ°μ
- μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μ κ΄κ³μμ΄ λ 립μ μΌλ‘ μ¬μ©
class OuterClass {
private static String staticField = "Outer Static Field";
private String instanceField = "Outer Instance Field";
// μ μ λ©€λ² ν΄λμ€ μ μΈ
static class HelperClass {
public void display() {
// μ μ λ©€λ² ν΄λμ€λ μΈλΆ ν΄λμ€μ μ μ νλμ μ κ·Ό κ°λ₯
System.out.println("Accessing outer static field: " + staticField);
// μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ νλλ μ κ·Ό λΆκ° (μ»΄νμΌ μλ¬ λ°μ)
// System.out.println("Accessing outer instance field: " + instanceField);
}
// ν¬νΌ μν : νΉμ μμ
μ μ²λ¦¬νλ μ νΈλ¦¬ν° λ©μλ μ 곡
public static int add(int a, int b) {
return a + b;
}
}
}
public class Main {
public static void main(String[] args) {
// μ μ λ©€λ² ν΄λμ€λ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ μμ΄ μμ± κ°λ₯
OuterClass.HelperClass helper = new OuterClass.HelperClass();
helper.display();
// μ μ ν¬νΌ λ©μλ νΈμΆ
int result = OuterClass.HelperClass.add(5, 3);
System.out.println("Result of addition: " + result);
}
}
β³οΈ (λΉμ μ ) λ©€λ² ν΄λμ€
- μΈμ€ν΄μ€κ° λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€μ μ묡μ μΌλ‘ μ°κ²°λ¨ π λ°κΉ₯ μΈμ€ν΄μ€ μμ΄λ μμ± λΆκ°
- μΈμ€ν΄μ€ λ©μλμμ μ κ·νλ this (= ν΄λμ€λͺ .this)λ₯Ό μ¬μ©ν΄ λ°κΉ₯ μΈμ€ν΄μ€μ λ©μλλ₯Ό νΈμΆνκ±°λ λ°κΉ₯ μΈμ€ν΄μ€μ μ°Έμ‘°λ₯Ό κ°μ Έμ¬ μ μμ
- μ΄λ€ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό κ°μΈ λ€λ₯Έ ν΄λμ€μ μΈμ€ν΄μ€μ²λΌ 보μ΄κ² νλ λ·°λ‘ μ¬μ©
class OuterClass {
private String message = "Hello from OuterClass";
// λΉμ μ λ©€λ² ν΄λμ€
class InnerClass {
void display() {
// λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€ νλμ μ κ·Ό
System.out.println("Accessing: " + message);
// λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€ λ©μλ νΈμΆ
OuterClass.this.outerMethod();
}
}
void outerMethod() {
System.out.println("Outer method called");
}
}
public class Main {
public static void main(String[] args) {
// OuterClass μΈμ€ν΄μ€ μμ±
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass(); // InnerClass μΈμ€ν΄μ€ μμ±
inner.display(); // display λ©μλ νΈμΆ
}
}
- λΉμ μ λ©€λ² ν΄λμ€λ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μ μ°κ²°λμ΄ μμ΄, μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ νλμ λ©μλμ μ κ·Όν μ μμ
- μ΄ κ²½μ°, λΉμ μ λ©€λ² ν΄λμ€μ μΈμ€ν΄μ€κ° μμ±λ λλ§λ€ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μ λν μ¨μ μ°Έμ‘°κ° μλμΌλ‘ μμ±λ¨
λ©€λ² ν΄λμ€μμ λ°κΉ₯ μΈμ€ν΄μ€μ μ κ·Όν μΌμ΄ μλ€λ©΄ 무쑰건 static λΆμ¬μ μ μ λ©€λ² ν΄λμ€λ‘ λ§λ€κΈ° !
π static μλ΅ μ λ°κΉ₯ μΈμ€ν΄μ€λ‘μ μ¨μ μΈλΆ μ°Έμ‘°λ₯Ό κ°κ² λλ―λ‘ μκ°κ³Ό 곡κ°μ΄ μλΉλκ±°λ λ©λͺ¨λ¦¬ λμ λ°μ κ°λ₯
β³οΈ μ΅λͺ ν΄λμ€
- μ΄λ¦μ΄ μμ
- λ°κΉ₯ ν΄λμ€μ λ©€λ²κ° μλ
- μ°μ΄λ μμ μ μ μΈκ³Ό λμμ μΈμ€ν΄μ€κ° λ§λ€μ΄μ§
- λΉμ μ μΈ λ¬Έλ§₯μμ μ¬μ©λ λλ§ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€ μ°Έμ‘° κ°λ₯
- μ μΈν μ§μ μμλ§ μΈμ€ν΄μ€ μμ± κ°λ₯
- instanceof κ²μ¬λ ν΄λμ€μ μ΄λ¦μ΄ νμν μμ μ μν λΆκ°
- μ¬λ¬ μΈν°νμ΄μ€ ꡬν λΆκ°
- μΈν°νμ΄μ€λ₯Ό ꡬννλ λμμ λ€λ₯Έ ν΄λμ€ μμ λΆκ°
- μ΅λͺ ν΄λμ€λ₯Ό μ¬μ©νλ ν΄λΌμ΄μΈνΈλ κ·Έ μ΅λͺ ν΄λμ€κ° μμ νμ μμ μμν λ©€λ² μΈμλ νΈμΆ λΆκ°
- μ μ ν©ν 리 λ©μλλ₯Ό ꡬνν λ μ£Όλ‘ μ¬μ©λ¨
class OuterClass {
void display() {
// μ΅λͺ
λ΄λΆ ν΄λμ€
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("This is an anonymous inner class.");
}
};
// μ€ν
runnable.run();
}
}
public class Main {
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.display();
}
}
β³οΈ μ§μ ν΄λμ€
- κ°μ₯ λλ¬Όκ² μ¬μ©
- μ§μ λ³μλ₯Ό μ μΈν μ μλ κ³³μ΄λ©΄ μ€μ§μ μΌλ‘ μ΄λμλ μ μΈ κ°λ₯
- μ΄λ¦μ΄ μκ³ λ°λ³΅ν΄μ μ¬μ© κ°λ₯
- λΉμ μ λ¬Έλ§₯μμ μ¬μ©λ λλ§ λ°κΉ₯ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°ν μ μμ
- μ μ λ©€λ²λ₯Ό κ°μ§ μ μμΌλ©° κ°λ μ±μ μν΄ μ§§κ² μμ±ν΄μΌ ν¨
class OuterClass {
private String outerField = "Outer Field";
void display() {
class LocalInnerClass {
void print() {
// λΉμ μ λ¬Έλ§₯μμλ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ νλ μ κ·Ό κ°λ₯
System.out.println("Accessing outer class field: " + outerField);
System.out.println("This is a local inner class.");
}
}
// μ§μ λ΄λΆ ν΄λμ€λ λ©μλ λ΄μμλ§ μμ± λ° μ¬μ© κ°λ₯
LocalInnerClass localInner = new LocalInnerClass();
localInner.print();
}
}
public class Main {
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.display();
}
}
λ©μλ λ°μμλ μ¬μ©ν΄μΌ νκ±°λ λ©μλ μμ μ μνκΈ°μ λ무 κΈΈλ©΄ π λ©€λ² ν΄λμ€
λ©€λ² ν΄λμ€μ μΈμ€ν΄μ€ κ°κ°μ΄ λ°κΉ₯ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νλ€λ©΄ π λΉμ μ λ©€λ² ν΄λμ€
κ·Έλ μ§ μμΌλ©΄ π μ μ λ©€λ² ν΄λμ€
μ€μ²© ν΄λμ€κ° ν λ©μλ μμμλ§ μ°μ΄λ©΄μ κ·Έ μΈμ€ν΄μ€λ₯Ό μμ±νλ μ§μ μ΄ λ¨ ν κ³³μ΄κ³ ν΄λΉ νμ μΌλ‘ μ°κΈ°μ μ ν©ν ν΄λμ€λ μΈν°νμ΄μ€κ° μ΄λ―Έ μλ€λ©΄ π μ΅λͺ ν΄λμ€
κ·Έλ μ§ μμΌλ©΄ π μ§μ ν΄λμ€
25. ν±λ 벨 ν΄λμ€λ ν νμΌμ νλλ§ λ΄κΈ°
μ»΄νμΌλ¬κ° ν ν΄λμ€μ λν μ μλ₯Ό μ¬λ¬ κ° λ§λ€μ΄ λ΄λ μΌ X
π μμ€ νμΌμ μ΄λ€ μμλ‘ μ»΄νμΌνλ λ°μ΄λ리 νμΌμ΄λ νλ‘κ·Έλ¨μ λμμ΄ λ¬λΌμ§λ μΌ X
'Java > π Effective Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[π Effective Java] μ΄κ±° νμ κ³Ό μ΄λ Έν μ΄μ δΈ (0) | 2024.11.10 |
---|---|
[π Effective Java] μ λ€λ¦ δΈ (0) | 2024.10.12 |
[π Effective Java] ν΄λμ€μ μΈν°νμ΄μ€ δΈ (2) | 2024.10.05 |
[π Effective Java] ν΄λμ€μ μΈν°νμ΄μ€ δΈ (1) | 2024.09.25 |
[π Effective Java] λͺ¨λ κ°μ²΄μ κ³΅ν΅ λ©μλ δΈ (0) | 2024.09.22 |