객체는 행동과 역할로 이루어진 개념입니다. 객체 지향 프로그래밍에서 객체는 데이터와 해당 데이터를 처리하는 행동을 함께 묶은 개념입니다. 이것을 객체의 "상태(State)"와 "행위(Behavior)"라고도 표현할 수 있습니다.
상태(State)
: 객체는 데이터를 가지고 있으며, 이 데이터는 객체의 상태를 나타냅니다. 이러한 상태는 객체의 특징이나 속성을 나타내는 부분입니다. 예를 들어, 학생 객체의 이름, 나이, 성적 등이 해당됩니다.
행위(Behavior)
: 객체는 행동을 수행할 수 있으며, 이 행동은 객체의 역할을 나타냅니다. 객체는 메서드를 통해 행동을 수행하며, 이 메서드는 객체가 어떤 일을 할 수 있는지를 정의합니다. 예를 들어, 학생 객체가 공부하거나 시험을 보는 것이 해당됩니다.
좋은 객체지향 설계는 데이터 중심의 사고와 행동 중심의 사고를 균형있게 조합하여 구현됩니다. 데이터와 행동을 모두 고려하면서 클래스를 설계하는 것이 중요합니다.
엔티티(Entity)의 정의와 책임 할당
: 데이터 중심의 사고로부터 엔티티를 정의합니다. 엔티티는 어떤 데이터를 나타내는지를 결정합니다.
그러나 엔티티에게는 행동과 책임도 할당해야 합니다. 이를 통해 엔티티가 자신의 데이터를 어떻게 다루는지를 정의하고, 객체 간의 상호작용을 지원합니다.
책임의 분배와 행동 정의
: 행동 중심의 사고로부터 역할과 책임을 정의합니다. 객체는 어떤 행동을 수행하는지를 중심으로 설계합니다.
그러나 이 때에도 객체의 상태(데이터)에 대한 고려를 잊지 않습니다. 객체의 행동과 상태는 서로 연결되어 있으며, 데이터 중심의 사고를 통해 어떤 상태를 저장할지 결정합니다.
데이터와 행동의 일관성 유지
: 데이터와 행동의 일관성을 유지하면서 클래스를 설계합니다. 데이터와 행동은 서로 보완적이어야 합니다.
데이터 변경 시에 해당 데이터를 사용하는 행동도 함께 고려하여 설계합니다. 데이터 중심과 행동 중심 사이의 밸런스를 유지합니다.
// 데이터 중심의 사고로 엔티티를 정의
class StudentData {
private String name;
private int age;
public StudentData(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
// 행동 중심의 사고로 책임을 할당
class Student {
private StudentData data;
public Student(String name, int age) {
this.data = new StudentData(name, age);
}
public String getName() {
return data.getName();
}
public int getAge() {
return data.getAge();
}
public void study() {
System.out.println(data.getName() + " is studying.");
}
public void takeExam() {
System.out.println(data.getName() + " is taking an exam.");
}
}
public class Main {
public static void main(String[] args) {
Student student = new Student("Alice", 20);
System.out.println("Name: " + student.getName());
System.out.println("Age: " + student.getAge());
student.study();
student.takeExam();
}
}
위의 코드에서는 StudentData 클래스가 데이터 중심의 사고로 학생의 이름과 나이 정보를 저장하고, Student 클래스가 행동 중심의 사고로 학생의 행동을 정의합니다. 이렇게 융합된 설계로 객체의 데이터와 행동을 각각 고려하며 클래스를 설계할 수 있습니다.
객체지향 프로그래밍에서 클래스를 설계할 때 데이터 중심의 사고와 행동 중심의 사고 모두 중요하지만, 행동 중심의 사고를 놓친 채로 설계할 때가 많으며 행동 중심으로 고려하여 설계할 때 객체지향 프로그래밍에서 더 나은 결과를 얻을 수 있습니다.
데이터 중심의 사고 (Data-Centric Thinking)
데이터 중심의 사고는 주로 "데이터 어떻게 저장하고 관리할 것인가?"에 초점을 둡니다.
이 접근 방식은 데이터와 데이터의 구조에 집중합니다. 클래스의 주요 목적은 데이터를 저장하고 접근하는 것입니다. 데이터 중심의 사고로 설계된 클래스들은 간단한 데이터 저장 용도에는 유용할 수 있으나, 복잡한 비즈니스 로직을 표현하기에는 한계가 있을 수 있습니다.
행동 중심의 사고 (Behavior-Centric Thinking)
행동 중심의 사고는 "객체가 어떤 행동을 수행하는가?"에 초점을 둡니다.
이 접근 방식은 객체들의 상호작용과 메서드 호출에 주목합니다. 클래스의 주요 목적은 객체가 어떤 행동을 수행하는지를 나타내는 것입니다. 행동 중심의 사고로 설계된 클래스들은 객체의 역할과 책임을 더 명확하게 표현하고, 더 유연하고 확장 가능한 설계를 할 수 있습니다.
또한, 객체 지향 설계에서 가장 중요한 점은 '역할과 책임의 명확한 분리'입니다.
객체가 상태(State)와 행위(Behavior)로 구성되어 있다는 것을 기억하면, "역할"은 객체가 수행하는 일반적인 행동과 "책임"은 객체가 특정 상황에서 어떤 행위를 수행해야 하는지를 의미합니다. 이 두 가지 개념을 명확하게 분리함으로써 설계는 더 모듈화되고 유연해집니다.
역할 (Role)
역할은 객체가 수행하는 일반적인 행동을 나타냅니다. 이는 객체의 일반적인 기능이나 역할을 의미하며, 여러 객체가 동일한 역할을 수행할 수 있습니다.
책임 (Responsibility)
책임은 객체가 특정 상황에서 수행해야 할 구체적인 행동을 나타냅니다. 책임은 객체가 특정한 상황이나 요청에 응답하는 방식을 기술하며, 객체가 특정 역할을 수행할 때 어떤 동작을 해야 하는지를 정의합니다.
이 두 가지 개념을 명확하게 분리함으로써, 객체들 간의 역할을 공유하면서도 객체마다 다른 책임을 부여하여 유연하고 모듈화된 설계를 구현할 수 있습니다. 따라서 "역할과 책임의 명확한 분리" 원칙은 행동 중심의 사고를 강조하며, 객체 지향 설계에서 객체가 어떤 행동을 수행하고 어떤 역할을 가지는지를 중요하게 생각하는 것을 나타냅니다.