λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ“— Book/μžλ°”μ˜ 정석

6-3μž₯ λ³€μˆ˜μ™€ λ©”μ„œλ“œ 上 (3.1 ~ 3.6)

by hyeon-z 2023. 4. 4.

 

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

πŸ’‘λ³€μˆ˜μ˜ μ’…λ₯˜λ₯Ό κ²°μ •μ§“λŠ” μ€‘μš”ν•œ μš”μ†ŒλŠ” 'λ³€μˆ˜μ˜ μ„ μ–Έλœ μœ„μΉ˜'μ΄λ―€λ‘œ λ³€μˆ˜κ°€ μ–΄λŠ μ˜μ—­μ— μ„ μ–Έλ˜μ—ˆλŠ”μ§€λ₯Ό ν™•μΈν•˜λŠ” 것이 μ€‘μš”!!

 

λ³€μˆ˜μ˜ μ’…λ₯˜λŠ” 3가지이닀.

 

1. 클래슀 λ³€μˆ˜: 멀버 λ³€μˆ˜ 쀑 static이 뢙은 λ³€μˆ˜

2. μΈμŠ€ν„΄μŠ€ λ³€μˆ˜: λ©€λ²„ λ³€μˆ˜ 쀑 static이 λΆ™μ§€ μ•Šμ€ λ³€μˆ˜

3. μ§€μ—­ λ³€μˆ˜: 멀버 λ³€μˆ˜λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λ³€μˆ˜

 

 

iv와 cvλŠ” 클래슀 μ˜μ—­μ— μ„ μ–Έλ˜μ–΄ μžˆμœΌλ―€λ‘œ 멀버 λ³€μˆ˜μ΄κ³  이 쀑 static이 뢙은 cvλŠ” 클래슀 λ³€μˆ˜, λΆ™μ§€ μ•Šμ€ ivλŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ΄λ‹€.

λ©”μ„œλ“œμΈ method()의 λ‚΄λΆ€, 즉 'λ©”μ„œλ“œ μ˜μ—­'에 μ„ μ–Έλœ lvλŠ” μ§€μ—­λ³€μˆ˜μ΄λ‹€.

 

λ³€μˆ˜μ˜ μ’…λ₯˜μ™€ νŠΉμ§•

 

 

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ (instance variable)

 

- 클래슀 μ˜μ—­μ— μ„ μ–Έλ˜λ©°, 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ λ§Œλ“€μ–΄μ§„λ‹€.

=> λ³€μˆ˜μ˜ 값을 μ½μ–΄μ˜€κ±°λ‚˜ μ €μž₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ°˜λ“œμ‹œ μΈμŠ€ν„΄μŠ€ λ¨Όμ € 생성!

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

 

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

 

클래슀 λ³€μˆ˜ (class variable)

 

- μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ•žμ— static을 λΆ™μ—¬ μ‚¬μš©ν•œλ‹€.

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

- μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ 달리 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  λ°”λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

- 'ν΄λž˜μŠ€μ΄λ¦„.ν΄λž˜μŠ€λ³€μˆ˜'의 ν˜•μ‹μœΌλ‘œ μ‚¬μš©ν•œλ‹€.

- λ©”λͺ¨λ¦¬μ— λ‘œλ”©λ  λ•Œ μƒμ„±λ˜μ–΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ  λ•ŒκΉŒμ§€ μœ μ§€λœλ‹€.

- public을 뢙이면 같은 ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ μ–΄λ””μ„œλ‚˜ μ ‘κ·Όν•  수 μžˆλŠ” 'μ „μ—­λ³€μˆ˜(global variable)'의 성격을 κ°–λŠ”λ‹€.

 

βœ…ν•œ 클래슀의 λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ“€μ΄ 곡톡적인 값을 μœ μ§€ν•΄μ•Ό ν•˜λŠ” μ†μ„±μ˜ 경우, 클래슀 λ³€μˆ˜λ‘œ μ„ μ–Έν•œλ‹€.

 

*μ°Έμ‘°λ³€μˆ˜μ˜ μ„ μ–Έμ΄λ‚˜ 객체의 생성과 같이 클래슀의 정보가 ν•„μš”ν•  λ•Œ, ν΄λž˜μŠ€λŠ” λ©”λͺ¨λ¦¬μ— λ‘œλ”©λœλ‹€.

 

 

μ§€μ—­ λ³€μˆ˜ (local variable)

 

