π™ΉπšŠπšŸπšŠ

[Java] λ³€μˆ˜ μ’…λ₯˜ / 클래슀의 생λͺ…μ£ΌκΈ° / λ©”μ„œλ“œ / JVM의 λ©”λͺ¨λ¦¬ ꡬ쑰 / κΈ°λ³Έν˜• & μ°Έμ‘°ν˜• λ§€κ°œλ³€μˆ˜

ν•΄λ²„λ‹ˆ 2024. 4. 15. 16:41
λ°˜μ‘ν˜•

μ„ μ–Έ μœ„μΉ˜μ— λ”°λ₯Έ λ³€μˆ˜μ˜ μ’…λ₯˜

 

static이 λΆ™μœΌλ©΄ 클래슀 λ³€μˆ˜μ΄κ³ , static이 뢙지 μ•ŠμœΌλ©΄ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ΄λ‹€. 

 

1️⃣ 클래슀 λ³€μˆ˜ (Class Variables)

public class Student {
    static String schoolName; // 클래슀 λ³€μˆ˜

    String name; // μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
    int age; // μΈμŠ€ν„΄μŠ€ λ³€μˆ˜

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        // 클래슀 λ³€μˆ˜ κ°’ μ„€μ •
        Student.schoolName = "ABC High School";

        // 각각의 μΈμŠ€ν„΄μŠ€λŠ” κ°œλ³„μ μΈ 값을 κ°€μ§‘λ‹ˆλ‹€.
        Student student1 = new Student("Alice", 18);
        Student student2 = new Student("Bob", 17);

        // 좜λ ₯
        System.out.println("Student 1 - Name: " + student1.name + ", Age: " + student1.age + ", School: " + Student.schoolName);
        System.out.println("Student 2 - Name: " + student2.name + ", Age: " + student2.age + ", School: " + Student.schoolName);

            /*
            Student 1 - Name: Alice, Age: 18, School: ABC High School
                Student 2 - Name: Bob, Age: 17, School: ABC High School
                */
    }
}

 

클래슀 λ³€μˆ˜λŠ” λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅ν†΅λœ μ €μž₯곡간(λ³€μˆ˜)을 κ³΅μœ ν•˜κ²Œ λœλ‹€.

클래슀 λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€λ³€μˆ˜μ™€ 달리 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ μ–Έμ œλΌλ„ λ°”λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” νŠΉμ§•μ΄ 있으며, ν΄λž˜μŠ€μ΄λ¦„.ν΄λž˜μŠ€λ³€μˆ˜ 와 같은 ν˜•μ‹μœΌλ‘œ μ‚¬μš©ν•œλ‹€.



β“μ–Έμ œ 생성돼❓

ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— ‘λ‘œλ”©(loading)’될 λ•Œ μƒμ„±λ˜μ–΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ  λ•ŒκΉŒμ§€ μœ μ§€λ˜λ©°, public을 μ•žμ— 뢙이면 같은 ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ μ–΄λ””μ„œλ‚˜ μ ‘κ·Όν•  수 μžˆλŠ” μ „μ—­λ³€μˆ˜μ˜ 성격을 κ°–λŠ”λ‹€.






2️⃣ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ (Instance Variables)

클래슀 μ˜μ—­μ— μ„ μ–Έλœλ‹€.

μΈμŠ€ν„΄μŠ€λŠ” 독립적인 μ €μž₯곡간을 κ°€μ§€λ―€λ‘œ μ„œλ‘œ λ‹€λ₯Έ 값을 κ°€μ§ˆ 수 μžˆλ‹€.

 

β“μ–Έμ œ μ‚¬μš©β“

μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ κ³ μœ ν•œ μƒνƒœλ₯Ό μœ μ§€ν•΄μ•Ό ν•˜λŠ” μ†μ„±μ˜ 경우, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ‘œ μ„ μ–Έν•œλ‹€.

 

β“μ–Έμ œ 생성돼❓

