-
[Java] 게터/세터(Getter/Setter)를 사용하는 이유IT Study/컴퓨터 기초 2023. 4. 10. 16:58728x90
1. Getter/Setter
클래스의 멤버 변수를 public으로 선언하면, 해당 멤버 변수는 어디서든 직접 접근이 가능합니다.
그러나 멤버 변수에 직접 접근하는 것은 문제가 될 수 있습니다.
❓ 왜 클래스의 멤버 변수에 직접 접근하는 것이 문제가 될까요?
왜냐하면 클래스의 멤버 변수에 직접 접근한다는 것은 외부에서 멤버 변수의 값을 변경할 수 있다는 의미로,
외부에서 클래스의 멤버 변수에 직접 접근하여 값을 변경하면 해당 클래스는 의도치 않게 동작할 수 있습니다.
public이 아닌 *private이라는 키워드로 멤버 변수가 선언되어 있더라도
클래스의 외부에서 접근이 가능하게 되면 해당 클래스 내에 구현이 변경되었을 때 다른 코드에 영향을 줄 수 있습니다.
*private : 접근 제한자 중 하나로, 해당 멤버를 선언한 클래스 내에서만 접근이 가능하도록 제한하는 키워드
∴ Getter/Setter는 private으로 선언된 클래스의 멤버변수에 대해, 외부에서 접근할 수 있도록 만들어 줄 수 있습니다.
이를 통해 클래스 내부 구현을 변경할 경우,
Getter/Setter를 사용하는 코드에는 영향을 미치지 않으면서 클래스의 멤버 변수에 대한 접근을 제어할 수 있습니다.
2. 캡슐화와 정보 은닉
캡슐화란 객체의 변수와 메서드를 하나로 묶어 외부에서 직접 접근하지 못하도록 하고,
메서드를 통해서만 접근할 수 있도록 제한하는 것을 의미합니다.
캡슐화를 통해 객체 보호와 동시에, 객체 간의 의존성을 낮출 수 있습니다.
정보 은닉이란 객체의 내부 구현을 외부에 감추어 접근을 제한하는 것을 의미합니다.
이를 통해 객체 보호와 동시에, 오류의 발생을 줄일 수 있습니다.
3. Getter/Setter의 장점
Getter/Setter는 캡슐화와 정보 은닉을 지키기 위한 규칙으로,
객체의 변수에 직접 접근하는 것을 막고 메서드를 통해 간접적으로 접근하도록 하는 것이 그 역할입니다.
Getter/Setter를 사용하여 필드의 값을 제어할 수 있습니다.
예를 들어, 객체의 나이 변수는 음수가 될 수 없는데
Setter(값 받기)에서 음수가 들어오면 예외를 발생시키거나 값의 유효성을 검증하는 로직을 추가할 수 있습니다.
4. 게터/세터의 단점
첫 번째, Getter/Setter를 지나치게 사용하면 클래스 구조가 복잡해질 수 있습니다.
멤버 변수를 private으로 설정하면 게터/세터를 사용하게 되는데, 이러한 접근 방식이 많아지면 코드의 가독성이 떨어질 수 있습니다.
두 번째, Getter/Setter는 메서드 호출에 따른 오버헤드가 발생할 수 있습니다.
멤버 변수에 직접 접근하기보다, 게터/세터를 통해 간접 접근하면 메서드 호출이 추가로 발생하기 때문에 성능에 영향을 미칠 수 있습니다.
5. 게터/세터의 사용 예시
eclipse(통합개발환경, IDE)에서는 Getter/Setter를 부르기 위해서는 'shift + alt + s' 단축키를 사용합니다.
Select All : Getter/Setter 모두 생성
Select Getters/Setters : Getter/Setter 생성학생 정보를 저장하는 클래스를 예시로, 학생의 이름, 학번, 전공을 멤버 변수로 생성하였습니다.
public class Student { private String name; private String studentID; private String major; }
Getter는 값을 다시 뱉어내는(읽어오는) 메서드, Setter는 값을 받아 멤버변수에 저장하는 메서드라고 이해해 보세요 😃
public class Student { private String name; private String studentID; private String major; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getStudentID() { return studentID; } public void setStudentID(String studentID) { this.studentID = studentID; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } }
Getter/Setter를 통해 값을 설정하거나 가져올 때,
유효성 검사를 수행하거나 메서드와 같이 다른 로직을 추가할 수 있다는 장점이 있습니다.
public class Student { private String name; private String studentID; private String major; public String getName() { return name; } public void setName(String name) { if (name == null || name.length() == 0) { throw new IllegalArgumentException("Name cannot be null or empty"); } this.name = name; } public String getStudentID() { return studentID; } public void setStudentID(String studentID) { if (studentID == null || studentID.length() == 0) { throw new IllegalArgumentException("Student ID cannot be null or empty"); } this.studentID = studentID; } public String getMajor() { return major; } public void setMajor(String major) { if (major == null || major.length() == 0) { throw new IllegalArgumentException("Major cannot be null or empty"); } this.major = major; } }
이렇게 Getter/Setter에 대해 알아봤습니다.
Getter/Setter 를 통해 직접 접근하지 않아 유지보수가 쉽고 안정적인 코드를 작성할 수 있습니다.
하지만, 무분별한 Getter/Setter의 사용은 객체지향적인 설계 원칙에 위배될 수 있으며,
반복적인 코드 작성으로 코드의 가독성을 해칠 수 있으니 적절한 사용을 통한 프로그래밍을 지향하도록 노력합시다 💞
'IT Study > 컴퓨터 기초' 카테고리의 다른 글
[Java] 람다식 (Lambda) (0) 2023.04.20 [Java] toString() (Feat. 매번 헷갈려..) (0) 2023.04.15 [Java] 스레드 (Thread) (0) 2023.04.08 [Java] 열거형 (Enum) (0) 2023.04.06 [Java] 제네릭과 와일드카드 (0) 2023.04.05