컬렉션이나 레코드의 게터/세터, 그리고 가변데이터와 관련된 문제가 무엇이고 그 해결책을 설명하시오.
- 컬렉션 변수 접근을 캡슐화하면서 게터가 컬렉션 자체를 반환핟도록 하면 컬렉션 원소들이 변경될 가능성이 있다. 해결책으로 컬렉션을 감싼 클래스의 따로 컬렉션 변경자 메서드를 만든다. 컬렉션을 읽기전용으로 제공한다가 있다.
- 레코드 사용시 계산해서 얻을 수 있는 값과 그렇지 않은 값을 명확하게 구분해서 저장해야한다. 해결책으로 가변데이터를 저장하는 용도로 객체를 사용한다. 객체를 사용하면 어떻게 저장했는지 숨긴체 값을 메서드로 전달할 수 있다.
기법’들 중에는 다소 무의미한 방법들이 설명되곤 한다. 이번 7장의 기법 ‘절차’ 들 중에 가장 필요없는 설명이 들어간 절차를 찾으시오.
- '7.9 알고리즘 교체하기'라고 생각한다. 다른 기법들에는 배경설명이 있고 어느정도 타당한 근거를 가진다. 원칙이 있고 그것에 따라 리팩터링 절차를 밟으라는 것이다. 하지만 알고리즘은 다소 애매하다. 더 좋은 방법이 있으면 그것으로 고치라는 것이다. 개발이 진행되면서 더 나은 알고리즘, 코드를 추구하게 되는 것은 어찌보면 당연한 것이다. 그렇다고 어떻게하라는 저자의 명확한 가이드가 있는 것도 아니라서 다소 의미가 적었던 절차였다고 생각한다.
- 조의를 표한다.
3. “기본형을 객체로 만들기“ 기법과 어울리는 악취가 무엇인지, 객체로 표현하는게 유리하지만 기본형으로 표현하는 경우가 잦은 예시를 하나 찾아 서술하시오.
- 기본 타입에 대한 강박관념(Primitive Obsession). 레코드 타입은 데이터를 구조화 하여 의미 있는 그룹으로 만들수 있게 한다. 객체의 유용한 점 중의 하나는 이런 기본 타입과 레코드 타입의 경계를 흐리게 하거나 아예 없애버린다. 개발을 하다보면 회원 정보를 관리할 때가 있다. 회원정보에 이름, 비밀번호와 함께 주소를 입력받고는 한다. 많은 경우에서 주소를 문자로 입력받고 바로 텍스트 형태로 저장하기도 한다. 주소는 보통 우편 번호와 기본주소 상세주소로 구성되어 있다. 따라서 기본형으로 주소를 표현하다는 것보다 객체로 표현했을 때, 우편 번호 추출같은 특별한 동작을 사용했을 때 장점이 있다.
- 리팩터링
5. 캡슐화는 OOP의 핵심 패러다임중 하나다. 일반적으로는 클래스와 연관지어 설명되곤 하지만, 본 책에서는 객체화와는 별개로 캡슐화를 사용한다. 예를들어 변수 캡슐화가 대표적인데. (java/c#과 같은) 강요된 oop가 아닌 언어로 개발해본 경험이 있다면 이와 관련해 어떤 불편함이 있었는지. 없었다면 굳이 객체 밖의 변수 등, 강요된 oop가 아닌 요소를 사용할 이유가 있는지, 개인의 생각을 서술하시오.
예전에 과제로 C언어를 이용하여 학사 관리 시스템을 만들었던 경험이 있다. 모든 코드를 하나의 함수에 넣으면 이해하기 어렵기 때문에 구조체를 활용하고는 했다. 구조체에 값을 담고 구현을 했었는데, 요구사항을 반영하면서 로직도 길어졌다. 구조체의 내부값을 접근해서 이용하다보니 어디에서나 값을 접근하고 수정하기 쉬웠다. 반대로 에러가 발생했을때 내가 의도하지 않은 곳에서 값이 이미 변경되어있어 어디에서 오류를 발생했는지 캐치하기 어려웠던 기억이 있다. 본격적으로 Java와 같은 OOP 언어를 접하면서 캡슐화 개념을 접하게 되었다. 처음에는 익숙하지 않았지만 값을 접근하기 위해 메서드를 접근하는 방식이 외부에서 값을 변조해서 발생되는 오류를 줄일 수 있었다.