λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ€ Java/μžλ°”μ™„μ „μ •λ³΅

[Java] μ΄λ„ˆ 클래슀

by ._.sori 2025. 4. 29.

 

 

 

πŸ“š μ°Έκ³ ν•œ μ±…

 

: 좜처 예슀24 ν™ˆνŽ˜μ΄μ§€

 

 

 

- 기본적인 κ°œλ…μ„ μ •λ¦¬ν•˜κ³  μΆ”κ°€μ μœΌλ‘œ κΆκΈˆν•œ 것듀을 μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€ -

 

 

πŸ₯ πŸ₯ πŸ₯

 


 

βœ”οΈ   μΈμŠ€ν„΄μŠ€ 멀버 μ΄λ„ˆ 클래슀_ 426p

 

 μΈμŠ€ν„΄μŠ€ 멀버 μ΄λ„ˆ 클래슀

: μ•„μš°ν„° 클래슀 λ‚΄μ—μ„œ μΈμŠ€ν„΄μŠ€μΈ 객체 λ‚΄λΆ€ λ©€λ²„μ˜ ν˜•νƒœλ‘œ μ‘΄μž¬ν•˜λŠ” 클래슀

 

class OuterClass {

    public int a = 1;
    protected int b = 2;
    private int c = 3;
    
    void outerMethod(){
        System.out.println("μ•„μš°ν„°ν΄λž˜μŠ€!");
    }    

    class InnerClass {
        
        void innerMethod() {
            System.out.println(a);
            System.out.println(b);
            System.out.println(c);
            
            outerMethod();
        }
    }    
     
}

public class PraticeInnerClass1 {
    public static void main(String[] args) {
    
        OuterClass outer = new OuterClass();
        
        OuterClass.InnerClass inner = outer.new InnerClass();
        
        inner.innerMethod();
        
    }
}
멀버 μ΄λ„ˆ 클래슀 쀑 ν•˜λ‚˜μΈ μΈμŠ€ν„΄μŠ€ 멀버 ν΄λž˜μŠ€λŠ” 객체 λ‚΄λΆ€μ˜ λ©€λ²„μ˜ ν˜•νƒœλ‘œ μ‘΄μž¬ν•œλ‹€. 객체의 λ©€λ²„λž€, ν•΄λ‹Ή ν΄λž˜μŠ€μ— μžˆλŠ” ν•„λ“œλ‚˜ λ©”μ„œλ“œλ₯Ό 이야기 ν•˜λŠ”λ° ν•΄λ‹Ή 클래슀 내뢀에 ν΄λž˜μŠ€κ°€ 생긴닀면 이 ν΄λž˜μŠ€λ„ λ©€λ²„λΌλŠ” 것이닀. 그렇기에 μΈμŠ€ν„΄μŠ€ 멀버 μ΄λ„ˆ ν΄λž˜μŠ€λŠ” μ•„μš°ν„° 클래슀의 λͺ¨λ“  μ ‘κ·Ό μ§€μ •μžμ˜ 멀버에 μ ‘κ·Όν•  수 있게 λœλ‹€.

μžλ°”λŠ” μ»΄νŒŒμΌμ„ μˆ˜ν–‰ν•˜λ©΄ 각 ν΄λž˜μŠ€λ³„λ‘œ λ°”μ΄νŠΈ μ½”λ“œμΈ .class 파일이 μƒμ„±λœλ‹€. μ΄λ„ˆ 클래슀 λ§ˆμ°¬κ°€μ§€λ‘œ μƒμ„±λœλ‹€. ν•˜μ§€λ§Œ κ·Έ ν˜•νƒœλŠ” μ•„μš°ν„° ν΄λž˜μŠ€μ™€λŠ” λ‹€λ₯Ό 수 μžˆλ‹€. μ•„μš°ν„° ν΄λž˜μŠ€λŠ” 'OuterClass.class'라고 생성이 될 것이닀. 그러면 μ•„μš°ν„° 클래슀 μ•ˆμ— μžˆλŠ” μΈμŠ€ν„΄μŠ€ 멀버 ν΄λž˜μŠ€λŠ” 'OuterClass$InnerClass.class'둜 파일이 μƒμ„±λœλ‹€. κ·Έ μ΄μœ λŠ” λ‹Ήμ—°ν•˜κ²Œλ„ μ•„μš°ν„° 클래슀 내뢀에 있기 λ•Œλ¬Έμ— 그것을 ν‘œμ‹œν•˜κ³ μž μƒμ„±λœλ‹€.

