Amenable
Amenable's Blog
Amenable
  • λΆ„λ₯˜ 전체보기 (189)
    • πŸ“‚ JAVA (87)
      • μ΄νŽ™ν‹°λΈŒ μžλ°” (65)
      • μ£Όμš” κ°œλ… (22)
    • πŸ“‚ 개발 μ„œμ  (22)
      • μ‹€μš©μ£Όμ˜ ν”„λ‘œκ·Έλž˜λ¨Έ (1)
      • 객체지ν–₯의 사싀과 μ˜€ν•΄ (2)
      • 클린 μ½”λ“œ (8)
      • ν•¨κ»˜ 자라기 (1)
      • 그림으둜 λ°°μš°λŠ” HTTP&Network Basic (10)
    • πŸ“‚ λ°μ΄ν„°λ² μ΄μŠ€ (8)
      • κ°œλ… (8)
      • λ¬Έμ œν’€μ΄ (0)
    • πŸ“‚ λ„€νŠΈμ›Œν¬ (14)
      • κ°œλ… (6)
      • 성곡과 μ‹€νŒ¨λ₯Ό κ²°μ •ν•˜λŠ” 1%의 λ„€νŠΈμ›Œν¬ 원리 (8)
    • πŸ“‚ μŠ€ν”„λ§ (13)
      • κΈ°λ³Έ κ°œλ… (13)
    • πŸ“‚ WEB (5)
    • πŸ“‚ 자료ꡬ쑰 (12)
      • κ°œλ… (2)
      • μ •λ ¬ (8)
      • 트리 (2)
    • πŸ“‚ μ•Œκ³ λ¦¬μ¦˜ (10)
      • μ΅œμ†Œμ‹ μž₯트리 (2)
      • μ΅œλ‹¨ 경둜 (2)
      • λ¬Έμžμ—΄ (2)
      • ETC (4)
    • πŸ“‚ μ•Œκ³ λ¦¬μ¦˜_λ¬Έμ œν’€μ΄ (4)
      • BOJ_λ°±μ€€ (4)
    • πŸ“‚ ν”„λ‘œκ·Έλž˜λ° (3)
    • πŸ“‚ DevOps (2)
      • 배포 (2)
    • πŸ“‚ ν›„κΈ° (8)
      • μš°μ•„ν•œ ν…Œν¬μ½”μŠ€(ν”„λ¦¬μ½”μŠ€) (4)
      • 2023λ…„ (3)
      • 2024λ…„ (1)
    • πŸ“‚ 회고 (1)
      • 2023λ…„ (1)

λΈ”λ‘œκ·Έ 메뉴

  • πŸš€ GitHub

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
Amenable

Amenable's Blog

λ³€κ²½ κ°€λŠ₯성을 μ΅œμ†Œν™”ν•˜λΌ(λΆˆλ³€ 클래슀λ₯Ό λ§Œλ“€ λ•Œ κ³ λ €ν•  것)(3) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ17)]
πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”

λ³€κ²½ κ°€λŠ₯성을 μ΅œμ†Œν™”ν•˜λΌ(λΆˆλ³€ 클래슀λ₯Ό λ§Œλ“€ λ•Œ κ³ λ €ν•  것)(3) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ17)]

2023. 4. 27. 21:18

  이전 κΈ€

  • λ³€κ²½ κ°€λŠ₯성을 μ΅œμ†Œν™”ν•˜λΌ(λΆˆλ³€ 클래슀λ₯Ό λ§Œλ“œλŠ” λ‹€μ„― κ°€μ§€ κ·œμΉ™)(1) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ17)]
  • λ³€κ²½ κ°€λŠ₯성을 μ΅œμ†Œν™”ν•˜λΌ(λΆˆλ³€ ν΄λž˜μŠ€μ˜ μž₯점, λ‹¨μ , λ‹¨μ  λŒ€μ²˜ λ°©λ²•)(2) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ17)]

 

  이번 κΈ€μ—μ„œλŠ” 'λΆˆλ³€ 클래슀λ₯Ό λ§Œλ“€ λ•Œ κ³ λ €ν•  것'에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

 

