|
| 1 | +--- |
| 2 | +title: "리팩토링 기술에 대해서 카테고리별 정리 - 요약편" |
| 3 | +date: "2025-07-13" |
| 4 | +tags: ["Clean Code", "Java"] |
| 5 | +summary: "A categorized summary of essential refactoring techniques for improving code structure and readability" |
| 6 | +description: "자주 사용되는 리팩토링 기법들을 카테고리별로 정리한 요약편" |
| 7 | +--- |
| 8 | + |
| 9 | +:::quote |
| 10 | +[리팩토링 2판](https://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Signature/dp/0134757599/ref=pd_sbs_5/147-9985226-7575522?pd_rd_w=IqNPf&pf_rd_p=3676f086-9496-4fd7-8490-77cf7f43f846&pf_rd_r=D6D6Y0JWZ93JER6KZ2J3&pd_rd_r=abe95b3d-5be0-437a-8fd3-e5d4959ae207&pd_rd_wg=k2g1l&pd_rd_i=0134757599&psc=1)과, 백기선님의 강의인 [인프런 - 코딩으로 학습하는 리팩토링](https://www.inflearn.com/course/%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81)의 내용이 포함되어 있다. |
| 11 | +::: |
| 12 | + |
| 13 | + |
| 14 | +--- |
| 15 | + |
| 16 | +### 기본 기술 - 가장 자주 사용하는 리팩토링 기술 |
| 17 | + |
| 18 | +아래와 같은 refactoring 기술은 여러 refactoring 을 할 때 사용되는 기본이 되면서 자주 사용하는 기술이라고 할 수 있다. |
| 19 | + |
| 20 | +#### 1) Extract Function (함수 추출하기) ↔ Inline Function (함수 인라인하기) |
| 21 | +#### 2) Inline Function (함수 인라인하기) ↔ Extract Function (함수 추출하기) |
| 22 | +* 함수 추출하기, 함수 인라인하기는 서로 반대되는 리팩토링 기술이다. |
| 23 | + |
| 24 | +#### 3) Extract Variable (변수 추출하기) |
| 25 | +#### 4) Inline Variable (변수 인라인하기) |
| 26 | +#### 5) Change Function Declaration (함수 선언 변경하기) |
| 27 | +#### 6) Encapsulate Variable (변수 캡슐화하기) |
| 28 | +#### 7) Rename Variable (변수 이름 바꾸기) |
| 29 | +#### 8) Introduce Parameter Object (매개 변수 객체 만들기) |
| 30 | +#### 9) Combine Functions into Class (여러 함수를 클래스로 묶기) |
| 31 | +#### 10) Combine Function into TransForm (여러 함수를 변환 함수로 묶기) |
| 32 | +#### 11) Split Phase (단계 쪼개기) |
| 33 | + |
| 34 | + |
| 35 | +--- |
| 36 | + |
| 37 | +### 캡슐화 - 모듈에서 외부 시스템으로 공개하지 않아도 되는 데이터를 숨기는 기술 |
| 38 | + |
| 39 | +#### 1) Encapsulate Record (레코드 캡슐화하기) |
| 40 | +#### 2)Encapsulate Collection (컬렉션 캡슐화하기) |
| 41 | +- 어떠한 클래스가 가지고 있는 컬렉션을 캡슐화하는 방법이다. |
| 42 | +- 컬렉션 자체를 캡슐화하는 것. |
| 43 | +- 컬렉션의 복사본을 전달하거나 컬렉션 자체를 제공하는게 아니라, 컬렉션을 수정할 수 있는 메서드를 제공한다거나.. |
| 44 | +#### 3) Replace Primitive with Object (기본형을 객체로 바꾸기) |
| 45 | +#### 4) Replace Temp with Object (임시 변수를 질의 함수로 바꾸기) |
| 46 | +#### 5) Extract Class (클래스 추출하기) |
| 47 | +#### 6) Inline Class (클래스 인라인하기) |
| 48 | +#### 7) Hide Delegate (위임 숨기기) ↔ Remove Middle Man (중재자 제거하기) |
| 49 | +#### 8) Remove Middle Man (중재자 제거하기) ↔ Hide Delegate (위임 숨기기) |
| 50 | +#### 9) Substitute Algorithm (알고리듬 교체하기) |
| 51 | +- 캡슐화가 잘되어 있을때 사용할 수 있는 리팩토링 기술이라고 할 수 있음. |
| 52 | + |
| 53 | +--- |
| 54 | + |
| 55 | +### 기능 옮기기 - 함수나 필드 또는 문장을 적절한 위치로 옮기는 기술 |
| 56 | + |
| 57 | +#### 1) Move Function (함수 옮기기) |
| 58 | +#### 2) Move Field (필드 옮기기) |
| 59 | +#### 3) Move Statements into Function (문장을 함수로 옮기기) ↔ Move Statements to Callers (문장을 호출한 곳으로 옮기기) |
| 60 | +- statements 를 함수 안으로 옮기는 것 |
| 61 | +- 항상 호출되는 statements 는 함수 안으로 옮기는 것이 더 적절하다는 것이다. |
| 62 | +#### 4) Move Statements to Callers (문장을 호출한 곳으로 옮기기) ↔ Move Statements into Function (문장을 함수로 옮기기) |
| 63 | +- 문장을 함수를 호출하는 곳으로 옮기는 것 |
| 64 | +- 함수 추출하기를 다시 하고 싶은 경우에 사용 |
| 65 | +- 하나의 Statement 에 대해서 적절한 위치를 찾아주는 리팩토링 기술 |
| 66 | +#### 5) Replace Inline Code with Function Call (인라인 코드를 함수 호출로 바꾸기) |
| 67 | +- Inline 된 코드가 여러번 사용되면 함수로 변경하는 것 |
| 68 | +#### 6) Slide Statements (문장 슬라이드 하기) |
| 69 | +- 코드를 정리하다보면 위아래로 내리기만해도 그 부분을 줄일 수 있다. |
| 70 | +#### 7) Split Loop (반복문 쪼개기) |
| 71 | +- 반복문 안에서 여러가지 일을 하니깐 하나의 Function 으로 추출하는 것이고, 필드가 옮겨질수도 있다. |
| 72 | +#### 8) Replace Loop with Pipeline (반복문을 파이프라인으로 바꾸기) |
| 73 | +#### 9) Remove Dead Code (죽은 코드 제거하기) |
| 74 | + |
| 75 | +--- |
| 76 | + |
| 77 | +### 데이터 조직화 - 데이터(변수가 필드) 구조를 다루는 기술 |
| 78 | + |
| 79 | +#### 1) Split Variable (변수 쪼개기) |
| 80 | +#### 2) Rename Field (필드 이름 바꾸기) |
| 81 | +#### 3) Replace Derived Variable with Query (파생 변수를 질의 함수로 바꾸기) |
| 82 | +- 계산할 수 있는 변수를 굳이 필드로 선언하지 말자는 것. |
| 83 | +- 다른 변수들을 통해서 계산할 수 있는 것은 함수로 바꾸자는 것. |
| 84 | +#### 4) Change References to Value (참조를 값으로 바꾸기) |
| 85 | +- 어떤 매개변수를 다룰 때 참조가 아니라 값을 전달한다는 것. |
| 86 | +- Reference 의 값을 많이 쓴다면 적절하겟지만 값하나만 쓰는 거면 값 하나만 전달한다는 것. |
| 87 | +#### 5) Change Value to References (값을 참조로 바꾸기) |
| 88 | + |
| 89 | +--- |
| 90 | + |
| 91 | +### 조건부 로직 간소화 - 복잡한 조건문을 다루는 기술 |
| 92 | + |
| 93 | +#### 1) Decompose Conditional (조건문 분해하기) |
| 94 | +#### 2) Consolidate Conditional Expression (조건식 통합하기) |
| 95 | +- 여러 조건문이 있는 경우에 하나의 메서드로 빼내는것. |
| 96 | +#### 3) Replace Nested Conditional with Guard Clauses (중첩 조건문을 보호 구문으로 바꾸기) |
| 97 | +- Guard Clauses |
| 98 | +#### 4) Replace Conditional with Polymorphism (조건부 로직을 다형성으로 바꾸기) |
| 99 | +#### 5) Introduce Special Case (특이 케이스 추가하기) |
| 100 | +#### 6) Introduce Assertion (어서션 추가하기) |
| 101 | + |
| 102 | +--- |
| 103 | + |
| 104 | +### API 리팩토링 - 쉽게 이해하고 사용할 수 있는 API 를 만드는 기술 |
| 105 | + |
| 106 | +:::warning |
| 107 | +✔ HTTP API 와 같은 것만 API 가 아니고, interface, class, function, method 이런 것들도 모두 API 라고 볼 수 있다. |
| 108 | +✔ 함수의 선언부를 변경하는 것도 API 리팩토링이라고 볼 수 있다. |
| 109 | +::: |
| 110 | + |
| 111 | +#### 1) Separate Query from Modifier (질의 함수와 변경 함수 분리하기) |
| 112 | +#### 2) Parameterize Function (함수 매개 변수화하기) |
| 113 | +- 매개변수에 따라서 함수가 하는 일이 달라지게 만들어주는 것이다. |
| 114 | +- 그렇게 함으로써, 여러 함수들을 만드는 것을 줄일 수 있다면 유용한 리팩토링이 된다는 이야기. |
| 115 | +#### 3) Remove Flag Argument (플래그 인수 제거하기) |
| 116 | +#### 4) Preserve Whole Object (객체 통째로 넘기기) |
| 117 | +#### 5) Replace Parameter with Query (매개 변수를 질의 함수로 바꾸기) |
| 118 | +#### 6) Replace Query with Parameter (질의 함수를 매개 변수로 바꾸기) |
| 119 | +#### 7) Remove Setting Method (세터 제거하기) |
| 120 | +#### 8) Replace Constructor with Factory Function (생성자를 팩토리 함수로 바꾸기) |
| 121 | +#### 9) Replace Function with Command (함수를 명령으로 바꾸기) |
| 122 | +#### 10) Replace Command with Function (명령을 함수로 바꾸기) |
| 123 | + |
| 124 | +--- |
| 125 | + |
| 126 | +### 상속 다루기 - 상속을 제대로 사용하는 기술 |
| 127 | + |
| 128 | +#### 1) Pull up Method (메서드 올리기) |
| 129 | +#### 2) Pull up Field (필드 올리기) |
| 130 | +#### 3) Pull up Constructor Body (생성자 본문 올리기) |
| 131 | +#### 4) Push Down Method (메서드 내리기) |
| 132 | +#### 5) Push Down Field (필드 내리기) |
| 133 | +#### 6) Replace Type Code with Subclasses (타입 코드를 서브 클래스로 바꾸기) |
| 134 | +#### 7) Remove Subclass (서브클래스 제거하기) |
| 135 | +#### 8) Extract Superclass (슈퍼 클래스 추출하기) |
| 136 | +#### 9) Collapse Hierarchy (계층 합치기) |
| 137 | +#### 10) Replace Subclass with Delegate (서브 클래스를 위임으로 바꾸기) |
| 138 | +#### 11) Replace Superclass with Delegate (슈퍼 클래스를 위임으로 바꾸기) |
| 139 | + |
| 140 | +:::tip |
| 141 | +<a href="https://github.com/eottabom/refactoring-study" target="_blank" >예제 코드 보러가기 (클릭)</a> |
| 142 | +::: |
| 143 | + |
| 144 | +--- |
| 145 | + |
| 146 | +:::success |
| 147 | +<b> 개인적인 생각</b> |
| 148 | +✔ 다양한 Refactoring 기술이 있지만, 중요한 것은 <b>의미 전달</b>이라고 생각한다. |
| 149 | +✔ 의도가 드러나게 코드를 작성해야 협업도 수월하고 유지보수도 쉬워진다. |
| 150 | +✔ 좋은 리팩토링은 읽는 사람이 고민하지 않게 만든다는 것이다. |
| 151 | +::: |
| 152 | + |
| 153 | +--- |
| 154 | + |
| 155 | +### 📚 Reference |
| 156 | + |
| 157 | +* [리팩토링 2판](https://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Signature/dp/0134757599/ref=pd_sbs_5/147-9985226-7575522?pd_rd_w=IqNPf&pf_rd_p=3676f086-9496-4fd7-8490-77cf7f43f846&pf_rd_r=D6D6Y0JWZ93JER6KZ2J3&pd_rd_r=abe95b3d-5be0-437a-8fd3-e5d4959ae207&pd_rd_wg=k2g1l&pd_rd_i=0134757599&psc=1) |
| 158 | +* [인프런 - 코딩으로 학습하는 리팩토링](https://www.inflearn.com/course/%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81) |
| 159 | + |
| 160 | +<br/><br/> |
0 commit comments