ν•΄λ‹Ή 클래슀의 객체가 생성될 λ•Œ μƒμ„±λ˜κ³ , 객체의 생λͺ…주기에 따라 μœ μ§€λœλ‹€.






3️⃣ 지역 λ³€μˆ˜ (Local Variables)

public class Example {
    public static void main(String[] args) {
        int a = 5; // 지역 λ³€μˆ˜

        System.out.println("Value of a: " + a);
    }
}

 

β“μ–Έμ œ 생성돼❓

ν•΄λ‹Ή 블둝이 싀행될 λ•Œ μƒμ„±λ˜κ³  λΈ”λ‘μ˜ λ²”μœ„κ°€ μ’…λ£Œλ  λ•Œ μ†Œλ©Έλœλ‹€.

 

β“κ·ΈλŸΌ 클래슀 λ³€μˆ˜λž‘ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λž‘ μƒμ„±λ˜λŠ” μ‹œκ°„ 차이가 μ–Όλ§ˆλ‚˜ λ‚˜λŠ”κ±°μ§€β“

→ 클래슀의 생λͺ… μ£ΌκΈ°κ°€ μžˆλŠ”λ° μˆœμ„œλŠ” λ°‘κ³Ό 같이 μ§„ν–‰λœλ‹€.

β‘  λ‘œλ”©(λ©”λͺ¨λ¦¬μ— λ‘œλ“œ)
β‘‘ 링크
β‘’ μ΄ˆκΈ°ν™”(static) : ν΄λž˜μŠ€ λ³€μˆ˜ 
β‘£ μΈμŠ€ν„΄μŠ€ν™”(new) : μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
β‘€ μ‚¬μš©
β‘₯ μ†Œλ©Έ

 

λ”°λΌμ„œ, 클래슀 λ³€μˆ˜λŠ” 클래슀 λ‘œλ”© 및 μ΄ˆκΈ°ν™” μ‹œμ μ— μƒμ„±λ˜λ©°, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” κ·Έ 이후에 객체가 생성될 λ•Œλ§ˆλ‹€ μƒμ„±λœλ‹€.

μ‹œκ°„ μ°¨μ΄λŠ” 클래슀 λ‘œλ”© μ‹œμ κ³Ό 첫 객체 생성 μ‹œμ  κ°„μ˜ 차이인데, ν”„λ‘œκ·Έλž¨μ— 따라 이 μ‹œκ°„ μ°¨μ΄λŠ” 맀우 짧을 μˆ˜λ„, μƒλŒ€μ μœΌλ‘œ κΈΈ μˆ˜λ„ μžˆλ‹€.

 

 
 

 

클래슀의 생λͺ…μ£ΌκΈ°

1️⃣ λ‘œλ”©(Loading) : 클래슀 파일이 λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ˜λŠ” 단계

  • 클래슀 파일의 λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό 읽어와 JVM λ‚΄μ˜ λ©”λͺ¨λ¦¬μ— μ˜¬λ¦°λ‹€.
  • 이 κ³Όμ •μ—μ„œ 클래슀의 μ½”λ“œλ₯Ό κ²€μ¦ν•˜κ³ , ν•„μš”ν•œ μžμ›μ„ μ€€λΉ„

 

2️⃣ 링크(Linking) : λ‘œλ”©λœ 클래슀 파일이 ν•„μš”ν•œ λ‹€λ₯Έ ν΄λž˜μŠ€μ™€ μ—°κ²°λ˜λŠ” 단계

  • λ‘œλ”© λ‹¨κ³„μ—μ„œ μ½μ–΄μ˜¨ 클래슀의 λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό λ©”λͺ¨λ¦¬μ— 올린 ν›„, JVM λ‚΄λΆ€μ˜ λŸ°νƒ€μž„ μƒμˆ˜ 풀에 ν•΄λ‹Ήν•˜λŠ” ν΄λž˜μŠ€μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό ν•΄κ²°
  • 이 λ‹¨κ³„μ—μ„œλŠ” 클래슀 λ³€μˆ˜μ™€ λ©”μ†Œλ“œμ˜ μ‹€μ œ λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ ν• λ‹Ή

 

