λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
β˜•Java

[Java μ΄ν•΄ν•˜κΈ°] 6. μžλ°”μ˜ ν•¨μˆ˜(λ©”μ†Œλ“œ)λž€? (2)

by Luvbit 2024. 5. 4.


 

🩷 λ©”μ„œλ“œμ˜ μ’…λ₯˜

 

- μžλ°”μ—μ„œ λ©”μ„œλ“œλŠ” 크게 두 가지 μ£Όμš” μœ ν˜•μœΌλ‘œ λΆ„λ₯˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ™€ μ •μ  λ©”μ„œλ“œ.

   μ΄ 두 μœ ν˜•μ˜ λ©”μ„œλ“œλŠ” μ‚¬μš© 방식, μ ‘κ·Ό 방식, 그리고 μš©λ„μ—μ„œ 차이가 μžˆμŠ΅λ‹ˆλ‹€.

 

 


 

1. μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œ (Instance Methods)

 

μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” 객체의 μΈμŠ€ν„΄μŠ€μ— μ†ν•œ λ©”μ„œλ“œλ‘œ, 객체의 μΈμŠ€ν„΄μŠ€ 데이터(ν•„λ“œ)에 μ ‘κ·Όν•˜κ³  μ‘°μž‘ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ €λ©΄ λ¨Όμ € ν•΄λ‹Ή 클래슀의 객체λ₯Ό 생성해야 ν•©λ‹ˆλ‹€.

이 λ©”μ„œλ“œλ“€μ€ 클래슀의 νŠΉμ • μΈμŠ€ν„΄μŠ€μ— 쒅속적이기 λ•Œλ¬Έμ—,

클래슀의 각 μΈμŠ€ν„΄μŠ€λŠ” λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€μ˜ λ©”μ„œλ“œμ™€ μƒνƒœκ°€ λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

πŸ”Ž νŠΉμ§•

객체의 μƒνƒœ(μΈμŠ€ν„΄μŠ€ λ³€μˆ˜)에 μ ‘κ·Όν•˜κ³  λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
static ν‚€μ›Œλ“œ 없이 클래슀 내뢀에 μ •μ˜λ©λ‹ˆλ‹€.
λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” 객체 μΈμŠ€ν„΄μŠ€κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

 

public class MyNumber {
    private int number;  // μΈμŠ€ν„΄μŠ€ λ³€μˆ˜

    // μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ
    public void setNumber(int number) {
    	this.number = number;
	}
    
    public int getNumber() {
        return this.number;
    }
}

// μ‚¬μš© 예
MyNumber myNumber = new MyNumber();
myNumber.setNumber(3);  // μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 호좜 (κ°’ μ €μž₯)
System.out.println(myNumber.getNumber());  // μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 호좜 (κ°’ 좜λ ₯)

// κ²°κ³Ό : 3

 

 

 

2. 정적 λ©”μ†Œλ“œ (Static Methods)

 

정적 λ©”μ„œλ“œλŠ” ν΄λž˜μŠ€μ— μ†ν•˜λ©°, νŠΉμ • μΈμŠ€ν„΄μŠ€μ— μ’…μ†λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 λ©”μ„œλ“œλ“€μ€ static ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜λ˜λ©°,

클래슀 이름을 톡해 직접 ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

정적 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ— 직접 μ ‘κ·Όν•  수 μ—†μœΌλ©°, 였직 정적 λ³€μˆ˜μ™€ λ‹€λ₯Έ 정적 λ©”μ„œλ“œλ§Œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ’‘ static은 ν΄λž˜μŠ€κ°€ JVM에 μ˜ν•΄ 처음 λ‘œλ”©λ  λ•Œ μ΄ˆκΈ°ν™”λ˜κ³  λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ©λ‹ˆλ‹€.
μ΄λŠ” λͺ¨λ“  ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Όν•  수 μžˆκΈ°μ—,  '곡유'ν•˜λŠ” 속성을 가지기도 ν•©λ‹ˆλ‹€.

 

πŸ”Ž νŠΉμ§•

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ— μ ‘κ·Όν•  수 μ—†κ³ , 였직 정적 λ³€μˆ˜μ—λ§Œ μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.
클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ , 클래슀 μ΄λ¦„μœΌλ‘œ 직접 ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜ λ˜λŠ” 헬퍼 ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λŠ” 데 자주 μ‚¬μš©λ©λ‹ˆλ‹€.

 

public class mySum {
    // 정적 λ©”μ„œλ“œ
    public static int sum(int a, int b) {
        return a + b;
    }
}

// μ‚¬μš© 예
int sum = mySum.sum(5, 3);  // 객체 생성 없이 클래슀 μ΄λ¦„μœΌλ‘œ 호좜
System.out.println(sum);  // 좜λ ₯: 8

 

 

 

 


 

 

 

 

🩷 λ©”μ„œλ“œ 인자 전달방식

- μžλ°”μ™€ 같은 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ ν•¨μˆ˜λ‚˜ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ 인자λ₯Ό μ „λ‹¬ν•˜λŠ” 방식은 크게 μ„Έ κ°€μ§€λ‘œ λ‚˜λ‰©λ‹ˆλ‹€. Call by Value, Call by Reference, 그리고 Call by Name.