1. 상속을 막을 수 μžˆλŠ” 또 λ‹€λ₯Έ 방법 πŸ¦“

  이전 글을 톡해 λΆˆλ³€ 클래슀λ₯Ό 보μž₯ν•˜λ €λ©΄ μžμ‹ μ„ μƒμ†ν•˜μ§€ λͺ»ν•˜κ²Œ ν•΄μ•Ό ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆμ—ˆλ‹€. μžμ‹ μ„ μƒμ†ν•˜μ§€ λͺ»ν•˜κ²Œ ν•˜λŠ” κ°€μž₯ μ‰¬μš΄ λ°©λ²•μœΌλ‘œ final ν΄λž˜μŠ€μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μ•˜λ‹€.

  ν•˜μ§€λ§Œ 더 μœ μ—°ν•œ 방법이 μžˆλ‹€. λͺ¨λ“  μƒμ„±μžλ₯Ό private ν˜Ήμ€ package-private으둜 λ§Œλ“€κ³  public 정적 νŒ©ν„°λ¦¬λ₯Ό μ œκ³΅ν•˜λŠ” 방법이닀.

// 1. private μƒμ„±μž
public class Complex {
    private final double re;
    private final double im;

    private Complex(double re, double im) {
        this.re = re;
        this.im = im;
    }
    
    // λ‚΄λΆ€ ν΄λž˜μŠ€μ—μ„œ 상속 κ°€λŠ₯
    private static class MyComplex extends Complex {
        
        private MyComplex(double re, double im){
            super(re, im);
        }
    }
    
    ...
}
// 2. package-private μƒμ„±μž
package com.item17;

public class Complex {
    private final double re;
    private final double im;

    Complex(double re, double im) {
        this.re = re;
        this.im = im;
    }
}

----------

// 같은 νŒ¨ν‚€μ§€μ—μ„œ 상속 κ°€λŠ₯
package com.item17; // 같은 νŒ¨ν‚€μ§€

public class MyComplex extends Complex {
    MyComplex(double re, double im) {
        super(re, im);
    }
}

  μƒμ„±μžλ₯Ό private둜 λ§Œλ“€λ©΄ λ‚΄λΆ€μ—μ„œλ§Œ 상속을 ν—ˆμš©ν•΄ μ£ΌλŠ” 것이고, package-private둜 λ§Œλ“€λ©΄ 같은 νŒ¨ν‚€μ§€μ—μ„œλ§Œ 상속을 ν—ˆμš©ν•΄ μ£ΌλŠ” 것이닀.

  μ™ΈλΆ€μ—μ„œ ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•„λž˜μ™€ 같이 public 정적 νŒ©ν„°λ¦¬λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

public class Complex {
    private final double re;
    private final double im;

    private Complex(double re, double im) {
        this.re = re;
        this.im = im;
    }

    private static class MyComplex extends Complex {

        private MyComplex(double re, double im){
            super(re, im);
        }
    }
    
    // 정적 νŒ©ν„°λ¦¬
    public static Complex valueOf(double re, double im){
        return new Complex(re, im);
    }
    
    ...
}

----------

public static void main(String[] args) {
    Complex complex = Complex.valueOf(1, 0.5);
}

  ν•΄λ‹Ή 방식을 μ‚¬μš©ν•˜λ©΄ 2κ°€μ§€ μž₯점을 κ°€μ§ˆ 수 μžˆλ‹€.

πŸ“˜ μž₯점 1. μœ μ—°ν•˜λ‹€.

  이처럼 μ œν•œμ μ΄μ§€λ§Œ 상속을 ν—ˆμš©ν•˜κ²Œ λœλ‹€λ©΄ λ‹€μ–‘ν•œ ꡬ체적인 클래슀λ₯Ό λ§Œλ“€ 수 μžˆλ‹€λŠ” 이점이 μžˆλ‹€. 정적 νŒ©ν„°λ¦¬λ₯Ό μ‚¬μš©ν•˜λ©΄ λ‚΄λΆ€μ˜ κ΅¬ν˜„μ²΄λ₯Ό λ°”κΏ€ 수 μžˆλ‹€. μ•„λž˜μ²˜λŸΌ MyComplexλΌλŠ” 것을 μ΄μš©ν•˜μ—¬ κ΅¬ν˜„μ²΄λ₯Ό λ°”κΏ€ 수 μžˆλ‹€. 

public class Complex {
    private final double re;
    private final double im;

    private Complex(double re, double im) {
        this.re = re;
        this.im = im;
    }

    private static class MyComplex extends Complex {

        private MyComplex(double re, double im){
            super(re, im);
        }
    }    

    public static Complex valueOf(double re, double im){
        return new MyComplex(re, im); // Complexμ—μ„œ MyComplex둜 λ³€κ²½
    }
    