- λ©”μ„œλ“œ 내에 μ„ μ–Έλ˜μ–΄ λ©”μ„œλ“œ λ‚΄μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜κ³ , λ©”μ„œλ“œκ°€ μ’…λ£Œλ˜λ©΄ μ†Œλ©Έλœλ‹€.

- forλ¬Έ λ˜λŠ” while문의 블둝 내에 μ„ μ–Έλœ μ§€μ—­λ³€μˆ˜λŠ” μ§€μ—­λ³€μˆ˜κ°€ μ„ μ–Έλœ 블둝 {} λ‚΄μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜κ³ , 블둝을 λ²—μ–΄λ‚˜λ©΄ μ†Œλ©Έλœλ‹€.

 


2. ν΄λž˜μŠ€λ³€μˆ˜μ™€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜

 

μΉ΄λ“œ 클래슀λ₯Ό μ •μ˜ν•΄ 보자.

 

클래슀의 μ†μ„±μœΌλ‘œλŠ” μ•„λž˜μ˜ 4κ°€μ§€ μš”μ†Œκ°€ μžˆλ‹€.

- 무늬

- 숫자

- 폭

- 높이

 

각 CardμΈμŠ€ν„΄μŠ€λŠ” μžμ‹ λ§Œμ˜ 무늬 (kind)와 숫자(number)λ₯Ό μœ μ§€ν•˜κ³  μžˆμ–΄μ•Ό ν•˜λ―€λ‘œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ‘œ μ„ μ–Έν•˜μ˜€κ³ , 각 μΉ΄λ“œμ˜ ν­(width)κ³Ό 높이(height)λŠ” λͺ¨λ“  μΈμŠ€ν„΄μŠ€ κ°€ κ³΅ν†΅μ μœΌλ‘œ 같은 값을 μœ μ§€ν•΄μ•Ό ν•˜λ―€λ‘œ ν΄λž˜μŠ€ λ³€μˆ˜λ‘œ μ„ μ–Έν•˜μ˜€λ‹€.

class Card {
    // μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
    String kind;
    int num;
    
    // 클래슀 λ³€μˆ˜
    static int width;
    static int height;
}

μΉ΄λ“œμ˜ ν­μ΄λ‚˜ 높이, 즉 클래슀 λ³€μˆ˜μ˜ 값을 λ³€κ²½ν•˜λŠ” 경우, λͺ¨λ“  μΉ΄λ“œμ˜ width, height값이 λ³€κ²½λœλ‹€λŠ” 것을 λͺ…μ‹¬ν•˜μž.

 

class CardTest {
    public static void main(String[] args) {
        System.out.println(Card.width);
        System.out.println(Card.height);
    }
}

클래슀 λ³€μˆ˜λŠ” 'ν΄λž˜μŠ€μ΄λ¦„.ν΄λž˜μŠ€λ³€μˆ˜'의 ν˜•νƒœλ‘œ μ‚¬μš©ν•˜λ―€λ‘œ Card.width, Card.height와 같이 μ‚¬μš©ν•œλ‹€.

 

정리

 

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œλ§ˆλ‹€ μƒμ„±λ˜λ―€λ‘œ μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ 각기 λ‹€λ₯Έ 값을 μœ μ§€ν•  수 μžˆμ§€λ§Œ, 클래슀 λ³€μˆ˜λŠ” λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ ν•˜λ‚˜μ˜ μ €μž₯곡간을 κ³΅μœ ν•˜λ―€λ‘œ, 항상 κ³΅ν†΅λœ 값을 κ°–λŠ”λ‹€.


3. λ©”μ„œλ“œ

νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 일련의 λ¬Έμž₯듀을 ν•˜λ‚˜λ‘œ 묢은 것.

 

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

 

1. 높은 μž¬μ‚¬μš©μ„±

ν•œλ²ˆ λ§Œλ“€μ–΄ 놓은 λ©”μ„œλ“œλŠ” λͺ‡ 번이고 ν˜ΈμΆœν•  수 있으며, λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—μ„œλ„ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

 

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

λ°˜λ³΅λ˜λŠ” λ¬Έμž₯듀을 λ¬Άμ–΄μ„œ ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ‘œ μž‘μ„±ν•΄ λ†“μœΌλ©΄, λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” ν•œ λ¬Έμž₯으둜 λŒ€μ²΄ν•  수 μžˆλ‹€.

전체 μ½”λ“œμ˜ 길이가 μ§§μ•„μ§€κ³ , 변경사항이 λ°œμƒν–ˆμ„ λ•Œ μˆ˜μ •ν•΄μ•Ό ν•  μ½”λ“œμ˜ 양이 쀄어듀어 였λ₯˜κ°€ λ°œμƒν•  κ°€λŠ₯성도 ν•¨κ»˜ 쀄어든닀.

 

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

