λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μŠ€ν„°λ”” & μ„Έλ―Έλ‚˜

[μš°μ•„ν•œν…Œν¬μ„Έλ―Έλ‚˜] λ¦¬νŒ©ν† λ§ 정리 (By μžλ°”μ§€κΈ° λ°•μž¬μ„±λ‹˜)

by 주발2 2021. 2. 21.
λ°˜μ‘ν˜•

 μ•ˆλ…•ν•˜μ„Έμš”~ 이전에 μš΄μ˜ν•˜λ˜ λΈ”λ‘œκ·Έ 및 GitHub, 곡뢀 λ‚΄μš©μ„ μ •λ¦¬ν•˜λŠ” Study-GitHub κ°€ μžˆμŠ΅λ‹ˆλ‹€!

 λ„€μ΄λ²„ λΈ”λ‘œκ·Έ

 GitHub

Study-GitHub

 πŸ”


βœ” μš°μ•„ν•œν…Œν¬μ„Έλ―Έλ‚˜ 190425 TDD λ¦¬νŒ©ν† λ§ by μžλ°”μ§€κΈ° λ°•μž¬μ„±λ‹˜

https://youtu.be/bIeqAlmNRrA

 

μ•ˆλ…•ν•˜μ„Έμš”! μ΄λ²ˆμ— 정말 쒋은 κ°•μ˜λ₯Ό 보게 λ˜μ–΄μ„œ μ •λ¦¬ν•˜κ³ μž 글을 μ“°λ €κ³  ν•©λ‹ˆλ‹€!

​

λ³Έ κ°•μ˜λŠ” TDD, λ¦¬νŒ©ν† λ§ μ—°μŠ΅λ°©λ²•μ— λŒ€ν•œ κ°•μ˜μ΄μ§€λ§Œ μ €λŠ” λ¦¬νŒ©ν† λ§μ— λŒ€ν•΄ 정리λ₯Ό ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

​

μ˜μƒμ—μ„œ μ•ž λ‚΄μš©μΈ 1~2λ‹¨κ³„λŠ” TDD에 λŒ€ν•œ λ‚΄μš©μ΄κ³ , 3단계뢀터 λ¦¬νŒ©ν† λ§κ³Ό κ΄€λ ¨λœ λ‚΄μš©μž…λ‹ˆλ‹€.

​

​

λ¦¬νŒ©ν† λ§κ³Ό κ΄€λ ¨ν•œ μ œμ•½μ‚¬ν•­, 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 Java Code Convention을 μ§€ν‚€λ©΄μ„œ ν”„λ‘œκ·Έλž˜λ°μ„ ν•œλ‹€.

 Indent(λ“€μ—¬μ“°κΈ°) depthλ₯Ό 3이 λ„˜μ§€ μ•Šλ„λ‘ κ΅¬ν˜„ν•œλ‹€.(2κΉŒμ§€λ§Œ ν—ˆμš©)
    •
 μ˜ˆλ₯Ό λ“€μ–΄ whileλ¬Έ μ•ˆμ— if문이 있으면 λ“€μ—¬μ“°κΈ°λŠ” 2이닀.
    • 힌트: Indent(λ“€μ—¬μ“°κΈ°) depthλ₯Ό μ€„μ΄λŠ” κ°€μž₯ 쒋은 방법은 ν•¨μˆ˜(λ˜λŠ” λ©”μ„œλ“œ)λ₯Ό λΆ„λ¦¬ν•˜λ©΄ λœλ‹€.

ν•¨μˆ˜(λ˜λŠ” λ©”μ„œλ“œ)κ°€ ν•œ 가지 일만 ν•˜λ„λ‘ μ΅œλŒ€ν•œ μž‘κ²Œ λ§Œλ“€μ–΄λΌ.

ν•¨μˆ˜(λ˜λŠ” λ©”μ„œλ“œ)의 길이가 15라인을 λ„˜μ–΄κ°€μ§€ μ•Šλ„λ‘ κ΅¬ν˜„ν•œλ‹€. => ν•œ 가지 일만 μž˜ν•˜λ„λ‘ κ΅¬ν˜„.

