๐ŸŽฏ 1์ฃผ์ฐจ Unit 2.1 โ€” ๋ฉ”์„œ๋“œ์˜ ๊ตฌ์กฐ

Psjยท6์ผ ์ „

F-lab

๋ชฉ๋ก ๋ณด๊ธฐ
23/52

๐ŸŽฏ Unit 2.1 โ€” ๋ฉ”์„œ๋“œ์˜ ๊ตฌ์กฐ

F-lab Java 1์ฃผ์ฐจ / Phase 2 / Unit 2.1 ๋ณธ๊ฒฉ ํ•™์Šต ์ž๋ฃŒ
9-์„น์…˜ ๋งˆ์Šคํ„ฐ ํ”„๋กฌํ”„ํŠธ ํ˜•์‹์œผ๋กœ ๊นŠ์ด ํŒŒํ—ค์นœ๋‹ค.

์„ ์ˆ˜ ์ง€์‹: Unit 1.2 (ํด๋ž˜์Šค์™€ ๊ฐ์ฒด์˜ ๋ณธ์งˆ)
๋‹ค์Œ Unit: 2.2 โ€” ๊ฐ€๋ณ€์ธ์ž (Varargs)


๐ŸŒ 1. ์„ธ์ƒ ์† ๋น„์œ 

๋ฉ”์„œ๋“œ = "์ „์ž๋ ˆ์ธ์ง€์˜ ๋ฒ„ํŠผ"

์ „์ž๋ ˆ์ธ์ง€๋ฅผ ๋– ์˜ฌ๋ ค๋ณด์„ธ์š”. ์ „์ž๋ ˆ์ธ์ง€์—๋Š” ๋‹ค์–‘ํ•œ ๋ฒ„ํŠผ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • "์‹œ์ž‘" ๋ฒ„ํŠผ โ€” ๋ˆ„๋ฅด๋ฉด ๋ฐ์šฐ๊ธฐ ์‹œ์ž‘ (์ž…๋ ฅ ์—†์Œ, ๊ฒฐ๊ณผ ์—†์Œ)
  • "+30์ดˆ" ๋ฒ„ํŠผ โ€” ๋ˆ„๋ฅด๋ฉด ์‹œ๊ฐ„์ด 30์ดˆ ์ถ”๊ฐ€ (์ž…๋ ฅ ์—†์Œ, ์‹œ๊ฐ„ ๋ณ€๊ฒฝ)
  • "ํ•ด๋™" ๋ฒ„ํŠผ โ€” ๋ฌด๊ฒŒ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ ์ ˆํ•œ ์‹œ๊ฐ„ ์ž๋™ ์„ค์ • (์ž…๋ ฅ: ๋ฌด๊ฒŒ, ๊ฒฐ๊ณผ: ์„ค์ •๋œ ์‹œ๊ฐ„)
  • "์˜จ๋„ ์กฐํšŒ" ๋ฒ„ํŠผ โ€” ๋ˆ„๋ฅด๋ฉด ํ˜„์žฌ ์Œ์‹ ์˜จ๋„ ํ‘œ์‹œ (์ž…๋ ฅ ์—†์Œ, ๊ฒฐ๊ณผ: ์˜จ๋„)

๊ฐ ๋ฒ„ํŠผ์€ ์„ธ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

  1. ์ด๋ฆ„ โ€” "ํ•ด๋™", "์‹œ์ž‘", "์˜จ๋„ ์กฐํšŒ"
  2. ์ž…๋ ฅ โ€” ๋ฐ›์„ ์ˆ˜๋„, ์•ˆ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Œ
  3. ๊ฒฐ๊ณผ โ€” ์ค„ ์ˆ˜๋„, ์•ˆ ์ค„ ์ˆ˜๋„ ์žˆ์Œ

โ†’ ์ด๊ฒŒ ๋ฉ”์„œ๋“œ์˜ ๋ณธ์งˆ์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ "๋ฒ„ํŠผ" ๋“ค์ด ๋ฉ”์„œ๋“œ.


๋” ์ผ์ƒ์ ์ธ ๋น„์œ  โ€” "ATM ๊ธฐ๊ธฐ"

ATM์˜ ๋ฉ”๋‰ด๋ฅผ ๋ณด๋ฉด:

ATM ๋ฒ„ํŠผ์ž…๋ ฅ๊ฒฐ๊ณผ
"์ž”์•ก ์กฐํšŒ"๋น„๋ฐ€๋ฒˆํ˜ธ์ž”์•ก
"์ถœ๊ธˆ"๋น„๋ฐ€๋ฒˆํ˜ธ, ๊ธˆ์•กํ˜„๊ธˆ + ์˜์ˆ˜์ฆ
"์ž…๊ธˆ"ํ˜„๊ธˆ์˜์ˆ˜์ฆ
"ํ™”๋ฉด ์ข…๋ฃŒ"์—†์Œ์—†์Œ

๊ฐ ๋ฒ„ํŠผ์ด ๋ฉ”์„œ๋“œ, ATM์ด ๊ฐ์ฒด ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ATM์˜ ๋‚ด๋ถ€ ๋™์ž‘(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ, ์นด๋“œ ์ธ์ฆ, ํ˜„๊ธˆ ์นด์šดํ„ฐ ์ž‘๋™...) ์„ ๋ชฐ๋ผ๋„, ๋ฒ„ํŠผ๋งŒ ๋ˆ„๋ฅด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

โ†’ ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์—๊ฒŒ ์ผ์„ ์‹œํ‚ค๋Š” ๋ช…๋ น ์ฐฝ๊ตฌ.


๋น„์œ ์˜ ํ•ต์‹ฌ ์ •๋ฆฌ

๋น„์œ  ์š”์†Œ์ž๋ฐ” ๋ฉ”์„œ๋“œ
๋ฒ„ํŠผ ์ด๋ฆ„๋ฉ”์„œ๋“œ๋ช…
๋ฒ„ํŠผ ์ž…๋ ฅ๋งค๊ฐœ๋ณ€์ˆ˜
๋ฒ„ํŠผ ๊ฒฐ๊ณผ๋ฐ˜ํ™˜๊ฐ’
๋ฒ„ํŠผ ๋ˆ„๋ฅด๋Š” ํ–‰์œ„๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
๋ˆ„๊ฐ€ ๋ˆ„๋ฅผ ์ˆ˜ ์žˆ๋‚˜์ ‘๊ทผ ์ œ์–ด์ž

๐Ÿ”ฅ 2. ํƒ„์ƒ ๋ฐฐ๊ฒฝ

๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋˜ ์‹œ์ ˆ โ€” ๋ฌดํ•œ ๋ฐ˜๋ณต ์ฝ”๋“œ

์ดˆ๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (์–ด์…ˆ๋ธ”๋ฆฌ, ์ดˆ๊ธฐ BASIC) ์—์„œ๋Š” ํ•จ์ˆ˜(๋ฉ”์„œ๋“œ) ๋ผ๋Š” ๊ฐœ๋…์ด ์—†๊ฑฐ๋‚˜ ์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜๋ ค๋ฉด:

[ํ”„๋กœ๊ทธ๋žจ]
  ์ฃผ๋ฌธ 1๋ฒˆ ์ฒ˜๋ฆฌ:
    - ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ ์ฝ”๋“œ 100์ค„
    - ์„ธ๊ธˆ ๊ณ„์‚ฐ ์ฝ”๋“œ 50์ค„
    - ๊ฒฐ์ œ ์ฝ”๋“œ 80์ค„
    
  ์ฃผ๋ฌธ 2๋ฒˆ ์ฒ˜๋ฆฌ:
    - ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ ์ฝ”๋“œ 100์ค„  โ† ๋˜‘๊ฐ™์€ ์ฝ”๋“œ ๋˜ ์ž‘์„ฑ
    - ์„ธ๊ธˆ ๊ณ„์‚ฐ ์ฝ”๋“œ 50์ค„   โ† ๋˜ ์ž‘์„ฑ
    - ๊ฒฐ์ œ ์ฝ”๋“œ 80์ค„        โ† ๋˜ ์ž‘์„ฑ
    
  ์ฃผ๋ฌธ 3๋ฒˆ ์ฒ˜๋ฆฌ:
    - ... ๋˜ ๋˜‘๊ฐ™์ด ...

