ABOUT ME

작은 디테일에 집착하는 개발자

Today
-
Yesterday
-
Total
-
  • [Java] 게터/세터(Getter/Setter)를 사용하는 이유
    IT Study/컴퓨터 기초 2023. 4. 10. 16:58
    728x90

    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
Designed by Tistory.