Refactoring (리펙토링)
[Refactoring] 6-2. 캡슐화 (클래스 추출하기)
jake-kim
2023. 3. 22. 01:02
클래스 or 구조체 추출하기
* 아래부터 편의상 구조체 추출하기도 클래스 추출하기로 명칭
- 클래스 안에 일부 property나 메소드를 또다른 클래스로 묶을 수 있다면 따로 그 요소들을 별도의 클래스로 만드는 것
- 클래스는 데이터가 추가되고, 연산이 추가되다보면 어느새 비대해지는데, 역할이 많을수록 복잡도가 증가하는데 이 것을 클래스 추출하기를 통해 해결이 가능
- 하나의 클래스에는 하나의 성격만 담도록 코딩하다보면 나중에 변경할때도 다른 사이드 이펙을 고려하지 않고 쉽게 수정이 가능

ex) 구조체 추출하기
struct Person {
let officeAreaCode: String
let officeNumber: String
func getOfficeAreaCode() -> String {
officeAreaCode
}
func getOfficeNumber() -> String {
officeNumber
}
}
- person관련 정보와 phone성격 2가지가 있는데 이게 모두 Person 하나에 다 있으므로 Person에서 Phone정보를 따로 구조체로 추출이 가능
- 리펙토링 - phone 성격을 따로 struct로 추출하기
- 코드는 길어지긴 했지만 PhoneNumber라는 것을 캡슐화하여 Person 입장에서는 phoneNumber의 내부 로직을 모르게하여 Person의 관심사를 좁혀서 코딩할때 쉽게 접근할 수 있는 장점이 존재
struct Person {
private let phoneNumber: PhoneNumber
init() {
phoneNumber = .init(areacode: "", number: "")
}
func getOfficeAreaCode() -> String {
phoneNumber.getAreaCode()
}
func getOfficeNumber() -> String {
phoneNumber.getNumber()
}
}
struct PhoneNumber {
let areacode: String
let number: String
func getAreaCode() -> String {
areacode
}
func getNumber() -> String {
number
}
}
* 참고
- Refactoring (Marting Flowler)