C++기준으로 설명해봄.
어차피 여기 고수님들은 다 아는 소리겠지만, 밑에 한명이 모른대서 써봄

예전에 캡슐화 =  게터 세터 도배
로 생각하는 사람을 봤는데, 전혀 아니다.

상식적으로 생각하면 아무 기능없이 get~~하면 고대로 리턴하고, set~~하면 고대로 값바꾸면 그건 퍼블릭 함수 2개를 만드는 개뻘짓을 하는 것 뿐 아무 의미가 없다.

그말은 거꾸로 게터 세터를 적절히 쓰려면 거기에 의미가 있어야 한다는 거다.

1. get과 set의 접근에 차이를 두고 싶을 때.
예를 들어 변수는 private고, pulic get으로 외부에선 값을 받아올 수만 있게 하고 싶을 때

2. getter에서 뭔가 변화를 줄 때
예를 들어 값에 그대로 접근하지 않고 복사해서 넘겨준다거나(1과 함께 쓸때)
객체를 const &로 감싸서 그대로 넘기되 수정을 막던가
형변환해서 넘긴다거나

3. setter에서 정보를 조합하거나 변형하는 역할을 할 때
이경우 이름이 굳이 set~~가 아니라 Initialize~~ Init~~ Generate~~ 등도 가능하겠지

4. 동시에 여러 변수를 set할 때

5. 로그 찍거나 디버깅할 때

예시는 들자면 끝이 없으니 생략.

요는 캡슐화라는 것은 게터세터 도배해서 public변수를 없애라는 것이 아니라, 한 클래스의 변수를 다른 클래스에서 쿰척대며 가지고 놀지 않게 하란거지.

게임을 시작할 때 게임서버에 저장된 유저 정보를 불러와 인벤토리 내의 아이템을 재구성하는 코드를 생각해보자.

A라는 클래스에서 게임을 시작한 후 유저정보를 불러왔다고 치자.그럼 그 클래스는 정보를 인벤토리에 던져주기만 하고,
정보를 가지고 아이템과 그 개수를 다시 재구성하는 것은 인벤토리 클래스에서 해야한다는 거지.

A에서 인벤토리에 있는 아이템 목록 Map에 직접 접근해서 하나하나 아이템을 넣어주고 있으면 문제가 있다는 것.

나중에 여기 디버깅하는 데 인벤토리에 문제가 있는걸 인벤토리 클래스가 아닌 다른 클래스에서 수정하고 앉아있으면 얼마나 빡치겠음.

또 캐릭터가 아이템을 획득했다면 인벤토리의 AddItem함수를 호출해서 아이템 종류랑 개수만 던져줘야지, 또 여기서 아이템 목록을 불러와서 이미 아이템이 있는지 찾고 거기다 더해주는 등 찝적대고 있으면 우욱....

보통 이런 문제는 한 클래스가 해야할 일을 다른 클래스에서 할 때 터짐.

따라서 public 변수는 줄이는 게 맞다. 하지만 구조적인 수정을 통해 해결하란 거지 게터 세터 무조건 처박으란건 아님.

- dc official App