else μ˜ˆμ•½μ–΄λ₯Ό 쓰지 μ•ŠλŠ”λ‹€.

if μ‘°κ±΄μ ˆμ—μ„œ 값을 return ν•˜λ„λ‘ κ΅¬ν˜„ν•˜λ©΄ elseλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

https://google.github.io/styleguide/javaguide.html

https://myeonguni.tistory.com/1596

 

μœ„μ™€ 같은 과정을 μ§€ν‚€λ©΄μ„œ, 더 λ‚˜μ•„κ°€ ν•¨μˆ˜(λ©”μ„œλ“œ)의 라인 수λ₯Ό μ€„μ΄κ±°λ‚˜, Indent의 depthλ₯Ό 1κΉŒμ§€λ§Œ ν—ˆμš©ν•˜λ„λ‘ 더 κ°œμ„ ν•΄ λ‚˜κ°€λ©΄μ„œ λ¦¬νŒ©ν† λ§μ„ μ§„ν–‰ν•©λ‹ˆλ‹€.

​

​

 

λ¦¬νŒ©ν† λ§μ— μ‚¬μš©λ  μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

	public static int splitAndSum(String text) {
		int result = 0;
		if(text == null || text.isEmpty()) {
			result = 0;
		} else {
			String[] values = text.split(",|:");
			for(String value: values) {
				result += Integer.parseInt(value);
			}
		}
		return result;
	}

 

μœ„ λ©”μ„œλ“œμ—λŠ” λ‹€μŒκ³Ό 같은 μ—¬λŸ¬ 문제점이 μ‘΄μž¬ν•©λ‹ˆλ‹€.

    • ν•œ λ©”μ„œλ“œκ°€ μ—¬λŸ¬κ°€μ§€μ˜ 일을 ν•©λ‹ˆλ‹€.

    • else μ˜ˆμ•½μ–΄κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.

    • depthκ°€ 2 μ΄μƒμž…λ‹ˆλ‹€.

​

λ”°λΌμ„œ μœ„μ™€ 같은 λ¬Έμ œμ μ„ κ°œμ„ ν•΄λ‚˜κ°€λ©° λ¦¬νŒ©ν† λ§μ„ 진행해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 

 

βœ” λ©”μ„œλ“œ 뢄리 λ¦¬νŒ©ν† λ§

 ν•œ λ©”μ„œλ“œμ— 였직 ν•œ λ‹¨κ³„μ˜ Indent(λ“€μ—¬μ“°κΈ°) 만 ν•œλ‹€.

μœ„ μ½”λ“œμ—μ„œ λ“€μ—¬μ“°κΈ°λ₯Ό 1둜 λ§žμΆ”κΈ° μœ„ν•΄ λ©”μ„œλ“œλ₯Ό 뢄리해야 ν•˜λŠ”λ°, for문의 μ½”λ“œλ₯Ό λ©”μ„œλ“œλ‘œ λ”°λ‘œ λΆ„λ¦¬ν•©λ‹ˆλ‹€.

 

 

μœ„μ—μ„œμ˜ for문을 sumμ΄λΌλŠ” λ©”μ„œλ“œλ‘œ λΆ„λ¦¬ν•΄μ„œ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

이제 splitAndSum λ©”μ„œλ“œλŠ” for문을 λ”°λ‘œ λΆ„λ¦¬ν•΄μ„œ λΉΌλƒˆκΈ°λ•Œλ¬Έμ—, depth λŠ” 1이 λ©λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ 아직 κ°œμ„ μ‚¬ν•­μ΄ λ§Žμ€λ°μš”, λ‹€μŒμœΌλ‘œ else μ˜ˆμ•½μ–΄λ₯Ό μ œκ±°ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.​

 

