λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“šμ½μ€ μ±… 정리/μžλ°” μ½”λ”©μ˜ 기술

[μžλ°” μ½”λ”©μ˜ 기술] 2μž₯ : μ½”λ“œ μŠ€νƒ€μΌ λ ˆλ²¨μ—…

2.1 맀직 λ„˜λ²„λ₯Ό μƒμˆ˜λ‘œ λŒ€μ²΄

void setPreset(int speedPreset) {
    if (speedPreset == 2) {
        setTargetSpeedKmh(16944);
    } else if (speedPreset == 1) {
        setTargetSpeedKmh(7667);
    } else if (speedPreset == 0) {
        setTargetSpeedKmh(0);
    }
}

void setTargetSpeedKmh(double speed) {
    targetSpeedKmh = speed;
}

μœ„ μ½”λ“œ 쑰각처럼 μ•„λ¬΄λŸ° μ˜λ―Έμ—†λŠ” μˆ«μžκ°€ ν”„λ‘œκ·Έλž¨μ„ λ™μž‘μ„ μ œμ–΄ν•œλ‹€λ©΄ "맀직 λ„˜λ²„"라고 λΆ€λ₯Έλ‹€.

 

μ΄λŸ¬ν•œ λ§€μ§λ„˜λ²„μ˜ μ‚¬μš©μ€ μ •ν™•ν•œ 뜻이 μ •ν•΄μ Έμžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 였λ₯˜κ°€ λ°œμƒν•˜κΈ° μ‰¬μš°λ©° μ‚¬μš©μžκ°€ λ©”μ„œλ“œ 내뢀에 λŒ€ν•œ 지식을 μ•Œκ³  μžˆμ–΄μ•Όλ§Œ ν•œλ‹€.

 

λ”°λΌμ„œ, μ΄λŸ¬ν•œ "맀직 λ„˜λ²„"λ₯Ό μ—†μ• λ³΄μž.