큰 규λͺ¨μ˜ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” λ¬Έμž₯듀을 μž‘μ—…λ‹¨μœ„λ‘œ λ‚˜λˆ μ„œ μ—¬λŸ¬ 개의 λ©”μ„œλ“œμ— λ‹΄μ•„ ν”„λ‘œκ·Έλž¨μ˜ ꡬ쑰λ₯Ό λ‹¨μˆœν™”μ‹œν‚€λŠ” 것이 ν•„μˆ˜μ μ΄λ‹€.

 

public static void main(String[] args) {
    int[] numArr = new int[10];

    initArr(numArr);    // 1. 배열을 μ΄ˆκΈ°ν™”
    printArr(numArr);   // 2. 배열을 좜λ ₯
    sortArr(numArr);    // 3. 배열을 μ •λ ¬
    printArr(numArr);   // 4. 배열을 좜λ ₯
}

이처럼 mainλ©”μ„œλ“œλŠ” ν”„λ‘œκ·Έλž¨μ˜ 전체 흐름이 ν•œλˆˆμ— λ“€μ–΄μ˜¬ μ •λ„λ‘œ λ‹¨μˆœν•˜κ²Œ κ΅¬μ‘°ν™”ν•˜λŠ” 것이 μ’‹λ‹€.

μ²˜μŒμ— ν”„λ‘œκ·Έλž¨μ„ 섀계할 λ•Œ λ‚΄μš©μ΄ μ—†λŠ” λ©”μ„œλ“œλ₯Ό μž‘μ—…λ‹¨μœ„λ‘œ λ§Œλ“€μ–΄ 놓고, ν•˜λ‚˜μ”© μ™„μ„±ν•΄ κ°€λŠ” 것도 ν”„λ‘œκ·Έλž¨μ„ κ΅¬μ‘°ν™”ν•˜λŠ” 쒋은 방법이닀. 


4. λ©”μ„œλ“œμ˜ μ„ μ–Έκ³Ό κ΅¬ν˜„

λ©”μ„œλ“œλŠ” 크게 두 λΆ€λΆ„, 선언뢀와 κ΅¬ν˜„λΆ€λ‘œ λ‚˜λˆ„μ–΄μ Έ μžˆλ‹€.

λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œμ΄λ¦„ (νƒ€μž… λ³€μˆ˜λͺ…, νƒ€μž… λ³€μˆ˜λͺ…,...)
{
        // λ©”μ„œλ“œ 호좜 μ‹œ μˆ˜ν–‰λ  μ½”λ“œ
}

 

int add(int a, int b) // μ„ μ–ΈλΆ€
{  
    return a + b;  // κ΅¬ν˜„λΆ€
}

 

λ©”μ„œλ“œ μ„ μ–ΈλΆ€

 

- λ©”μ„œλ“œ 이름

- λ§€κ°œλ³€μˆ˜ μ„ μ–Έ

- λ°˜ν™˜ νƒ€μž…

 

πŸ’‘ λ©”μ„œλ“œκ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ μ–΄λ–€ 값듀을 ν•„μš”λ‘œ ν•˜κ³  μž‘μ—…μ˜ 결과둜 μ–΄λ–€ νƒ€μž…μ˜ 값을 λ°˜ν™˜ν•˜λŠ”μ§€μ— λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•œλ‹€.

 

λ©”μ„œλ“œμ˜ μ„ μ–ΈλΆ€λ₯Ό λ³€κ²½ν•˜κ²Œ 되면, κ·Έ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜λŠ” λͺ¨λ“  곳을 같이 λ³€κ²½ν•΄μ•Ό ν•˜λ―€λ‘œ 후에 변경사항이 λ°œμƒν•˜μ§€ μ•Šλ„λ‘ μ‹ μ€‘νžˆ μž‘μ„±ν•΄μ•Ό ν•œλ‹€.

 

λ§€κ°œλ³€μˆ˜ μ„ μ–Έ

 

λ§€κ°œλ³€μˆ˜

- λ©”μ„œλ“œκ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ”λ° ν•„μš”ν•œ κ°’λ“€(μž…λ ₯)을 μ œκ³΅λ°›κΈ° μœ„ν•œ 것

- ν•„μš”ν•œ κ°’μ˜ 개수만큼 λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€.