​

 

 

 else μ˜ˆμ•½μ–΄λ₯Ό 쓰지 μ•ŠλŠ”λ‹€.

기쑴의 μ½”λ“œ splinAndSum() 에 λΉ„ν•΄ removeElseSplitAndSum() λ©”μ†Œλ“œμ—λŠ” else μ˜ˆμ•½μ–΄λ₯Ό μ œκ±°ν–ˆλŠ”λ°μš”, 

 

μœ„μ™€ 같이 μ˜ˆμ™Έ 상황이 생겼을 λ•Œ(ifλ¬Έ) λ°”λ‘œ return을 ν•˜κ²Œ 되면 둜컬 λ³€μˆ˜(result)λ₯Ό 생성할 ν•„μš”κ°€ μ—†κ³ ,

λ˜ν•œ else μ˜ˆμ•½μ–΄λ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

(μ•„λž˜ μž‘μ—…μ—μ„  removeElseSplitAndSum λ©”μ„œλ“œμ˜ 이름을 splitAndSum 으둜 λ³€κ²½ν•˜κ³  μ‚¬μš©ν•©λ‹ˆλ‹€.)

 

 

 

 λ©”μ„œλ“œκ°€ ν•œ 가지 일만 ν•˜λ„λ‘ κ΅¬ν˜„ν•˜κΈ°.

μœ„μ˜ sum λ©”μ„œλ“œλŠ” 두 κ°€μ§€μ˜ 일을 ν•˜λŠ”λ°, λˆˆμΉ˜μ±„μ…¨λ‚˜μš” ?

    1) λ¬Έμžμ—΄μ„ μ •μˆ˜λ‘œ λ³€ν™˜ν•œλ‹€(parseInt)

     2) μ •μˆ˜λ₯Ό λͺ¨λ‘ λ”ν•œλ‹€(+=)

 

 

μœ„μ™€ 같이 두 κ°€μ§€μ˜ 일을 ν•˜λŠ”λ°μš”, λ”°λΌμ„œ "λͺ¨λ“  λ©”μ„œλ“œλŠ” ν•œ κ°€μ§€μ˜ 일을 ν•΄μ•Όν•œλ‹€"λŠ” μ›μΉ™λŒ€λ‘œ λ¦¬νŒ©ν† λ§μ„ ν•©λ‹ˆλ‹€.

μœ„μ™€ 같이 λ¬Έμžμ—΄μ„ μ •μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” λ©”μ„œλ“œ - toInts() , μ •μˆ˜λ₯Ό λ”ν•˜λŠ” λ©”μ„œλ“œ - sum() 을 톡해

μ΄μ œλŠ” 각 λ©”μ„œλ“œλ“€μ€ ν•œ κ°€μ§€μ˜ 일만 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

(toInts2(), tosum2() λ©”μ„œλ“œμ²˜λŸΌ streamκ³Ό λžŒλ‹€λ₯Ό 톡해 λ™μΌν•œ κ²°κ³Όλ₯Ό κ°„λ‹¨ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆμ–΄μš”! 😯)

 

 

λ˜ν•œ 기쑴의 splitAndSum() λ©”μ„œλ“œμ—λŠ” 기쑴의 values[] 둜컬 λ³€μˆ˜λ₯Ό μ œκ±°ν•˜κ³ , μœ„μ™€ 같이 λ°”λ‘œ return을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

ν˜„μž¬ κΉŒμ§€μ˜ μ½”λ“œλ₯Ό 보면 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.(κΈ°μ‘΄ μ½”λ“œλ₯Ό stream으둜 λŒ€μ²΄ν–ˆμŠ΅λ‹ˆλ‹€.)

    public static int splitAndSum(String text) {
        if (text == null || text.isEmpty()) {
            return 0;
        }
        return sum(toInts(text.split(",|:"))); // Decorator
    }

    private static int[] toInts(final String[] values) {
        return Arrays.stream(values).mapToInt(Integer::parseInt).toArray();
    }

    private static int sum(final int[] value) {
        return Arrays.stream(value).sum();
    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4};

        int result = Arrays.stream(arr).sum();
        System.out.println(result);
    }

 

 

 