๋ฌธ์ œ:

  • ๊ฐ™์€ ๋กœ์ง์„ ๋งค๋ฒˆ ๋ณต์‚ฌ โ†’ ์ฝ”๋“œ ํญ์ฆ
  • ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ ๋ฐฉ์‹ ๋ฐ”๋€Œ๋ฉด? ๋ชจ๋“  ๊ณณ์„ ์ˆ˜์ •
  • ํ•œ ๊ณณ์ด๋ผ๋„ ๋น ๋œจ๋ฆฌ๋ฉด ๋ฒ„๊ทธ
  • ๊ฐ€๋…์„ฑ X

ํ•จ์ˆ˜ (Function) ์˜ ๋“ฑ์žฅ

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  "ํ•จ์ˆ˜" ๊ฐ€ ๋“ฑ์žฅ:

ํ•จ์ˆ˜ ์ •์˜: ๊ฐ€๊ฒฉ_๊ณ„์‚ฐํ•˜๊ธฐ = (...์ฝ”๋“œ 100์ค„...)

[ํ”„๋กœ๊ทธ๋žจ]
  ์ฃผ๋ฌธ 1๋ฒˆ ์ฒ˜๋ฆฌ:
    - ๊ฐ€๊ฒฉ_๊ณ„์‚ฐํ•˜๊ธฐ() ํ˜ธ์ถœ
    - ์„ธ๊ธˆ_๊ณ„์‚ฐํ•˜๊ธฐ() ํ˜ธ์ถœ
    - ๊ฒฐ์ œํ•˜๊ธฐ() ํ˜ธ์ถœ
    
  ์ฃผ๋ฌธ 2๋ฒˆ ์ฒ˜๋ฆฌ:
    - ๊ฐ€๊ฒฉ_๊ณ„์‚ฐํ•˜๊ธฐ()  โ† ๊ฐ™์€ ํ•จ์ˆ˜ ์žฌ์‚ฌ์šฉ
    - ์„ธ๊ธˆ_๊ณ„์‚ฐํ•˜๊ธฐ()
    - ๊ฒฐ์ œํ•˜๊ธฐ()

ํšจ๊ณผ:

  • ์ฝ”๋“œ ํ•œ ๋ฒˆ๋งŒ ์ž‘์„ฑ
  • ์ˆ˜์ •๋„ ํ•œ ๋ฒˆ๋งŒ ํ•˜๋ฉด ๋ชจ๋“  ๊ณณ์— ๋ฐ˜์˜
  • ๊ฐ€๋…์„ฑ โ†‘

โ†’ ํ•จ์ˆ˜๋Š” "์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ๋‹จ์œ„" ๋ผ๋Š” ํ˜๋ช…์  ๋ฐœ๋ช….


๋ฉ”์„œ๋“œ (Method) โ€” ๊ฐ์ฒด์ง€ํ–ฅ์˜ ํ•จ์ˆ˜

์ž๋ฐ” ๊ฐ™์€ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด์— ๋ฌถ์ด๋ฉด์„œ ์ด๋ฆ„์ด ๋ฉ”์„œ๋“œ(method) ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ (Function)๋ฉ”์„œ๋“œ (Method)
์†Œ์†๋…๋ฆฝ์  (์ „์—ญ)ํด๋ž˜์Šค์— ์†ํ•จ
ํ˜ธ์ถœํ•จ์ˆ˜๋ช…()๊ฐ์ฒด.๋ฉ”์„œ๋“œ๋ช…()
๋ฐ์ดํ„ฐ ์ ‘๊ทผ์ธ์ž๋กœ ๋ฐ›์Œ์ž๊ธฐ ๊ฐ์ฒด์˜ ํ•„๋“œ ์ง์ ‘ ์ ‘๊ทผ
์˜ˆC์˜ printf()์ž๋ฐ”์˜ obj.toString()

โ†’ ๋ฉ”์„œ๋“œ๋Š” "๊ฐ์ฒด์˜ ํ–‰๋™์„ ์ •์˜ํ•˜๋Š” ํ•จ์ˆ˜".


ํ•ต์‹ฌ ํ†ต์ฐฐ

"๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์„ ์ •์˜ํ•œ ์•ฝ์†์ด๋‹ค."

๊ฐ์ฒด์—๊ฒŒ ๋ฉ”์„œ๋“œ๋Š”:

  • ์ž๊ธฐ ๋Šฅ๋ ฅ์˜ ๋ชฉ๋ก (์ด ๊ฐ์ฒด๋Š” ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋‚˜)
  • ์™ธ๋ถ€์™€ ์†Œํ†ตํ•˜๋Š” ํ†ต๋กœ (์™ธ๋ถ€์—์„œ ์–ด๋–ป๊ฒŒ ๋ถ€ํƒํ•  ์ˆ˜ ์žˆ๋‚˜)
  • ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ์˜ ๊ด€๋ฌธ (์บก์Аํ™”์˜ ํ•ต์‹ฌ ๋„๊ตฌ)

๐Ÿ’ฃ 3. ์—†์œผ๋ฉด ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ

๋ฉ”์„œ๋“œ ์—†์ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด?

๊ฐ์ฒด๊ฐ€ ๋ฐ์ดํ„ฐ(ํ•„๋“œ)๋งŒ ์žˆ๊ณ  ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์งˆ๊นŒ์š”?

// ๋ฉ”์„œ๋“œ ์—†๋Š” ๋นˆํ˜ˆ ๊ฐ์ฒด โŒ
public class BankAccount {
    public int balance;  // ์ž”์•ก (public์ด ๋ฌธ์ œ ๋” ํ‚ค์›€)
}

์ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์™ธ๋ถ€์—์„œ ๋ชจ๋“  ์ผ์„ ์ง์ ‘ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

BankAccount account = new BankAccount();
account.balance = 10000;

// ์ž…๊ธˆํ•˜๋ ค๋ฉด?
account.balance = account.balance + 5000;  // ์™ธ๋ถ€์—์„œ ์ง์ ‘ ๊ณ„์‚ฐ

// ์ถœ๊ธˆํ•˜๋ ค๋ฉด?
if (account.balance >= 3000) {
    account.balance = account.balance - 3000;  // ์™ธ๋ถ€์—์„œ ๊ฒ€์ฆ + ๊ณ„์‚ฐ
} else {
    System.out.println("์ž”์•ก ๋ถ€์กฑ");
}

// ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ๊ฐ™์€ ์ž…๊ธˆ/์ถœ๊ธˆ์ด ํ•„์š”ํ•  ๋•Œ?
// โ†’ ๊ฐ™์€ ์ฝ”๋“œ ๋˜ ์ž‘์„ฑ โŒ

๋ฌธ์ œ 1: ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๋‚ด๋ถ€ ๋™์ž‘์„ ์•Œ์•„์•ผ ํ•จ.
๋ฌธ์ œ 2: ๊ฐ™์€ ๋กœ์ง์ด ์—ฌ๋Ÿฌ ๊ณณ์— ์ค‘๋ณต.
๋ฌธ์ œ 3: ๋ˆ„๊ตฌ๋‚˜ balance ๋ฅผ ์ง์ ‘ ๋งŒ์ง โ†’ ๋ฌด๊ฒฐ์„ฑ X.
๋ฌธ์ œ 4: ์Œ์ˆ˜ ์ž”์•ก๋„ ๊ฐ€๋Šฅ (account.balance = -99999).


