객체 지향 프로그래밍과 인간관계
객체 지향적 프로그래밍에서는 객체와 객체 간의 상호작용을 통해 코드를 작성한다. 이 객체를 하나의 인격체라고 생각해보았을 때 결국 객체 지향적 프로그래밍이란 여러 역할을 가진 객체(사람들)이 하나의 서비스를 만들어나가는 과정이라고 생각할 수 있을 것이다.
한 명의 사람에게 어떤 정보를 전달해야 하는 상황이라고 가정하자. 정보를 전달하기 위해 상대방의 두개골을 열어 정보를 주입시키지는 않는다. 타인에게서 정보를 얻어야 할 때 상대방의 뇌에서 정보를 가져오는 행위도 하지 않는다. 대신, 우리는 그 정보를 상대방에게 말하고 그 사람은 그 말을 자신 나름대로 해석하여 머릿속에 정보를 전달한다. 정보가 필요하면 상대방에게 요청하고, 상대방이 나에게 그 정보를 얘기해준다.
전자가 클래스의 멤버 변수를 직접 접근하는 방식이라면, 후자가 Getter와 Setter를 통해 정보를 취급하는 것이다.
Getter와 Setter란?
기술적인 얘기를 해보자. Getter와 Setter는 객체의 인스턴스 변수에 대한 접근과 수정을 위한 메서드이다. 보통 클래스의 멤버 변수를 선언할 때는 private으로 선언하여 외부에서 직접적으로 접근하지 못하고 오직 Getter와 Setter를 통해서만 접근하도록 허용한다.
그러면 기껏 private으로 접근 못하게 막아뒀는데 왜 굳이 getter와 setter가 있는 것인가? 가장 근본적인 이유는 각 인스턴스의 데이터에 대한 조회, 조작이 꼭 필요한 경우가 있기 때문이다. 모든 것이 객체인 세상에서 데이터를 생성하고 조작하는 로직 또한 객체로서 만들어지게 된다(ex. Value Object, Transfer Object, Data Transfer Object ). 이런 경우 객체의 데이터를 조회, 조작할 수 있게 하되, 최소한의 안전장치를 마련해둔 것이 getter와 setter이다.
Getter를 사용하는 추가적인 이유는 객체 데이터의 원본이 아닌 복사본을 주기 때문이다. 외부에서 객체의 원본 데이터에 접근하는 것이 아니기 때문에 데이터 조회 업무 안에서 데이터가 손상될 일이 없다.
Setter를 사용하는 것은 객체의 데이터를 변경해야 할 때 검증 로직 등을 둬서 프로그램 개발자가 의도한 방향으로만 데이터를 변경할 수 있도록 유도할 수 있기 때문이다. 대규모 프로젝트나 관리해야 할 것들이 많은 경우 이 장점이 더더욱 크게 빛날 것이다.
public class Person {
private String name;
private int age;
// Getter
public String getName() {
return name;
}
public int getAge() {
return age;
}
// Setter
public void setName(String name) {
if(name.equal("수지"){
throw new Illegalargumentexception("내 이름은 수지가 아닌데");
}
this.name = name;
}
}
Getter와 Setter를 지양하라고?
이렇게 기껏 만든 Getter와 Setter는 사실 되도록 사용하지 않는 것이 권장된다. 가장 근본적인 이유는 기껏 private으로 인스턴스 멤버 변수들을 숨겨놨는데 getter와 setter를 사용하면 이 효과가 거의 사라지기 때문. 또한 getter와 setter는 객체(1번) 안에서 다른 객체(2번)의 상태를 조회하고 변경할 수 있기 때문에 2번이 해야 할 책임을 1번에서 맡아서 하게 되는 경우가 많아진다.
Getter의 사용 지양 이유 - Getter가 조회에서 끝나지 않기 때문
많은 경우 Getter를 사용해서 값을 조회하여 그 값에 대해서 조건을 확인하거나 비즈니스 로직을 작성하게 된다. 이렇게 할 경우 한 객체의 책임을 다른 객체에서 위임하는 꼴이 된다. 따라서 이후 변경에 따른 코드 수정에 매우 취약해지게 된다. getter를 단순히 값을 조회하거나인자로 넘기기 위한 경우 등이 아니라면, 그 정보를 가지고 있는 객체에게 조건 검사나 비즈니스 로직 처리를 맡기자.
Setter의 사용 지양 이유 - 값을 바꾸는 이유가 명확하지 않음
Setter를 사용하는 것은 어떤 객체에게 값을 이것으로 바꿔(setAge(10);)라고 얘기하는 것이기 때문에 이 값을 왜 바꾸고 혹은 초기화하는지에 대한 정보가 없어지게 된다. 특히 다른 객체 안에서 특정 객체의 인스턴스 변수 값을 바꾸게 하는 경우가 있는데, 이 경우 위에서 얘기했던 것처럼 한 객체가 다른 객체의 책임을 넘겨받는 일이 발생하게 된다.
Getter와 Setter는 죄악인가?
물론 getter와 setter를 완전히 사용하면 안 된다는 뜻은 아니다. 오히려 그럴 경우 코드가 너무 복잡해지는 경우도 많다. 어떤 객체의 역할을 온전히 존중해주고, 자신의 일을 책임지게 하는 방식으로 한다면 getter와 setter의 사용은 코드를 훨씬 더 간결하게 만들어준다.
'부트캠프' 카테고리의 다른 글
자바 기초 스터디 4주차 - Stream 사용하기 (0) | 2023.11.16 |
---|---|
자바 기초 스터디 3주차 - Enum 사용하기 (0) | 2023.11.09 |
자바 기초 스터디 1주차 - Array vs ArrayList (1) | 2023.10.25 |