- 각각의 방식은 μ–΄λ–»κ²Œ μΈμžκ°€ ν•¨μˆ˜ λ˜λŠ” λ©”μ†Œλ“œμ— μ „λ‹¬λ˜κ³ , κ·Έ 호좜이 λ³€μˆ˜μ— μ–΄λ–€ 영ν–₯을 λ―ΈμΉ˜λŠ”μ§€μ— λŒ€ν•œ 근본적인 차이λ₯Ό κ°–μŠ΅λ‹ˆλ‹€.

 

 

 

 

1. Call by Value (값에 μ˜ν•œ ν˜ΈμΆœ)

 

🌟

- Call by Value λ°©μ‹μ—μ„œλŠ” ν•¨μˆ˜λ‘œ μ „λ‹¬λœ 인자의 볡사본이 μƒμ„±λ©λ‹ˆλ‹€.

- 즉, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 인자의 값을 변경해도 μ™ΈλΆ€μ˜ λ³€μˆ˜μ—λŠ” 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

- 이 방식은 ν•¨μˆ˜κ°€ 독립적인 μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œ μœ μš©ν•˜λ©°, μ™ΈλΆ€ λ³€μˆ˜λ₯Ό μ‹€μˆ˜λ‘œ λ³€κ²½ν•˜λŠ” 것을 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

Example )

public class Test {
    public static void increment(int number) {
        number = number + 1;
        System.out.println("Inside increment: " + number);
    }

    public static void main(String[] args) {
        int x = 5;
        increment(x);
        System.out.println("After increment: " + x);
    }
}

 

좜λ ₯ :

Inside increment: 6
After increment: 5

 


 

 

2. Call by Reference (참쑰에 μ˜ν•œ 호좜)

 

🌟

- Call by Reference λ°©μ‹μ—μ„œλŠ” ν•¨μˆ˜λ‘œ μ „λ‹¬λœ 인자의 μ°Έμ‘°(μ£Όμ†Œ)κ°€ μ „λ‹¬λ©λ‹ˆλ‹€.  λ”°λΌμ„œ ν•¨μˆ˜ λ‚΄μ—μ„œ 인자의 값을 λ³€κ²½ν•˜λ©΄ ν˜ΈμΆœν•œ μͺ½μ˜    λ³€μˆ˜λ„ 영ν–₯을 λ°›μŠ΅λ‹ˆλ‹€.

- μžλ°”λŠ” μˆœμˆ˜ν•œ Call by Referenceλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹ , 객체의 μ°Έμ‘°λ₯Ό κ°’μœΌλ‘œ 전달(Call by Value of Reference)ν•˜λŠ” 방식을      μ‚¬μš©ν•©λ‹ˆλ‹€.

- 이것은 객체의 μ°Έμ‘°(λ©”λͺ¨λ¦¬ μ£Όμ†Œμ˜ 볡사본)κ°€ ν•¨μˆ˜λ‘œ μ „λ‹¬λ˜λ―€λ‘œ, ν•¨μˆ˜ λ‚΄μ—μ„œ 객체의 μƒνƒœλ₯Ό λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

Example )

public class Test {
    public static void modify(Point point) {
        point.x = 5;
        System.out.println("Inside modify: " + point.x);
    }

    public static void main(String[] args) {
        Point myPoint = new Point(1);
        modify(myPoint);
        System.out.println("After modify: " + myPoint.x);
    }
}

class Point {
    public int x;
    public Point(int x) {
        this.x = x;
    }
}

 

좜λ ₯ :

Inside modify: 5
After modify: 5

 

 

 

 

3. Call by Name 

 

🌟

- Call by Name은 ν•¨μˆ˜μ˜ μΈμžκ°€ μ‹€μ œλ‘œ μ‚¬μš©λ  λ•ŒκΉŒμ§€ κ·Έ 평가λ₯Ό μ§€μ—°μ‹œν‚€λŠ” 전달 λ°©μ‹μž…λ‹ˆλ‹€.

- 이 방식은 주둜 초기의 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‚˜ 일뢀 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ§€μ›λ©λ‹ˆλ‹€.

- μžλ°”μ—μ„œλŠ” 직접적인 Call by Name λ©”μ»€λ‹ˆμ¦˜μ„ μ§€μ›ν•˜μ§€ μ•Šμ§€λ§Œ, λžŒλ‹€ ν‘œν˜„μ‹μ„ 톡해 μœ μ‚¬ν•œ 효과λ₯Ό λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

Example )

public class Test {
    public static void compute(Supplier<Integer> supplier) {
        System.out.println("Computed value: " + supplier.get());
    }

    public static void main(String[] args) {
        int value = 5;
        compute(() -> value + 5);
    }
}

 

좜λ ₯ :

Computed value: 10

 

 

 

 

 

 

 

 

 

아직 참쑰에 μ˜ν•œ ν˜ΈμΆœμ΄λ‚˜ 객체 생성 등에 λŒ€ν•΄ μƒμ†Œν•˜μ‹œκ² μ§€λ§Œ,
이런 μ½”λ“œλŠ” μ΄λ ‡κ²Œ 좜λ ₯λ˜λŠ”κ΅¬λ‚˜λ§Œ μ΄ν•΄ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€!

λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œλŠ” μ œμ–΄λ¬Έ, 반볡문으둜 μ°Ύμ•„λ΅™κ² μŠ΅λ‹ˆλ‹€.