반응형

가독성 높이는 습관 - 캡슐화

 

 

캡슐화를 처음 배웠을 때

객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고 실제 구현 내용 일부를 외부에 감추어 은닉한다.

... 접근지정자를 두어 은닉의 정도를 기술하여 구현한다. - wikipedia

 

 

class User {

    /* 속성 */
    private String name;
    private int age;
    
    /* 메서드 */
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
}
  • 속성 : name, age
  • 메서드 : getName(), getAge()
  • 접근지정자 : private, protected, public

 

 

자바빈 규약

  • 기본 생성자를 가지고 있으며,
  • 모든 멤버가 private으로 선언되어 있고,
  • 멤버를 접근하기 위해 Getter, Setter가 public으로 열려있는 클래스를 뜻함

 

 

현실

  • 두가지 예시모두 user의 나이를 직접가져오므로 캡슐화에 의한 은닉이 수행되지 않음
  • 접근제어자만 private로 지정한다고 캡슐화가 지켜지는 것은 아님
/* 자바빈 규약을 따르나 캡슐화를 지키지 않음 */
final static int ADULT_AGE = 19;
final static int MARRIAGEABLE_AGE = 18;
final static int DRIVER_LICENCE_AGE = 18;

if (user.getAge() >= ADULT_AGE)
    // ...doSomething
    
if (user.getAge() >= MARRIAGEABLE_AGE)
    // ...doSomething
    
if (user.getAge() >= DRIVER_LICENCE_AGE)
    // ...doSomething
/* 자바빈 규약을 따르지 않고 모든 필드를 열어둠 */
final static int ADULT_AGE = 19;
final static int MARRIAGEABLE_AGE = 18;
final static int DRIVER_LICENCE_AGE = 18;

if (user.age >= ADULT_AGE)
    // ...doSomething
    
if (user.age >= MARRIAGEABLE_AGE)
    // ...doSomething
    
if (user.age >= DRIVER_LICENCE_AGE)
    // ...doSomething

 

 

Tell, Don't Ask (TDA 원칙)

 

bliki: TellDontAsk

a bliki entry for TellDontAsk

martinfowler.com

 

/* User.java */
class User {
    int age;
    public boolean isAdult() {
        return age >= ADULT_AGE;
    }
    
    public boolean isMarriageableAge() {
        return age >= MARRIAGEABE_AGE;
    }
}
if (user.isAdult())
    // ...doSomething
    
if (user.isMarriageableAge())
    // ...doSomething

 

 

캡슐화로 얻을 수 있는 것

  • 데이터와 그 처리 방법을 숨길 수 있다.
  • 비지니스 로직과 그 구현 방법을 외부로부터 보호한다.
  • 외부에 대한 영향도가 줄어듬 → 버그 포인트가 줄어듬

 

 

주의할 점

basket.getProduct().get(0)
        .getProductOption()
        .getProductOptionDetail()
        .getProductOptionDetailType();

 

 


반응형

'cs > java-spring-boot' 카테고리의 다른 글

[Zero-base] 9-8. null  (0) 2022.03.16
[Zero-base] 9-7. enum  (0) 2022.03.16
[Zero-base] 9-5. 이름짓기  (0) 2022.03.16
[Zero-base] 9-4. 왜 좋은 코드를 작성해야할까?  (0) 2022.03.16
[Zero-base] 9-3. 레거시 코드  (0) 2022.03.16

+ Recent posts