대범하게

[클린코드] 13일차 - 구현을 감추려면 추상화. 그리고 객체와 자료 구조 사이의 분명한 차이 본문

알아두면쓸데있는신기한잡학사전/독서일지

[클린코드] 13일차 - 구현을 감추려면 추상화. 그리고 객체와 자료 구조 사이의 분명한 차이

대범하게 2023. 11. 7. 01:02
반응형

[클린코드] 13일차 - 구현을 감추려면 추상화. 그리고 객체와 자료 구조 사이의 분명한 차이

클린코드 13일차 (p.111~116(5장) / 117~122(6장) )

6 객체와 자료 구조

변수를 비공개 private 로 정의하는 이유가 있다.

다른 사람들이 변수에 의존하지 않게 만들고 싶어서이다. (충동 .. 변뎍.. 그냥 구현을 맘대로 바꾸고 싶어서 ..?)

그렇다면 어째서 많은 프로그래머가 조회get 함수와 설정set 함수를
당연하게 공개public 해 비공개 변수를 외부에 노출할까?

 

.. 정확히 무슨 뜻인진 모르겠지만 차차 알아가보자.

 

자료 추상화

- 두 클래스 모두 2차원 점을 표현.

- 1 클래스는 구현을 외부로 노출. / 2 클래스는 구현을 완전히 숨김.

// 1. 구체적인 Point 클래스
public class Point {
    public double x;
    public double y;
}

// 2. 추상적인 Point 클래스
public interface Point {
    double getX();
    double getY();
    void setCartesian(double x, double y);
    double getR();
    double getTheta();
    void setPolar(doube r, double theta);
}

 

- 2번 클래스는 자료구조 이상을 표현한다.

- 클래스 메서드가 접근 정책을 강제하며, 좌표를 읽을 때는 각 값을 개별적으로 읽어야한다. 하지만 좌표를 설정할 때는 두 값을 한 꺼번에 설정해야한다. (추상화된 클래스임을 알 수 있다.)

 

- 1번 클래스는 개별적으로 좌표값을 읽고 설정하게 강제하며, 구현을 노출한다. 변수를 private으로 선언하더라도 각 값마다 조회get 함수와 설정set 함수를 외부로 노출하는 셈이다.  (위에 언급한 물음표에 관련된 내용이다...!!)

 

구현을 감추려면 추상화가 필요하다.

(형식 논리에 치우쳐) 조회 함수와 설정 함수로 변수를 다룬다고 클래스가 되지는 않는다.

그보다는 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미의 클래스다.

 

"개발자는 객체가 포함하는 자료를 표현하는 가장 좋은 방법을 심각하게 고민해야 한다." (p.119)

아무 생각 없이 조회/설정 함수를 추가하는 방법이 가장 나쁘다.

 

 

자료/객체 비대칭

 

- 객체는 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개한다.

- 자료 구조는 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다.

 

- 두 개념은 사실상 정반대다. 상호 보완적인 특질이 있다. 그래서 객체와 자료 구조는 근본적으로 양분된다. 

 

나쁘고 좋음이 아니라 방법에 따른 장단점을 알고 있어야 한다.

// 절차적인 도형 클래스
// 도형이 동작하는 방식은 Geometry 클래스에서 구현한다.
// 만약 둘레 길이를 구하는 perimeter() 함수를 추가하고 싶다면? 도형 클래스는 아무 영향도 받지 않는다. 
// 반면 새 도형을 추가하고 싶다면 ? Geometry 클래스에 속한 함수를 모두 고쳐야 한다.


// 객체 지향적인 도형 클래스
// 여기서 area()는 다형polymorphic 메서드이다..!!
// 새 도형을 추가해도 기존 함수에 아무런 영향을 미치지 않는다.
// 반면 새 함수를 추가하고 싶다면 도형 클래스 전부를 고쳐야한다.

public class Square implements Shape {
	private Point topLeft;
    private doubel side;
    
    public double area() {
    	return side * side;
    }
}

public class Rectangle implements Shape {
	private Point topLeft;
	private doubel height;
    private doubel width;
    
    public double area() {
    	return height * width;
    }
}

public class Circle implements Shape {
	private Point center;
	private doubel radius;
    private doubel PI = 3.14;
    
    public double area() {
    	return PI * radius * radius;
    }
}

 

- 다시 말해, 객체 지향 코드에서 어려운 변경은 절차적인 코드에서 쉬우며, 절차적인 코드에서 어려운 변경은 객체 지향 코드에서 쉽다!

새로운 자료 타입 필요 : 클래스와 객체 지향 기법이 가장 적합
새로운 함수 필요 : 절차적인 코드와 자료 구조가 좀 더 적합
Comments