3.2 메모리 CPU의 클록 속도는 증가함. CPU 클록 속도만큼 데이터를 빠르게 가져오지 못함. 메모리 성능이 좋지 못함. 메모리 성능 문제를 극복하기 위해 CPU에 캐시 메모리가 추가됨. 멀티 코어에서는 캐시 메모리의 일관성을 잘 처리하기 위해 Cache Consistencty Protocol을 함. MESI 프로토콜 멀티 프로세서가 동시에 메모리를 Hit 하고 변경하는 경우라면, 다른 프로세서 관점에서 캐시는 invalid(무효)가 되어서 다시 처리됨. touchEveryItem() / touchEveryLine()은 i++ vs i += 16이기 때문에 16배의 일을 많이 할 것이라고 생각하지만, 실제 소요 시간은 거의 동일함. 캐싱 환경이기 때문에 이렇게 동작함. 이미 캐시에 모두 로딩되어 있기..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 리팩토링 43. Assertions 추가하기 (Introduce Assertion) 문제 상황 종종 코드로 표현하지 않았지만 기본적으로 가정하고 있는 조건들이 있다. 그런 조건은 알고리즘으로 추론하거나 주석을 읽으면서 확인할 수 있다. 전제조건 / 후처리 조건은 Assertion을 사용해서 보다 명시적으로 나타낼 수 있다. (런타임에는 영향 없음) Assertions 추가하기 Assertions은 if / switch 문과 달리 '항상' True이길 기대하는 조건을 표현할 때 사용한다. 프로그램이 Assertion에서 실패한다면 프로그래머의 실수로 생각할 수 있다. Assertion이 없어도 프로그램이 동작해야 한다. (자바에서는 ..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 24. 주석(Comments) 주석을 남겨야 할 것 같다면 먼저 코드를 리팩토링 하라. 불필요한 주석을 줄일 수 있다. 주석은 좋은 냄새에 해당한다. 주석 중 일부는 안 좋은 코드 냄새를 나타내기도 하기 때문이다. 예를 들어 주석 자체가 '긴 메서드 냄새'를 암시하는 힌트가 될 수도 있다. 관련 리팩토링 '함수 추출하기'를 사용해 설명이 필요한 부분을 별도의 메서드로 빼낸다. '함수 선언부 변경하기'를 사용해 함수 이름을 재정의 할 수 있다. (함수의 이름이 직관적이지 않은 경우) 시스템적으로 어떤 필요한 규칙(Validation)이 있다면, 'Assertion 추가하기'를 적용할 수 있다. 주석으로 시스템적으로 가정하고 있는..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 23. 상속 포기 (Refused Bequest) 상속 포기 냄새 서브 클래스가 슈퍼 클래스에서 제공하는 메서드나 데이터를 잘 활용하지 않는다는 것은 해당 상속 구조에 문제가 있음을 의미함. 즉, 슈퍼 클래스에서 제공하는 기능이 공통 기능에 어울리지 않음을 의미함. 리팩토링 방법 기존의 서브클래스 또는 새로운 서브 클래스를 만들고 슈퍼클래스에서 '메서드와 필드를 내려주면 (Push Down Method / Field)' 슈퍼클래스에 공통으로 사용하는 기능만 남길 수 있다. 서브클래스가 슈퍼클래스의 기능을 재사용하고 싶지만, 인터페이스를 따르고 싶지 않은 경우에는 '슈퍼클래스 또는 서브클래스를 위임으로 교체하기' 리팩토링을 적용..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 리팩토링 42. 레코드 캡슐화 하기(Encapsulate Record) 변하는 데이터를 다룰 때는 레코드보다는 객체를 선호한다. 책에서 말하는 '레코드'란, public 필드로 구성된 데이터 클래스를 말함. (자바의 Record와는 다름) 데이터를 메서드 뒤로 감추면 객체의 클라이언트는 어떤 데이터가 저장되어 있는지 신경 쓸 필요가 없다. 필드 이름을 변경할 때 점진적으로 변경할 수 있다. 하지만 자바의 Record는 불변 객체라서 이런 리팩토링이 필요없다. 리팩토링 public 필드를 private 필드로 변경 Getter / Setter를 통해 필드에 접근하도록 변경. 책에서 이야기하는 Records는 public한 필드로 구성..