객체(Object)와 자료구조(Data Structures)의 차이가 뭘까?

객체(Object)와 자료구조(Data Structures)의 차이가 뭘까?

개발일기

 

📕 클린코드(Clean Code)를 읽다가 의문이 생겼다.

근데 구글링을 아무리 해봐도 책의 내용을 그대로 옮겨쓴 블로그들밖에 없어

현재 의문에 대해 납득이 되는 해답이 생기질 않는다.

 

public class Person {
  String name; 
  int age; 
}

 

클린코드 책의 내용을 보면 자료구조에 대해 이런 방식으로 표현한다

내부의 변수를 외부에 공개하는 클래스 정도로 이해가 된다.

의문이 생긴 부분의 내용이다.

 

자료/객체 비대칭 앞서 소개한 두 가지 예제는 객체와 자료 구조 사이에 벌어진 차이를 보여준다.
객체는 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개한다.
자료 구조는 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다.
문단을 처음부터 다시 읽어보기 바란다.
두 정의는 본질적으로 상반된다.
두 개념은 사실상 정반대다.
사소한 차이로 보일지 모르지만 그 차이가 미치는 영향은 굉장하다.

 

위 글을 보면 BigDecimal 같은 경우는 대체 뭔가 싶은 의문이 생긴다.

 

public class BigDecimal extends Number implements Comparable<BigDecimal> { 
  private final BigInteger intVal; 
  private final int scale; 
  private transient int precision; 
  private transient String stringCache;
  ...
}

 

 

모든 필드를 private으로 제한했고, 메서드를 통해 외부에 노출하고있다.

또한 메서드를 통해 내부의 자료를 조작하고 있다.

 

전형적인 객체에 대한 설명에 들어맞는데

내 생각에 그럼에도 불구하고 BigDecimal은 분명히 자료구조라고 생각한다.

BigDecimal은 대체로 금액에 관련된 정확한 정수형 값을 가지고 있고,

이는 언제든지 호출해 확인할 수 있기때문이다.

 

일단 계속해서 책을 보다보면 BigDecimal은 잡종구조라는 결론으로 귀결되는데,

이후 책에서 잡종구조에 대해 설명하고 있기를

객체와 자료구조의 단점만 모아둔 구조이므로 되도록이면 피하라고 설명하고 있다.

 

근데 그렇게 이해하고 넘어가자니

그토록 안좋다고 설명하고있는 잡종구조의 클래스가 자바 패키지에 들어있고,

전세계에서 유용하게 사용되어지고 있는게 맞나? 라는 의문이 생긴다.

그래서 이도저도아닌 상태에서 자료구조는 대체 뭐고 객체는 뭔가라는 의문에서 해답을 찾지 못하고 있다.

 

자료구조는 크게보면 객체의 부분집합인가?

DTO는 자료구조인가? 객체인가?

내 생각엔 일단 자료구조인 것 같다.

 

Objects vs Data Structures를 보면 이런 구문들이 있다.

 

public class Person {
  public String firstName; 
  public String lastName; 
  public String phoneNumber; 
}

 

타 언어들의 자료구조와 비교하며 명백한 자료구조라고 설명하고 있다.

 

public class Person {
    public String firstName;
    public String lastName;
    public String phoneNumber;
}

 

public class Person {
    private String firstName;
    private String lastName;
    private String phoneNumber;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

}

 

클린코드 책의 내용대로라면 위의 클래스는 자료구조며

아래의 클래스는 객체라고 보는게 맞다고 생각한다.

하지만 필드의 접근제한자가 public 에서 private으로 바뀌었고, 접근자와 수정자가 정의되었으나

여전히 외부에서 Person의 변수가 뭔지 짐작할 수 있고 객체의 목적또한 바뀐것이 없기때문에

본질적으로 두 코드는 같으며 결국 두 클래스 모두 자료구조라고 얘기하고 있다.

 

자바빈즈의 경우 접근자와 수정자 없이 필드를 public으로 공개할 경우

프레임워크에서 프로퍼티로 사용하기 위해 접근자와 수정자가 필요하기 때문에

굳이 필드를 private으로 제한하고 모든 필드에 대해 접근자와 수정자를 정의한

표준규약으로 약속되어 사용되고 있다고 납득하고 넘어갈 수는 있었다.

 

public class Person {
    private String firstName;
    private String lastName;
    private String phoneNumber;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    private void validatePhoneNumber (String phoneNumber) throws FormatException {
        // Do validation here to ensure we have a legit phone number.
        // Throw an exception if its invalid.
    }

}

 

위의 클래스에 validatePhoneNumber() 라는 핸드폰번호 유효성 검사 메서드가 생겼다.

이제 이 객체에는 다른 목적행동(Methods)이 생겼기 때문에 이젠 객체로 볼수 있느냐고 묻는다.

 

나는 잡종구조라고 생각했다.

 

자료구조도 맞는것 같고 객체도 맞다고 생각했기 때문이다.

하지만 위 글에서는 Person에 유효성검사 기능이 생기므로서 다른 목적과 행동이 생겼으나

여전히 모든 필드가 외부에 공개되어있다시피 하고(캡슐화가 되어있지 않고),

누구나 내부의 자료를 짐작하고 조작할 수 있기 때문에 여전히 자료구조라고 얘기하고 있다.

 

No matter how much lipstick you put on this pig, Person is a data structure, not an object.

 

심지어 Person 이라는 돼지에 아무리 립스틱을 바르더라도 Person은 객체가 아니고 자료구조라고 한다.

책을 보면서 계속 쓸데없는 의문만 생기고 있는 것 같다. 😭

아무리 고민해도 나혼자는 답을 못찾겠다.

주변에 의견을 구해봐야겠다.

 


© 2022. All rights reserved.