본문 바로가기
study/geultto

코드를 보면 사람이 보인다: MECE한 사고, 깨끗한 코드

by 고기만두(개발자) 2024. 3. 16. 18:35
728x90
반응형

프로그래밍을 처음 배울 때, 새로운 언어를 접할 때 아마 다 IF문부터 배우게 될 것이다.

새로운 수정 요청이 들어와서 기존 소스를 점검하는데,

내가 생각하지 못한 좋은OR나쁜 방식으로 짠 코드를 보고 생각나서 이 글을 써보게 되었다.

IF문을 모르는 프로그래머는 아무도 없겠지만 잘 사용할 줄 아는 사람은 또 생각보다 많지 않은 것 같다.

그리고 사람들마다 스타일도 천차만별이라, 코드를 보면 사람이 보인다.

728x90

*업무에서는 주로 자바를 사용하며, 자바 소스로 예시를 들어보았다.

*업무에서 제시되는 상황을 약간 각색하였다.


문제상황 1.
나의 영업 실적과 회원가입 유도에 따른 포인트 리워드 제도를 만들려고 한다.
1) 나의 실적 100만원 이상
2) 나의 추천인코드로 입력하고 들어온 회원 2명 이상 이거나, 내 추천인코드로 가입한 회원이 추천인코드 발급하여 들어온 회원이 5명 이상
3) 나의 추천인코드로 입력하고 들어온 회원이 1명 이거나, 내 추천인코드로 가입한 회원이 추천인코드 발급하여 들어온 회원이 3명 이상

1) 2) 를 만족하는 경우 100만 포인트를 지급한다.
1) 3) 을 만족하는 경우( 2) 는 만족하지 못한 경우) 50만 포인트를 지급한다.
1)만 만족하고 2)와 3)을 만족하지 못한 경우에는 포인트를 지급하지 않는다.
double amount = 1000000;	//실적 기준금액 100만원
int x = 1;	//내가 직접 영입한 회원수
int y = 5;	//내가 영입한 회원이 영입한 회원수
double reward = 0;	//리워드

if(amount >= 1000000) {
        if(x >= 2 || y >= 5) {
            reward = 100000;
        } else if (x == 1 || y >= 3 ){
            reward = 50000;
        } else if( x == 0 || y < 3) {
            reward = 0;
        }
}

 

나라면 일단 직관적으로 이렇게 짰을 것 같다.

그런데 ... 만약 실적 100만원 이상 말고 200만원 이상인 경우,

1에서 제시한 금액의 2배를 준다는 조건을 언젠가 먼 미래에 추가한다면??

if(amount >= 2000000) {
        if(x >= 2 || y >= 5) {
            reward = 200000;
        } else if (x == 1 || y >= 3 ){
            reward = 100000;
        } else if( x == 0 || y < 3) {
            reward = 0;
        }
} else if(amount >= 1000000 && amount < 2000000){
        if(x >= 2 || y >= 5) {
            reward = 100000;
        } else if (x == 1 || y >= 3 ){
            reward = 50000;
        } else if( x == 0 || y < 3) {
            reward = 0;
        }
}

 

조건 하나 더 붙였다가 굉장히 뭐가 많아졌다.

x, y if 문 을 따로 메소드로 빼고, 200만원 이상일 때 *2 처리 하는 방법도 있겠지만,

조건이 어떻게 변화할 지 모르니

(갑자기 2배가 될 지 3배가 될지도 모르고, 다른 조건이 더 붙을 수도 있는 거고)

이렇게 짜기에도 조금 위험 부담이 있긴 해 보인다.

요구사항 문서를 보며 대략 이정도를 생각하며 전임자가 짜둔 원래의 코드를 보았다.

if( (amount >= 1000000) && (x >= 2 || y >= 5) ) {
    reward = 100000;
} else if ( (amount >= 1000000) && (x == 1 || y >= 3) ) {
    reward = 50000;
} else if ( (amount >= 1000000) && (x == 0 || y < 3) ) {
    reward = 0;
}

 

전임자가 짜둔 코드는 이런 방식이었다.

내가 생각한 코드가 더 나은지, 저 코드가 더 나은지를 비교하고 싶진 않다.

사람마다 판단 기준은 다를 수 있을 것이라고 생각한다.

그런데 나는 저걸 보면서 오, 이렇게도 생각할 수 있구나 라는 생각을 했다.

 