InnerClass 내에 innerMethodκ°€ μžˆλ‹€. innerMethodλ₯Ό μ‚¬μš©ν•˜κ³ μž ν•˜μ—¬ μΈμŠ€ν„΄μŠ€ 멀버 클래슀의 객체λ₯Ό μƒμ„±ν•˜λ €ν•œλ‹€. μΈμŠ€ν„΄μŠ€ 멀버 클래슀의 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ¨Όμ € μ•„μš°ν„° 클래슀의 객체 생성이 ν•„μš”ν•˜λ‹€. κ·Έ 후에 μ•„μš°ν„° 클래슀 내에 μžˆλŠ” μ΄λ„ˆ ν΄λž˜μŠ€μ΄λ‹ˆ, μƒμ„±ν•œ μ•„μš°ν„° 클래슀 객체의 μ°Έμ‘° λ³€μˆ˜λ₯Ό μ΄μš©ν•΄ 객체 내뢀에 μžˆλŠ” μ΄λ„ˆ 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€. 그러면 OuterClass.InnerClass inner = outer.new InnerClass( );κ°€ λœλ‹€.

μœ„μ˜ μ½”λ“œμ—μ„œ innerMethodλ₯Ό 보면 μ•„μš°ν„° 클래슀 ν•„λ“œμ— μ ‘κ·Όν•˜κ³  μžˆλ‹€. μ ‘κ·Ό κ°€λŠ₯ν•œ μ΄μœ λŠ” InnerClass 내에 OuterClass의 멀버와 λ™μΌν•œ 이름이 μ—†κΈ° λ•Œλ¬ΈμΈλ°, λ§Œμ•½ 같은 이름이 InnerClass내에 μ‘΄μž¬ν•œλ‹€λ©΄ μ„€λ„μž‰μ΄ λ°œμƒν•΄ InnerClass λ‚΄λΆ€ ν•„λ“œμ˜ κ°’μœΌλ‘œ λ³€κ²½λ˜μ–΄ 좜λ ₯될 것이닀. 그럼 λ™μΌν•œ 이름을 κ°€μ§„ μƒνƒœμ—μ„œ μ•„μš°ν„° 클래슀의 멀버에 μ ‘κ·Όν•˜κ³ μž ν•œλ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒ? 'OuterClass.this.a'λ₯Ό 뢙이면 λœλ‹€. OuterClassλ₯Ό 뢙이지 μ•ŠμœΌλ©΄ InnerClass의 멀버에 μ ‘κ·Όν•˜λ‹ˆ μœ μ˜ν•΄μ•Όν•œλ‹€.

 

 

 

 


 

 

 

 

βœ”οΈ   정적 멀버 μ΄λ„ˆ 클래슀_ 431p

 

 μ •적 멀버 μ΄λ„ˆ 클래슀

: μ΄λ„ˆ 클래슀 μ•žμ— static이 ν¬ν•¨λœ ν΄λž˜μŠ€λ‹€.

class OuterClass {
    int a = 1;
    static int b = 2;
    
    void outerMethod1() {
        System.out.println("μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ!");
    }
    
    static void outerMethod2() {
        System.out.println("정적 λ©”μ„œλ“œ!");
    }    
     
    
    static class InnerClass {
        void innerMethod() {
            System.out.println(b);
            outerMethod();
        }
    }
}

public class PracticeInnerClass2 {
    public static void main(String[] args) {
        OuterClass.InnerClass inner = new OuterClass.InnerClass();
        
        inner.innerMethod();
    }
}
static이 ν¬ν•¨λœ μ΄λ„ˆ ν΄λž˜μŠ€λŠ” static νŠΉμ„±μ„ μ§€λ‹ˆκ²Œ λœλ‹€. κ·Έ νŠΉμ§•μ΄ μ•„μš°ν„° 클래슀 내에 static이 뢙은 λ©€λ²„λ§Œ 정적 μ΄λ„ˆ 클래슀 λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•  수 있게 ν•œλ‹€. 또 λ‹€λ₯Έ νŠΉμ„±μ„ μ‚΄νŽ΄λ³΄μž. μœ„μ˜ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄λ©΄ mainμ—μ„œ μ•„μš°ν„° 클래슀의 객체λ₯Ό λ§Œλ“€μ§€ μ•Šκ³  λ°”λ‘œ 정적 μ΄λ„ˆ 클래슀의 객체λ₯Ό μƒμ„±ν•œ 것을 λ³Ό 수 μžˆλ‹€. μ•„μš°ν„° 클래슀 내에 μžˆλŠ” 정적 μ΄λ„ˆ ν΄λž˜μŠ€λ„ 정적 λ©€λ²„μ΄λ―€λ‘œ 클래슀λͺ…μœΌλ‘œ λ°”λ‘œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.

 

 

 

 


 

 

 

