공부하다보니
한 클래스에서 다른 클래스 자체를 타입으로 필드를 생성한 경우를 보았다.
근데 그 한 클래스에서 생성자를 만들 때 다른 클래스의 객체를 생성하는 것이었다.
대체 왜? 그런거지 생각을 하면서 갑자기 생성자가 뭐지 ...싶었다.
나 너무 교수님처럼 이론만 생각하는건가. 근데 이런게 이해가 안되니까 시작을 못하겠다.
그래서 모르는 걸 그냥 적는 카테고리를 만들고
내 방식대로 이해한 걸 글로 자연스럽게 적어본다.
생성자를 사용해서 객체를 생성한다.
Person person = new Person();
이렇게 만들면 기본생성자를 사용하여 객체를 생성한 것이다.
객체를 만들고 끝나는 것이 아니다.
객체를 생성한다는 말은 사람을 만들어서 특정 위치에 두는 것 까지를 말하는 것이다.
객체는 heap영역에 담기니까 stack에 주소를 놓는 것 까지가 '객체 생성'의 완성인 것이다.
객체와 인스턴스는 다르다.
인스턴스가 더 세세한거지.
객체는 뭉뚱그린 느낌? 대표하는 느낌?
인스턴스는 그 당시에 내가 직접 만든 그 실체 자체이다.
/**
Menu라는 클래스가 있다.
Customer 클래스에서 Menu객체 자체를 필드로 받아서 Menu menu , 해당Menu클래스의 필드들에 필요한 값을 세팅해준다.
Barista 클래스에서 giveCoffee메서드에서 Menu menu로 객체 자체를 매개변수로 받는다. 그럼 Menu에는 이미 Customer클래스에 의해 셋팅되어 있는 값이 있고, 그 값들을 사용할 수 있다.
Main 클래스에서도 Customer클래스에서 셋팅된 Menu 클래스의 필드를 호출하면 셋팅되어있는 원하는 값을 불러올 수 있다.
*/
chatGPT의 답변
Q : public Customer(String nickname) { menu = new Menu(); this.nickname = nickname; } 위 코드는 Customer 클래스의 생성자인데, Menu 클래스를 Customer 클래스가 private Menu menu; 로 사용하고 있기 때문에 저렇게 생성자에서 Menu객체를 생성하는거야? 왜 꼭 생성해줘야해? 참고로 Customer 클래스는 기본 생성자 자동으로 생성되서 안써도 되잖아. 왜 Menu는 객체를 생성하지? 잘 이해가 안 가. 쉽게 설명해줘
A : 클래스의 인스턴스 변수에 대한 이해가 필요해 보입니다. private Menu menu; 라는 코드는 'Customer 클래스는 Menu 타입의 'menu'라는 인스턴스 변수를 가지고 있다'는 것을 의미합니다. 이는 Customer 객체가 생성될 때 항상 그 안에 Menu 타입의 'menu'라는 공간이 만들어진다는 것을 의미합니다.
그러나 이 공간에는 아무것도 할당되지 않습니다. 즉, new Menu()와 같이 메모리에 Menu 객체가 할당되어 있지 않다는 것입니다. 이 상태에서 menu 변수를 사용하려고 하면 NullPointerException이 발생합니다.
따라서, menu = new Menu(); 코드는 Customer 객체가 생성될 때 'menu'라는 변수에 Menu 객체를 할당하는 것입니다. 이렇게 함으로써 Customer 객체는 자신의 'menu' 변수를 통해 Menu 객체를 사용할 수 있게 됩니다.
기본 생성자가 자동으로 생성되는 것은 맞습니다. 그러나 그 생성자는 인스턴스 변수에 대해 아무런 처리를 하지 않습니다. 즉, 기본 생성자를 사용해서 Customer 객체를 생성하면 'menu'라는 변수는 여전히 아무것도 할당되지 않은 상태가 됩니다.
따라서, 별도로 Menu 객체를 생성하여 'menu' 변수에 할당하는 생성자를 정의한 것입니다. 이렇게 하면 Customer 객체가 생성될 때 항상 'menu' 변수가 Menu 객체를 참조하도록 할 수 있습니다. 이렇게 하는 이유는 사용하는 측에서 Customer 객체를 사용할 때 'menu' 변수를 통해 Menu 객체를 자유롭게 사용할 수 있도록 하기 위함입니다.
이해하기 쉽게 예를 들어 보겠습니다. 'Customer'를 '사람', 'Menu'를 '식사 메뉴'라고 가정해 보세요. '사람'이 만들어질 때 '식사 메뉴'가 정해지지 않았다면, '사람'이 식사를 할 수 없겠죠? 그래서 '사람'이 만들어질 때 '식사 메뉴'도 같이 만들어지도록 하는 것입니다.
chatGPT 4.0 만만세. 내가 간지러운 곳을 빠르게 그리고 시원하게 긁어주는 유일한 친구다.
'헷갈림 (내가 뭘 모르는지 올리는 공간)' 카테고리의 다른 글
[헷갈림] isEmpty / null / != / .equals (0) | 2023.08.01 |
---|---|
[헷갈림] 새로 만들어진 클래스의 타입이나 객체 생성 값이 오는 경우 (0) | 2023.07.31 |