- 각 λ³€μˆ˜ κ°„μ˜ ꡬ뢄은 μ‰Όν‘œ ', 'λ₯Ό μ‚¬μš©ν•œλ‹€.

 

μ£Όμ˜ν•  점

일반적인 λ³€μˆ˜ μ„ μ–Έκ³Ό 달리 두 λ³€μˆ˜μ˜ νƒ€μž…μ΄ 같아도 λ³€μˆ˜μ˜ νƒ€μž…μ„ μƒλž΅ν•  수 μ—†λ‹€.

int add(int a, int b) {}  // OK
int add(int a, b) {}	  // ERROR!! λ§€κ°œλ³€μˆ˜ b의 νƒ€μž…μ΄ μ—†λ‹€.

 

μ„ μ–Έν•  수 μžˆλŠ” λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜λŠ” 거의 μ œν•œμ΄ μ—†μ§€λ§Œ, 만일 μž…λ ₯ν•΄μ•Ό ν•  κ°’μ˜ κ°œμˆ˜κ°€ λ§Žμ€ κ²½μš°μ—λŠ” λ°°μ—΄μ΄λ‚˜ μ°Έμ‘°λ³€μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

만일, 값을 μ „ν˜€ μž…λ ₯받을 ν•„μš”κ°€ μ—†λ‹€λ©΄ κ΄„ν˜Έ () μ•ˆμ— 아무것도 적지 μ•ŠλŠ”λ‹€.

 

* λ§€κ°œλ³€μˆ˜λ„ λ©”μ„œλ“œ 내에 μ„ μ–Έλœ κ²ƒμœΌλ‘œ κ°„μ£Όλ˜λ―€λ‘œ 'μ§€μ—­ λ³€μˆ˜'이닀.

 

λ©”μ„œλ“œμ˜ 이름

 

λ©”μ„œλ“œμ˜ 이름도 μ•„λž˜ λΈ”λ‘œκ·Έμ— μ •λ¦¬ν•œ λ³€μˆ˜μ˜ λͺ…λͺ…κ·œμΉ™λŒ€λ‘œ μž‘μ„±ν•˜λ©΄ λœλ‹€.

 

2-1μž₯ λ³€μˆ˜

1. λ³€μˆ˜λž€? 단 ν•˜λ‚˜μ˜ 값을 μ €μž₯ν•  수 μžˆλŠ” λ©”λͺ¨λ¦¬ 곡간 2. λ³€μˆ˜μ˜ μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™” λ³€μˆ˜μ˜ μ„ μ–Έ int age; // λ³€μˆ˜νƒ€μž… λ³€μˆ˜μ΄λ¦„ λ©”λͺ¨λ¦¬μ˜ 빈 곡간에 ‘λ³€μˆ˜ νƒ€μž…’에 μ•Œλ§žμ€ 크기의 μ €μž₯ 곡간 확보 이

hyeon-z.tistory.com

 

λ©”μ„œλ“œλŠ” νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ―€λ‘œ λ©”μ„œλ“œ 이름은 'add'처럼 동사인 κ²½μš°κ°€ 많으며, μ΄λ¦„λ§ŒμœΌλ‘œλ„ λ©”μ„œλ“œμ˜ κΈ°λŠ₯을 μ‰½κ²Œ μ•Œ 수 μžˆλ„λ‘ ν•¨μΆ•μ μ΄λ©΄μ„œλ„ 의미 μžˆλŠ” μ΄λ¦„μœΌλ‘œ μ§€μ–΄μ•Ό ν•œλ‹€.

 

λ°˜ν™˜ νƒ€μž…

 

πŸ’‘λ©”μ„œλ“œμ˜ μž‘μ—… μˆ˜ν–‰ κ²°κ³Ό(좜λ ₯)인 'λ°˜ν™˜ κ°’'의 νƒ€μž…

λ°˜ν™˜κ°’μ΄ μ—†λŠ” κ²½μš°μ—λŠ” λ°˜ν™˜νƒ€μž…μœΌλ‘œ 'void'λ₯Ό μ λŠ”λ‹€.

 

* 'void'λŠ” '아무것도 μ—†μŒ'을 μ˜λ―Έν•œλ‹€.

 

λ©”μ„œλ“œμ˜ κ΅¬ν˜„λΆ€

 

πŸ’‘λ©”μ„œλ“œμ˜ μ„ μ–ΈλΆ€ λ‹€μŒμ— μ˜€λŠ” κ΄„ν˜Έ{}둜 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œ μˆ˜ν–‰λ  λ¬Έμž₯듀을 λ„£λŠ”λ‹€.

 

