객체 지향 프로그래밍과 접근 제어자: 코드의 안전한 관리

ZEDY·2023년 10월 8일
0

[백엔드] Spring Boot

목록 보기
15/27

객체 지향 프로그래밍과 접근 제어자: 코드의 안전한 관리

객체 지향 프로그래밍과 접근 제어자

객체 지향 프로그래밍(OOP)은 소프트웨어 개발의 중요한 패러다임 중 하나로, 현실 세계의 개념을 추상화하고 모델링하는 데 주로 사용됩니다. 이러한 모델링은 클래스, 필드, 메서드 등의 멤버로 구현되며, 이러한 멤버에 대한 접근을 제어하는 것이 접근 제어자의 역할입니다.

주요 접근 제어자

Java와 같은 몇몇 프로그래밍 언어에서 주로 사용되는 네 가지 주요 접근 제어자는 다음과 같습니다.

  1. public: 어떤 클래스에서나 해당 멤버에 접근할 수 있도록 합니다. 다른 패키지의 클래스에서도 접근 가능합니다. 이는 가장 개방적인 접근 제어자로, 외부에서 사용해야 하는 클래스와 메서드에 사용됩니다.

  2. protected: 동일한 클래스 내부에서, 동일한 패키지 내의 클래스에서, 그리고 해당 클래스를 상속받은 하위 클래스에서만 접근할 수 있습니다. 이는 상속과 관련된 메서드와 필드에서 주로 사용됩니다.

  3. default (package-private): 이 접근 제어자를 명시하지 않으면 기본 접근 제어자가 되며, 동일한 패키지 내의 클래스에서만 접근할 수 있습니다. 다른 패키지에서는 접근할 수 없습니다. 주로 패키지 내부에서만 사용되는 클래스와 유틸리티 메서드에 적용됩니다.

  4. private: 해당 멤버를 선언한 클래스 내부에서만 접근할 수 있으며, 다른 클래스에서는 접근할 수 없습니다. 이는 클래스의 내부 구현 디테일을 숨기고 다른 클래스에게 노출하지 않아야 할 경우에 사용됩니다.

적절한 접근 제어자 선택

적절한 접근 제어자를 선택하는 것은 코드의 안전성과 유지보수 용이성을 결정짓는 중요한 요소 중 하나입니다. 이에 따라 다음과 같은 일반적인 가이드라인이 적용됩니다.

  • public: 다른 클래스에서 자주 사용해야 하는 멤버에 사용됩니다. 특히 라이브러리 클래스나 API의 일부로 제공되는 클래스와 메서드에 적합합니다.

  • protected: 상속 관계에서 사용되며, 서브클래스에서 접근해야 하는 멤버에 사용됩니다. 클래스의 상태나 동작을 확장하거나 재정의할 때 유용합니다.

  • default (package-private): 패키지 내부에서만 접근 가능한 멤버에 사용됩니다. 주로 패키지 내부에서만 사용되는 클래스나 유틸리티 메서드에 적합합니다.

  • private: 클래스 내부에서만 사용되어야 하는 멤버에 사용됩니다. 내부 구현 디테일을 숨기고 다른 클래스에게 노출하지 않아야 할 경우에 사용됩니다.

이러한 접근 제어자를 올바르게 활용하면 클래스 간의 결합도를 관리하고 코드의 가독성을 높일 수 있습니다. 또한 캡슐화와 보안 측면에서도 중요한 역할을 합니다.


내 경험

나는 주로 id 값이나 정말 중요한 값에만 private을 붙이는 편이었는데, 그러면 나머지 필드들은 default가 되었다.
그런데 이번 경험으로 private이 얼마나 중요한지 알게 되었다.


일반적인 접근 제어자 사용법

주로 클래스의 필드들은 private으로 설정하고 필요한 경우에만 public으로 설정하는 것이 일반적인 방법입니다. 이렇게 함으로써 캡슐화 원칙을 준수하면서도 필요한 경우에만 필드에 접근하거나 수정할 수 있습니다.

  1. private: 클래스 내부에서만 접근 가능합니다. 다른 클래스나 외부에서 접근할 수 없으며, 이 필드에 접근하려면 해당 클래스 내부에서 메서드를 사용해야 합니다.
private int age;
  1. protected: 같은 패키지 내에서는 접근 가능하고, 상속 관계의 하위 클래스에서도 접근 가능합니다.
protected String name;
  1. package-private (default): 아무 접근 제한자도 지정하지 않으면 패키지 내에서만 접근 가능합니다. 다른 패키지에서는 접근할 수 없습니다.
String email; // 패키지 내에서만 접근 가능
  1. public: 어떤 클래스에서나 접근 가능합니다. 모든 패키지와 클래스에서 접근할 수 있습니다.
public double salary;

대부분의 필드는 private으로 설정하여 클래스 내부 상태를 보호하고 외부로부터 은닉하는 것이 좋습니다. 필드에 접근할 때에는 게터(Getter)와 세터(Setter) 메서드를 사용하여 필드에 접근하고 수정하는 것이 관례입니다. 이렇게 하면 필요한 경우 필드에 대한 접근을 제어하고 유효성 검사 또는 특별한 로직을 수행할 수 있습니다.

profile
Spring Boot 백엔드 주니어 개발자

0개의 댓글