티스토리 뷰

책/Clean Code

6장 객체와 자료구조

0307kjb 2022. 3. 29. 13:06

변수를 private로 정의하는 이유는 남들이 변수에 의존하지 않게 만드는 것이다.

그런데 우리는 get, set메서드를 통해 당여하게 공개하여 비공개 변수를 외부에 노출하는 것일까?

 

public class Point{
    double x;
    double y;
}

,

public interface Point{
    double getX();
    double getY();
    void setCartestian(double x, double y);
    ...
}

 

interface Point의 경우 자료 구조 이상을 표현하며 클래스 메서드가 접근 정책을 강제한다.

좌표를 읽을 때는 각 값을 개별적으로 읽으나, 좌표 설정 시 두 값을 한번에 설정한다.

반면에 class Point의 경우 개별적으로 읽고 설정이 가능하게 한다.

 

이를 통해 변수 사이에 함수라는 계층을 넣는다고 하여 구현이 저절로 감춰지지는 않는다. 구현을 감추려면 추상화가 필요하다. 클래스보다 추상 인터페이스를 제공하여 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미를 가진 클래스라고 할 수 있다.

 

그럼 정확히 무슨 차이일까?

책에서는 객체와 자료 구조 사이에 벌어진 차이라고 말한다.

객체의 경우 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개한다. 자료구조는 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다. 본질이 다르며 그 차이는 매우 크다.

 

public class Square{
	...
}

public class Rectangle{
	...
}

public class Circle{
	...
}

public class Geometry{
	public double area(Object shape){
    	if(shape instanceof Square){
        	...
        }else if(shape instanceof Rectangle){
        	...
        }else if(shape instanceof Circle){
        	...
        }
    }
}

이 코드가 절차적이라고 비판 받을 수는 있다.

하지만!

Geometry 클래스에 perimeter( )라는 함수를 추가한다면, 도형에 의존 하거나 해당 클래스는 아무런 변화가 없다.

반대로 새 도형을 추가한다면 Geometry 클래스에 속한 함수를 모두 고쳐야 한다.

 

 

public class Square implements Shape{
	public double area(){
    	...
    }
}

public class Rectangle implements Shape{
	public double area(){
    	...
    }
}

public class Circle implements Shape{
	public double area(){
    	...
    }
}

 

위에 코드를 통해 정반대의 본질을 이해를 해보면,

절차적인 코드는 기존 자료구조를 변경하지 않으면서 새 함수를 추가하기 쉽지만 자료구조 추가 시 모든 함수를 고쳐야 한다. 반대로 객체 지향 코드는 자료구조 추가 시 기존 함수를 변경하지 않으면서 클래스를 추가하기 쉽지만 새로운 함수 추가시 모든 클래스를 고쳐야 한다는 단점이 있는 것이다.

즉 편협하게 무조건적으로 객체지향 코드가 좋은 것이 아니니 절차지향과 객체지향의 장단점을 잘 살피고 코드를 작성하는 것이 필요하다. 이것이 핵심이다.

' > Clean Code' 카테고리의 다른 글

10장 클래스  (0) 2022.04.09
9장 단위 테스트  (0) 2022.04.06
8장 경계  (0) 2022.04.04
3장 함수  (0) 2021.12.02
2장 의미 있는 이름  (0) 2021.11.28
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함