return문

 

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

이 λ¬Έμž₯은 μž‘μ—…μ„ μˆ˜ν–‰ν•œ 결과인 λ°˜ν™˜κ°’μ„ ν˜ΈμΆœν•œ λ©”μ„œλ“œλ‘œ μ „λ‹¬ν•˜λŠ”λ°, 이 κ°’μ˜ νƒ€μž…μ€ λ°˜ν™˜ νƒ€μž…κ³Ό μΌμΉ˜ν•˜κ±°λ‚˜ 적어도 μžλ™ ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ν•œ 것이어야 ν•œλ‹€.

 

μ—¬λŸ¬ 개의 λ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆλŠ” λ§€κ°œλ³€μˆ˜μ™€ 달리 return문은 단 ν•˜λ‚˜μ˜ κ°’λ§Œ λ°˜ν™˜ν•  수 μžˆλ‹€.

즉, λ©”μ„œλ“œλ‘œμ˜ μž…λ ₯(λ§€κ°œλ³€μˆ˜)은 μ—¬λŸ¬ 개일 수 μžˆμ§€λ§Œ 좜λ ₯(λ°˜ν™˜κ°’)은 μ΅œλŒ€ ν•˜λ‚˜λ§Œ ν—ˆμš©ν•œλ‹€.

 

μ§€μ—­ λ³€μˆ˜

 

πŸ’‘λ©”μ„œλ“œ 내에 μ„ μ–Έλœ λ³€μˆ˜

 

λ©”μ„œλ“œ 내에 μ„ μ–Έλœ λ³€μˆ˜λ“€μ€ κ·Έ λ©”μ„œλ“œ λ‚΄μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμœΌλ―€λ‘œ μ„œλ‘œ λ‹€λ₯Έ λ©”μ„œλ“œλΌλ©΄ 같은 μ΄λ¦„μ˜ λ³€μˆ˜λ₯Ό 선언해도 λœλ‹€.

int add(int x, int y) {
    int result = x + y;
    return result;
}

int multiply(int x, int y) {
    int result = x * y;
    return result;
}

μœ„μ— μ •μ˜λœ λ©”μ„œλ“œ add와 muliply에 각기 μ„ μ–Έλœ λ³€μˆ˜ x, y, resultλŠ” μ΄λ¦„λ§Œ 같을 뿐 μ„œλ‘œ λ‹€λ₯Έ λ³€μˆ˜μ΄λ‹€.


5. λ©”μ„œλ“œμ˜ 호좜

λ©”μ„œλ“œμ΄λ¦„(κ°’ 1, κ°’ 2,...)οΌ› // λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 방법

 

인자(argument)와 λ§€κ°œλ³€μˆ˜(parameter)

 

인자(인수)

λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ κ΄„ν˜Έ() μ•ˆμ— μ§€μ •ν•΄ μ€€ κ°’λ“€

 

λ§€κ°œλ³€μˆ˜

λ©”μ„œλ“œκ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ”λ° ν•„μš”ν•œ κ°’λ“€(μž…λ ₯), λ©”μ„œλ“œ μ„ μ–ΈλΆ€μ—μ„œ μ‚¬μš©

 

인자의 κ°œμˆ˜μ™€ μˆœμ„œλŠ” 호좜된 λ©”μ„œλ“œμ— μ„ μ–Έλœ λ§€κ°œλ³€μˆ˜μ™€ μΌμΉ˜ν•΄μ•Ό ν•œλ‹€.

μΈμžλŠ” λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜λ©΄μ„œ λ§€κ°œλ³€μˆ˜μ— λŒ€μž…λ˜λ―€λ‘œ, 인자의 νƒ€μž…μ€ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…κ³Ό μΌμΉ˜ν•˜κ±°λ‚˜ μžλ™ ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ν•œ 것이어야 ν•œλ‹€.

 

μ½”λ“œλ₯Ό 톡해 μ‚΄νŽ΄λ³΄λ©΄ mainν•¨μˆ˜μ—μ„œ add λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ κ΄„ν˜Έ () μ•ˆμ— 넣은 κ°’ 1, 2κ°€ 인자이고 add λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•  λ•Œ κ΄„ν˜Έ () μ•ˆμ— 넣은 κ°’ x, yκ°€ λ§€κ°œλ³€μˆ˜μ΄λ‹€.

public static void main(String[] args) {
    int result = add(1, 2);  // 인자 (1, 2)
}