3️⃣ μ΄ˆκΈ°ν™”(Initialization) : static λ³€μˆ˜κ°€ μ΄ˆκΈ°ν™”λ˜λŠ” 단계

  • 클래슀 λ³€μˆ˜(static λ³€μˆ˜)κ°€ ν•΄λ‹Ή 클래슀의 μΈμŠ€ν„΄μŠ€ν™” 없이 μ‚¬μš©λ  λ•Œ μ΄ˆκΈ°ν™”
  • 클래슀 λ³€μˆ˜λŠ” ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ λ‘œλ”©λ˜κ³  링크된 후에 μ΄ˆκΈ°ν™”
  • 클래슀의 μ΄ˆκΈ°ν™” 블둝 및 static λ³€μˆ˜λ“€μ΄ μ„ μ–Έλœ μˆœμ„œλŒ€λ‘œ μ΄ˆκΈ°ν™”

 

4️⃣ μΈμŠ€ν„΄μŠ€ν™”(Instantiation) : 클래슀의 객체가 μƒμ„±λ˜λŠ” 단계

  • new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀의 객체(μΈμŠ€ν„΄μŠ€)κ°€ 생성
  • μ΄λ•Œ new ν‚€μ›Œλ“œλ‘œ μƒμ„±λœ μΈμŠ€ν„΄μŠ€λŠ” νž™(heap) λ©”λͺ¨λ¦¬μ— ν• λ‹Ή
  • μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” ν•΄λ‹Ή 객체가 생성될 λ•Œλ§ˆλ‹€ μƒμ„±λ˜κ³ , μΈμŠ€ν„΄μŠ€μ˜ μ΄ˆκΈ°ν™” λΈ”λ‘μ΄λ‚˜ μƒμ„±μžμ— μ˜ν•΄ μ΄ˆκΈ°ν™”

 

5️⃣ μ‚¬μš©(Usage)

 

6️⃣ μ†Œλ©Έ(Garbage Collection)

더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” κ°μ²΄λŠ” λ©”λͺ¨λ¦¬μ—μ„œ μ œκ±°λœλ‹€.






 

 

 

 


λ©”μ„œλ“œ

νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 일련의 λ¬Έμž₯듀을 ν•˜λ‚˜λ‘œ 묢은 것.
기본적으둜 μˆ˜ν•™μ˜ ν•¨μˆ˜μ™€ μœ μ‚¬




 

λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 이유

1️⃣ 높은 μž¬μ‚¬μš©μ„±(reusability)

2️⃣ μ€‘λ³΅λœ μ½”λ“œμ˜ 제거

3️⃣ ν”„λ‘œκ·Έλž¨μ˜ ꡬ쑰화



int add (int x, int y) // μ„ μ–ΈλΆ€
{                      // κ΅¬ν˜„λΆ€
    int result = x + y;

    return result; 
}                       // κ΅¬ν˜„λΆ€

 

int : λ°˜ν™˜νƒ€μž…(좜λ ₯)

add : λ©”μ„œλ“œ 이름

(int x, int y) : λ§€κ°œλ³€μˆ˜ μ„ μ–Έ(μž…λ ₯)

return : κ²°κ³Όλ₯Ό λ°˜ν™˜

λ©”μ„œλ“œμ˜ λ°˜ν™˜ νƒ€μž…μ΄ voidκ°€ μ•„λ‹Œ 경우, κ΅¬ν˜„λΆ€{} μ•ˆμ— ‘return λ°˜ν™˜κ°’;’이 λ°˜λ“œμ‹œ ν¬ν•¨λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€.

λ°˜ν™˜κ°’μ€ μ΅œλŒ€ ν•˜λ‚˜λ§Œ ν—ˆμš©




int add(int x, int y) { ... } // OK.
int add(int x, y) { ... }     // μ—λŸ¬. λ§€κ°œλ³€μˆ˜ y의 νƒ€μž…μ΄ μ—†λ‹€. 






void도 return; ν•„μš”ν–ˆμ—ˆλ‹€.