    ...
}

  λ‚΄λΆ€μ—μ„œλŠ” MyComplex뿐만 μ•„λ‹ˆλΌ μ–Όλ§ˆλ“ μ§€ λ‹€λ₯Έ κ΅¬ν˜„μ²΄λ‘œ λ°”κΏ€ 수 μžˆλ‹€. λ‚΄λΆ€μ—μ„œ μ²˜λ¦¬λ˜λŠ” 것이기 λ•Œλ¬Έμ— λ¬Όλ‘  μ™ΈλΆ€μ—μ„œλŠ” μ•„λ¬΄λŸ° 변경을 λͺ» λŠλ‚€λ‹€!

  이것이 final 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것과 λΉ„κ΅ν•΄μ„œ 더 μœ μ—°ν•˜λ‹€κ³  ν•˜λŠ” μ΄μœ μ΄λ‹€.

πŸ“˜ μž₯점 2. 캐싱 κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆλ‹€.

  λ‹€μŒ λ¦΄λ¦¬μŠ€μ—μ„œ 객체 캐싱 κΈ°λŠ₯을 μΆ”κ°€ν•΄ μ„±λŠ₯을 λŒμ–΄μ˜¬λ¦΄ μˆ˜λ„ μžˆλ‹€. 정적 νŒ©ν„°λ¦¬λ₯Ό μ‚¬μš©ν–ˆμ„ λ•Œ 맀번 μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄ μ£ΌλŠ” 게 μ•„λ‹ˆλΌ 캐싱해 놓은 μΈμŠ€ν„΄μŠ€λ₯Ό 리턴할 수 μžˆλ‹€.

 

(μΆ”κ°€μ μœΌλ‘œ, μœ„μ˜ Complex와 같은 클래슀λ₯Ό '사싀상 final'(=effectively final)이라고 λΆˆλ¦°λ‹€. )

 

2. μž¬μ •μ˜κ°€ κ°€λŠ₯ν•œ ν΄λž˜μŠ€λŠ” 방어적인 볡사λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. πŸ¦„

  λΆˆλ³€ 클래슀인데 'final 클래슀' λ˜λŠ” 'private λ˜λŠ” package-private μƒμ„±μž + 정적 νŒ©ν„°λ¦¬'둜 κ΅¬ν˜„ν•΄λ†“μ§€ μ•Šμ€ κ²½μš°μ—λŠ” μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ? 즉, 상속을 ν—ˆμš©ν•΄ λ†“μ•˜λ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?

public static BigInteger safeInstance(BigInteger val){

    // 방어적 볡사
    return val.getClass() == BigInteger.class ?
            val : new BigInteger(val.toByteArray());
}

  μœ„μ˜ μ½”λ“œμ—μ„œ 인수둜 λ°›λŠ” 객체의 νƒ€μž…μ„ μ˜ˆμΈ‘ν•  수 μ—†λ‹€. BigInteger의 ν•˜μœ„ μΈμŠ€ν„΄μŠ€κ°€ κ°€λ³€ 객체일 μˆ˜λ„ 있기 λ•Œλ¬Έμ΄λ‹€. 이런 μƒν™©μ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•˜λ €λ©΄ μ‹ λ’°ν•  수 μ—†λŠ” ν•˜μœ„ 클래슀의 μΈμŠ€ν„΄μŠ€λΌκ³  ν™•μΈλ˜λ©΄, 이 μΈμˆ˜λ“€μ„ 가변이라 κ°€μ •ν•˜κ³  λ°©μ–΄μ μœΌλ‘œ 볡사λ₯Ό ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

 

3. λͺ¨λ“  '외뢀에 κ³΅κ°œν•˜λŠ”' ν•„λ“œκ°€ final 이어야 ν•œλ‹€. 🐴

  μ•žμ˜ κΈ€μ—μ„œ λΆˆλ³€ 클래슀λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ 'λͺ¨λ“  ν•„λ“œλ₯Ό private으둜 μ„ μ–Έν•œλ‹€'λΌλŠ” κ·œμΉ™μ΄ μžˆμ—ˆλ‹€. ν•˜μ§€λ§Œ λͺ¨λ“  ν•„λ“œλΌλŠ” μ œμ•½μ„ 쑰금 μ™„ν™”μ‹œν‚¨λ‹€λ©΄ 'λͺ¨λ“  외뢀에 κ³΅κ°œλ˜μ–΄ μžˆλŠ” ν•„λ“œλŠ” final둜 μ„ μ–Έν•œλ‹€'라고 ν•  수 μžˆλ‹€.

public final class PhoneNumber {

    private final short areaCode, prefix, lineNum;

    public PhoneNumber(short areaCode, short prefix, short lineNum) {
        this.areaCode = areaCode;
        this.prefix = prefix;
        this.lineNum = lineNum;
    }
    
    ...
    
    private volatile int hashCode;