static int add(int x, int y) {  // 맀개 λ³€μˆ˜ (int x, int y)
    return x + y;
}

 

λ©”μ„œλ“œμ— μ„ μ–Έλœ λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜μ™€ λ‹€λ₯Έ κ°’ λ˜λŠ” νƒ€μž…이 λ‹€λ₯Έ 값을 κ΄„ν˜Έ()에 λ„£μœΌλ©΄ μ»΄νŒŒμΌλŸ¬κ°€ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

int result1 = add(1); 			// ERROR. λ©”μ„œλ“œμ— μ„ μ–Έλœ λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜κ°€ 닀름
int result2 = add(1, 2, 3);		// ERROR. λ©”μ„œλ“œμ— μ„ μ–Έλœ λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜κ°€ 닀름
int result3 = add(1.0);			// ERROR. λ©”μ„œλ“œμ— μ„ μ–Έλœ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ΄ 닀름

 

λ©”μ„œλ“œμ˜ 싀행흐름

 

같은 클래슀 λ‚΄μ˜ λ©”μ„œλ“œλΌλ¦¬λŠ” μ°Έμ‘°λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ λ„ μ„œλ‘œ 호좜이 κ°€λŠ₯ν•˜μ§€λ§Œ staticλ©”μ„œλ“œλŠ” 같은 클래슀 λ‚΄μ˜ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μ—†λ‹€.

class MyMath {
    long add(long a, long b) {
        return a + b;
    }

    long add2(long a, long b) {
        return add(1, 2);  // OK
    }

    static long add3(long a, long b) {
        return add(1, 2);  // ERROR
    }
}

 

MyMath클래슀의 'add(long a, long b)'λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄μ„œλŠ” λ¨Όμ € 'MyMath mm = new MyMath();'와 같이 MyMath클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œ λ‹€μŒ μ°Έμ‘°λ³€μˆ˜ mm을 톡해야 ν•œλ‹€.

 

1. mainλ©”μ„œλ“œμ—μ„œ addλ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€. 호좜 μ‹œ μ €μž₯ν•œ 1Lκ³Ό 2L이 λ©”μ„œλ“œ add의 λ§€κ°œλ³€μˆ˜ a, b에 각각 볡사(λŒ€μž…)λœλ‹€.

2. λ©”μ„œλ“œ add의 κ΄„ν˜Έ{} μ•ˆμ— μžˆλŠ” λ¬Έμž₯듀이 μˆœμ„œλŒ€λ‘œ μˆ˜ν–‰λœλ‹€.

3. λ©”μ„œλ“œ add의 λͺ¨λ“  λ¬Έμž₯이 μ‹€ν–‰λ˜κ±°λ‚˜ return문을 λ§Œλ‚˜λ©΄, ν˜ΈμΆœν•œ λ©”μ„œλ“œ(main λ©”μ„œλ“œ)둜 λ˜λŒμ•„μ™€μ„œ μ΄ν›„μ˜ λ¬Έμž₯듀을 μ‹€ν–‰ν•œλ‹€.

 

βœ…λ©”μ„œλ“œκ°€ μ‹€ν–‰λ˜λ©΄ μ§€κΈˆκΉŒμ§€ μ‹€ν–‰ μ€‘μ΄λ˜ λ©”μ„œλ“œλŠ” 싀행을 μž μ‹œ λ©ˆμΆ”κ³  호좜된 λ©”μ„œλ“œμ˜ λ¬Έμž₯듀이 μ‹€ν–‰λœλ‹€.

 

long value = add(1L, 2L)
-> long value = 3L;

addλ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜ νƒ€μž…μ΄ longμ΄λ―€λ‘œ 인자둜 long λ˜λŠ” long으둜 μžλ™ ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ν•œ 값을 μ§€μ •ν•΄μ•Ό ν•œλ‹€.

λ˜ν•œ λ©”μ„œλ“œμ˜ κ²°κ³Όλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ value도 λ°˜ν™˜κ°’κ³Ό 같은 νƒ€μž…μ΄κ±°λ‚˜ λ°˜ν™˜κ°’μ΄ μžλ™ ν˜•λ³€ν™˜λ˜μ–΄ μ €μž₯될 수 μžˆλŠ” νƒ€μž…μ΄μ–΄μ•Ό ν•œλ‹€.

 

β“μ•„λž˜ addν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ— 인자둜 longνƒ€μž… 값을 λ„£λŠ”λ‹€λ©΄ μ–΄λ–»κ²Œ 될까?