void helloWorld(){
    System.out.println("Hellow World!!");

    return; // λ°˜ν™˜ νƒ€μž…μ΄ voidμ΄λ―€λ‘œ μƒλž΅ κ°€λŠ₯. μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μΆ”κ°€
}

μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μΆ”κ°€ν•΄μ€¬λ˜ 것.

κ·Έλƒ₯ 아무 생각 없이 μ“°κ³  μžˆμ—ˆλ‹€.






λ§€κ°œλ³€μˆ˜μ˜ μœ νš¨μ„± 검사

λ©”μ„œλ“œμ˜ κ΅¬ν˜„λΆ€{}λ₯Ό μž‘μ„±ν•  λ•Œ, 제일 λ¨Όμ € ν•΄μ•Ό ν•˜λŠ” 일이 λ§€κ°œλ³€μˆ˜μ˜ 값이 μ μ ˆν•œ 것인지 ν™•μΈν•˜λŠ” 것이닀.

‘ν˜ΈμΆœν•˜λŠ” μͺ½μ—μ„œ μ•Œμ•„μ„œ μ μ ˆν•œ 값을 λ„˜κ²¨μ£Όκ² μ§€.’λΌλŠ” 생각을 μ ˆλŒ€λ‘œ κ°€μ Έμ„œλŠ” μ•ˆ λœλ‹€.

float divide(int x, int y) {
    // μž‘μ—…ν•˜κΈ° 전에 λ‚˜λˆ„λŠ” μˆ˜κ°€ 0인지 확인해야 ν•œλ‹€. 
    if ( y == 0 ) {
        System.out.println("0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.");
        return 0; 
    }
}


λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•  λ•ŒλŠ” λ§€κ°œλ³€μˆ˜μ˜ μœ νš¨μ„± κ²€μ‚¬ν•˜λŠ” μ½”λ“œλ₯Ό λ°˜λ“œμ‹œ λ„£λŠ” 게 μ’‹λ‹€.
λ§€κ°œλ³€μˆ˜μ˜ μœ νš¨μ„± κ²€μ‚¬λŠ” λ©”μ„œλ“œμ˜ μž‘μ„±μ— μžˆμ–΄μ„œ κ°„κ³Όν•˜κΈ° μ‰¬μš΄ μ€‘μš”ν•œ 뢀뢄이닀.

 

 

 

 

 

 

 


JVM의 λ©”λͺ¨λ¦¬ ꡬ쑰

1️⃣ Method Area
2️⃣ Call Stack
3️⃣ Heap




1️⃣ Method Area

ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 μ–΄λ–€ ν΄λž˜μŠ€κ°€ μ‚¬μš©λ˜λ©΄, JVM은 ν•΄λ‹Ή 클래슀의 클래슀 파일(.class)을 μ½μ–΄μ„œ λΆ„μ„ν•˜μ—¬  ν΄λž˜μŠ€μ— λŒ€ν•œ 정보(클래슀 데이터)λ₯Ό 이곳에 μ €μž₯ν•œλ‹€.

클래슀의 ν΄λž˜μŠ€λ³€μˆ˜(class variable)도 이 μ˜μ—­μ— ν•¨κ»˜ μƒμ„±λœλ‹€.

 

β“ν΄λž˜μŠ€μ— λŒ€ν•œ μ •λ³΄λž€β“

public class MyClass {
    private int myField;

    public MyClass() {
        myField = 0;
    }

    public void setMyField(int value) {
        myField = value;
    }

    public int getMyField() {
        return myField;
    }

    public static void staticMethod() {
        System.out.println("This is a static method.");
    }
}

 

  1. 클래슀의 이름: MyClass
  2. ν•„λ“œ: myField
  3. μƒμ„±μž: MyClass()
  4. λ©”μ„œλ“œ: setMyField(int value), getMyField(), staticMethod()

이런 정보듀을 μ €μž₯ν•œλ‹€.




2️⃣ Call Stack(호좜 μŠ€νƒ λ˜λŠ” execution stack)