๋ฉ”์„œ๋“œ๋ฅผ ๋„์ž…ํ•˜๋ฉด

public class BankAccount {
    private int balance;  // private โ€” ์ง์ ‘ ์ ‘๊ทผ X
    
    public void deposit(int amount) {
        if (amount <= 0) {
            throw new IllegalArgumentException("์ž…๊ธˆ์•ก์€ ์–‘์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค");
        }
        this.balance += amount;
    }
    
    public void withdraw(int amount) {
        if (amount <= 0) {
            throw new IllegalArgumentException("์ถœ๊ธˆ์•ก์€ ์–‘์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค");
        }
        if (this.balance < amount) {
            throw new IllegalStateException("์ž”์•ก ๋ถ€์กฑ");
        }
        this.balance -= amount;
    }
    
    public int getBalance() {
        return this.balance;
    }
}

์‚ฌ์šฉ:

BankAccount account = new BankAccount();
account.deposit(10000);    // ์ž…๊ธˆ
account.withdraw(3000);    // ์ถœ๊ธˆ
int current = account.getBalance();

// ์•ˆ์ „์„ฑ โœ…
account.withdraw(99999);   // โ†’ ์˜ˆ์™ธ! ์ž”์•ก ๋ถ€์กฑ
account.deposit(-100);     // โ†’ ์˜ˆ์™ธ! ์–‘์ˆ˜๋งŒ ๊ฐ€๋Šฅ
// account.balance = -1;   // โ†’ ์ปดํŒŒ์ผ ์—๋Ÿฌ! private

ํšจ๊ณผ ๋น„๊ต

๋ฉ”์„œ๋“œ ์—†์Œ๋ฉ”์„œ๋“œ ์žˆ์Œ
์ฝ”๋“œ ์ค‘๋ณต๋งค๋ฒˆ ์™ธ๋ถ€์—์„œ ์ž‘์„ฑํ•œ ๋ฒˆ ์ •์˜ ํ›„ ์žฌ์‚ฌ์šฉ
๋ฐ์ดํ„ฐ ๋ณดํ˜ธ๋ˆ„๊ตฌ๋‚˜ ์ง์ ‘ ๋ณ€๊ฒฝ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ
๊ฒ€์ฆ ๋กœ์งํ˜ธ์ถœ์ž๊ฐ€ ์•Œ์•„์„œ๋ฉ”์„œ๋“œ ์•ˆ์— ํ•œ ๋ฒˆ๋งŒ
๋ณ€๊ฒฝ ์˜ํ–ฅ๋ชจ๋“  ํ˜ธ์ถœ์ž ์ˆ˜์ •๋ฉ”์„œ๋“œ๋งŒ ์ˆ˜์ •
๊ฐ€๋…์„ฑ๋‚ฎ์Œ๋†’์Œ

โ†’ ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์˜ ํ•ต์‹ฌ ๋„๊ตฌ. ๋ฉ”์„œ๋“œ ์—†์ด๋Š” ์บก์Аํ™”๋„, ๋‹คํ˜•์„ฑ๋„ ๋ถˆ๊ฐ€๋Šฅ.


โœ… 4. ํ•ด๊ฒฐ์ฑ… โ€” ๋ฉ”์„œ๋“œ์˜ ๊ตฌ์กฐ

๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜ (Signature) โญ

์ž๋ฐ” ๋ฉ”์„œ๋“œ์˜ ํ‘œ์ค€ ํ˜•ํƒœ:

[์ ‘๊ทผ์ œ์–ด์ž] [๊ธฐํƒ€์ œ์–ด์ž] ๋ฐ˜ํ™˜ํƒ€์ž… ๋ฉ”์„œ๋“œ๋ช…(๋งค๊ฐœ๋ณ€์ˆ˜๋ชฉ๋ก) [throws ์˜ˆ์™ธ] {
    // ๋ฉ”์„œ๋“œ ๋ณธ๋ฌธ
    return ๋ฐ˜ํ™˜๊ฐ’;
}

์‹ค์ œ ์˜ˆ์‹œ:

public static int calculateTotal(int price, int quantity) throws IllegalArgumentException {
    if (price < 0 || quantity < 0) {
        throw new IllegalArgumentException("์Œ์ˆ˜ ๋ถˆ๊ฐ€");
    }
    return price * quantity;
}

๊ฐ ๋ถ€๋ถ„์„ ๋ถ„ํ•ดํ•ด๋ณด๋ฉด:

๋ถ€๋ถ„์˜ˆ์‹œ์—ญํ• 
์ ‘๊ทผ ์ œ์–ด์žpublic๋ˆ„๊ฐ€ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€
๊ธฐํƒ€ ์ œ์–ด์žstatic์ธ์Šคํ„ด์Šค ์—†์ด ํ˜ธ์ถœ ๊ฐ€๋Šฅ
๋ฐ˜ํ™˜ ํƒ€์ž…int์–ด๋–ค ๊ฒฐ๊ณผ๋ฅผ ์ฃผ๋Š”๊ฐ€
๋ฉ”์„œ๋“œ๋ช…calculateTotal๋ฌด์—‡์„ ํ•˜๋Š”๊ฐ€
๋งค๊ฐœ๋ณ€์ˆ˜(int price, int quantity)๋ฌด์—‡์„ ์ž…๋ ฅ๋ฐ›๋Š”๊ฐ€
์˜ˆ์™ธ ์„ ์–ธthrows IllegalArgumentException์–ด๋–ค ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ์ˆ˜ ์žˆ๋Š”๊ฐ€
๋ณธ๋ฌธ{ ... }์‹ค์ œ ๋กœ์ง
๋ฐ˜ํ™˜๋ฌธreturn price * quantity;๊ฒฐ๊ณผ๋ฅผ ๋Œ๋ ค์คŒ

4๊ฐ€์ง€ ์ ‘๊ทผ ์ œ์–ด์ž โญ (๋ฉด์ ‘ ๋‹จ๊ณจ)

์ œ์–ด์ž๊ฐ™์€ ํด๋ž˜์Šค๊ฐ™์€ ํŒจํ‚ค์ง€์ž์‹ ํด๋ž˜์Šค (๋‹ค๋ฅธ ํŒจํ‚ค์ง€)๊ทธ ์™ธ
publicโœ…โœ…โœ…โœ…
protectedโœ…โœ…โœ…โŒ
(default)โœ…โœ…โŒโŒ
privateโœ…โŒโŒโŒ

์›์น™: ๊ฐ€์žฅ ์ข์€ ๋ฒ”์œ„๋กœ ์‹œ์ž‘ โ†’ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋„“ํž˜ (์บก์Аํ™” ์›์น™)

์‹ค๋ฌด ์˜ˆ์‹œ:

public class Fare {
    private int amount;              // ์™ธ๋ถ€ ์ฐจ๋‹จ โ€” ๊ฐ€์žฅ ์•ˆ์ „
    
    public int getAmount() { ... }   // ์™ธ๋ถ€ ์กฐํšŒ์šฉ โ€” ๊ณต๊ฐœ
    
    protected void onAmountChanged() { ... }  // ์ž์‹๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    
    void internalUpdate() { ... }    // ๊ฐ™์€ ํŒจํ‚ค์ง€๋งŒ (default)
    
    private void validate() { ... }  // ํด๋ž˜์Šค ๋‚ด๋ถ€๋งŒ
}

์•”๊ธฐ ํŒ: public > protected > default > private ์ˆœ์œผ๋กœ ์ข์•„์ง.