class MyMath {
    double add(double a, double b) {
        return a + b;
    }
}

class MyMathTest {
    public static void main(String[] args) {
        MyMath mm = new MyMath();

        double value = mm.add(1L, 2L);
        System.out.println(value);  // 3.0
    }
}

 

μžλ™ ν˜•λ³€ν™˜μ— λŒ€ν•΄ κΆκΈˆν•˜λ©΄ μ°Έκ³  λ°”λž€λ‹€.

 

2-5μž₯ ν˜• λ³€ν™˜

1. ν˜• λ³€ν™˜(μΊμŠ€νŒ…, casting)μ΄λž€? πŸ’‘ λ³€μˆ˜ λ˜λŠ” μƒμˆ˜μ˜ νƒ€μž…μ„ λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것 2. ν˜• λ³€ν™˜ 방법 πŸ’‘ (νƒ€μž…) ν”Όμ—°μ‚°μž 여기에 μ‚¬μš©λ˜λŠ” κ΄„ν˜Έ()λŠ” ‘캐슀트 μ—°μ‚°μž’, ‘ν˜•λ³€ν™˜ μ—°μ‚°μž’라

hyeon-z.tistory.com

 

호좜 μ‹œμ— μž…λ ₯된 값은 λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜μ— λŒ€μž…λ˜λŠ” κ°’μ΄λ―€λ‘œ, longν˜•μ˜ 값을 doubleν˜•μ˜ λ³€μˆ˜μ— μ €μž₯ν•˜λŠ” 것과 κ°™λ‹€.

'double a = 1L;'을 μˆ˜ν–‰ν•˜λ©΄ longν˜• 값인 1L은 doubleν˜• 값인 1.0으둜 μžλ™ ν˜•λ³€ν™˜(μž‘μ€ νƒ€μž… -> 큰 νƒ€μž…)λ˜μ–΄ add의 λ§€κ°œλ³€μˆ˜ a에 μ €μž₯λœλ‹€.

 

λ”°λΌμ„œ addλ©”μ„œλ“œμ— 두 개의 μ •μˆ˜ κ°’(1L, 2L)을 μž…λ ₯ν•˜μ—¬ ν˜ΈμΆœν•˜μ˜€μŒμ—λ„ λΆˆκ΅¬ν•˜κ³  μ—°μ‚°κ²°κ³Όκ°€ doubleν˜•μ˜ 값이 λœλ‹€.


6. return문

πŸ’‘ ν˜„μž¬ μ‹€ν–‰ 쀑인 λ©”μ„œλ“œλ₯Ό μ’…λ£Œν•˜κ³  ν˜ΈμΆœν•œ λ©”μ„œλ“œλ‘œ λ˜λŒμ•„κ°„λ‹€.

 

μ§€κΈˆκΉŒμ§€λŠ” λ°˜ν™˜κ°’μ΄ μžˆμ„ λ•Œλ§Œ return문을 μ‚¬μš©ν–ˆμ§€λ§Œ, μ›λž˜λŠ” λ°˜ν™˜κ°’μ˜ μœ λ¬΄μ— 관계 없이 λͺ¨λ“  λ©”μ„œλ“œμ—λŠ” 적어도 ν•˜λ‚˜μ˜ return문이 μžˆμ–΄μ•Ό ν•œλ‹€.

 

❓ κ·Έλ ‡λ‹€λ©΄ λ°˜ν™˜ νƒ€μž…μ΄ 'void'인 경우, return문이 없어도 λ¬Έμ œκ°€ μ—†μ—ˆλ˜ μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒ?

 

κ·Έ μ΄μœ λŠ” μ»΄νŒŒμΌλŸ¬κ°€ λ©”μ„œλ“œμ˜ λ§ˆμ§€λ§‰μ— 'return;'을 μžλ™μ μœΌλ‘œ μΆ”κ°€ν•΄ μ£Όμ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€. 

 

λ°˜ν™˜ 값이 μžˆλŠ” κ²½μš°λŠ” λ°˜λ“œμ‹œ return문이 μžˆμ–΄μ•Ό ν•œλ‹€.

int add(int a, int b) {
    // ERROR
}

 

return문이 μ—†μœΌλ©΄ 컴파일 μ—λŸ¬(error : missing return statement)κ°€ λ°œμƒν•œλ‹€.

 

❓if문을 μ‚¬μš©ν•˜λŠ” 경우 ifλ¬Έ μ•ˆμ—λ§Œ return을 ν•΄μ£Όλ©΄ λ¬Έμ œκ°€ μ—†μ„κΉŒ?

