좋은 코드 만들기/클린코드

[클린코드] 6. 객체와 자료 구조

개발새발 2021. 4. 25. 11:01
반응형

자료 추상화

OOP에서 특수한 경우가 아니면 class안의 인스턴스변수를 private으로 정의하는 한다. 왜냐하면 남들(사용하는 쪽)이 변수에 의존하지 않게 만들기 위해서이다.

참고 + (d-yong.tistory.com/21)

 

[C++] 클래스를 캡슐화(Encapsulation) 하는 이유(왜 멤버변수는 대부분 private인가?)

객체지향 언어에서 클래스를 만들때 항상 나오는 말은 캡슐화(Encapsulation)다. 즉, 멤버변수는 private 접근 한정자로 외부의 직접적인 접근을 제한하고 클래스를 사용하는 외부에 인터페이스를 제

d-yong.tistory.com

 

위의 내용에 한발더 나아가 클린코드에서는 추상화 인터페이스를 제공해 API를 사용하는 쪽에서 내부 구현을 모른채 기능을 사용할 수 있어야 한다고 주장한다.

 

말로는 설명이 어려우니 아래의 간단한 예를 보면서 이해해보자

간단한 예을 위해 set함수등 초기화는 스킵함

 

[추상화 단계가 상승하는 순]

 

1단계 (추상화 단계 하)

1
2
3
4
5
class Circle {
public:
    int x, int y;
    float r;
};
cs

가장 최악의 추강화 단계 모든 변수가 그대로 노출 된다.

 

2단계 (추상화 단계 중)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class public {
public:
    int getX() {
        return x;
    }
    int getY() {
        return y;
    }
    int getRadius() {
        return ;
    }
    int getArea() {
        return r*r*3.14;
    }
private:
    int x, int y;
    float r;
};
cs

변수 사이에 함수 계층을 넣는것으로는 구현이 안벽히 감춰지지 않는다.

 

 

3단계 (추상화 단계 상)

1
2
3
4
5
6
7
8
9
10
11
12
13
class Shape {
    virtual float getArea() = 0;
}
 
class Circle : public Shape {
    virtual float getArea() override {
        return r*r*3.14;
    }
 
private:
    int x, int y;
    float r;
}
cs

추상 인터페이스를 통해 사용자 입장에서는 내부의 구현을 모르게 된다.

 

 

class를 만들 때 동작을 공개하고(인터페이스) 자료를 숨기는것에 집중한다.

반응형