๋ฐ˜ํ™˜ ํƒ€์ž… ์ข…๋ฅ˜

// 1. ๊ธฐ๋ณธํ˜•
public int getAge() { return 25; }
public double getPrice() { return 9.99; }
public boolean isActive() { return true; }

// 2. ๊ฐ์ฒด
public String getName() { return "Alice"; }
public Customer getCustomer() { return this.customer; }

// 3. ๋ฐฐ์—ด
public int[] getScores() { return new int[]{90, 85, 70}; }

// 4. ์ปฌ๋ ‰์…˜
public List<String> getTags() { return List.of("a", "b"); }

// 5. ๋ฐ˜ํ™˜ ์—†์Œ
public void doSomething() {
    System.out.println("์ž‘์—… ์™„๋ฃŒ");
    // return ์—†์Œ (์ž๋™ ์ข…๋ฃŒ) ๋˜๋Š” return; ๊ฐ€๋Šฅ
}

void ์™€ return ์˜ ๋ฏธ๋ฌ˜ํ•œ ๊ด€๊ณ„

void ๋Š” "๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค" ๋Š” ์˜๋ฏธ:

public void greet(String name) {
    System.out.println("Hello, " + name);
    // return ์ƒ๋žต ๊ฐ€๋Šฅ (์ž๋™ ์ข…๋ฃŒ)
}

๊ทธ๋Ÿฌ๋‚˜ return; (๊ฐ’ ์—†๋Š” return) ์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅ โ€” ๋ฉ”์„œ๋“œ ์ฆ‰์‹œ ์ข…๋ฃŒ์šฉ:

public void greet(String name) {
    if (name == null) {
        return;  // โœ… ์ฆ‰์‹œ ์ข…๋ฃŒ, ์ดํ›„ ์ฝ”๋“œ ์‹คํ–‰ X
    }
    System.out.println("Hello, " + name);  // name์ด null์ด๋ฉด ์‹คํ–‰ ์•ˆ ๋จ
}

return value; ๋Š” ๋ถˆ๊ฐ€:

public void doSomething() {
    return 42;  // โŒ ์ปดํŒŒ์ผ ์—๋Ÿฌ: void ๋ฉ”์„œ๋“œ๋Š” ๊ฐ’ ๋ฐ˜ํ™˜ X
}

๋งค๊ฐœ๋ณ€์ˆ˜ (Parameter) vs ์ธ์ž (Argument)

์ž์ฃผ ํ—ท๊ฐˆ๋ฆฌ๋Š” ์šฉ์–ด:

// ๋งค๊ฐœ๋ณ€์ˆ˜ (Parameter) โ€” ๋ฉ”์„œ๋“œ ์ •์˜ ์‹œ
public int add(int a, int b) {  // โ† a, b๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜
    return a + b;
}

// ์ธ์ž (Argument) โ€” ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌํ•˜๋Š” ์‹ค์ œ ๊ฐ’
int result = add(3, 5);  // โ† 3, 5๊ฐ€ ์ธ์ž

๋น„์œ :

  • ๋งค๊ฐœ๋ณ€์ˆ˜ = ์Œ์‹์  ๋ฉ”๋‰ดํŒ์˜ "์˜ต์…˜" (์‚ฌ์ด์ฆˆ: ์†Œ/์ค‘/๋Œ€)
  • ์ธ์ž = ์†๋‹˜์ด ์‹ค์ œ๋กœ ์„ ํƒํ•œ ๊ฐ’ ("์ค‘ ์‚ฌ์ด์ฆˆ ์ฃผ์„ธ์š”")

๐Ÿ—๏ธ 5. ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ

public class Calculator {
    public int add(int a, int b) {
        int sum = a + b;
        return sum;
    }
}

Calculator calc = new Calculator();
int result = calc.add(3, 5);

JVM ๋‚ด๋ถ€ ํ๋ฆ„ โญ :

[Stack ์˜์—ญ]                    [Heap ์˜์—ญ]
  main()                          
  - calc (์ฐธ์กฐ) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’  Calculator ์ธ์Šคํ„ด์Šค
  - result                        โ†‘
                                  โ”‚
  add() ํ˜ธ์ถœ ์‹œ                   โ”‚
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”‚
  โ”‚ add()  โ† ์ƒˆ ์Šคํƒ ํ”„๋ ˆ์ž„      โ”‚
  โ”‚ - this (์ž๊ธฐ ๊ฐ์ฒด) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  โ”‚ - a = 3                       
  โ”‚ - b = 5                       
  โ”‚ - sum = 8                     
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           
  โ†“ return ํ›„                     
  add() ์Šคํƒ ํ”„๋ ˆ์ž„ ์ œ๊ฑฐ          
  result = 8                      

ํ•ต์‹ฌ ๋™์ž‘:
1. add(3, 5) ํ˜ธ์ถœ ์‹œ Stack์— ์ƒˆ ํ”„๋ ˆ์ž„ ์ƒ์„ฑ
2. ๋งค๊ฐœ๋ณ€์ˆ˜ a=3, b=5 ๊ฐ€ ์ƒˆ ํ”„๋ ˆ์ž„์— ๋ณต์‚ฌ (Pass by Value)
3. ๋ฉ”์„œ๋“œ ์•ˆ์˜ ์ง€์—ญ๋ณ€์ˆ˜ sum ๋„ ์ƒˆ ํ”„๋ ˆ์ž„์— ์ƒ์„ฑ
4. return ์‹œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜๋ฐ›๋Š” ๋ณ€์ˆ˜์— ๋ณต์‚ฌ
5. ๋ฉ”์„œ๋“œ ์ข…๋ฃŒ โ†’ Stack ํ”„๋ ˆ์ž„ ์ œ๊ฑฐ

โ†’ ์ด๊ฒŒ 4์ฃผ์ฐจ JVM ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์˜ ๊ธฐ์ดˆ.


this โ€” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์˜ ์ˆจ์€ ์ฃผ์ธ๊ณต

public class Counter {
    private int count = 0;
    
    public void increment() {
        this.count++;  // this = ํ˜ธ์ถœํ•œ ๊ฐ์ฒด
    }
}

Counter c1 = new Counter();
Counter c2 = new Counter();

c1.increment();  // this = c1, c1.count = 1
c1.increment();  // this = c1, c1.count = 2
c2.increment();  // this = c2, c2.count = 1

JVM์˜ ๋น„๋ฐ€ โญ :

  • c1.increment() ๋Š” ์‚ฌ์‹ค ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ Counter.increment(c1) ์œผ๋กœ ๋ณ€ํ™˜
  • ์ฆ‰, ์ฒซ ๋ฒˆ์งธ ์ธ์ž๊ฐ€ ์ž๋™์œผ๋กœ this ๋กœ ์ „๋‹ฌ๋จ
  • ์šฐ๋ฆฌ ๋ˆˆ์—๋Š” ์•ˆ ๋ณด์ผ ๋ฟ

โ†’ Java๊ฐ€ ๊ฐ์ฒด์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜.


๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ โญ

"๊ฐ™์€ ์ด๋ฆ„, ๋‹ค๋ฅธ ์‹œ๊ทธ๋‹ˆ์ฒ˜"

public class Calculator {
    public int add(int a, int b) { return a + b; }
    public double add(double a, double b) { return a + b; }
    public int add(int a, int b, int c) { return a + b + c; }
    public String add(String a, String b) { return a + b; }
}

calc.add(1, 2);          // ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ
calc.add(1.5, 2.5);      // ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ
calc.add(1, 2, 3);       // ์„ธ ๋ฒˆ์งธ ํ˜ธ์ถœ
calc.add("Hi", " Bob");  // ๋„ค ๋ฒˆ์งธ ํ˜ธ์ถœ