λ©”μ„œλ“œμ˜ μž‘μ—…μ— ν•„μš”ν•œ λ©”λͺ¨λ¦¬ 곡간을 μ œκ³΅ν•œλ‹€.

λ©”μ„œλ“œκ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λ™μ•ˆ μ§€μ—­λ³€μˆ˜λ“€κ³Ό μ—°μ‚°μ˜ 쀑간 κ²°κ³Ό 등을 μ €μž₯ν•˜λŠ”λ° μ‚¬μš©λœλ‹€.

그리고 λ©”μ„œλ“œκ°€ μž‘μ—…μ„ 마치면 ν• λ‹Ήλ˜μ—ˆλ˜ λ©”λͺ¨λ¦¬κ³΅κ°„은 λ°˜ν™˜λ˜μ–΄ λΉ„μ›Œμ§„λ‹€.

 

νŠΉμ§•

  • λ©”μ„œλ“œκ°€ 호좜되면 μˆ˜ν–‰μ— ν•„μš”ν•œ 만큼의 λ©”λͺ¨λ¦¬λ₯Ό μŠ€νƒμ— ν• λ‹Ήλ°›λŠ”λ‹€.
  • λ©”μ„œλ“œκ°€ μˆ˜ν–‰μ„ λ§ˆμΉ˜κ³ λ‚˜λ©΄ μ‚¬μš©ν–ˆλ˜ λ©”λͺ¨λ¦¬λ₯Ό λ°˜ν™˜ν•˜κ³  μŠ€νƒμ—μ„œ μ œκ±°λœλ‹€.
  • ν˜ΈμΆœμŠ€νƒμ˜ 제일 μœ„μ— μžˆλŠ” λ©”μ„œλ“œκ°€ ν˜„μž¬ μ‹€ν–‰ 쀑인 λ©”μ„œλ“œμ΄λ‹€.
  • μ•„λž˜μ— μžˆλŠ” λ©”μ„œλ“œκ°€ λ°”λ‘œ μœ„μ˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ©”μ„œλ“œμ΄λ‹€.




3️⃣ Heap

μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜λŠ” 곡간 (μΈμŠ€ν„΄μŠ€λ³€μˆ˜λ“€μ΄ μƒμ„±λ˜λŠ” 곡간)

 

 

 

 

 

 

 

 

κΈ°λ³Έν˜• λ§€κ°œλ³€μˆ˜μ™€ μ°Έμ‘°ν˜• λ§€κ°œλ³€μˆ˜

κΈ°λ³Έν˜• λ§€κ°œλ³€μˆ˜ : λ³€μˆ˜μ˜ 값을 읽기만 ν•  수 μžˆλ‹€. (read only)
μ°Έμ‘°ν˜• λ§€κ°œλ³€μˆ˜ : λ³€μˆ˜μ˜ 값을 읽고 λ³€κ²½ν•  수 μžˆλ‹€. (read & wrtie)


❓ 근데 λ„λŒ€μ²΄ μ™œ? 와이? 톡일성이 μ—†κ²Œ κΈ°λ³Έν˜• λ§€κ°œλ³€μˆ˜λŠ” read only이고, μ°Έμ‘°ν˜• λ§€κ°œλ³€μˆ˜λŠ” read & writeμΌκΉŒβ“

