노션에서 정리한 내용을 벨로그로 옮겼기 때문에 노션으로 보면 조금 더 보기 더 편합니다🤗
이동하기 → junnkk's Notion
변수를 비공개(private)로 정의하는 이유 → 남들이 변수에 의존하지 않게 만들고 싶기 때문
그렇다면 왜 프로그래머들은 get, set 함수를 public하게 만들어 비공개 변수를 외부에 노출할까?
예시) 구체적인 Point 클래스 vs 추상적인 Point 클래스 (p118)
구체적인 Point 클래스
직표좌표계 사용
개별적으로 좌표값을 읽고 설정하게 강제
구현 노출. 변수를 private으로 선언 하더라도 각 값마다 get과 set 함수를 제공한다면 구현을 외부로 노출하는 셈.
추상적인 Point 클래스
자료 구조 이상을 표현
클래스 메서드가 접근 정책을 강제
좌표를 읽을 때 각 값을 개별적으로 읽어야 함.
좌표를 설정할 때는 두 값을 한꺼번에 설정
구현을 감추려면 추상화 필요.
추상 인터페이스를 제공해 사용자가 구현을 모른채 자료의 핵심을 조작할 수 있어야 진정한 클래스
디미터 법칙 : 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙
→ 클래스 C의 메서드 f는 다음과 같은 객체의 메서드만 호출해야 한다
클래스 C
f가 생성한 객체
f 인수로 넘어온 객체
C인스턴스 변수에 저장된 객체
위 객체에서 허용된 메서드가 반환하는 객체의 메서드는 호출하면 안 된다
기차 충돌
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
위와 같은 구조의 코드를 기차 충돌이라고 하고 피하는 것이 좋다
잡종 구조
: 절반은 객체, 절반은 자료 구조
⇒ 사용 X
구조체 감추기
객체라면 내부 구조를 감춰야 한다.
예시) p125
자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스. → 지료 전달 객체(DTO)라고도 함
→ 데이터베이스와 통신하거나 소켓에서 받은 메세지의 구문을 분석할 때 유용
→ 데이터베이스에 저장된 가공되지 않은 정보를 애플리케이션 코드에서 사용할 객체로 변환하는 일련의 단계에서 가장 처음으로 사용하는 코드
일반적인 형태는 bean 빈 구조
→ 비공개 변수를 조회/설정 함수로 조작.
→ 일종의 사이비 캡슐화로 별다른 이익 X
활성 레코드
: DTO의 특수한 형태
공개 변수가 있거나 비공개 변수에 조회/설정 함수가 있는 자료 구조지만 대개 save나 find와 같은 탐색 함수도 제공
활성 레코드는 디비 테이블이나 다른 소스에서 자료를 직접 변환한 결과이다
⇒ 자료 구조로 취급!
→ 비즈니스 규칙을 담으면서 내부 자료를 숨기는 객체는 따로 생성. (내부 자료는 활성 레코드의 인스턴스일 확률이 ↑