int max(int a, int b) {
    if (a > b) {
        return a;
    }  
    // ERROR
}

 

return문이 μ‘΄μž¬ν•˜μ§€λ§Œ return문이 μ—†λ‹€λŠ” μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

κ·Έ μ΄μœ λŠ” ifλ¬Έ μ‘°κ±΄μ‹μ˜ 결과에 따라 return문이 μ‹€ν–‰λ˜μ§€ μ•Šμ„ 수 있기 λ•Œλ¬Έμ΄λ‹€.

 

if문의 else블둝에 return문을 μΆ”κ°€ν•˜κ±°λ‚˜ ifλ¬Έ μ‹€ν–‰ ν›„ return문을 μΆ”κ°€ν•΄μ„œ, 항상 결괏값이 λ°˜ν™˜λ˜λ„λ‘ ν•΄μ•Ό ν•œλ‹€.

int max(int a, int b) {
    if (a > b) {
        return a;  // 쑰건식이 참일 λ•Œ μ‹€ν–‰
    }
    else {
        return b;  // 쑰건식이 거짓일 λ•Œ μ‹€ν–‰
    }
}
int max(int a, int b) {
    if (a > b) {
        return a;
    }
    return b;
}

 

λ°˜ν™˜κ°’ 

 

return문의 λ°˜ν™˜κ°’μœΌλ‘œ 주둜 λ³€μˆ˜κ°€ 였긴 ν•˜μ§€λ§Œ μˆ˜μ‹μ΄ μ˜€λŠ” κ²½μš°λ„ μžˆλ‹€.

int add(int a, int b) {
    return a + b;
}

ν•΄λ‹Ή μˆ˜μ‹μ„ κ³„μ‚°ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.

 

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

 

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

 

νƒ€μž…λ§Œ 맞으면 μ–΄λ–€ 값도 λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 λ„˜μ–΄μ˜¬ 수 있기 λ•Œλ¬Έμ—, κ°€λŠ₯ν•œ λͺ¨λ“  경우의 μˆ˜μ— λŒ€ν•΄ κ³ λ―Όν•˜κ³  그에 λŒ€λΉ„ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•œλ‹€.

 

μ˜ˆμ‹œ μ½”λ“œ

float divide(int x, int y) {

    // λ‚˜λˆ„λŠ” 수(y)κ°€ 0인지 ν™•μΈν•œλ‹€.
    if (y == 0) {
        System.out.println("0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.");
        return 0;
    }

    return x / (float)y;
}

 

λ©”μ„œλ“œ divideλŠ” λ§€κ°œλ³€μˆ˜ xλ₯Ό y둜 λ‚˜λˆˆ κ²°κ³Όλ₯Ό μ‹€μˆ˜(floatνƒ€μž…)둜 λ°˜ν™˜ν•œλ‹€.

0으둜 λ‚˜λˆ„λŠ” 것은 κΈˆμ§€λ˜μ–΄ 있기 λ•Œλ¬Έμ— 계산 전에 y의 값이 0인지λ₯Ό 확인해야 ν•œλ‹€.

 

y의  값이 0인 κ²½μš°μ—λŠ” return문을 μ΄μš©ν•΄μ„œ μž‘μ—…μ„ μ€‘λ‹¨ν•˜κ³  λ©”μ„œλ“œλ₯Ό λΉ μ Έλ‚˜μ™€μ•Ό ν•œλ‹€. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄, λ‚˜λˆ„κΈ°λ₯Ό ν•˜λŠ” λ¬Έμž₯μ—μ„œ ν”„λ‘œκ·Έλž¨μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλœλ‹€.

 

μ μ ˆν•˜μ§€ μ•Šμ€ 값이 λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 λ„˜μ–΄μ˜¨λ‹€λ©΄ λ§€κ°œλ³€μˆ˜μ˜ 값을 λ³΄μ •ν•˜λ˜κ°€, λ³΄μ •ν•˜λŠ” 것이 λΆˆκ°€λŠ₯ν•˜λ‹€λ©΄ return문을 μ‚¬μš©ν•΄μ„œ μž‘μ—…μ„ μ€‘λ‹¨ν•˜κ³  ν˜ΈμΆœν•œ λ©”μ„œλ“œλ‘œ λ˜λŒμ•„κ°€μ•Ό ν•œλ‹€.

 

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

 

 

Reference

μžλ°”μ˜ 정석 - 남ꢁ μ„±

λŒ“κΈ€