κΈ°λ³Έν˜•κ³Ό μ°Έμ‘°ν˜• λ§€κ°œλ³€μˆ˜μ˜ μ°¨μ΄λŠ” λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜λŠ” λ°©μ‹μ˜ 차이 λ•Œλ¬Έμ΄λ‹€.

  1. κΈ°λ³Έν˜• λ§€κ°œλ³€μˆ˜
    • κΈ°λ³Έν˜• λ§€κ°œλ³€μˆ˜λŠ” 값을 λ³΅μ‚¬ν•˜μ—¬ μ „λ‹¬ν•œλ‹€.
    • λ§€κ°œλ³€μˆ˜μ— μ „λ‹¬λœ 값은 ν•¨μˆ˜ λ‚΄μ—μ„œ λ³€κ²½λ˜μ–΄λ„ ν˜ΈμΆœν•œ ν•¨μˆ˜μ˜ λ³€μˆ˜μ—λŠ” 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€.
    • μ΄λŠ” κΈ°λ³Έν˜•μ΄ λ©”λͺ¨λ¦¬μ— 직접 μ €μž₯λ˜λŠ” 값이기 λ•Œλ¬Έμ΄λ‹€.
  2. μ°Έμ‘°ν˜• λ§€κ°œλ³€μˆ˜
    • μ°Έμ‘°ν˜• λ§€κ°œλ³€μˆ˜λŠ” λ³€μˆ˜μ˜ μ£Όμ†Œλ₯Ό μ „λ‹¬ν•œλ‹€.
    • λ§€κ°œλ³€μˆ˜μ— μ „λ‹¬λœ λ³€μˆ˜μ˜ 값을 λ³€κ²½ν•˜λ©΄ ν˜ΈμΆœν•œ ν•¨μˆ˜μ˜ λ³€μˆ˜μ—λ„ 영ν–₯을 λ―ΈμΉœλ‹€.
    • μ΄λŠ” μ°Έμ‘°ν˜•μ΄ λ©”λͺ¨λ¦¬μ— κ°„μ ‘μ μœΌλ‘œ μ €μž₯λ˜λŠ” 값이기 λ•Œλ¬Έμ΄λ‹€.

 

 

 

 

 

 

 

μ°Έμ‘°ν˜•μ΄λ©΄ μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œκ°€ λ³΅μ‚¬λœλ‹€.

μ£Όμ†Œλ₯Ό μ•Œ 수 있기 λ•Œλ¬Έμ— 값을 읽어 μ˜€λŠ” 것은 λ¬Όλ‘  값을 λ³€κ²½ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€.

class Data { int x; }
class ReferenceParamEx {
    public static void main(String[] args) {
        Data d = new Data();
        d.x = 10;
        change(d);
        System.out.println(d.x) // 1000 
    }

    static void change(Data d){
        d.x = 1000;
    }
}






μ°Έμ‘°ν˜• λ°˜ν™˜νƒ€μž…

λ§€κ°œλ³€μˆ˜λΏλ§Œ μ•„λ‹ˆλΌ λ°˜ν™˜νƒ€μž…λ„ μ°Έμ‘°ν˜•μ΄ 될 수 μžˆλ‹€.

λ°˜ν™˜νƒ€μž…μ΄ μ°Έμ‘°ν˜•μ΄λΌλŠ” 것은 λ©”μ„œλ“œκ°€ 객체의 μ£Όμ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.






 

 

 

 

 

μž¬κ·€ν˜ΈμΆœ(recursive call)

void method() {
    method(); // μž¬κ·€ν˜ΈμΆœ. λ©”μ„œλ“œ μžμ‹ μ„ ν˜ΈμΆœν•œλ‹€. 
}

λ°˜λ³΅λ¬Έλ³΄λ‹€ μž¬κ·€ν˜ΈμΆœμ˜ μˆ˜ν–‰μ‹œκ°„μ΄ 더 였래 κ±Έλ¦°λ‹€.

λ°˜λ³΅λ¬Έμ€ κ·Έμ € 같은 λ¬Έμž₯을 λ°˜λ³΅ν•΄μ„œ μˆ˜ν–‰ν•˜λŠ” κ²ƒμ΄μ§€λ§Œ,

λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 것은 λ°˜λ³΅λ¬Έλ³΄λ‹€ λͺ‡ 가지 과정이 μΆ”κ°€λ‘œ ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

(ex. λ§€κ°œλ³€μˆ˜ 볡사와 μ’…λ£Œ ν›„ 볡귀할 μ£Όμ†Œμ €μž₯ λ“±)



 

❓그렇닀면 ꡳ이 μ™œ? μ‚¬μš©ν• κΉŒ?❓

