카테고리 없음
객체 지향 프로그래밍 OOP - 캡슐화
aammddkkzxc
2024. 2. 4. 18:54
접근 제어자
- 자바에서는 다양한 접근 제어자를 이용하여 클래스, 생성자, 필드, 메서드 등의 멤버에 대한 접근 권한을 지정한다.
- 접근 제어자는 해당 멤버에 대한 외부로부터의 접근을 제한하거나 허용하는 역할을 한다
클래스에서의 접근 제한
- public : 어떤 패키지에서도 접근 가능합니다.
- default : 같은 패키지 내에서만 접근 가능합니다. 별도로 명시하지 않으면 default로 간주
생성자에서의 접근 제한
- 생성자에 대한 접근 제어자는 직접 지정하지 않는다면 default로 간주
- 자동으로 생성되는 기본 생성자는 클래스와 동일한 접근 제한자를 가짐
필드와 메서드
- public: 모든 클래스에서 접근 가능
- protected: 같은 패키지 내에서, 또는 다른 패키지에서 해당 클래스를 상속받은 자식 클래스에서만 접근 가능
- default : 같은 패키지 내에서만 접근 가능합니다. 접근 제어자를 명시하지 않으면 default
- private: 같은 클래스 내에서만 접근 가능
getter와 setter
setter
- setter 메소드를 통해 데이터를 변경한다
- 데이터는 외부에서 접근할 수 없도록 막고, 메소드는 공개해서 외부에서 메소드를 통해 데이터에 접근하도록 유도
- 메소드 내에서 조건절 등으로 매개값을 검증해서 유효한 값만 데이터로 저장
getter
- 필드에 대한 직접 접근을 막고, getter를 사용하여 접근 하도록 한다
- 만약 나중에 필드의 값을 계산하거나 변경해야 하는 경우, 해당 로직을 getter 메서드 내부에 추가할 수 있다.
getter와 setter지양
getter와 setter로도 데이터의 무결성과 캡슐화를 온전히 해낸다고 하긴 힘들다 다음과 같은 이유를 봐보자
setter
- Setter는 값을 바꾸는 이유를 드러내지 않는다
- Setter를 사용하면 객체의 상태를 외부에서 언제든지 변경할 수 있다. 이로 인해 왜 상태가 변경되는지 명확하지 않을 수 있다. 객체의 상태가 변경되는 이유를 명시적으로 나타내지 않으면 코드의 이해와 유지보수가 어려워진다.
- 다른 객체들로 책임이 분산된다:
- Setter를 통해 객체의 상태를 변경하면 해당 객체에 대한 책임이 분산되고, 다른 객체들도 이 내용에 대해 알고 관리해야 한다 => 결합도가 높아진다
getter
- getter로 데이터를 읽어 온 후 조회로 끝나지 않는 경우가 많다
- 멤버변수에 getter를 생성해 놓고 상태값을 꺼내 그 값으로 객체 외부에서 로직을 수행한다면, 객체가 로직(행동)을 갖고 있는 형태가 아니고 메시지를 주고 받는 형태도 아니게 된다. 또한, 객체 스스로 상태값을 변경하는 것이 아니고, 외부에서 상태값을 변경할 수 있는 위험성도 생길 수 있다. 따라서 이는 객체스럽지 못한 것이다.
해결 방법
- setter
- 변경 이유를 나타내는 메서드를 따로 생성하여 사용한다.
- 생성자로 의존성 주입을 통해 필요한 객체나 값을 외부에서 주입받도록 설계한다.
- getter
- 상태 데이터를 꺼내 로직을 처리하도록 구현하지 말고, 객체 자체에서 로직을 구현하고, 메시지를 보내 일을 하도록 한다.
출처
(도서) 이것이 자바다
https://tecoble.techcourse.co.kr/post/2020-04-28-ask-instead-of-getter/