์˜ค๋ฒ„๋กœ๋”ฉ ๊ทœ์น™ โญ :

  • โœ… ๋ฉ”์„œ๋“œ๋ช… ๊ฐ™์Œ
  • โœ… ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž… ๋‹ค๋ฆ„ OR
  • โœ… ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐœ์ˆ˜ ๋‹ค๋ฆ„ OR
  • โœ… ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆœ์„œ ๋‹ค๋ฆ„
  • โŒ ๋ฐ˜ํ™˜ ํƒ€์ž…๋งŒ ๋‹ค๋ฅธ ๊ฑด X
public int foo() { ... }
public String foo() { ... }  // โŒ ์ปดํŒŒ์ผ ์—๋Ÿฌ

์™œ ๋ฐ˜ํ™˜ ํƒ€์ž…๋งŒ ๋‹ค๋ฅด๋ฉด ์•ˆ ๋˜๋‚˜?

  • ํ˜ธ์ถœ ์‹œ์ ์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์–ด๋А ๋ฉ”์„œ๋“œ์ธ์ง€ ๋ชจ๋ฆ„
  • obj.foo(); ๋งŒ์œผ๋กœ๋Š” int ๋ฉ”์„œ๋“œ์ธ์ง€ String ๋ฉ”์„œ๋“œ์ธ์ง€ ๊ตฌ๋ณ„ ๋ถˆ๊ฐ€

JVM ๋‚ด๋ถ€์˜ ๋ฉ”์„œ๋“œ ์‹๋ณ„ โญ :

  • JVM์€ ๋ฉ”์„œ๋“œ๋ฅผ "๋ฉ”์„œ๋“œ๋ช… + ๋งค๊ฐœ๋ณ€์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜" ๋กœ ์‹๋ณ„
  • ๋ฐ˜ํ™˜ ํƒ€์ž…์€ ์‹๋ณ„์— ํฌํ•จ ์•ˆ ๋จ

Pass by Value โ€” ์ž๋ฐ”์˜ ์ธ์ž ์ „๋‹ฌ ๋ฐฉ์‹

์ž๋ฐ”๋Š” ํ•ญ์ƒ ๊ฐ’์œผ๋กœ ์ „๋‹ฌ(Pass by Value) ํ•ฉ๋‹ˆ๋‹ค. (4์ฃผ์ฐจ์—์„œ ๊นŠ์ด ๋‹ค๋ฃธ)

๊ธฐ๋ณธํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜:

public void changeNumber(int x) {
    x = 100;  // ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ x๋งŒ ๋ณ€๊ฒฝ
}

int num = 10;
changeNumber(num);
System.out.println(num);  // 10 (๋ณ€๊ฒฝ ์•ˆ ๋จ)

๊ฐ์ฒด ๋งค๊ฐœ๋ณ€์ˆ˜ (์ฐธ์กฐ์˜ ๊ฐ’ ์ „๋‹ฌ):

public void changeName(Person p) {
    p.setName("Bob");  // ๊ฐ์ฒด ๋‚ด๋ถ€ ๋ณ€๊ฒฝ โ€” ์™ธ๋ถ€ ์˜ํ–ฅ โœ…
}

public void replacePerson(Person p) {
    p = new Person("Bob");  // ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ ์ฐธ์กฐ๋งŒ ๋ณ€๊ฒฝ
}

Person alice = new Person("Alice");
changeName(alice);
System.out.println(alice.getName());  // "Bob" (๊ฐ์ฒด ๋‚ด๋ถ€ ๋ณ€๊ฒฝ๋จ)

Person charlie = new Person("Charlie");
replacePerson(charlie);
System.out.println(charlie.getName());  // "Charlie" (์ฐธ์กฐ ๋ณ€๊ฒฝ ์•ˆ ๋จ)

โ†’ 4์ฃผ์ฐจ์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃฐ ์ฃผ์ œ. ์ง€๊ธˆ์€ "์ž๋ฐ”๋Š” ํ•ญ์ƒ ๊ฐ’ ์ „๋‹ฌ" ๋งŒ ๊ธฐ์–ต.


๐Ÿ’ป 6. ์‹ค์ „ ์ฝ”๋“œ ์˜ˆ์‹œ

ILIC ์šด์ž„ ์‹œ์Šคํ…œ์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ 1: ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ ํ˜•ํƒœ๋“ค

public class FareService {
    private final FareRepository repository;
    
    // 1. ๋งค๊ฐœ๋ณ€์ˆ˜ X, ๋ฐ˜ํ™˜ X
    public void initialize() {
        System.out.println("FareService ์ดˆ๊ธฐํ™”");
    }
    
    // 2. ๋งค๊ฐœ๋ณ€์ˆ˜ X, ๋ฐ˜ํ™˜ O
    public int getCount() {
        return repository.count();
    }
    
    // 3. ๋งค๊ฐœ๋ณ€์ˆ˜ O, ๋ฐ˜ํ™˜ X
    public void delete(Long id) {
        repository.deleteById(id);
    }
    
    // 4. ๋งค๊ฐœ๋ณ€์ˆ˜ O, ๋ฐ˜ํ™˜ O
    public Fare findById(Long id) {
        return repository.findById(id)
            .orElseThrow(() -> new EntityNotFoundException("์šด์ž„ ์—†์Œ"));
    }
    
    // 5. ์—ฌ๋Ÿฌ ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ณต์žกํ•œ ๋ฐ˜ํ™˜
    public List<Fare> search(Long customerId, FareStatus status, LocalDate from, LocalDate to) {
        return repository.findByCriteria(customerId, status, from, to);
    }
}

์˜ˆ์‹œ 2: ์ ‘๊ทผ ์ œ์–ด์ž ํ™œ์šฉ

public class Fare {
    private int amount;       // ์™ธ๋ถ€ ์ ‘๊ทผ ๋ถˆ๊ฐ€
    private FareStatus status;
    
    // public โ€” ์™ธ๋ถ€ API
    public void changeAmount(int newAmount) {
        validateAmount(newAmount);  // ๋‚ด๋ถ€ ํ˜ธ์ถœ
        this.amount = newAmount;
        notifyChange();
    }
    
    // protected โ€” ์ž์‹ ํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋“œ ๊ฐ€๋Šฅ
    protected void notifyChange() {
        System.out.println("์šด์ž„ ๋ณ€๊ฒฝ๋จ");
    }
    
    // package-private (default) โ€” ๊ฐ™์€ ํŒจํ‚ค์ง€๋งŒ
    void internalReset() {
        this.amount = 0;
        this.status = FareStatus.DRAFT;
    }
    
    // private โ€” ํด๋ž˜์Šค ๋‚ด๋ถ€๋งŒ
    private void validateAmount(int amount) {
        if (amount < 0) {
            throw new IllegalArgumentException("์Œ์ˆ˜ ๋ถˆ๊ฐ€");
        }
    }
    
    public int getAmount() { return amount; }
}

์ข‹์€ ์„ค๊ณ„์˜ ์‹ ํ˜ธ:

  • private ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์Œ (๋‚ด๋ถ€ ๊ตฌํ˜„)
  • public ์€ ๋ช…ํ™•ํ•œ ์™ธ๋ถ€ API๋งŒ
  • protected, default ๋Š” ์˜๋„์ ์ธ ๊ฒฝ์šฐ๋งŒ

์˜ˆ์‹œ 3: ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ ํ™œ์šฉ

public class FareCalculator {
    
    // ๊ธฐ๋ณธ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ
    public int calculate(int distance) {
        return distance * 500;
    }
    
    // ๊ฑฐ๋ฆฌ + ๋ฌด๊ฒŒ
    public int calculate(int distance, int weight) {
        return distance * 500 + weight * 100;
    }
    
