Coding Planet

[μ΄νŽ™ν‹°λΈŒ μžλ°”]chapter2 : [μ•„μ΄ν…œ4] μΈμŠ€ν„΄μŠ€ν™”λ₯Ό λ§‰μœΌλ €κ±°λ“  private μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜λΌ λ³Έλ¬Έ

πŸ’» Java Study/Java 이둠 정리

[μ΄νŽ™ν‹°λΈŒ μžλ°”]chapter2 : [μ•„μ΄ν…œ4] μΈμŠ€ν„΄μŠ€ν™”λ₯Ό λ§‰μœΌλ €κ±°λ“  private μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜λΌ

jhj.sharon 2023. 8. 10. 00:38
λ°˜μ‘ν˜•

μ•„μ΄ν…œ4: μΈμŠ€ν„΄μŠ€ν™”λ₯Ό λ§‰μœΌλ €κ±°λ“  private μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜λΌ

μΈμŠ€ν„΄μŠ€ν™”(instance instantiation)λŠ” 클래슀의 μ •μ˜λ₯Ό 기반으둜 μ‹€μ œ 객체λ₯Ό λ©”λͺ¨λ¦¬μ— μƒμ„±ν•˜λŠ” 과정이닀. 클래슀의 μΈμŠ€ν„΄μŠ€ν™”λ₯Ό λ§‰κΈ°μœ„ν•΄ private μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜λŠ” 것은 클래슀λ₯Ό μ™ΈλΆ€μ—μ„œ μΈμŠ€ν„΄μŠ€ν™”ν•˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•œ ν…Œν¬λ‹‰μ΄λ‹€. ν΄λž˜μŠ€μ— μ •μ˜λœ μƒμ„±μžκ°€ λͺ¨λ‘ 'private'으둜 μ„ μ–Έλ˜λ©΄, κ·Έ ν΄λž˜μŠ€λŠ” μ™ΈλΆ€μ—μ„œ 객체λ₯Ό 생성할 수 μ—†κ²Œ λœλ‹€. μ΄λŸ¬ν•œ μ ‘κ·Ό μ œν•œμžλ₯Ό μ‚¬μš©ν•˜λŠ” 것은 주둜 μœ ν‹Έλ¦¬ν‹° ν΄λž˜μŠ€λ‚˜ μƒμˆ˜λ§Œμ„ ν¬ν•¨ν•˜λŠ” ν΄λž˜μŠ€μ™€ 같이 μΈμŠ€ν„΄μŠ€ν™”λ  ν•„μš”κ°€ μ—†λŠ” ν΄λž˜μŠ€λ“€μ— μ μš©λœλ‹€.

 

1. 정적 λ©”μ„œλ“œμ™€ 정적 ν•„λ“œλ§Œμ„ 담은 μœ ν‹Έμ„± ν΄λž˜μŠ€λŠ” λ§Œλ“œλŠ” 경우

  • κΈ°λ³Έ νƒ€μž… κ°’μ΄λ‚˜ λ°°μ—΄ κ΄€λ ¨ λ©”μ„œλ“œλ“€μ„ λͺ¨μ•„놓을 λ•Œ : java.lang.Math, java.util.Arrays
  • νŠΉμ • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 객체λ₯Ό μƒμ„±ν•΄μ£ΌλŠ” 정적 λ©”μ„œλ“œ(ν˜Ήμ€ νŒ©ν„°λ¦¬)λ₯Ό λͺ¨μ•„놓을 λ•Œ : java.util.Collections
  • final ν΄λž˜μŠ€μ™€ κ΄€λ ¨ν•œ λ©”μ„œλ“œλ“€μ„ λͺ¨μ•„놓을 λ•Œ ➜ final 클래슀λ₯Ό μƒμ†ν•΄μ„œ ν•˜μœ„ ν΄λž˜μŠ€μ— λ©”μ„œλ“œλ₯Ό λ„£λŠ” 것이 λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ—

