인프런 커뮤니티 질문&답변

갈색곰님의 프로필 이미지
갈색곰

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

Getter 와 Setter

안녕하세요 나도코딩 선생님 :)

작성

·

255

3

안녕하세요 나도코딩 선생님 :)
곧 추석인데 잘 지내고 계신가요?

선생님 강의 복습하면서 보고있는데 항상 감사드립니다!

다름이 아니라, 저도 해당 글쓴님과 같은 의문점이 들어 답변 주신 부분을 확인하였는데요,
https://www.inflearn.com/questions/950351

답변 주신 해당 부분을 반복해서 읽고 있는데 명확하게 이해가 되지 않아 질문드리는 점 양해 부탁드립니다(__ __)


제가 이해한 바로는 Resolution()의 경우, null값으로 반환되어 if문을 getter로 작성하셨고, Price()의 경우는 특정 값 반환으로 인해 if문을 setter로 작성하신 점으로 이해해도 될까요? 추후 코드를 작성할 시 getter와 setter 중 어떤 조건으로 어디에 조건문을 작성하는 것일지 알고싶어 여쭈어봅니다!

편안한 연휴 보내시길 바라며, 감사합니다!

 




전달값이 없는 단순한 getter 메소드는 일반적으로 그냥 인스턴스 변수의 값을 반환하는 역할을 수행합니다.

하지만 getResolution() 과 같이 getter 메소드에 조건을 추가하는 이유는 해당 인스턴스 변수의 값이 특정 조건을 만족하지 않을 경우에 대응하는 로직을 제공하기 위해서입니다. 이러한 접근 방식은 일반적으로 값을 반환하는 단순한 getter 메소드에서는 유용합니다.

이런 방식을 사용하는 이유는 몇 가지가 있는데요.

 

1. 안정성
인스턴스 변수의 값이 null일 때 getter 메소드가 null을 반환하면, 클라이언트 코드에서 해당 값의 null 여부를 체크하여 잠재적인 문제(=NullPointerException)를 방지하는데 도움이 됩니다.

2. 기본값 제공
해당 인스턴스 변수가 기본값인 경우, 또는 아직 값이 설정되지 않은 경우를 대비하여 기본 메시지나 기본값을 반환할 수 있습니다.

3. 클라이언트 코드 간소화
클라이언트 코드에서 추가적인 null 체크나 예외 처리를 하지 않도록 도와줍니다.

4. 의도 표현

인스턴스 변수가 특정 조건을 만족하지 않을 때 어떤 동작을 하는지 미리 설명하는 역할을 합니다.

 


 

이번에는 setPrice() 에 대해 설명 드릴게요.

setter 메소드는 주로 인스턴스 변수 값을 설정하는 역할을 합니다.

하지만 때로는 값의 유효성을 검사하거나 특정 조건을 만족하지 않을 때 기본값이나 다른 값으로 설정해야 할 경우가 있는데 이때 setter 메소드에서 조건을 확인하고 특정 동작을 수행하는 것은 올바른 접근 방법일 수 있습니다.

setPrice() 메소드는 price 인스턴스 변수를 설정하는데, 만약 price가 100,000보다 작으면 100,000으로 설정하고, 그렇지 않으면 주어진 price 값을 그대로 price 인스턴스 변수에 설정합니다. 이렇게 setter 메소드에 조건을 추가하여 값을 검증하고 처리하면 코드의 안정성과 유효성을 높일 수 있습니다. 예를 들어, price가 음수가 될 수 없거나 특정 범위를 벗어나면 이를 감지하고 기본값이나 다른 유효한 값으로 설정할 수 있게 되지요.

답변 2

2

나도코딩님의 프로필 이미지
나도코딩
지식공유자

네 맞습니다 😊

getResolution() 이 아닌 setResolution() 에서 잘못된 값이 설정되지 않도록 미리 처리를 할 수도 있고요.

void setResolution(String resolution) {
    if (resolution == null || resolution.isEmpty()) {
        this.resolution = "판매자에게 문의하세요.";
    } else {
        this.resolution = resolution;
    }
}

String getResolution() {
    return resolution;
}

setPrice() 가 아닌 getPrice() 에서 최저가 확인을 하도록 할 수도 있습니다 :)

void setPrice(int price) {
    this.price = price;
}

int getPrice() {
    if (price < 100000) {
        return 100000;
    }
    else {
        return price;
    }
}

강의에서 다룬 예제에서는 이렇게 하셔도 아무런 문제가 없습니다. 단, 다른 프로그램을 만드실 때는 set 을 할 때 조건 확인이 필요한 경우도 있습니다. 가령 해상도 정보는 문자열(String)이긴 하지만 반드시 가로x세로 포맷으로 지정, 그러니까 1024x768, 1920x1080 등과 같이 작성을 해야 한다고 가정하겠습니다. 그러면 이 문자열로부터 x 를 기준으로 앞에 있는 값은 항상 가로 크기, 뒤에 있는 값은 항상 세로 크기가 되며 다음과 같이 클래스를 만들어볼 수도 있어요.

public class BlackBox {
    private int width;
    private int height;