개인적으로는 and/or조건 여러 개를 한줄로 갖다 붙이면 헷갈려질까봐,

줄 수를 조금 더 쓰더라도 언제 다시 봐도 이해 가게 만들려고 하는 편이지만..

실적 조건이 변하더라도,

저기에 갖다 붙이면 if/else문의 깊이가 더 깊어지진 않겠다 라는 생각이 든다.

사실 한도 끝도 없이 깊어지는 코드를 보면 한숨이 나온다.

 


문제상황 2. 매사가 부정적인 사람의 꼬꼬무
성적 A면 Awesome B면 good C면 soso D면 horrible
그것도 아닌 경우 NO! 를 출력하는 간단한 예제를 생각해보자.
반응형
String grade = "A";
String result = "";

if (grade == "A"){
    result = "Awesome";
} else if(grade == "B"){
    result = "good";
} else if(grade == "C"){
    result = "soso";
} else if(grade == "D"){
    result = "horrible";
} else {
	result = "NO!";
}
System.out.print(result);

 

보통 이 정도 간단한 코드를 생각한다.

물론 실무적인 상황은 더 복잡하지만,

아무튼 이런 정도의 조건문을 출력하면 되는 예제가

String grade = "A";
String result = "";

if (grade != "A"){
    if(grade != "B"){
        if(grade != "C"){
            if(grade != "D"){
                result = "NO!";
            }else {
                result = "horrible";
            }
        }else {
            result = "soso";
        }
    }else {
        result = "good";
    }
}else {
    result = "Awesome";
}
System.out.print(result);

 

누군지 모를 오래전 전임자에 의해 이런 식으로 한도 끝도 없이 깊이 들어가게 되어 있는 걸 본 적이 있다.

평가하고 싶진 않았지만, 이런 소스를 만나면 왜 그런 생각을 하셨는지

그날 혹시 뭔가 안 좋은 일이 있었는지를 묻고 싶다.


조건을 잘 설정하려면 일단 빠뜨리는 경우가 있어서는 안 된다.

그리고 중복되어 걸리지 않도록 해야 한다.

 

이를 MECE라고 한다. 

Mutually Exclusive (상호 배제적)

: 각각의 카테고리나 옵션은 다른 것들과 중복되지 않아야 한다.

즉, 하나의 항목이 한 번에 두 개 이상의 그룹에 속하면 안 된다.

중복을 피하고 각 항목을 명확하게 정의하는 방법이다.

Collectively Exhaustive (전체를 완전히 포괄하는)

: 모든 가능한 경우를 아우르며, 빠짐없이 모든 옵션을 고려해야 한다.

문제나 분석 대상의 모든 부분이나 영역을 다루고, 아무것도 빠뜨리지 않도록 하는 것을 의미한다.

 

조건문을 짜고 코딩을 하는 것 말고도, 평소 비즈니스적인 사고방식에서도 꼭 필요한 덕목이다.

가장 논리적인 사람들이 모여있는 맥킨지 컨설팅그룹에서 만들어지고 전파된 개념이다.

 

 

[논리의 기술]

 

바바라 민토, 논리의 기술 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

[로지컬 씽킹]

 

 

로지컬 씽킹 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

책 2권을 추천. 사실 시간이 없다면 둘 중 하나만 읽어봐도 충분할 것 같다.

컨설팅 회사 다니던 시절 전자를 추천받아 읽어본 적이 있는데, 지금까지도 꾸준히 써먹고 있고, 그러려고 노력한다.

 

좋은 코드에 대한 고민을 하며 [클린 코드] 역시 읽어본 적이 있는데,

어떻게 하면 더 깔끔하고 좋은 코드를 만들 지 항상 생각하고 있다.

 

챕터별 요약본이라도 보고싶다면 아래 글부터 이어지는 글들 참고.

https://career-gogimandu.tistory.com/119

 

클린코드(Clean code) 1장 - 좋은 코드와 나쁜 코드

https://career-gogimandu.tistory.com/115 Java 힙 공간 에러 발생한 배치 성능개선후기 2022.08.19 개발된지 3년이 넘은 이후로 마지막 수정 2019년 초 나 입사 전 그 뒤 전혀 수정 없이 매달 루틴하게 잘쓰던 자

career-gogimandu.tistory.com

 

* 독자 분들이 읽으셨던 좋은 책에 대한 추천을 환영합니다.

* 어떤 코드가 좋은지에 대한 의견 교환 역시 환영합니다.

728x90
반응형

댓글