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

cksdyd1111님의 프로필 이미지
cksdyd1111

작성한 질문수

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

Getter 와 Setter

생성자편에서 this.serialNumber 를 넣는이유

작성

·

191

0

 생성자편에 블랙박스 클래스에 this.serialNumber에 디스를 붙이는이유가 무엇인가요?

그리고 인스턴스변수 int serialNumber; 생성하지않고 클래스변수

static int counter = 0; 으로 바로생성해도 되지 않나요?

답변 1

0

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

안녕하세요?

만약 다음과 같이 전달값을 받지 않는 생성자라면 생성자 내에서 this 를 사용하지 않아도 괜찮습니다. 객체를 먼저 생성하고 나서 main() 메소드에서 차례대로 값을 설정할 수도 있지요.

BlackBox() {
    System.out.println("기본 생성자 호출");
}

하지만 전달값을 받아서 객체 생성과 동시에 값 초기화를 하는 경우라면 어떨까요? 만약 modelName 을 전달받아서 바로 설정한다고 가정하면 전달받은 modelName 과 인스턴스 변수 modelName 의 이름이 같기 때문에 서로를 구분하기 위해서 this. 의 사용이 필요해진답니다.

BlackBox(String modelName) {
    // 인스턴스 변수 modelName 에 전달값 modelName 을 대입
    this.modelName = modelName; 
}

물론 이런 식으로 서로의 이름이 다르다면 this. 는 사용하지 않아도 무방합니다.

BlackBox(String name) {
    // 인스턴스 변수 modelName 에 전달값 name 을 대입
    this.modelName = name; 
}

int serialNumber 는 제품(BlackBox 로부터 만들어지는 객체)마다 서로 다른 고유의 번호를 가지기 위한 변수입니다. counter 변수를 통해 1씩 증가하도록 구현했는데요. 만약 serialNumber 라는 인스턴스 변수를 클래스 내에 정의하고 있지 않다면 b1 객체와 b2 객체의 serialNumber 를 알 수 있는 방법이 없습니다. 왜냐면 counter 변수는 static 으로 정의되어 모든 객체에서 공용으로 사용되기 때문에 객체마다 고유의 값을 저장하기 위한 별도의 변수가 필요해지는 것이죠.

그래서 다음과 같이 BlackBox 클래스를 간단히 정의하고 나서요.

public class BlackBox {
    int serialNumber;
    static int counter = 0;
  
    BlackBox() {
        this.serialNumber = ++counter;
    }
}

main() 메소드에서 이렇게 출력을 해보면 서로 다른 값을 확인할 수 있지만

BlackBox b1 = new BlackBox();
BlackBox b2 = new BlackBox();

System.out.println(b1.serialNumber); // 1
System.out.println(b2.serialNumber); // 2

위 코드에 이어서 이렇게 값을 찍어보면 같은 값을 확인할 수 있게 됩니다. 강의에서 의도한 것과는 다르죠.

System.out.println(b1.counter); // 2
System.out.println(b2.counter); // 2

궁금증 해결에 도움되었으면 좋겠습니다 😊
감사합니다.

cksdyd1111님의 프로필 이미지
cksdyd1111

작성한 질문수

질문하기