개발자 99% 커뮤니티에서 수다 떨어요!
TIL (Today I Learned)
2022.3.1
오늘 읽은 범위
// 6장. 객체와 자료구조
책에서 기억하고 싶은 내용을 써보세요.
자료를 세세하게 공개하기 보다는 추상적인 개념으로 표현하는 편이 좋다. 인터페이스나 조회/설정 함수만으로는 추상화가 이뤄지지 않는다. 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을
심각하게 고민해야 한다. 아무생각 없이 조회/설정 함수를 추가하는 방법이 가장 나쁘다. (P.119)
복잡한 시스템을 짜다보면 새로운 함수가 아니라새로운 타입이 필요한 경우가 생긴다. 이때는 클래스와객체 지향 기법이 가장 적당하다. 반면 새로운 자료타입이 아니라 새로운 함수가 필요한 경우도 생긴다. 이때는 절차적인 코드와 자료 구조가 좀더 적합하다. (P.122)
디미터 법칙은 잘 알려진 휴리스틱으로, 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙이다. 앞 절에서 봤듯이, 객체는 자료를 숨기고 함수를 공개한다. 즉 객체는 조치함수로 내부구조를 공개하면안된다는 의미다. (P.123)
좀더 정확히 표현하자면, 디미터 법칙은 "클래스 C의 메서드 f는 다음과 같은 객체의 메서드만 호출해야한다" 고 주장한다.
클래스C
f 가 생성한 객체
f 인수로 넘어온 객체
C 인스턴스 변수에 저장된 객체
하지만 위 객체에서 허용된 메서드가 반환하는 객체의 메서드는 호출하면 안된다. 다시말해 낯선 사람은경계하고 친구랑만 놀라는 의미다.
(P.123)
기차충돌- 여러객차가 한 줄로 이어진 기차처럼 보이기 때문이다.
일반적으로 조잡하다 여겨지는 방식이므로 피하는 편이 좋다. (P.124)
잡종구조- 이런 잡종구조는 새로운 함수는 물론이고 새로운 자료 구조도 추가하기 어렵다. 양쪽 세상에서단점만 모아놓은 구조다. 그러므로 잡종 구조는 되도록 피하는 편이 좋다. 프로그래머가 함수나 타입을 보호할지 공개할지 확신하지 못해(더 나쁘게는 무지해)어중간하게 내놓은 설계에 불과하다. (P.125)
자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스다. 이런 자료 구조체를 때로는 자료전달 객체 (Data Transter Object ) 라 한다. DTO는 굉장히 유용한 구조체다. 특히 데이터베이스와 통신하거나 소켓에서 받은 메시지의 구문을 분석할 때 유용하다. 흔히 DTO는 데이터베이스에 저장된 가공되지않은 정보를 애플리케이션 코드에서 사용할 객체로 변환하는 일련의 단계에서 가장 처음으로 사용하는 구조체다. (P.126)
활성 레코드는 DTO의 특수한 형태다. 공개 변수가 있거나 비공개 변수에 조회/ 설정 함수가 있는 자료 구조지만, 대개 save나 find와 같은 탐색 함수도 제공한 다. 활성 레코드는 데이터베이스 테이블이나 다른 소스에서 자료를 직접 변환한 결과다. (P.127)
활성 레코드는 자료 구조로 취급한다. 비즈니스 규칙을 담으면서 내부 자료를 숨기는 객체는 따로 생성한다. (여기서 내부 자료는 활성 레코드의 인스턴스일 가능성이 높다.) (P.127)
객체는 동작을 공개하고 자료를 숨긴다. 그래서 기존 동작을 변경하지 않으면서 새 객체타입을 추가하기는 쉬운 반면, 기존 객체에 새 동작을 추가하기는 어렵다. (P.127)
자료구조는 별다른 동작 없이 자료를 노출한다. 그래서 기존 자료 구조에 새 동작을 추가하기는 쉬우나, 기존 함수에 새 자료구조를 추가하기는 어렵다. (P.127)
(어떤) 시스템을 구현할 때, 새로운 자료 타입을 추가하는 유연성이 필요하면 객체가 더 적합하다. 다른 경우로 새로운 동작을 추가하는 유연성이 필요하면 자료 구조와 절차적인 코드가 더 적합하다. 우수한 소프트웨어 개발자는 편견 없이 이 사실을 이해해 직면한 문제에 최적인 해결책을 선택한다. (P.128)
오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요
나는 정말 아는 것이 없구나 라고 생각하며,
객체는 왜 숨겨야 하는 것이며, 기차충돌을 거리낌 없이 사용 해서는 안되는 것을
배우게 되었다.
코드만 잘 입력해서 실행되게 하는 것 뿐만 아니라 전반적인 관리를 위해 어떻게 처리해야하는지 더 높은 계단으로 올라가는 느낌이었다.
그래서 왜숨겨야 하냐면...클래스 멤버에 대한 독점적 데이터 액세스를 보장하고 의도하지 않거나 의도 된 변경을 방지하여 객체 무결성을 보호하고, 소프트웨어 구성 요소 간의 상호 종속성을 제한하여 시스템 복잡성을 줄여 견고성을 높이기 때문이다.
궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.
객체
컴퓨터 과학에서의 객체란 식별자로 참조할 수 있는 메모리 상의 값을 말합니다.
자료 구조
프로그래밍에서 데이터를 구조적으로 표현하는 방식과 이를 구현하는 데 필요한 알고리즘에 대해 논하는 기초이론
디미터 법칙
디미터 법칙의 핵심은 객체 구조의 경로를 따라 멀리 떨어져 있는 낯선 객체에 메시지를 보내는 설계는 피하라는 것이다.
바꿔 말해서 객체는 내부적으로 보유하고 있거나 메시지를 통해 확보한 정보만 가지고 의사 결정을 내려야 하고 다른 객체를 탐색해 뭔가를 일어나게 해서는 안 된다.
이러한 핵심적인 내용 때문에 디미터 법칙은 Don’t Talk to Strangers(낯선 이에게 말하지 마라)라고도 불리고 한 객체가 알아야 하는 다른 객체를 최소한으로 유지하라는 의미로 Principle of least knowledge(최소 지식 원칙)라고도 불린다.