Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
6. 객체와 자료 구조
#clean_code
2년 전
660

오늘 TIL 3줄 요약

  • 자료구조는 무조건 함수 없이 공개 변수만 포함하고 객체는 비공개 변수와 공개 함수를 포함한다.

  • 가능하면 둘을 섞는 잡종코드는 피하자.

  • 절차지향, 객체지향 둘 중 뭐가 맞다 라기 보다 시스템에 맞는 최적의 해결책을 선택하면 된다.

TIL (Today I Learned) 날짜

  1. 05.03

오늘 읽은 범위

6장 객체와 자료 구조

책에서 기억하고 싶은 내용을 써보세요.

변수를 private으로 정의하는 이유가 있다. 남들이 변수에 의존하지 않게 만들고 싶어서다. 그렇다면 왜 조회 함수, 설정 함수를 당연하게 public하게 해 비공개 변수를 외부에 노출할까?

  • 자료 추상화

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

  • 자료/객체 비대칭

    객체는 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개한다. 자료 구조는 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다. 이 두 정의는 본질적으로 상반된다.

    예를 들어, 절차적인 도형 클래스를 보자

    public class Square{
    	public Point topLeft;
    	public double height;
    	public double side;
    }
    public class Circle{
    	public Point center;
    	public double radius;
    }
    public class Geometry{
    	public final double PI = 3.141592653589793;
    	public double area(Object shape) throws NoSuchShapeException{
    		if(shape instanceof Square){ 
    			... 
    		}else if(shape instanceof Circle){
    			...	
    		}
    	}
    }
    

    각 도형 클래스는 간단한 자료구조다. 아무런 메서드도 제공하지 않는다. 도형이 동작하는 방식은 Geometry 클래스에서 구현한다. 객체 지향 프로그래머가 본다면 코웃음 칠지도 모르겠다. 하지만 만약 Geometry 클래스에 둘레 길이를 구하는 perimeter() 함수를 추가하고 싶다면? 도형 클래스는 아무런 영향도 받지 않는다. 반대로 새 도형을 추가하고 싶다면 Geometry 클래스에 속한 함수를 모두 고쳐야 한다.

    이번에는 객체 지향 적인 도형 클래스다

    public class Square implements Shape{
    	private Point topLeft;
    	private double side;
    	public double area(){
    		return side * side;
    	}
    }
    public class Circle implements Shape{
    	private Point center;
    	private double radius;
    	public final double PI = 3.141592653589793;
    	public double area(){
    		return PI * radius * radius;
    	}
    }
    

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

    분별있는 프로그래머는 모든 것이 객체라는 생각이 미신임을 잘 안다. 때로는 단순한 자료 구조와 절차적인 코드가 가장 적합한 상황도 있다.

  • 디미터 법칙

    디미터 법칙은 잘 알려진 휴리스틱으로, 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙이다. 더 정확히 “클래스 C의 메서드 f는 다음과 같은 객체의 메서드만 호출해야 한다"고 주장한다

    • 클래스 C

    • f가 생성한 객체

    • f인수로 넘어온 객체

    • C 인스턴스 변수에 저장된 객체

    자료구조는 무조건 함수 없이 공개 변수만 포함하고 객체는 비공개 변수와 공개 함수를 포함한다면, 문제는 훨씬 간단하다.

    물론, 절반은 객체, 절반은 자료구조인 잡종 구조가 나온다. 중요한 기능을 수행하는 함수도 있고, 공개 변수나 공개 조회/설정 함수도 있다. 하지만 이 구조는 절차, 객체 양쪽 세상의 단점만 모아놓은 구조다. 피하자.

  • 자료 전달 객체

    자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스다. 이런 자료 구조체를 때로는 자료 전달 객체(DTO)라 한다.

  • 결론

    객체는 동작을 공개하고 자료를 숨긴다. 그래서 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기는 쉬운 반면, 기존 객체에 새 동작을 추가하기는 어렵다. 어떤 시스템을 구현할 때, 새로운 자료 타입을 추가하는 유연성이 필요하면 객체가 더 적합하다. 다른 경우라면 자료구조와 절차적인 코드가 더 적합하다. 개발자는 편견없이 최적의 해결책을 선택하면 되는거다.

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요

내가 편하다고 느끼는 자세는 사실 몸에 안 좋고, 맛있는 것들은 사실 몸에 안좋을 때가 더 많은 것처럼 빠르게 쉽게 짜는 코드들은 나쁜코드들이 대부분인게 좀 억울한 면도 있다. 건강하기 위해 운동을 하는 것처럼 좋은 코드를 위한 고민들과 클린코드에서 말하는 좋은 코드를 위한 일련의 연습들을 계속해서 의식한다면 점점 좋은 코드로 나아가겠지.

자바로 개발을 처음 시작했을 때를 생각해보니, 잡종 구조를 잡종 구조인지도 모르고 객체를 사용했었다. 물론 지금도 알고 객체를 객체답게 사용하는가는 주춤하게 된다. 클린코드를 지금에서야 읽게 된게 아쉬울 만큼 개발했던 나의 나쁜 코드들을 돌아보게 한다. 중요한건 앞으로 어떻게 좋은 코드로 발전 해 나갈지겠지! 이번 장도 너무 재밌었다!

궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

오늘 읽은 다른사람의 TIL