////
Search
Duplicate

14. 순차적 코드 구성하기

이 장에서는 명령문과 명령문 블록을 순차적으로 입력하는 가장 간단한 형태의 제어 구조를 소개한다.

1. 순서가 중요한 명령문

순서가 중요한 명령문은 정렬하기 쉽다. 다음 예를 확인해보자.
data = readData(); results = calculateResultsFromData( data ); printResults(results);
Java
복사
특별할 일이 발생하지 않는 한 이 코드에 있는 명령문은 반드시 작성된 순서대로 실행된다.
데이터를 읽고, 결과를 계산하고, 계산한 결과를 출력한다. 각 연산들은 바로 전의 연산에 의존하고 있다.
순서가 중요하지만 의존성이 덜 분명하게 작성된 명령문도 존재한다.
revenue.computeMonthly(); revenue.computeQuarterly(); revenue.computeAnnual();
Java
복사
이 예제에서 분기별 계산은 이미 월별 계산이 되어있다는 전제하에 동작한다.
각 연산들 사이에 의존성이 존재하지만 이 코드만으로 그 의존성을 확인할 수 없다. 여기에서는 그러한 의존성이 분명하지 않고 감춰져있다.
명령문이 특정한 순서로 작성되어야 하는 의존성이 존재하는 경우에는 의존성을 분명히 하는 과정이 필요하다. 다음은 명령문 배치와 관련된 지침이다.
의존성이 분명하게 보이게 코드를 구성하라.
의존성이 분명하게 보이게 메소드의 이름을 작성하라.
의존성을 분명하게 하기 위해서 메소드 매개변수를 사용하라.
메소드끼리 데이터를 주고 받는 것으로 의존성을 표현할 수 있다.
InitializeExpenseData( expenseData ) ComputeMarketingExpense( expenseData ) ComputeSalesExpense( expenseData ) ComputeTravelExpense( expenseData ) ComputePersonnelExpense( expenseData ) DisplayExpenseSummary( expenseData )
Visual Basic
복사
데이터가 순서의 의존성이 없음을 표현할 수도 있다.
ComputeMarketingExpense( marketingData ) ComputeSalesExpense( salesData ) ComputeTravelExpense( travelData ) ComputePersonnelExpense( personnelData ) DisplayExpenseSummary( marketingData, salesData, travelData, personnelData )
Visual Basic
복사

2. 순서가 중요하지 않은 명령문

순서가 중요하지 않더라도 정렬은 가독성과 성능, 유지보수성에 영향을 미친다.
정렬을 위해 보조 기준들을 적용할 수 있으며 기본 가이드라인은 연관된 작업을 함께 두는 근접성 원칙을 따른다.

코드를 하향식으로 읽을 수 있도록 개발

기본 원칙은 코드를 여기저기 건너뛰지 않고 하향식으로 읽을 수 있게 개발하는 것이다.
단순히 제어 흐름이 실행 시 하향식으로 진행하게 하는 것만으로는 충분하지 않다. 코드를 읽는 사람이 이해에 필요한 정보를 찾기 위해서 코드를 뒤져야한다면 재구성해야한다는 뜻이다.
다음은 적절하지 않은 예다.
MarketingData marketingData; SalesData salesData; TravelData travelData; travelData.ComputeQuarterly(); salesData.ComputeQuarterly(); marketingData.ComputeQuarterly(); salesData.ComputeAnnual(); marketingData.ComputeAnnual(); travelData.ComputeAnnual(); salesData.Print(); travelData.Print(); marketingData.Print();
Visual Basic
복사
특정한 변수 객체인 marketingData가 어떻게 사용되는지 알고 싶다고 하자.
코드를 읽는 사람은 marketingData를 참조하는 모든 코드를 추적해야 한다.
다음은 같은 코드를 더 나은 구조로 작성한 것이다.
MarketingData marketingData; marketingData.ComputeQuarterly(); marketingData.ComputeAnnual(); marketingData.Print(); SalesData salesData; salesData.ComputeQuarterly(); salesData.ComputeAnnual(); salesData.Print(); TravelData travelData; travelData.ComputeQuarterly(); travelData.ComputeAnnual(); travelData.Print();
Visual Basic
복사
이 코드는 여러 면에서 앞선 코드보다 좋다.
각 객체에 대한 참조를 함께 위치시켜 참조가 지역화되었다.
객체가 살아 있는 코드의 범위가 좁아졌다.
가장 중요한 점은 각 객체 별로 메소드를 추출해낼 수 있게 되었다는 점이다.

연관된 명령문 그룹화하기

연관된 명령문을 함께 둔다. 이 명령문은 같은 데이터를 처리하거나 비슷한 작업을 수행하거나 각 명령문의 처리 순서에 의존하기 때문에 관련지을 수 있다.
연관된 명령문이 잘 정렬되어있는지 확인하는 방법은 연관된 객체끼리 그룹짓고 그들이 겹치는지 확인해보는 것이다. 명령문이 잘 정렬되어 있다면 그룹끼리 겹치지 않을 것이다.
관련 명령문을 그룹화하고 나면 서로 아주 밀접하게 관련되어 있으면서도 전후 명령문과는 아무런 관계가 없는 명령문을 발견하게 될 것이다.
그런 경우에는 밀접하게 연관된 명령문을 별도의 메소드로 리팩토링한다.

요점 정리

순차적인 코드를 구성하는 가장 강력한 원칙은 의존성을 정리하는 것이다.
의존성은 훌륭한 메소드명이나 매개변수 리스트, 주석, 보조 변수(코드의 가독성이 정말 중요한 경우)의 사용을 통해 분명히하는 것이 좋다.
코드가 순서에 의존하지 않는다면 연관된 명령문을 가능한 가까이에 둔다.