μ΄λŸ¬ν•œ 경우의 μœ ν‹Έλ¦¬ν‹° ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ‘œ λ§Œλ“€μ–΄ μ“°λ €κ³  μ„€κ³„ν•œ 것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€ν™”λ₯Ό 막아 μ£ΌλŠ” 것이 μ’‹λ‹€. μΆ”μƒν΄λž˜μŠ€λ‘œ λ§Œλ“œλŠ” κ²ƒμœΌλ‘œλŠ” μΈμŠ€ν„΄μŠ€ν™”λ₯Ό 막을 수 μ—†λ‹€. ν•˜μœ„ 클래슀λ₯Ό λ§Œλ“€μ–΄ μΈμŠ€ν„΄μŠ€ν™” ν•  수 있기 λ•Œλ¬Έμ΄λ‹€. λ˜ν•œ μ‚¬μš©μžμ—μ„œ μƒμ†ν•΄μ„œ μ“°λΌλŠ” μ˜€ν•΄λ₯Ό 뢈러올 수 μžˆλ‹€. private μƒμ„±μžλ₯Ό λ§Œλ“€μ–΄ μ£Όλ©΄ κ°„λ‹¨ν•˜κ²Œ μΈμŠ€ν„΄μŠ€ν™”λ₯Ό 막을 수 μžˆλ‹€.

 

2. μΈμŠ€ν„΄μŠ€ν™”λ₯Ό 막기 방법 private μƒμ„±μž

  • μƒμ„±μžλ₯Ό λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄ μ»΄νŒŒμΌλŸ¬λŠ” μžλ™μœΌλ‘œ κΈ°λ³Έ μƒμ„±μžλ₯Ό λ§Œλ“€μ–΄ μ€€λ‹€. μ¦‰, λ§€κ°œλ³€μˆ˜λ₯Ό 받지 μ•ŠλŠ” public μƒμ„±μžκ°€ λ§Œλ“€μ–΄μ§€κ²Œ λœλ‹€. 이 λ•Œ μ‚¬μš©μžλŠ” 이 μƒμ„±μžκ°€ μžλ™ μƒμ„±λœ 것인지 ꡬ뢄할 수 μ—†κ²Œ λœλ‹€.
  • μ»΄νŒŒμΌλŸ¬κ°€ κΈ°λ³Έ μƒμ„±μžλ₯Ό λ§Œλ“œλŠ” κ²½μš°λŠ” 였직 λͺ…μ‹œλœ μƒμ„±μžκ°€ 없을 λ•Œ λΏμ΄λ―€λ‘œ private μƒμ„±μžλ₯Ό μΆ”κ°€ν•˜λ©΄ 클래슀의 μΈμŠ€ν„΄μŠ€ν™”λ₯Ό 막을 수 μžˆλ‹€.
  • μƒμ„±μž 내뢀에 AssertionErrorλ₯Ό λ˜μ§€λŠ” 것은, λ§Œμ•½ 클래슀 λ‚΄λΆ€λ‚˜ λ¦¬ν”Œλ ‰μ…˜μ„ 톡해 μΈμŠ€ν„΄μŠ€ν™”λ₯Ό μ‹œλ„ν•  κ²½μš°μ— μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€κΈ° μœ„ν•œ 좔가적인 방어측이닀. 
  • 이와 같은 방식을 톡해 μœ ν‹Έλ¦¬ν‹° ν΄λž˜μŠ€κ°€ μ‹€μˆ˜λ‘œ 객체둜 μƒμ„±λ˜λŠ” 것을 λ°©μ§€ν•˜κ³  클래슀의 정적 λ©”μ„œλ“œμ™€ λ³€μˆ˜λ§Œμ„ μ‚¬μš©ν•˜λ„λ‘ κ°•μ œν•œλ‹€. ν•˜μœ„ ν΄λž˜μŠ€κ°€ μƒμœ„ 클래슀의 μƒμ„±μžμ— μ ‘κ·Όν•  수 μ—†μœΌλ―€λ‘œ 상속을 막을 수 μžˆλ‹€.
  • 그런데 μƒμ„±μžκ°€ λΆ„λͺ… μ‘΄μž¬ν•˜λŠ”λ° ν˜ΈμΆœν•  μˆ˜λŠ” μ—†λ‹€λ‹ˆ, 그닀지 직관적이지 μ•Šλ‹€. 주석을 λ§Œλ“œμ‹œ λ‹¬μ•„μ£Όμž!
public class UtilityClass {

    // κΈ°λ³Έ μƒμ„±μžκ°€ λ§Œλ“€μ–΄ μ§€λŠ” 것을 λ§‰λŠ”λ‹€(μΈμŠ€ν„΄μŠ€ λ°©μ§€μš©)
    private UtilityClass() {
        throw new AssertionError("UtilityClass should not be instantiated!");
    }

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

    public static int subtract(int a, int b) {
        return a - b;
    }
}

 

λ°˜μ‘ν˜•
Comments