βœ” compose method νŒ¨ν„΄ 적용

 λ©”μ„œλ“œ(ν•¨μˆ˜)의 μ˜λ„κ°€ 잘 λ“œλŸ¬λ‚˜λ„λ‘ λ™λ“±ν•œ μˆ˜μ€€μ˜ μž‘μ—…μ„ ν•˜λŠ” μ—¬λŸ¬ λ‹¨κ³„λ‘œ λ‚˜λˆˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ μœ„μ—μ„œμ˜ λ¬Έμž₯을 λ¦¬νŒ©ν† λ§ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 

 

 

βœ” λ¦¬νŒ©ν† λ§ 마무리

λ¦¬νŒ©ν† λ§μ΄ λ§ˆλ¬΄λ¦¬κ°€ λ˜μ—ˆλŠ”λ°μš”, λ¦¬νŒ©ν† λ§ ν•˜κΈ° μ „μ˜ μ½”λ“œμ™€ ν›„μ˜ μ½”λ“œλ₯Ό λΉ„κ΅ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

 

 

λ¦¬νŒ©ν† λ§ μ „ μ½”λ“œ

	public static int splitAndSum(String text) {
		int result = 0;
		if(text == null || text.isEmpty()) {
			result = 0;
		} else {
			String[] values = text.split(",|:");
			for(String value: values) {
				result += Integer.parseInt(value);
			}
		}
		return result;
	}

 

 

 

 

λ¦¬νŒ©ν† λ§ ν›„ μ½”λ“œ

    public static int splitAndSum(String text) {
        if (isBlank(text)) {
            return 0;
        }
        return sum(toInts(split(text))); // Decorator
    }

    private static boolean isBlank(final String text) {
        return (text == null || text.isEmpty());
    }

    private static String[] split(final String text) {
        return text.split(",|:");
    }

    private static int[] toInts(final String[] values) {
        return Arrays.stream(values).mapToInt(Integer::parseInt).toArray();
    }

    private static int sum(final int[] value) {
        return Arrays.stream(value).sum();
    }

 

 

 

πŸŽ‰ λ¦¬νŒ©ν† λ§μ„ ν•œ ν›„μ˜ μ½”λ“œμ˜ νŠΉμ§•μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 κ° λ©”μ„œλ“œ(ν•¨μˆ˜)λŠ” ν•œ κ°€μ§€μ˜ 일만 ν•©λ‹ˆλ‹€.

 κ° λ©”μ„œλ“œμ˜ Indent(λ“€μ—¬μ“°κΈ°) depth 은 λͺ¨λ‘ "1" μž…λ‹ˆλ‹€.

 else μ˜ˆμ•½μ–΄κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

​

​

​

βœ” κ°•μ˜ λ‚΄μš©μ„ μ •λ¦¬ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 ν•œλ²ˆμ— λͺ¨λ“  원칙을 μ§€ν‚€λ©΄μ„œ λ¦¬νŒ©ν† λ§μ„ ν•˜λ €κ³  μ—°μŠ΅ν•˜μ§€ 마라.

 ν•œλ²ˆμ— ν•œ 가지 λͺ…ν™•ν•˜κ³  ꡬ체적인 λͺ©ν‘œλ₯Ό 가지고 μ—°μŠ΅ν•˜λΌ.

 μ—°μŠ΅μ€ 극단적인 λ°©λ²•μœΌλ‘œ μ—°μŠ΅ν•˜λŠ” 것도 μ’‹λ‹€.

     ν•œ λ©”μ„œλ“œμ˜ 라인 수 μ œν•œμ„ 15라인 -> 10라인으둜 쀄이도둝 μ—°μŠ΅ν•  것

​

 

 

 

 

 

 

 

 

 

λ°˜μ‘ν˜•

λŒ“κΈ€