    // ๊ฑฐ๋ฆฌ + ๋ฌด๊ฒŒ + ๊ธด๊ธ‰ ์—ฌ๋ถ€
    public int calculate(int distance, int weight, boolean urgent) {
        int base = calculate(distance, weight);
        return urgent ? base * 2 : base;
    }
    
    // FareRequest ๊ฐ์ฒด๋กœ
    public int calculate(FareRequest request) {
        return calculate(
            request.getDistance(), 
            request.getWeight(), 
            request.isUrgent()
        );
    }
}

// ์‚ฌ์šฉ โ€” ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ๋‹ค์–‘ํ•œ ํ˜ธ์ถœ
calc.calculate(100);                              // 50000
calc.calculate(100, 50);                          // 55000
calc.calculate(100, 50, true);                    // 110000
calc.calculate(new FareRequest(100, 50, true));   // 110000

ํšจ๊ณผ: ์‚ฌ์šฉ์ž๋Š” calculate ๋ผ๋Š” ํ•œ ์ด๋ฆ„ ๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋จ. ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ•œ ๋ฉ”์„œ๋“œ๋ช…์œผ๋กœ ์ฒ˜๋ฆฌ.


์˜ˆ์‹œ 4: void์™€ return; ์˜ ํ™œ์šฉ

public class FareValidator {
    
    public void validate(Fare fare) {
        // Early Return ํŒจํ„ด โญ
        if (fare == null) {
            return;  // ์ฆ‰์‹œ ์ข…๋ฃŒ
        }
        if (fare.getAmount() < 0) {
            throw new IllegalArgumentException("์Œ์ˆ˜ ์šด์ž„");
        }
        if (fare.getStatus() == null) {
            throw new IllegalStateException("์ƒํƒœ ์—†์Œ");
        }
        // ๋ชจ๋“  ๊ฒ€์ฆ ํ†ต๊ณผ
        System.out.println("๊ฒ€์ฆ OK");
    }
}

Early Return ํŒจํ„ด:

  • ์กฐ๊ฑด์— ์•ˆ ๋งž์œผ๋ฉด ์ฆ‰์‹œ return
  • ์ค‘์ฒฉ if๋ฅผ ์ค„์—ฌ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ

Bad (์ค‘์ฒฉ):

public void validate(Fare fare) {
    if (fare != null) {
        if (fare.getAmount() >= 0) {
            if (fare.getStatus() != null) {
                // ๊ฒ€์ฆ OK โ€” ๋“ค์—ฌ์“ฐ๊ธฐ ์ง€์˜ฅ โŒ
            }
        }
    }
}

Good (Early Return):

public void validate(Fare fare) {
    if (fare == null) return;
    if (fare.getAmount() < 0) throw new IllegalArgumentException();
    if (fare.getStatus() == null) throw new IllegalStateException();
    
    // ๋ฉ”์ธ ๋กœ์ง โ€” ํ‰ํ‰ํ•œ ๊ตฌ์กฐ โœ…
}

โš ๏ธ 7. ์ฃผ์˜์‚ฌํ•ญ & ํ”ํ•œ ์‹ค์ˆ˜

์‹ค์ˆ˜ 1: ๋ฉ”์„œ๋“œ๋ช…์„ ๋™์‚ฌ๊ฐ€ ์•„๋‹Œ ๋ช…์‚ฌ๋กœ

// โŒ ๋ช…์‚ฌ โ€” ๋ฉ”์„œ๋“œ์ธ์ง€ ๋ณ€์ˆ˜์ธ์ง€ ๋ชจํ˜ธ
public int total() { ... }
public String name() { ... }

// โœ… ๋™์‚ฌ โ€” ์˜๋„ ๋ช…ํ™•
public int calculateTotal() { ... }
public String getName() { ... }
public boolean isActive() { ... }  // ์ง„์œ„ํ˜•์€ is/has/can์œผ๋กœ

๊ทœ์น™ โญ :

  • ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ: ๋™์‚ฌ (calculate, find, save)
  • ์กฐํšŒ ๋ฉ”์„œ๋“œ: get (getName, getAge)
  • ์ง„์œ„ํ˜•: is/has/can (isActive, hasPermission, canDelete)

์‹ค์ˆ˜ 2: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Œ

// โŒ ๋งค๊ฐœ๋ณ€์ˆ˜ 7๊ฐœ
public Fare createFare(
    Long customerId,
    int amount,
    String currency,
    LocalDate departureDate,
    String origin,
    String destination,
    boolean urgent
) { ... }

๋ฌธ์ œ:

  • ํ˜ธ์ถœ ์‹œ ์ˆœ์„œ ํ—ท๊ฐˆ๋ฆผ
  • ๊ฐ™์€ ํƒ€์ž…์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ฉด ์‹ค์ˆ˜ ์œ„ํ—˜
createFare(1L, 50000, "KRW", date, "์„œ์šธ", "๋ถ€์‚ฐ", true);
createFare(1L, 50000, "KRW", date, "๋ถ€์‚ฐ", "์„œ์šธ", true);  // ์ถœ๋ฐœ-๋„์ฐฉ ๋ฐ”๋€œ! โŒ

ํ•ด๊ฒฐ โ€” ๊ฐ์ฒด๋กœ ๋ฌถ๊ธฐ:

public Fare createFare(FareCreateRequest request) { ... }

public record FareCreateRequest(
    Long customerId,
    int amount,
    String currency,
    LocalDate departureDate,
    Route route,        // origin, destination ๋ฌถ์Œ
    boolean urgent
) {}

์›์น™: ๋งค๊ฐœ๋ณ€์ˆ˜ 4๊ฐœ ์ด์ƒ์ด๋ฉด ๊ฐ์ฒด๋กœ ๋ฌถ๊ธฐ ๊ฒ€ํ† .


์‹ค์ˆ˜ 3: ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ๋ณ€๊ฒฝ

// โŒ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝ โ€” ํ˜ผ๋ž€ ์•ผ๊ธฐ
public int processAmount(int amount) {
    amount = amount * 2;  // ๋งค๊ฐœ๋ณ€์ˆ˜ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝ
    if (amount > 10000) {
        amount = 10000;
    }
    return amount;
}

๋ฌธ์ œ:

  • ์›๋ž˜ ์ž…๋ ฅ๊ฐ’์ด ๋ฌด์—‡์ด์—ˆ๋Š”์ง€ ์ถ”์  ์–ด๋ ค์›€
  • ๋””๋ฒ„๊น… ์–ด๋ ค์›€

ํ•ด๊ฒฐ โ€” ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” final, ์ƒˆ ๋ณ€์ˆ˜ ์‚ฌ์šฉ:

public int processAmount(final int amount) {
    int result = amount * 2;
    if (result > 10000) {
        result = 10000;
    }
    return result;
}

์‹ค์ˆ˜ 4: void ๋ฉ”์„œ๋“œ์ธ๋ฐ ๊ฒฐ๊ณผ๋ฅผ returnํ•˜๋ ค ํ•จ

public void doSomething() {
    int result = ...;
    return result;  // โŒ ์ปดํŒŒ์ผ ์—๋Ÿฌ
}

ํ•ด๊ฒฐ:

  • ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ๋ฐ˜ํ™˜ ํƒ€์ž… ๋ณ€๊ฒฝ
  • ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š” ์—†์œผ๋ฉด return; ๋งŒ (๊ฐ’ ์—†์ด)

์‹ค์ˆ˜ 5: ๋„ˆ๋ฌด ๊ธด ๋ฉ”์„œ๋“œ (God Method)