βœ”οΈ   μ§€μ—­ μ΄λ„ˆ 클래슀_ 433p


 μ§€μ—­ μ΄λ„ˆ 클래슀

: λ©”μ„œλ“œ λ‚΄μ—μ„œ μ •μ˜λ˜λŠ” 클래슀

class OuterClass {
    int a = 1;
    
    void outerMethod(){
        int b = 2;
        
        class InnerClass {
            void innerMethod() {
                System.out.println(a);
                System.out.println(b);
            }
        }
        
    InnerClass inner = new InnerClass();
    inner.innerMethod();
    }
}

public class PracticeInnerClass3 {
    public static void main(String[] args) {
        
        OuterClass outer = new OuterClass();
        outer.outerMethod();
        
    }
}
μ§€μ—­ μ΄λ„ˆ ν΄λž˜μŠ€λŠ” μ •μ˜λœ λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜λ©°, μ§€μ—­ μ΄λ„ˆ 클래슀λ₯Ό μ„ μ–Έ 이후 λ°”λ‘œ 객체λ₯Ό μƒμ„±ν•΄μ„œ μ‚¬μš©ν•œλ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€. λ©”μ„œλ“œκ°€ 호좜이 되면 κ·Έλ•Œλ§Œ λ©”λͺ¨λ¦¬μ— λ‘œλ”©λ˜κΈ° λ•Œλ¬Έμ— 정적 μ˜μ—­κ³ΌλŠ” λ‹€λ₯Έ νŠΉμ„±μ„ κ°€μ§€κ³  μžˆλ‹€. 정적 μ˜μ—­μ€ 객체가 μƒμ„±λ˜κΈ° 전에 λ¨Όμ € λ©”λͺ¨λ¦¬μ— λ‘œλ”©λ˜μ–΄μžˆλ‹€.

λ©”μ„œλ“œ 내뢀에 μžˆλŠ” λ³€μˆ˜λŠ” μ§€μ—­ λ³€μˆ˜λΌκ³  ν•œλ‹€. μ§€μ—­ μ΄λ„ˆ ν΄λž˜μŠ€κ°€ μ§€μ—­ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³ μž ν•˜λ©΄ ν•΄λ‹Ή μ§€μ—­ λ³€μˆ˜κ°€ final둜 μ„ μ–Έλ˜μ–΄μžˆμ–΄μ•Ό ν•œλ‹€. λ§Œμ•½ final을 μ„ μ–Έν•˜μ§€ μ•Šμ•„λ„ μ»΄νŒŒμΌλŸ¬κ°€ μ•Œμ•„μ„œ ν•΄λ‹Ή μ§€μ—­ λ³€μˆ˜μ— μΆ”κ°€ν•΄μ€€λ‹€. 또 ν•΄λ‹Ή μ§€μ—­ λ³€μˆ˜μ˜ 값이 λ³€λ™λœλ‹€λ©΄ 컴파일러 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

 

 

Q. μ§€μ—­ λ³€μˆ˜μ—λ§Œ final을 λΆ™μ—¬μ•Όν•˜λŠ” μ΄μœ κ°€ 뭘까?

A. λ©”μ„œλ“œκ°€ 끝이 λ‚˜λ”λΌλ„ μ§€μ—­ μ΄λ„ˆ 클래슀의 κ°μ²΄λŠ” λ©”μ„œλ“œ λ°–μ—μ„œ 살아남을 수 μžˆλ‹€. 그런데 λ©”μ„œλ“œ 내에 μžˆλŠ” λ³€μˆ˜μΈ μ§€μ—­ λ³€μˆ˜λŠ” λ©”μ„œλ“œκ°€ λλ‚˜λ©΄ μ‚¬λΌμ§€κ²Œ λœλ‹€. μ§€μ—­ μ΄λ„ˆ 클래슀의 κ°μ²΄λŠ” μ‚΄μ•„λ‚¨μ•„μ„œ ν™œλ™ν•΄μ•Όν•˜λŠ”λ°, λ³€μˆ˜κ°€ λλ‚˜λ²„λ¦¬λ©΄ ν•΄λ‹Ή ν΄λž˜μŠ€λŠ” μ œλŒ€λ‘œ μ‚¬μš©ν•  수 μ—†κ²Œλœλ‹€. 그렇기에 final을 λΆ™μ—¬ ν•΄λ‹Ή 값이 λ³€λ™λ˜μ§€ λͺ»ν•˜λ„λ‘ν•˜κ³  값을 λ³΅μ‚¬ν•˜μ—¬ λ©”μ„œλ“œκ°€ λμ΄λ‚˜λ„ μ‚¬μš©ν•  수 있게 ν•΄μ€€λ‹€.