→ μž¬κ·€ν˜ΈμΆœμ΄ μ£ΌλŠ” 논리적 간결함 λ•Œλ¬Έμ΄λ‹€.
λ°˜λ³΅λ¬Έλ³΄λ‹€ 더 λ‹¨μˆœν•œ ꡬ쑰둜 λ°”λ€” μˆ˜λ„ μžˆλ‹€.

μ•Œμ•„λ³΄κΈ° μ‰½κ²Œ μž‘μ„±ν•˜λŠ” 것이 (λΉ„νš¨μœ¨μ μ΄λ”λΌλ„) 논리적 였λ₯˜κ°€ λ°œμƒν•  ν™•λ₯ λ„ 쀄어듀고 λ‚˜μ€‘μ— μˆ˜μ •ν•˜κΈ°λ„ μ’‹λ‹€.

κ·Έλž˜μ„œ λ¨Όμ € 반볡문으둜 μž‘μ„±μ„ 해보고, μž¬κ·€ν˜ΈμΆœλ‘œ κ°„λ‹¨νžˆ ν•  수 μ—†λŠ”μ§€ κ³ λ―Όν•΄λ³Ό ν•„μš”κ°€ μžˆλ‹€.



f(n) = n * f(n-1), 단 f(1) =1 

νŒ©ν† λ¦¬μ–Όμ€ μž¬κ·€ν˜ΈμΆœμ„ μ‚¬μš©ν•˜κΈ° 쒋은 μ˜ˆμ œμ΄λ‹€.






 

 

 

클래슀 λ©”μ„œλ“œ(staticλ©”μ„œλ“œ)와 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ

클래슀 λ©”μ„œλ“œλ„ ν΄λž˜μŠ€λ³€μˆ˜μ²˜λŸΌ, 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ ‘ν΄λž˜μŠ€μ΄λ¦„.λ©”μ„œλ“œμ΄λ¦„(λ§€κ°œλ³€μˆ˜)’와 같은 μ‹μœΌλ‘œ 호좜이 κ°€λŠ₯ν•˜λ‹€.

λ°˜λ©΄μ— μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” λ°˜λ“œμ‹œ 객체λ₯Ό μƒμ„±ν•΄μ•Όλ§Œ ν˜ΈμΆœν•  수 μžˆλ‹€.

 

1️⃣ 클래슀λ₯Ό 섀계할 λ•Œ, λ©€λ²„λ³€μˆ˜ 쀑 λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ— κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 것에 static을 뢙인닀.
2️⃣ 클래슀 λ³€μˆ˜(static λ³€μˆ˜)λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ μ‚¬μš©ν•  수 μžˆλ‹€.
3️⃣ 클래슀 λ©”μ„œλ“œ(static λ³€μˆ˜)λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
4️⃣ λ©”μ„œλ“œ λ‚΄μ—μ„œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄, static을 λΆ™μ΄λŠ” 것을 κ³ λ €ν•œλ‹€.

 

→ 클래슀의 λ©€λ²„λ³€μˆ˜ 쀑 λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ— κ³΅ν†΅λœ 값을 μœ μ§€ν•΄μ•Όν•˜λŠ” 것이 μžˆλŠ”μ§€ μ‚΄νŽ΄λ³΄κ³  있으면, static을 λΆ™μ—¬μ€€λ‹€.

→ μž‘μ„±ν•œ λ©”μ„œλ“œ μ€‘μ—μ„œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ‚˜ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”μ„œλ“œμ— static을 뢙일 것을 κ³ λ €ν•œλ‹€. 

 

class MyMath2 {
    long a, b;

    // μΈμŠ€ν„΄μŠ€λ³€μˆ˜ a, bλ§Œμ„ μ΄μš©ν•΄μ„œ μž‘μ—…ν•˜λ―€λ‘œ λ§€κ°œλ³€μˆ˜κ°€ ν•„μš” μ—†λ‹€.
    long add() {
        return a + b;
    }

    // μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ 관계없이 λ§€κ°œλ³€μˆ˜λ§ŒμœΌλ‘œ μž‘μ—…μ΄ κ°€λŠ₯ν•˜λ‹€.
    static long add(long a, long b) {
        return a+ b;
    }
}