μš°λ¦¬λŠ” staticκ³Ό final을 μ΄μš©ν•΄μ„œ λ³€μˆ˜λ₯Ό λ”± ν•œλ²ˆλ§Œ μ‘΄μž¬ν•˜λ©° λ³€κ²½ν•  수 μ—†κ²Œ μƒμˆ˜λ‘œ λ§Œλ“€ 수 μžˆλ‹€.

    static final double CRUISE_SPEED_KMH = 16944;
    static final int CRUISE_SPEED_PRESET = 2;
    
    void setPreset(int speedPreset) {
        if (speedPreset == CRUISE_SPEED_PRESET) {
            setTargetSpeedKmh(CRUISE_SPEED_KMH);
        }

CRUISE_SPEED_PRESET처럼 λ³€μˆ˜λͺ…을 비ꡐ에 λ„£μœΌλ©΄ 사전 속도 μ„€μ •κ³Ό 타깃 속도가 훨씬 λͺ…확해진닀.

2.2 μ •μˆ˜ μƒμˆ˜ λŒ€μ‹  μ—΄κ±°ν˜•

2.1 처럼 μ‚¬μš©ν•˜λ©΄ μ‚¬μš©μžκ°€ ν•¨μˆ˜μ— μœ νš¨ν•˜μ§€ μ•Šμ€ 값을 넣을 수 μžˆλ‹€.

 

enum νƒ€μž…μ„ μ‚¬μš©ν•˜λ©΄ 이 ν˜„μƒμ„ 컴파일러 λ‹¨μ—μ„œ 막을 수 μžˆλ‹€.

enum SpeedPreset {
    STOP(0), PLANETARY_SPEED(7667), CRUISE_SPEED(16944);

    final double speedKmh;

    SpeedPreset(double speedKmh) {
        this.speedKmh = speedKmh;
    }
}

μ—΄κ±°ν˜•μ„ μ„ μ–Έν•΄μ„œ μ‚¬μš©ν•˜λ©΄ μ—΄κ±°ν˜•μ— μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 값은 컴파일 μžμ²΄κ°€ μ•ˆλ˜κ²Œ 막을 수 μžˆλ‹€.

 

2.3 For 루프 λŒ€μ‹  For-Each

전톡적인 순회 방식 λ³΄λ‹€λŠ” For-Eachλ₯Ό μ‚¬μš©ν•˜μ—¬ 인덱슀 번호λ₯Ό ν”„λ‘œκ·Έλž˜λ¨Έκ°€ λͺ¨λ₯΄κ²Œ ν•˜μž. (ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 저지λ₯Ό 수 μžˆλŠ” 였λ₯˜ 방지)

        for (String check : checks) {
            System.out.println(check);
        }

μ»¬λ ‰μ…˜μ˜ 각 μ›μ†Œλ§Œ μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ 였λ₯˜λ₯Ό 방지할 수 μžˆλ‹€.

2.4 μˆœνšŒν•˜λ©° μ»¬λ ‰μ…˜ μˆ˜μ •ν•˜μ§€ μ•ŠκΈ°

μ»¬λ ‰μ…˜μ„ μˆœνšŒν•˜λ©΄μ„œ μ»¬λ ‰μ…˜μ„ μˆ˜μ •ν•˜κ²Œ 되면 "ConcurrentModificationException"이 λ°œμƒν•œλ‹€. 컴파일 νƒ€μž„μ—λŠ” 이 였λ₯˜λ₯Ό μž‘μ•„λ‚΄μ§€ λͺ»ν•œλ‹€.

 

μš°λ¦¬κ°€ ν•  수 μžˆλŠ” 방법은 μˆ˜μ •μ„ μ›ν•˜λŠ” μ›μ†Œλ₯Ό 기얡해두고 μˆœνšŒκ°€ λλ‚œ ν›„ μˆ˜μ •ν•˜λŠ” 방법 ν•˜λ‚˜κ°€ 있고

Iteratorλ₯Ό ν™œμš©ν•΄μ„œ 순회 쀑에 μˆ˜μ •μ„ μ˜¬λ°”λ₯΄κ²Œ μˆ˜ν–‰ν•  수 μžˆλ‹€.

        Iterator<Supply> iterator = supplies.iterator();
        while (iterator.hasNext()) {
            if (iterator.next().isContaminated()) {
                iterator.remove();
            }
        }

2.5 μˆœνšŒν•˜λ©° 계산 집약적 μ—°μ‚°ν•˜μ§€ μ•ŠκΈ°

계산이 많이 ν•„μš”ν•œ λ™μž‘μ„ μˆœνšŒν•˜λ©΄μ„œ 맀번 μ‹€ν–‰ν•˜μ§€ μ•ŠκΈ°.

 

맀번 μ‹€ν–‰ν•˜κΈ° 보단 순회 전에 ν•„μš”ν•œ λ™μž‘μ„ λ¨Όμ € μˆ˜ν–‰ν•΄λ‘κ³  μ‚¬μš©ν•˜μž.

 

2.6 μƒˆ μ€„λ‘œ κ·Έλ£Ήν•‘

여백을 μ‚¬μš©ν•΄μ„œ μ„œλ‘œ μ˜λ―Έκ°€ λΉ„μŠ·ν•œ 것끼리 λΆ™μ—¬μ„œ μ‚¬μš©ν•˜κ³  μ˜λ―Έκ°€ λ‹€λ₯΄λ‹€λ©΄ ν•œ 쀄을 λ„μ–΄μ„œ μ‚¬μš©ν•˜μž.

2.7 이어뢙이기 λŒ€μ‹  μ„œμ‹ν™”

        String entry = author.toUpperCase() + ": [" + formattedMonth + "-" +
                today.getDayOfMonth() + "-" + today.getYear() + "](Day " +
                (ChronoUnit.DAYS.between(start, today) + 1) + ")> " +
                message + System.lineSeparator();
        logbook.write(entry);

μœ„ μ½”λ“œ 처럼 λ¬Έμžμ—΄μ„ λ‚˜μ—΄μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ μ‹€μ œλ‘œ μ–΄λ–»κ²Œ 좜λ ₯될 지 ꡉμž₯히 ν˜Όλž€μŠ€λŸ½λ‹€.

 

μ½”λ“œλ₯Ό κ°„μ†Œν™” μ‹œμΌœλ³΄μž (λ ˆμ΄μ•„μ›ƒκ³Ό λ°μ΄ν„°μ˜ 뢄리)

        String entry = String.format("%S: [%tm-%<te-%<tY](Day %d)> %s%n",
                author, today,
                ChronoUnit.DAYS.between(start, today) + 1, message);
        logbook.write(entry);

μœ„ μ½”λ“œμ²˜λŸΌ "μ„œμ‹ λ¬Έμžμ—΄"을 μ‚¬μš©ν•˜λ©΄ λ ˆμ΄μ•„μ›ƒκ³Ό 데이터λ₯Ό λΆ„λ¦¬ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

2.8 직접 λ§Œλ“€μ§€ 말고 μžλ°” API ν™œμš©ν•˜κΈ°

μ΄μ „μ—λŠ” λͺ¨λ‘ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜μ„ 직접 κ΅¬ν˜„ν–ˆμ§€λ§Œ μ΄λŠ” μ‹œκ°„μ΄ 많이 걸리고 였λ₯˜λ„ λ°œμƒν•˜κΈ° μ‰¬μ›Œμ§„λ‹€.

 

잘 λ§Œλ“€μ–΄μ§„ μžλ°” API(String, List λ“±)을 μž¬μ‚¬μš©ν•˜λ©΄ λΉ λ₯΄κ³  μ΅œμ ν™”λœ μ½”λ“œλ₯Ό μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

    int getQuantity(Supply supply) {
        Objects.requireNonNull(supply, "supply must not be null");

        return Collections.frequency(supplies, supply);
    }

Collections의 frequencyλ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ suppliesμ•ˆμ— supply의 λΉˆλ„λ₯Ό 코딩없이 μ‰½κ²Œ ꡬ할 수 μžˆλ‹€.

 

2.9 2μž₯μ—μ„œ 배운 λ‚΄μš©

  • 맀직 λ„˜λ²„ 처리
  • enum(μ—΄κ±°ν˜•) μ‚¬μš©ν•˜κΈ°
  • For-Each, μ„œμ‹ν™”
  • **μžλ°” API 적극 ν™œμš©ν•˜κΈ°**