{% hint style="success" %} κ°κ°μ μ€μ²© ν΄λμ€λ₯Ό μΈμ κ·Έλ¦¬κ³ μ μ¬μ©ν΄μΌ νλμ§λ₯Ό μμμΌ ν¨ {% endhint %}
λ€λ₯Έ ν΄λμ€ μμ μ μλ ν΄λμ€λ₯Ό λ§νλ€. μ€μ²© ν΄λμ€λ μμ μ κ°μΌ λ°κΉ₯ ν΄λμ€μμλ§ μ°μ¬μΌ νλ©°, κ·Έ μΈμ μ°μμκ° μλ€λ©΄ ν±λ 벨 ν΄λμ€λ‘ λ§λ€μ΄μΌ νλ€.
- μ μ λ©€λ² ν΄λμ€ : μΈλΆ ν΄λμ€
- (λΉμ μ ) λ©€λ² ν΄λμ€ : λ΄λΆ ν΄λμ€(inner class)
- μ΅λͺ ν΄λμ€ : λ΄λΆ ν΄λμ€(inner class)
- μ§μ ν΄λμ€ : λ΄λΆ ν΄λμ€(inner class)
- μ μ λ©€λ² ν΄λμ€λ μΈλΆ ν΄λμ€μ λ 립μ μΌλ‘ μ‘΄μ¬ν μ μλ€. μ¦, μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ μμ΄λ μ μ λ©€λ² ν΄λμ€μ κ°μ²΄λ₯Ό λ§λ€ μ μλ€.
- μ μ λ©€λ² ν΄λμ€λ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€μ μ κ·Όνμ§ λͺ»νλ€. μ΄λ μΈλΆ ν΄λμ€μ μνμ μκ΄μμ΄ λ 립μ μΌλ‘ λμν μ μλ ν΄λμ€λΌλ κ²μ μλ―Ένλ€.
- μ μ λ©€λ² ν΄λμ€λ λ€λ₯Έ μ μ λ©€λ²μ λμΌν κ·μΉμ μ μ©λ°λλ€. μλ₯Ό λ€μ΄
privateλ‘ μ μΈλλ©΄ μΈλΆ ν΄λμ€μμλ§ μ κ·Όν μ μκ³ ,publicμΌλ‘ μ μΈλλ©΄ μ΄λμλ μ κ·Ό κ°λ₯νλ€. - μ£Όλ‘ μΈλΆ ν΄λμ€μ λ°μ ν κ΄λ ¨μ΄ μμ§λ§, μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μ μκ΄μμ΄ λμνλ
λμ°λ―Έ ν΄λμ€(helper class)λ‘ μ¬μ©λλ€.
public class Calculator {
// μ μ λ©€λ² ν΄λμ€
public static class Operation {
public static final Operation PLUS = new Operation("+");
public static final Operation MINUS = new Operation("-");
private String symbol;
private Operation(String symbol) {
this.symbol = symbol;
}
public String getSymbol() {
return symbol;
}
}
public static void main(String[] args) {
System.out.println(Operation.PLUS.getSymbol()); // +
System.out.println(Operation.MINUS.getSymbol()); // -
}
}- μ μμμμ
OperationμCalculatorν΄λμ€μ μ μ λ©€λ² ν΄λμ€μ΄λ€.Calculatorμ μΈμ€ν΄μ€ μμ΄λOperationν΄λμ€μ λ©€λ²λ₯Ό μ¬μ©ν μ μλ€. μ΄λ₯Ό ν΅ν΄Calculator.Operation.PLUSννλ‘ μ°μ°μ μ μνκ³ μ¬μ©ν μ μκ² λλ€.
public class OuterClass {
private static String secret = "OuterClass Secret";
// μ μ λ©€λ² ν΄λμ€
public static class StaticInnerClass {
public void revealSecret() {
// λ°κΉ₯ ν΄λμ€μ private λ©€λ²μ μ κ·Ό κ°λ₯
System.out.println("Secret: " + secret);
}
}
}
public class Main {
public static void main(String[] args) {
OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
inner.revealSecret(); // "Secret: OuterClass Secret"
}
}μ μ λ©€λ² ν΄λμ€λ λ°κΉ₯ ν΄λμ€μ λ 립μ μΌλ‘ λμν μ μμΌλ©°, μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μλ μκ΄μμ΄ μΈμ€ν΄μ€νκ° κ°λ₯νλ€. λ°κΉ₯ ν΄λμ€μ
privateλ©€λ²μ μ κ·Όν μ μλ νΉμ§μ μ μΈνκ³ λ μΌλ° ν΄λμ€μ λ€λ₯΄μ§ μμΌλ©°, μ μ λ©€λ² ν΄λμ€λ λ³΄ν΅ λ°κΉ₯ ν΄λμ€μ ν¨κ» μ¬μ©λλ€.
μ μ λ©€λ² ν΄λμ€λ λ€λ₯Έ ν΄λμ€ μμ μ μΈλκ³ , λ°κΉ₯ ν΄λμ€μ private λ©€λ²μλ μ κ·Όν μ μλ€λ μ λ§ μ μΈνκ³ λ μΌλ° ν΄λμ€μ λκ°λ€.
μ μ λ©€λ² ν΄λμ€λ ν΄λμ€ λ΄λΆμ μ μΈλμ§λ§, κ·Έ μΈμλ μΌλ° ν΄λμ€μ λμΌν λ°©μμΌλ‘ λμνλ€.
- μμ±μλ₯Ό μ μν μ μλ€.
- λ©μλμ νλλ₯Ό κ°μ§ μ μλ€.
- μμμ ν μ μκ³ , μΈν°νμ΄μ€λ₯Ό ꡬνν μ μλ€.
- λ 립μ μΌλ‘ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€.
μλ₯Ό λ€μ΄, μ μ λ©€λ² ν΄λμ€λ μΌλ° ν΄λμ€μ²λΌ μΈμ€ν΄μ€λ₯Ό λ§λ€ μ μλ€.
public class OuterClass {
// μ μ λ©€λ² ν΄λμ€
public static class StaticInnerClass {
public void display() {
System.out.println("Static Inner Class");
}
}
}
public class Main {
public static void main(String[] args) {
// μ μ λ©€λ² ν΄λμ€λ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ μμ΄λ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€.
OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
inner.display(); // "Static Inner Class"
}
}μ μ½λμμ StaticInnerClassλ μΈλΆ ν΄λμ€ OuterClassμ λ³κ°λ‘ λμνλ©°, μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ μμ΄λ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€. μ΄λ μΌλ°μ μΈ λ
립 ν΄λμ€μ²λΌ μ¬μ©λλ€λ μ μμ μΌλ° ν΄λμ€μ λΉμ·νλ€.
μΌλ°μ μΈ λ
립 ν΄λμ€λ λ€λ₯Έ ν΄λμ€μ private λ©€λ²μ μ κ·Όν μ μλ€. κ·Έλ¬λ μ μ λ©€λ² ν΄λμ€λ μΈλΆ ν΄λμ€ μμ μ μΈλμ΄ μκΈ° λλ¬Έμ μΈλΆ ν΄λμ€μ private λ©€λ²μλ μ κ·Όν μ μλ€.
μλ₯Ό λ€μ΄:
public class OuterClass {
private static String secret = "OuterClass Secret";
// μ μ λ©€λ² ν΄λμ€
public static class StaticInnerClass {
public void revealSecret() {
// λ°κΉ₯ ν΄λμ€μ private λ©€λ²μ μ κ·Ό κ°λ₯
System.out.println("Secret: " + secret);
}
}
}
public class Main {
public static void main(String[] args) {
OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
inner.revealSecret(); // "Secret: OuterClass Secret"
}
}μ μ½λμμ StaticInnerClassλ μΈλΆ ν΄λμ€ OuterClassμ private νλμΈ secretμ μ κ·Όν μ μλ€. μ΄λ μΈλΆ ν΄λμ€ λ΄λΆμ μ μΈλ μ μ λ©€λ² ν΄λμ€μ΄κΈ° λλ¬Έμ κ°λ₯ν λμμ΄λ€.
μΌλ°μ μΌλ‘ λ
립μ μΈ ν΄λμ€λ λ€λ₯Έ ν΄λμ€μ private λ©€λ²μ μ κ·Όν μ μμ§λ§, μ μ λ©€λ² ν΄λμ€λ μΈλΆ ν΄λμ€μ λ©€λ²μ΄λ―λ‘ μΈλΆ ν΄λμ€μ private λ©€λ²μλ μ κ·Όν μ μλ μμΈμ μΈ κ²½μ°μ΄λ€.
- μ μ λ©€λ² ν΄λμ€λ μΈλΆ ν΄λμ€μ μΌλΆλ‘ μ μΈλλ©°, μΌλ° ν΄λμ€μ²λΌ λ 립μ μΌλ‘ λμν μ μλ€.
- κ·Έλ¬λ μΈλΆ ν΄λμ€μ
privateλ©€λ²μ μ κ·Όν μ μλ€λ μ μμ μΌλ° ν΄λμ€μ μ°¨μ΄κ° μλ€.
{% hint style="danger" %} λΉμ μ λ©€λ² ν΄λμ€λ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μ μ묡μ μΌλ‘ μ°κ²°λμ΄, μ¦, μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ μμ΄ μμ±ν μ μλ€. μ΄λ₯Ό ν΅ν΄ λ°κΉ₯ ν΄λμ€μ λ©μλλ νλμ μ κ·Όν μ μλ κ°λ ₯ν κΈ°λ₯μ μ 곡νλ€. λΉμ μ λ©€λ² ν΄λμ€λ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€μ κ°νκ² μ°κ²°λλ©°, κ°λΉμ§ 컬λ μ μμ λ©λͺ¨λ¦¬ λμμ μμΈμ΄ λ μλ μλ€. {% endhint %}
- λΉμ μ λ©€λ² ν΄λμ€λ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μ μ°κ΄λμ΄ μλ€.
- λΉμ μ λ©€λ² ν΄λμ€λ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μ μ κ·Όν μ μλ€. λ°λΌμ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ νλμ λ©μλμ μμ λ‘κ² μ κ·Όν μ μλ ν΄λμ€μ΄λ€.
- μ£Όλ‘ μΈλΆ ν΄λμ€μ μνμ λ°μ νκ² μ°κ΄λ μμ μ μνν λ μ¬μ©λλ€.
public class OuterClass {
private String message = "Hello from OuterClass!";
// λΉμ μ λ©€λ² ν΄λμ€
public class InnerClass {
public void printMessage() {
System.out.println(message); // μΈλΆ ν΄λμ€μ νλμ μ κ·Ό κ°λ₯
}
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
inner.printMessage(); // "Hello from OuterClass!"
}
}- μ μμμμ
InnerClassλ λΉμ μ λ©€λ² ν΄λμ€μ λλ€. μΈλΆ ν΄λμ€μΈOuterClassμ μΈμ€ν΄μ€κ° μμ΄μΌInnerClassμ κ°μ²΄λ₯Ό λ§λ€ μ μλ€. λνInnerClassλOuterClassμ νλμ μ κ·Όν μ μλ€.
public class OuterClass {
private String secret = "OuterClass Secret";
// λΉμ μ λ©€λ² ν΄λμ€
public class NonStaticInnerClass {
public void revealSecret() {
// λ°κΉ₯ ν΄λμ€μ private λ©€λ²μ μ κ·Ό κ°λ₯
System.out.println("Secret: " + secret);
}
}
public NonStaticInnerClass getInnerClass() {
return new NonStaticInnerClass();
}
}
public class Main {
public static void main(String[] args) {
OuterClass outer = new OuterClass();
OuterClass.NonStaticInnerClass inner = outer.getInnerClass();
inner.revealSecret(); // "Secret: OuterClass Secret"
}
}- λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€κ° μμ΄μΌλ§ μΈμ€ν΄μ€ν κ°λ₯.
- λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€μ μ묡μ μΌλ‘ μ°κ²°λμ΄ μλ€.
- λ°κΉ₯ μΈμ€ν΄μ€μ
thisμ°Έμ‘°λ₯Ό ν΅ν΄ λ°κΉ₯ ν΄λμ€μ νλμ λ©μλμ μ κ·Όν μ μλ€.
μ μ λ©€λ² ν΄λμ€μ λΉμ μ λ©€λ² ν΄λμ€μ ꡬ문 μ°¨μ΄
ꡬ문μμΌλ‘λ μ μ λ©€λ² ν΄λμ€λ static ν€μλλ₯Ό λΆμΈλ€λ μ°¨μ΄λ§ μμ§λ§, λμ μΈ‘λ©΄μμλ λ°κΉ₯ ν΄λμ€μμ μ°κ²° μ¬λΆκ° ν° μ°¨μ΄λ₯Ό λ§λ λ€.
public class OuterClass {
public static class StaticInnerClass {
// μ μ λ©€λ² ν΄λμ€
}
public class NonStaticInnerClass {
// λΉμ μ λ©€λ² ν΄λμ€
}
}| μ μ λ©€λ² ν΄λμ€ | λΉμ μ λ©€λ² ν΄λμ€ |
|---|---|
| μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ μμ΄ μμ± κ°λ₯ | μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€κ° μμ΄μΌ μμ± κ°λ₯ |
| μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ©€λ²μ μ κ·Ό λΆκ° | μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ©€λ²μ μ κ·Ό κ°λ₯ |
| μ£Όλ‘ λ 립μ μΈ λμ°λ―Έ ν΄λμ€λ‘ μ¬μ© | μΈλΆ ν΄λμ€μ λ°μ νκ² μ°κ΄λ λμμ μν |
static ν€μλλ‘ μ μΈλ¨ |
static ν€μλκ° μμ |
- μ μ λ©€λ² ν΄λμ€λ μΈλΆ ν΄λμ€μ λ°μ νκ² μ°κ΄λμ΄ μμ§λ§, μΈλΆ ν΄λμ€μ μνμ μμ‘΄νμ§ μλ κ²½μ°μ μ£Όλ‘ μ¬μ©λλ€. μλ₯Ό λ€μ΄, μ°μ°μ μ μ, μμ μ§ν© λ±μ λνλΌ λ μ ν©νλ€.
- λΉμ μ λ©€λ² ν΄λμ€λ μΈλΆ ν΄λμ€μ μνλ₯Ό μ°Έμ‘°νκ±°λ μΈλΆ ν΄λμ€μ λ°μ ν μνΈμμ©μ΄ νμν κ²½μ°μ μ¬μ©λλ€. μλ₯Ό λ€μ΄, μΈλΆ ν΄λμ€μ νλλ λ©μλμ μ κ·Όν΄μΌ νλ μν©μμ μ¬μ©λλ€.
{% hint style="success" %} μ μ λ©€λ² ν΄λμ€λ μΈλΆ ν΄λμ€μ μνμ μκ΄μμ΄ λ 립μ μΌλ‘ λμν μ μλ λμ°λ―Έ ν΄λμ€λ‘ μ£Όλ‘ μ¬μ©λκ³ , λΉμ μ λ©€λ² ν΄λμ€λ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μ λ°μ νκ² μ°κ΄λ μμ μ μννλ λ° μ¬μ©λλ€. {% endhint %}
λΉμ μ λ©€λ² ν΄λμ€λ 컬λ μ
μ λ°λ³΅μλ₯Ό ꡬνν λ μμ£Ό μ¬μ©λλ€. μ¬κΈ°μ λ°λ³΅μλ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€ μνλ₯Ό μ°Έμ‘°ν μ μμ΄μΌ νλ―λ‘ λΉμ μ λ©€λ² ν΄λμ€λ‘ ꡬνλλ€.
import java.util.AbstractSet;
import java.util.Iterator;
public class MySet<E> extends AbstractSet<E> {
private E[] elements; // MySet ν΄λμ€κ° κ΄λ¦¬νλ μμ λ°°μ΄
private int size; // MySetμ ν¬ν¨λ μμμ μ
// μμ±μ: λ°°μ΄μ λ°μ MySetμ μ΄κΈ°ν
public MySet(E[] elements) {
this.elements = elements;
this.size = elements.length; // μμ μλ₯Ό λ°°μ΄μ κΈΈμ΄λ‘ μ€μ
}
// iterator() λ©μλ: MyIterator μΈμ€ν΄μ€λ₯Ό λ°ν
@Override
public Iterator<E> iterator() {
return new MyIterator(); // λΉμ μ λ©€λ² ν΄λμ€μΈ MyIteratorλ₯Ό μμ±νκ³ λ°ν
}
// λΉμ μ λ©€λ² ν΄λμ€: λ°λ³΅μλ₯Ό ꡬννλ MyIterator ν΄λμ€
private class MyIterator implements Iterator<E> {
private int index = 0; // λ°λ³΅μκ° νμ¬ κ°λ¦¬ν€κ³ μλ μμμ μΈλ±μ€
// hasNext(): λ€μ μμκ° μλμ§ μ¬λΆλ₯Ό νμΈ
@Override
public boolean hasNext() {
return index < size; // νμ¬ μΈλ±μ€κ° sizeλ³΄λ€ μμΌλ©΄ λ€μ μμκ° μ‘΄μ¬
}
// next(): λ€μ μμλ₯Ό λ°ν
@Override
public E next() {
return elements[index++]; // νμ¬ μΈλ±μ€μ μμλ₯Ό λ°ννκ³ , μΈλ±μ€λ₯Ό μ¦κ°
}
}
// size(): MySetμ ν¬ν¨λ μμμ μλ₯Ό λ°ν
@Override
public int size() {
return size;
}
// main λ©μλ: MySetμ μμ±νκ³ , λ°λ³΅μλ₯Ό μ¬μ©νμ¬ μμλ₯Ό μΆλ ₯
public static void main(String[] args) {
MySet<String> mySet = new MySet<>(new String[]{"A", "B", "C"}); // String μμλ‘ κ΅¬μ±λ MySet μμ±
Iterator<String> iterator = mySet.iterator(); // MySetμ λ°λ³΅μ μμ±
while (iterator.hasNext()) {
System.out.println(iterator.next()); // λ°λ³΅μλ₯Ό μ¬μ©νμ¬ μμλ₯Ό νλμ© μΆλ ₯
}
}
}MySet<E>ν΄λμ€:AbstractSet<E>λ₯Ό μμλ°μ μ¬μ©μ μ μ μ§ν©μ ꡬνν ν΄λμ€. λ΄λΆμμE[]νμ λ°°μ΄μ μ¬μ©ν΄ μμλ€μ κ΄λ¦¬νλ©°, ν¬κΈ° μ 보λsizeλ‘ μ μ₯λλ€.- λΉμ μ λ©€λ² ν΄λμ€
MyIterator:MySetν΄λμ€μ λ°λ³΅μλ₯Ό ꡬνν λΉμ μ λ©€λ² ν΄λμ€.MyIteratorλMySetν΄λμ€μ μΈμ€ν΄μ€μ ν¬ν¨λ μμ λ°°μ΄μ μ κ·Όν μ μλ€. - μ€μν μ : λΉμ μ λ©€λ² ν΄λμ€μΈ
MyIteratorλMySetμ μΈμ€ν΄μ€ μν(elements,size)μ μ§μ μ κ·Όν μ μκΈ° λλ¬Έμ μ μ©νλ€. μ΄λ₯Ό ν΅ν΄ λ°κΉ₯ ν΄λμ€μ μνμ κΈ΄λ°νκ² μ°κ²°λμ΄ λμνλ€.
μ μ λ©€λ² ν΄λμ€λ λ³΄ν΅ λ°κΉ₯ ν΄λμ€μ μΌλΆ μν μ μννμ§λ§, λ°κΉ₯ ν΄λμ€μ μνμλ λ
립μ μΌλ‘ λμνλ€. μλ₯Ό λ€μ΄ Map.Entryλ Mapκ³Ό κ΄λ ¨ μμ§λ§ λ
립μ μΌλ‘ λμν΄μΌ νλ―λ‘ μ μ λ©€λ² ν΄λμ€λ‘ μ μλλ€.
public class MapExample {
// μ μ λ©€λ² ν΄λμ€ Entry: key-value μμ μ μ₯νλ ν΄λμ€
public static class Entry<K, V> {
private K key; // ν€
private V value; // κ°
// μμ±μ: keyμ valueλ₯Ό λ°μ Entryλ₯Ό μ΄κΈ°ν
public Entry(K key, V value) {
this.key = key;
this.value = value;
}
// getKey(): ν€λ₯Ό λ°ν
public K getKey() {
return key;
}
// getValue(): κ°μ λ°ν
public V getValue() {
return value;
}
// toString(): "key=value" νμμΌλ‘ μΆλ ₯
@Override
public String toString() {
return key + "=" + value; // ν€μ κ°μ "=" κΈ°νΈλ‘ μ°κ²°νμ¬ λ¬Έμμ΄λ‘ λ°ν
}
}
// main λ©μλ: Entry μΈμ€ν΄μ€λ₯Ό μμ±νκ³ μΆλ ₯
public static void main(String[] args) {
MapExample.Entry<String, Integer> entry = new MapExample.Entry<>("Key", 100); // "Key", 100 μμΌλ‘ Entry μμ±
System.out.println(entry); // "Key=100" μΆλ ₯
}
}- μ μ λ©€λ² ν΄λμ€
Entry: μ΄ ν΄λμ€λMapExampleν΄λμ€μ λ΄λΆμ μ μΈλ μ μ λ©€λ² ν΄λμ€λ‘, λ°κΉ₯ ν΄λμ€MapExampleμ μνμλ λ 립μ μΌλ‘ λμνλ€.Entryν΄λμ€λ ν€-κ° μμ κ΄λ¦¬νλ©°,Map.Entryμ κ°λ μ ꡬννλ€. - μ€μν μ : μ μ λ©€λ² ν΄λμ€λ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€μ κ΄κ³μμ΄ λ
립μ μΌλ‘ λμνλ―λ‘, λ°κΉ₯ ν΄λμ€μ μνμ μμ‘΄νμ§ μλλ€.
Entryν΄λμ€λMapExampleν΄λμ€μ μνλ₯Ό μ°Έμ‘°νμ§ μκΈ° λλ¬Έμ μ μ λ©€λ² ν΄λμ€λ‘ ꡬνλλ€.
- μ μ λ©€λ² ν΄λμ€λ λ°κΉ₯ ν΄λμ€μ λ 립μ μΌλ‘ λμνλ©°, λ©λͺ¨λ¦¬μ μ±λ₯ λ©΄μμ λ ν¨μ¨μ μΌ μ μμ΅λλ€.
- λΉμ μ λ©€λ² ν΄λμ€λ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€μ μ°κ²°λμ΄ μμΌλ©°, λ°κΉ₯ ν΄λμ€μ μνλ₯Ό μ°Έμ‘°ν΄μΌ ν λ μ¬μ©λ©λλ€.
- ꡬ문μ μΌλ‘
staticν€μλκ° λΆλλ μ λΆλλ μ°¨μ΄λ§ μμ§λ§, μλ―Έμ ν° μ°¨μ΄κ° μμ΅λλ€.
μ΅λͺ ν΄λμ€λ μ΄λ¦μ΄ μλ ν΄λμ€μ΄λ€. μ£Όλ‘ μ¦μμμ μΈμ€ν΄μ€λ₯Ό μμ±ν λ μ¬μ©λλ€.
μ΄λ¦μ΄ μκΈ° λλ¬Έμ μ€μ§ μ μΈκ³Ό λμμ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€. κ·Έλ¦¬κ³ νΉμ μΈν°νμ΄μ€λ₯Ό ꡬννκ±°λ, ν΄λμ€μ μλΈ ν΄λμ€λ₯Ό ν λ²μ μ μν μ μμ§λ§ μ¬λ¬ μΈν°νμ΄μ€λ₯Ό ꡬννκ±°λ λ€λ₯Έ ν΄λμ€λ₯Ό μμν μλ μλ€.
μ΅λͺ ν΄λμ€μ νΉμ§:
- μ΄λ¦μ΄ μλ€: μΈμ€ν΄μ€λ₯Ό μμ±νλ λμμ μ μΈλμ΄ μ¬μ©
- λ¨μΌ μΈν°νμ΄μ€λ§ ꡬννκ±°λ, λ¨μΌ ν΄λμ€λ₯Ό μμν μ μλ€.
- μ μ λ¬Έλ§₯μμ μ¬μ©ν μ μκ³ , μ μ λ©€λ²λ₯Ό κ°μ§ μ μλ€.
- μ½λμ μ μΈ μ§μ μμλ§ μ¬μ©ν μ μλ€. (μ¬μ¬μ© λΆκ°λ₯)
- 10μ€ μ΄νμ κ°λ¨ν μ½λλ‘ μ¬μ©νλ κ²μ΄ μ’λ€. κ·Έλ μ§ μμΌλ©΄ κ°λ μ±μ΄ λ¨μ΄μ§λ€.
- λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°ν μ μλ€.
public class AnonymousClassExample {
interface Greeting {
void sayHello();
}
public static void main(String[] args) {
// μ΅λͺ
ν΄λμ€ μ¬μ© μ
Greeting greeting = new Greeting() { // μ΄λ¦μ΄ μλ ν΄λμ€ μμ±
@Override
public void sayHello() {
System.out.println("Hello from Anonymous Class!");
}
};
greeting.sayHello(); // "Hello from Anonymous Class!" μΆλ ₯
}
}νΉμ§ μ€λͺ :
GreetingμΈν°νμ΄μ€λ₯Ό ꡬννλ μ΅λͺ ν΄λμ€κ° μμ±λκ³ , κ·Έ ν΄λμ€μ μΈμ€ν΄μ€κ° λ°λ‘ λ§λ€μ΄μ§λ€.- ν΄λμ€μ μ΄λ¦μ΄ μκΈ° λλ¬Έμ μ μΈκ³Ό λμμ μΈμ€ν΄μ€λ₯Ό μ¬μ©ν μ μλ€.
- μ½λμ κ°κ²°μ±κ³Ό μΌνμ± μ¬μ©μ μν΄ μ΅λͺ ν΄λμ€λ₯Ό μ¬μ©νλ€.
μ§μ ν΄λμ€λ λ©μλ λ΄μ μ μλλ ν΄λμ€μ΄λ©°, ν΄λΉ λ©μλμ μ§μλ³μμ²λΌ μ¬μ©λλ€. μ§μ λ³μκ° μ μΈλ μ μλ κ³³μ΄λΌλ©΄ μ΄λμμλ μ μν μ μκ³ , ν΄λΉ λΈλ‘ λ΄μμλ§ μ ν¨νλ€.
μ΅λͺ ν΄λμ€μ λ¬λ¦¬ μ΄λ¦μ΄ μμ΄ λ°λ³΅μ μΌλ‘ μ¬μ©ν μ μμ§λ§, μΈλΆμμ μ κ·Όν μ μλ€.
μ§μ ν΄λμ€μ νΉμ§:
- λ©μλ λ΄λΆμ μ μΈλμ΄ ν΄λΉ λ©μλμ μ§μλ³μμ²λΌ μ¬μ©λλ€.
- μ΄λ¦μ΄ μλ€: λ°λ³΅μ μΌλ‘ μ¬μ©ν μ μλ€.
- λ°κΉ₯ ν΄λμ€μ λ©€λ²μλ μ κ·Όν μ μμΌλ©°, final μ§μ λ³μμ μ κ·Ό κ°λ₯νλ€.
- μΈλΆμμλ μ κ·Όν μ μλ€ (μ§μ ν΄λμ€λ ν΄λΉ λΈλ‘ λ΄μμλ§ μ ν¨).
public class LocalClassExample {
public void printNumbers() {
final int factor = 2; // final μ§μ λ³μ
// μ§μ ν΄λμ€
class Multiplier {
int multiply(int number) {
return number * factor; // λ°κΉ₯ λ©μλμ final λ³μμ μ κ·Ό κ°λ₯
}
}
Multiplier multiplier = new Multiplier();
System.out.println(multiplier.multiply(5)); // μΆλ ₯: 10
System.out.println(multiplier.multiply(10)); // μΆλ ₯: 20
}
public static void main(String[] args) {
LocalClassExample example = new LocalClassExample();
example.printNumbers();
}
}νΉμ§ μ€λͺ :
MultiplierλΌλ μ§μ ν΄λμ€κ°printNumbersλ©μλ λ΄μμ μ μΈλμλ€.- μ΄ ν΄λμ€λ
factorλΌλ final λ³μμ μ κ·Όν μ μλ€. Multiplierν΄λμ€λ λ©μλ λ΄μμ μ¬λ¬ λ² μΈμ€ν΄μ€νν μ μμ§λ§, ν΄λΉ λ©μλ λ°μμλ μ¬μ©ν μ μλ€.
| νΉμ§ | μ΅λͺ ν΄λμ€ | μ§μ ν΄λμ€ |
|---|---|---|
| μ΄λ¦ | μμ | μμ |
| μ¬μ© κ°λ₯ λ²μ | μ μΈλ μ§μ μμλ§ μ¬μ© κ°λ₯ (μΌνμ±) | λ©μλλ λΈλ‘ λ΄μμ μ¬λ¬ λ² μΈμ€ν΄μ€ν κ°λ₯ |
| λ°κΉ₯ ν΄λμ€ μ°Έμ‘° | κ°λ₯ | κ°λ₯ |
| μ§μ λ³μ μ κ·Ό | final λλ effectively final μ§μ λ³μλ§ κ°λ₯ |
final λλ effectively final μ§μ λ³μλ§ κ°λ₯ |
| μ¬μ¬μ©μ± | μ¬μ¬μ© λΆκ°λ₯ | λ©μλ λ΄μμ μ¬μ¬μ© κ°λ₯ |
| μ¬μ© μμΉ | λ©μλλ ννμ λ΄μμ μ£Όλ‘ μ¬μ© | λ©μλλ λΈλ‘ λ΄μμ μ μΈ |
- μ¬λ¬ μΈν°νμ΄μ€λ₯Ό ꡬνν μ μκ³ , λ¨ νλμ μΈν°νμ΄μ€λ ν΄λμ€λ§ μμν μ μλ€.
- μ΅λͺ ν΄λμ€λ μΈμ€ν΄μ€κ° μμ±λ λλ§ μ μΈλλ©°, μ¬μ¬μ©μ΄ λΆκ°λ₯νλ€.
- ν΄λμ€μ μ΄λ¦μ΄ μμΌλ―λ‘
instanceofκ²μ¬λ ν΄λμ€μ μ΄λ¦μ΄ νμν μμ μ μνν μ μλ€.
μ΅λͺ ν΄λμ€λ μ£Όλ‘ κ°λ¨ν μΌνμ± μ¬μ©μ μ 리νλ©°, μ½λ κ°κ²°μ±μ μ€μν λ μ¬μ©λλ€. λ°λ©΄, μ§μ ν΄λμ€λ μ΄λ¦μ΄ μμ΄ μ¬λ¬ λ² μΈμ€ν΄μ€νκ° νμν λ μ¬μ©λλ€.
μ€μ²© ν΄λμ€μλ λ€ κ°μ§κ° μμΌλ©°, κ°κ°μ μ°μμ΄ λ€λ₯΄λ€. λ©μλ λ°μμλ μ¬μ©ν΄μΌ νκ±°λ λ©μλ μμ μ μνκΈ°μ λ무 κΈΈλ€λ©΄ λ©€λ² ν΄λμ€λ‘ λ§λ λ€.- λ©€λ² ν΄λμ€μ μΈμ€ν΄μ€ κ°κ°μ΄ λ°κΉ₯ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νλ€λ©΄ λΉμ μ μΌλ‘, κ·Έλ μ§ μμΌλ©΄ μ μ μΌλ‘ λ§λ€μ.
- μ€μ²© ν΄λμ€κ° ν λ©μλ μμμλ§ μ°μ΄λ©΄μ κ·Έ μΈμ€ν΄μ€λ₯Ό μμ±νλ μ§μ μ΄ λ¨ ν κ³³μ΄κ³ ν΄λΉ νμ
μΌλ‘ μ°κΈ°μ μ ν©ν ν΄λμ€λ μΈν°νμ΄μ€κ° μ΄λ―Έ μλ€λ©΄
μ΅λͺ ν΄λμ€λ‘ λ§λ€κ³ , κ·Έλ μ§ μμΌλ©΄μ§μ ν΄λμ€λ‘ λ§λ€μ.