반복문 사용시 성능 향상 방법 반복문 안에 배열 사용을 자제하기 배열에 접근할 때는 경계 검사(Bound Checking, 배열의 범위를 벗어난 접근이 있는가를 확인)를 하므로, 반복문 안에 배열을 사용하는 것보다 임시 변수를 사용할 수 있다면 임시 변수를 사용하는 것이 바람직하다. for ( int I = 0 ; I < repeat ; I++ ) { cou.. 프로그램 아키텍쳐/Refactoring 2010.12.09
조건 분기를 단순하게 변경하기 조건의 분해(Decompose Conditional) if-else문의 조건이 너무 복잡할 경우 메소드로 치환해 알기 쉬운 코드로 변경한다. 변경하기 전의 프로그램 코드) if( money >= 100 && tip >= 100 && score >=100 ) { pay = money ++; tip += bonus; } else { pay = money + tip; } 위와 같은 코드를 메소드로 치환하여 다음과 .. 프로그램 아키텍쳐/Refactoring 2010.12.09
클래스의 추출(Extract Class) 클래스는 각각 담당하는 일이 있고, 그 일을 완수해야 할 책임이 있다. ‘1개의 클래스가 완수할 책임은 1개’라는 것이 가장 이상적인 클래스이지만 개발을 하다 보면 클래스가 점점 부풀어져서 1개의 클래스가 많은 책임을 갖게 되는 경우도 종종 있다. 이럴 때는 책임을 분산시킬 클래스를 추출한다.. 프로그램 아키텍쳐/Refactoring 2010.12.09
메소드 추출(Extract Method)와 메소드 이름 변경(Rename Method) 메소드 추출(Extract Method) 클래스안에 메소드가 너무 길 경우, 메소드 안에 자잘한 처리가 연속되어 있는 경우, 그 처리 내부에서 그룹을 찾아내고 그 그룹을 독립적인 메소드로 추출한다. 그런 다음 추출한 메소드에 적절한 이름을 붙인다. 이것이 메소드 추출이다. 길고 지저분하.. 프로그램 아키텍쳐/Refactoring 2010.12.09
Null 객체의 도입(Introduce Null Object) 어떤 경우에는 Null 값이 들어오고 어떤 경우에는 정상적인 값이 들어올 경우가 있다면 Null 객체를 도입함으로써 Null 체크를 줄일 수 있다. Null 객체의 도입은 프로그램 코드 안에서 Null 체크가 많을 경우 유용한다. ■ Null 객체 만들기 원래 클래스의 서브 클래스를 만든다. (원래 클.. 프로그램 아키텍쳐/Refactoring 2010.12.09
제어 플래그의 삭제(Remove Control Flag) 플래스(flag)란 ‘깃발’을 의미하지만 프로그래밍에서는 ‘상태를 기록하고 처리의 흐름을 제어하기 위한 boolean형 변수’를 의미한다. 제어 플래그가 반드시 나쁜 것은 아니다. 프로그램에 상태를 기록하는 것은 필요하다. 하지만 제어 플래그를 지나치게 많이 사용하면 처리의 .. 프로그램 아키텍쳐/Refactoring 2010.12.09
설명용 변수의 도입(Introduce Explaining Variable) 코드의 내용이 이해하기 어렵게 코딩되어 있다면 설명용 변수의 도입을 생각해 볼 수 있다. if( n.equals("anonymous") && p.equals("") || n.equals("guest") && p.equals("") ) 위와 같은 코드는 이해하기 어렵다. 이 때 설명용 변수를 도입한다. boolean isAnonymous = n.equals("anonymous") && p.equals(""); boolean isGuest = n.equals("guest") && p.eq.. 프로그램 아키텍쳐/Refactoring 2010.12.09
정수의 의존관계 정수의 의존관계란 하나의 정수가 다른 정수에 영향을 미치는 관계를 말합니다. 예를 들어 '작업영역의 길이'와 '최대 입력길이'라는 두 개의 정수간에 의존관계가 있다고 가정하고, '작업 영역의 길이는 최대 입력 길이의 2배이다'라는 의존관계를 아래의 코드처럼 개별적인 심볼릭 정수.. 프로그램 아키텍쳐/Refactoring 2010.12.09
매직넘버를 심볼릭 정수로 치환하기 매직넘버란 소스 코드 안에 작성된 구체적인 숫자값을 말합니다. 예를 들어 다음과 같이 입력받은 값의 길이가 100을 넘기면 예외를 발생시키는 코드를 보면 다음과 같습니다. If ( 100 > input.length ) then Throw New OutofLengthException() End If 위 코드에서 숫자 100이 의미하는 뜻을 알 수가 없습니.. 프로그램 아키텍쳐/Refactoring 2010.12.09
리팩토링의 단계별 접근 방법 1. 한번에 2개씩 수정하지 않는다. 리팩토링을 할 때는 ‘리팩토링을 하기전에 테스트 - 리팩토링 - 리팩토링 후 테스트’ 의 순서를 가진다. 이와 같은 단계는 지켜가면서 리팩토링 하는 것이 좋다. 즉, 한번에 하나씩 수정하는 것이 가장 좋은 방법이다. 리팩토링은 여러 작업을 동시에 .. 프로그램 아키텍쳐/Refactoring 2010.12.09