    void setResolution(String resolution) {
        String[] strSplit = resolution.split("x"); // x 기준으로 문자열 분리하기
        width = Integer.parseInt(strSplit[0]); // x 이전의 값을 int 로 변환
        height = Integer.parseInt(strSplit[1]); // x 이후의 값을 int 로 변환
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }
}

위 클래스에서 setResolution() 메소드가 동작하고 나면 width, height 변수에는 각각 가로 크기, 세로 크기가 정수형으로 들어가게 되겠지요.

그런 다음에 main() 메소드에서는 클래스를 이렇게 사용할 수 있습니다.

public class Sample {
    public static void main(String[] args) {
        String resolution = "1920x1080"; // 해상도 정보
        BlackBox box = new BlackBox();
        box.setResolution(resolution);

        System.out.println("가로: " + box.getWidth());
        System.out.println("세로: " + box.getHeight());
    }
}

실행 결과는 다음과 같지요.

가로: 1920
세로: 1080

하지만 입력값을 가로x세로 포맷이 아닌 문자열, 즉 판매자에게 문의하세요 와 같은 문장으로 한다면 setResolution() 메소드가 수행되는 과정에서 오류가 발생하게 됩니다. x 라는 문자가 없을 뿐더러 정수형으로 변환할 수 있는 문자열이 아니기 때문이기도 하죠.

이런 점을 감안하셔서 getter 와 setter 에 필요 시 적절한 조건 또는 처리문을 추가하시면 되겠습니다 😊

갈색곰님의 프로필 이미지
갈색곰
질문자

안녕하세요 나도코딩 선생님 :)
연휴임에도 불구하고 좋은 예시 남겨주셔서 정말 감사합니다!!
덕분에 setter, getter 이해가 잘 된 것 같습니다 !! ㅎㅎ

연휴 푹 쉬시고 행복한 하루 가득하시길 바랍니다.

감사합니다 !!

2

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?

먼저 즐거운 명절 보내시길 바라며 꾸준히 열심히 공부해주셔서 진심으로 감사드립니다 😊👍

getter 와 setter 는 기본적으로는 인스턴스 변수의 값을 얻어(get)오거나 설정(set)하는 역할을 합니다. 그래서 다음과 같이 단순히 get, set 메소드를 정의하여도 충분히 제 역할은 다 하는 것이죠.

String getResolution() {
    return resolution;
}

void setPrice(int price) {
    this.price = price;
}

다만 예제에서는 조금의 if 문을 추가하였는데요.

getResolution() 는 resolution 변수의 값이 null 인 경우를 대비하여 if 조건문을 추가하였으며,
setPrice() 는 price 변수에 의도하지 않은 값(100,000 보다 작은 금액) 이 설정되는 것을 대비하여 if 조건문을 추가하였습니다.

이렇게 하지 않으면 resolution 데이터가 올바로 설정되지 않은 상품의 경우 null 값이 반환되어서 의도치 않은 값을 출력할 수 있게 되며, price 데이터가 너무 싼 가격 또는 심지어 음수 값도 들어갈 수 있는 잠재적인 문제가 발생할 수 있어요.

가령 어느 마트에 상품별 가격표를 출력해서 붙여야 하는데 특정 상품의 가격이 올바로 설정되지 않았다면 가격표에 "직원에게 문의하세요" 와 같은 문구가 적혀 있으면 그나마 다행이지만 "null" 이라고 적혀버리게 되면 문제가 되겠지요. 또는 모든 상품에 1000원 할인 이벤트를 한다면 1000원 할인이 적용된 가격을 출력하기를 원했는데, 낱개 상품이 500원짜리였다면 1000원을 할인 적용했을 때 -500원이 되는 어처구니 없는 일이 생길 수도 있겠죠.

이처럼 getter 와 setter 에는 기본적인 역할 외에 필요 시 적절한 if 문을 얼마든지 넣으실 수 있습니다.

비슷한 예로 유효성 검사 및 데이터 무결성을 위해 나이를 설정하는 setter 메소드에는 이렇게 적용해볼 수도 있겠네요!

public void setAge(int age) {
    if (age >= 0) {
        this.age = age;
    } else {
        throw new IllegalArgumentException("나이는 음수일 수 없습니다.");
    }
}

이해에 도움되길 바라겠습니다 😊
감사합니다.

갈색곰님의 프로필 이미지
갈색곰
질문자

안녕하세요 매번 친절한 설명 정말 감사합니다 선생님 :)

그렇다면 혹,
getResolution() 는 resolution 변수의 값이 null 인 경우를 대비하여 if 조건문을 추가하였으며,
setPrice() 는 price 변수에 의도하지 않은 값(100,000 보다 작은 금액) 이 설정되는 것을 대비하여 if 조건문을 추가하였습니다.

이 부분을 반대로 if문 추가하는 부분을 setResolution(), getPrice()로 변경하여

각각 Resolution()은 if문을 setter에, Price()는 if문을 getter에 작성해도 무방한것일지 여쭈어봅니다!

감사합니다!

갈색곰님의 프로필 이미지
갈색곰

작성한 질문수

질문하기