    @Override
    public int hashCode() {
        if(this.hashCode != 0){
            return hashCode;
        }

        synchronized (this){
            int result = hashCode;
            if(result == 0){
                result = Short.hashCode(areaCode);
                result = 31 * result + Short.hashCode(prefix);
                result = 31 * result + Short.hashCode(lineNum);
                this.hashCode = result;
            }

            return result;
        }
    }
}

  μœ„μ™€ 같이 μ–΄λ–€ λΆˆλ³€ ν΄λž˜μŠ€λŠ” 계산 λΉ„μš©μ΄ 큰 값을 λ‚˜μ€‘μ— (처음 쓰일 λ•Œ) κ³„μ‚°ν•˜μ—¬ final이 μ•„λ‹Œ ν•„λ“œμ— μΊμ‹œ 해놓기도 ν•œλ‹€. λ˜‘κ°™μ€ κ°’을 λ‹€μ‹œ μš”μ²­ν•˜λ©΄ μΊμ‹œ ν•΄λ‘” κ°’을 λ°˜ν™˜ν•˜μ—¬ κ³„μ‚° λΉ„μš©μ„ μ ˆκ°ν•˜λŠ” κ²ƒμ΄λ‹€.

  ν•˜μ§€λ§Œ 이 방법은 κ·Έ 객체가 λΆˆλ³€μ΄κΈ° λ•Œλ¬Έμ— μ‚¬μš©ν•  수 μžˆλŠ”λ°, λͺ‡ λ²ˆμ„ 계산해도 항상 같은 κ²°κ³Όκ°€ λ§Œλ“€μ–΄μ§μ΄ 보μž₯되기 λ•Œλ¬Έμ΄λ‹€.

 

ν•΄λ‹Ή 글은 λ°±κΈ°μ„  λ‹˜μ˜ 'μ΄νŽ™ν‹°λΈŒ μžλ°” μ™„λ²½ 곡랡'을 μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

'πŸ“‚ JAVA > μ΄νŽ™ν‹°λΈŒ μžλ°”' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

상속을 κ³ λ €ν•΄ μ„€κ³„ν•˜κ³  λ¬Έμ„œν™”ν•˜λΌ. κ·ΈλŸ¬μ§€ μ•Šμ•˜λ‹€λ©΄ 상속을 κΈˆμ§€ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ19)]  (0) 2023.04.29
μƒμ†λ³΄λ‹€λŠ” μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ18)]  (0) 2023.04.28
λ³€κ²½ κ°€λŠ₯성을 μ΅œμ†Œν™”ν•˜λΌ(λΆˆλ³€ 클래슀의 μž₯점, 단점, 단점 λŒ€μ²˜ 방법)(2) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ17)]  (0) 2023.04.27
λ³€κ²½ κ°€λŠ₯성을 μ΅œμ†Œν™”ν•˜λΌ(λΆˆλ³€ 클래슀λ₯Ό λ§Œλ“œλŠ” λ‹€μ„― κ°€μ§€ κ·œμΉ™)(1) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ17)]  (0) 2023.04.27
public ν΄λž˜μŠ€μ—μ„œλŠ” public ν•„λ“œκ°€ μ•„λ‹Œ μ ‘κ·Όμž λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ16)]  (0) 2023.04.24
    'πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • 상속을 κ³ λ €ν•΄ μ„€κ³„ν•˜κ³  λ¬Έμ„œν™”ν•˜λΌ. κ·ΈλŸ¬μ§€ μ•Šμ•˜λ‹€λ©΄ 상속을 κΈˆμ§€ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ19)]
    • μƒμ†λ³΄λ‹€λŠ” μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ18)]
    • λ³€κ²½ κ°€λŠ₯성을 μ΅œμ†Œν™”ν•˜λΌ(λΆˆλ³€ 클래슀의 μž₯점, 단점, 단점 λŒ€μ²˜ 방법)(2) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ17)]
    • λ³€κ²½ κ°€λŠ₯성을 μ΅œμ†Œν™”ν•˜λΌ(λΆˆλ³€ 클래슀λ₯Ό λ§Œλ“œλŠ” λ‹€μ„― κ°€μ§€ κ·œμΉ™)(1) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ17)]
    Amenable
    Amenable
    CS, μžλ°”, 자료ꡬ쑰, μ•Œκ³ λ¦¬μ¦˜, μŠ€ν”„λ§, μŠ€ν”„λ§ λΆ€νŠΈμ— ν•΄λ‹Ήν•˜λŠ” κ°œλ°œμ— κ΄€ν•œ λ‚΄μš©μ„ κ³΅μœ ν•©λ‹ˆλ‹€.

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”