class MyMathTest2{
    public static void main(String args[]) {
        // ν΄λž˜μŠ€λ©”μ„œλ“œ 호좜. μΈμŠ€ν„΄μŠ€ 생성없이 ν˜ΈμΆœκ°€λŠ₯
        System.out.println(MyMath2.add(200L, 100L));

        MyMath2 mm = new MyMath2(); // μΈμŠ€ν„΄μŠ€λ₯Ό 생성
        mm.a = 200L;
        mm.b = 100L;
        // μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œμ—μ„œλŠ” 객체생성 ν›„μ—λ§Œ 호좜이 κ°€λŠ₯함 
        System.out.println(mm.add()); 
    }
}






 

 

 

 

 

클래슀 멀버와 μΈμŠ€ν„΄μŠ€ λ©€λ²„κ°„μ˜ 참쑰와 호좜

ν΄λž˜μŠ€λ©€λ²„λŠ” μ–Έμ œλ‚˜ μ°Έμ‘° λ˜λŠ” 호좜이 κ°€λŠ₯!

ν•˜μ§€λ§Œ μΈμŠ€ν„΄μŠ€ λ©€λ²„λŠ” λ°˜λ“œμ‹œ 객체λ₯Ό μƒμ„±ν•œ ν›„μ—λ§Œ μ°Έμ‘° λ˜λŠ” 호좜이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— ν΄λž˜μŠ€λ©€λ²„κ°€ μΈμŠ€ν„΄μŠ€ 멀버λ₯Ό μ°Έμ‘°, ν˜ΈμΆœν•˜κΈ° μœ„ν•΄μ„œλŠ” 객체λ₯Ό μƒμ„±ν•˜μ—¬μ•Ό ν•œλ‹€.



class MemberCall {
    int iv = 10;
    static int cv = 20;

    int iv2 = cv;
    // static int cv2 = iv; // μ—λŸ¬. ν΄λž˜μŠ€λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μ—†μŒ 
    static int cv2 = new MemberCall().iv; // 이처럼 객체λ₯Ό 생성해야 μ‚¬μš©κ°€λŠ₯.

    static void staticMethod1() {
        System.out.println(cv);
        // System.out.println(iv); // μ—λŸ¬. ν΄λž˜μŠ€λ©”μ„œλ“œμ—μ„œ μΈμŠ€ν„΄μŠ€λ³€μˆ˜λ₯Ό μ‚¬μš©λΆˆκ°€.
        MemberCall c = new MemberCall();
        System.out.println(c.iv); // 객체λ₯Ό μƒμ„±ν•œ 후에야 μΈμŠ€ν„΄μŠ€λ³€μˆ˜μ˜ μ°Έμ‘°κ°€λŠ₯.
    }

    void instanceMethod1() {
        System.out.println(cv);
        System.out.println(iv); // μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œμ—μ„œλŠ” μΈμŠ€ν„΄μŠ€λ³€μˆ˜λ₯Ό λ°”λ‘œ μ‚¬μš©κ°€λŠ₯.
    }

    static void staticMethod2() {
        ststicMethod1();
        // instanceMethod1(); // μ—λŸ¬. ν΄λž˜μŠ€λ©”μ„œλ“œμ—μ„œλŠ” μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μ—†μŒ.
        MemberCall c =new MemberCall();
        c.instanceMethod1(); // μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œ 후에야 ν˜ΈμΆœν•  수 있음. 
    }

    void instanceMethod2() { 
    // μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œμ—μ„œλŠ” μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œμ™€ ν΄λž˜μŠ€λ©”μ„œλ“œ λͺ¨λ‘ μΈμŠ€ν„΄μŠ€ μƒμ„œμ—†μ΄ λ°”λ‘œ 호좜이 κ°€λŠ₯ν•˜λ‹€.
        staticMethod1(); 
        instanceMethod1();
    }
}




λ°˜μ‘ν˜•