// โŒ ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๊ฐ€ 200์ค„
public void processOrder(Order order) {
    // 1. ๊ฒ€์ฆ (50์ค„)
    // 2. ๊ณ„์‚ฐ (50์ค„)
    // 3. ์ €์žฅ (30์ค„)
    // 4. ์•Œ๋ฆผ (40์ค„)
    // 5. ๋กœ๊น… (30์ค„)
}

๋ฌธ์ œ:

  • ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์ผ์„ ํ•จ (SRP ์œ„๋ฐ˜)
  • ํ…Œ์ŠคํŠธ ๋ถˆ๊ฐ€๋Šฅ
  • ๊ฐ€๋…์„ฑ X

ํ•ด๊ฒฐ โ€” ์ž‘์€ ๋ฉ”์„œ๋“œ๋กœ ๋ถ„๋ฆฌ:

public void processOrder(Order order) {
    validate(order);
    int total = calculate(order);
    save(order);
    notify(order);
    log(order);
}

private void validate(Order order) { ... }
private int calculate(Order order) { ... }
private void save(Order order) { ... }
private void notify(Order order) { ... }
private void log(Order order) { ... }

๊ถŒ์žฅ: ๋ฉ”์„œ๋“œ๋Š” ํ•œ ํ™”๋ฉด์— ๋“ค์–ด์˜ค๋Š” ์ •๋„ (๋ณดํ†ต 20์ค„ ์ด๋‚ด).


์‹ค์ˆ˜ 6: ์˜ค๋ฒ„๋กœ๋”ฉ ๋‚จ์šฉ์œผ๋กœ ๋ชจํ˜ธํ•จ ๋ฐœ์ƒ

public class Calculator {
    public void process(int x) { ... }
    public void process(Integer x) { ... }  // โš ๏ธ Auto-boxing ๋ชจํ˜ธํ•จ
}

calc.process(10);  // int? Integer? ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์šฐ์„ ์ˆœ์œ„ ๊ฒฐ์ •

์›์น™:

  • ์˜ค๋ฒ„๋กœ๋”ฉ์€ ๋ช…๋ฐฑํžˆ ๋‹ค๋ฅธ ์‹œ๋‚˜๋ฆฌ์˜ค ์ผ ๋•Œ๋งŒ
  • ๋น„์Šทํ•œ ํƒ€์ž…(int/Integer, long/Long) ์œผ๋กœ ์˜ค๋ฒ„๋กœ๋”ฉ์€ ํ”ผํ•˜๊ธฐ

๐Ÿ”— 8. ์—ฐ๊ด€ ๊ฐœ๋… ๋งต

์ง์ ‘ ์ด์–ด์ง€๋Š” ํ•™์Šต

[Unit 2.1: ๋ฉ”์„œ๋“œ์˜ ๊ตฌ์กฐ]  โ† ์ง€๊ธˆ ์—ฌ๊ธฐ
        โ†“
[Unit 2.2: ๊ฐ€๋ณ€์ธ์ž] โ€” ๋‹ค์Œ ํ•™์Šต
        โ†“
[Unit 2.3: ์ƒ์†๊ณผ ์ƒ์„ฑ์ž ์ฒด์ด๋‹]
        โ†“
[Unit 2.4: ๋‹คํ˜•์„ฑ] โ˜… โ€” OOP์˜ ์ •์ 

์ด Unit์˜ ๊ฐœ๋…์ด ํ™œ์šฉ๋˜๋Š” ๊ณณ

1์ฃผ์ฐจ ๋‚ด:

  • Phase 3 (SOLID): SRP โ€” ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๊ฐ€ ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ
  • Phase 4 (JVM ๋ฉ”๋ชจ๋ฆฌ): ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ Stack ํ”„๋ ˆ์ž„ ์ƒ์„ฑ
  • Phase 5 (GC): ๋ฉ”์„œ๋“œ ์ข…๋ฃŒ ์‹œ ์ง€์—ญ๋ณ€์ˆ˜ ์†Œ๋ฉธ

๋ฏธ๋ž˜ ์ฃผ์ฐจ:

  • 3์ฃผ์ฐจ (์ œ๋„ค๋ฆญ): ๋ฉ”์„œ๋“œ์— ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ ์ถ”๊ฐ€ (<T> T foo(T input))
  • 3์ฃผ์ฐจ (๋žŒ๋‹ค): ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ’์ฒ˜๋Ÿผ ๋‹ค๋ฃจ๊ธฐ
  • 8-9์ฃผ์ฐจ (AOP): ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ํ”„๋ก์‹œ๋กœ ๊ฐ€๋กœ์ฑ„๊ธฐ
  • 15์ฃผ์ฐจ (Spring MVC): HandlerAdapter๊ฐ€ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ถ„์„ํ•ด์„œ ์ž๋™ ํ˜ธ์ถœ
  • 18์ฃผ์ฐจ (Security): @PreAuthorize ๊ฐ€ ๋ฉ”์„œ๋“œ ๋‹จ์œ„ ๊ถŒํ•œ ๊ฒ€์ฆ

๋ฉ”์„œ๋“œ์™€ ๋””์ž์ธ ํŒจํ„ด

ํŒจํ„ด๋ฉ”์„œ๋“œ ํ™œ์šฉ
Strategy์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ๊ตฌํ˜„
Template Method์ƒ์œ„ ๋ฉ”์„œ๋“œ๊ฐ€ ํ๋ฆ„, ํ•˜์œ„ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ตฌํ˜„
Factory Method๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ฉ”์„œ๋“œ๋กœ ์บก์Аํ™”
Builder๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์œผ๋กœ ๊ฐ์ฒด ๊ตฌ์„ฑ

โ†’ 5์ฃผ์ฐจ์—์„œ ๋ณธ๊ฒฉ ํ•™์Šต.


๋ฉด์ ‘ ๋‹จ๊ณจ ์งˆ๋ฌธ ๋งคํ•‘

์งˆ๋ฌธ์ด Unit์—์„œ์˜ ๋‹ต
"๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ์ด ๋ญ”๊ฐ€์š”?"๊ฐ™์€ ์ด๋ฆ„, ๋‹ค๋ฅธ ์‹œ๊ทธ๋‹ˆ์ฒ˜ (ํƒ€์ž…/๊ฐœ์ˆ˜/์ˆœ์„œ)
"์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์˜ ์ฐจ์ด๋Š”?"์˜ค๋ฒ„๋กœ๋”ฉ=๊ฐ™์€ ํด๋ž˜์Šค ๋‹ค๋ฅธ ์‹œ๊ทธ๋‹ˆ์ฒ˜, ์˜ค๋ฒ„๋ผ์ด๋”ฉ=์ƒ์†์—์„œ ๋ฉ”์„œ๋“œ ์žฌ์ •์˜ (Unit 2.4)
"์ ‘๊ทผ ์ œ์–ด์ž 4๊ฐ€์ง€ ์ฐจ์ด๋Š”?"public > protected > default > private
"Pass by Value vs Reference?"์ž๋ฐ”๋Š” ํ•ญ์ƒ Pass by Value (4์ฃผ์ฐจ์—์„œ ์ž์„ธํžˆ)
"void์—์„œ return ๊ฐ€๋Šฅ?"๊ฐ’ ์—†๋Š” return; ๋งŒ ๊ฐ€๋Šฅ

๐Ÿ“ 9. ํ•ต์‹ฌ ์š”์•ฝ โ€” 3์ค„ ์ •๋ฆฌ

1๏ธโƒฃ ๋ฉ”์„œ๋“œ๋Š” "๊ฐ์ฒด์˜ ํ–‰๋™์„ ์ •์˜ํ•˜๋Š” ๋‹จ์œ„" ๋‹ค.

์ ˆ์ฐจ์ง€ํ–ฅ์˜ ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด์— ๋ฌถ์ธ ํ˜•ํƒœ๋กœ, ์‹œ๊ทธ๋‹ˆ์ฒ˜(์ ‘๊ทผ์ œ์–ด์ž + ๋ฐ˜ํ™˜ํƒ€์ž… + ๋ฉ”์„œ๋“œ๋ช… + ๋งค๊ฐœ๋ณ€์ˆ˜) ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ๋ฉ”์„œ๋“œ ์—†์ด๋Š” ์บก์Аํ™”๋„ ๋‹คํ˜•์„ฑ๋„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ๊ฐ์ฒด์ง€ํ–ฅ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ ๋„๊ตฌ ๋‹ค.

2๏ธโƒฃ ์ ‘๊ทผ ์ œ์–ด์ž๋กœ "๋ˆ„๊ฐ€ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€" ๋ฅผ ํ†ต์ œํ•œ๋‹ค.

private ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋„“ํžˆ๋Š” ๊ฒƒ์ด ์บก์Аํ™”์˜ ํ•ต์‹ฌ. public > protected > default > private ์ˆœ์œผ๋กœ ์ข์•„์ง€๋ฉฐ, ์ข์„์ˆ˜๋ก ์•ˆ์ „ํ•˜๋‹ค. ILIC ๊ฐ™์€ ํฐ ์‹œ์Šคํ…œ์—์„œ๋Š” ์˜๋„์ ์ธ ์ ‘๊ทผ ์ œ์–ด๊ฐ€ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ๊ฒฐ์ •ํ•œ๋‹ค.

3๏ธโƒฃ ์ข‹์€ ๋ฉ”์„œ๋“œ๋Š” "ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ, ์งง๊ฒŒ, ๋ช…ํ™•ํ•œ ์ด๋ฆ„์œผ๋กœ" ํ•œ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ 4๊ฐœ ์ด์ƒ์ด๋ฉด ๊ฐ์ฒด๋กœ ๋ฌถ๊ธฐ, ๋ฉ”์„œ๋“œ๋Š” ํ•œ ํ™”๋ฉด์— ๋“ค์–ด์˜ค๊ฒŒ (20์ค„ ๋‚ด์™ธ), ๋™์‚ฌ ์‹œ์ž‘ ์ด๋ฆ„ (calculate, find, save), ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์•ˆ์—์„œ ๋ณ€๊ฒฝ X โ€” ์ด ๊ทœ์น™๋“ค์ด ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๊ฒฐ์ •ํ•œ๋‹ค.


๐ŸŽ“ ํ•™์Šต ์ž๊ธฐ ์ ๊ฒ€

๊ธฐ๋ณธ ์ดํ•ด

  • ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜์˜ 5๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งํ•  ์ˆ˜ ์žˆ๋‹ค
  • 4๊ฐ€์ง€ ์ ‘๊ทผ ์ œ์–ด์ž์˜ ์ฐจ์ด๋ฅผ ํ‘œ๋กœ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค
  • void ๋ฉ”์„œ๋“œ์—์„œ return; ์˜ ์˜๋ฏธ๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ธ์ž์˜ ์ฐจ์ด๋ฅผ ์ •ํ™•ํžˆ ๊ตฌ๋ณ„ํ•œ๋‹ค

์‹ค์ „ ์ ์šฉ

  • ILIC์˜ ํ•œ ํด๋ž˜์Šค๋ฅผ ๊ณจ๋ผ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค
  • private ๋ฉ”์„œ๋“œ๋ฅผ ๋Š˜๋ฆฌ๊ณ  public์„ ์ค„์ด๋Š” ๋ฆฌํŒฉํ† ๋ง์„ ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋งค๊ฐœ๋ณ€์ˆ˜ 5๊ฐœ ์ด์ƒ์ธ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ์ฒด๋กœ ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ๋‹ค

๋ฉด์ ‘ ๋Œ€๋น„ (1-2๋ถ„ ๋‹ต๋ณ€)

  • "๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์˜ ์ฐจ์ด๋Š”?" ๋‹ต๋ณ€ ๊ฐ€๋Šฅ
  • "์™œ private์ด ์ข‹์€๊ฐ€?" ๋‹ต๋ณ€ ๊ฐ€๋Šฅ (์บก์Аํ™” ๊ด€์ )
  • "๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— ๋ฐ˜ํ™˜ ํƒ€์ž…์€ ํฌํ•จ๋˜๋‚˜?" ๋‹ต๋ณ€ ๊ฐ€๋Šฅ (NO โ€” ์‹๋ณ„์— ๋ฏธ์‚ฌ์šฉ)

์ž๊ธฐ ์ ๊ฒ€ ์งˆ๋ฌธ ๋‹ต๋ณ€

Q1: void ๋ฐ˜ํ™˜ ํƒ€์ž…์˜ ๋ฉ”์„œ๋“œ์—์„œ return์„ ์“ธ ์ˆ˜ ์žˆ๋Š”๊ฐ€?

YES. ๋‹จ, ๊ฐ’ ์—†๋Š” return; ๋งŒ ๊ฐ€๋Šฅ. ๋ฉ”์„œ๋“œ๋ฅผ ์ฆ‰์‹œ ์ข…๋ฃŒ ํ•˜๋Š” ์šฉ๋„.

public void greet(String name) {
    if (name == null) {
        return;  // โœ… ์ฆ‰์‹œ ์ข…๋ฃŒ
    }
    System.out.println("Hello, " + name);
}

public void doSomething() {
    return 42;  // โŒ ๊ฐ’์ด ์žˆ๋Š” return ๋ถˆ๊ฐ€
}

ํ™œ์šฉ: Early Return ํŒจํ„ด โ€” ์กฐ๊ฑด์— ๋งž์ง€ ์•Š์œผ๋ฉด ์ฆ‰์‹œ ์ข…๋ฃŒํ•ด์„œ ์ค‘์ฒฉ if ์ค„์ด๊ธฐ.


Q2: ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†๋Š” ๋ฉ”์„œ๋“œ์™€ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ ๋ฐฉ์‹ ์ฐจ์ด๋Š”?

ํ˜ธ์ถœ ์‹œ ๊ด„ํ˜ธ ์•ˆ์— ์ธ์ž๋ฅผ ๋„˜๊ธฐ๋А๋ƒ์˜ ์ฐจ์ด:

// ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์Œ โ€” ๋นˆ ๊ด„ํ˜ธ
obj.method();

// ๋งค๊ฐœ๋ณ€์ˆ˜ ์žˆ์Œ โ€” ์ธ์ž ์ „๋‹ฌ
obj.method(arg1, arg2);

โš ๏ธ ์ฃผ์˜ โ€” ๊ด„ํ˜ธ๋Š” ํ•ญ์ƒ ํ•„์š”:

obj.method;    // โŒ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์•„๋‹˜ (๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋กœ ํ•ด์„๋˜๊ฑฐ๋‚˜ ์—๋Ÿฌ)
obj.method();  // โœ… ํ˜ธ์ถœ

โš ๏ธ ๋ฉ”์„œ๋“œ ์ฐธ์กฐ ์™€์˜ ์ฐจ์ด (3์ฃผ์ฐจ ๋žŒ๋‹ค์™€ ์—ฐ๊ฒฐ):

list.forEach(System.out::println);  // ๋ฉ”์„œ๋“œ ์ฐธ์กฐ (ํ˜ธ์ถœ X)
list.forEach(x -> System.out.println(x));  // ๋žŒ๋‹ค

๋‹ค์Œ Unit์œผ๋กœ

  • ๊ฐ€๋ณ€์ธ์ž(Varargs) ๋ฅผ ํ•™์Šตํ•  ์ค€๋น„ ์™„๋ฃŒ
  • "๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ€๋ณ€์ผ ๋•Œ" ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค

profile
Software Developer

0๊ฐœ์˜ ๋Œ“๊ธ€