우리가 흔하게 말하는 인스턴스화 즉 객체를 사용하기 위해서 정의해주는 것이 가능한 이유를 아시나요?
위 처럼 BookDTO라는 클래스가 있습니다. 이 클래스를 사용하기 위해서 위에서 말한 인스턴스화가 필요합니다.
위 사진처럼 인스턴스화를 진행해 줍니다. 그런데 생성자는 ()안에 파라미터 값을 넣어 주어야합니다.
생성자의 역할은 진짜 값을 가르키고 있는 힙메모리에 생성할 때부터 초기화해주는 것이 목표입니다.
그러니까 만약에 bk 라는 인스턴스가 있고 이것은 실제 데이터 값을 가르키는 힙메모리이고, 데이터가 독립적으로 저장됩니다.
※ 진짜 값을 가르키고 있다 라는 뜻은 BookDTO 클래스에 정의된 변수들을 의미합니다.
위처럼 new BookDTO(); 괄호 ()에 아무것도 넣어주지 않았다. 생성자는 원래 객체를 만들 때 이 값들을 전부 초기화
해주는 것이 원칙이지만 BookDTO라는 클래스에 아무 생성자도 정의해 주지 않는다면 Defalt Constructor(기본 생성자)
가 있어서 ()괄호 안에 아무것도 넣지 않고 인스턴스 생성이 가능한 것이다.
이해를 돕기위에 다음 사진을 보자.
그렇다면 왜 우리가 BookDTO bk = new BookDTO(); 괄호안에 아무것도 안넣고 인스턴스를 만들 수 있게 됬는지
이해했다면 생성자의 진짜 역할을 위해서 ()안에 어떤 것들을 넣어서 데이터값들을 초기화하고 시작해보자.
(BookDTO 클래스)
다음 함수를 살펴보면 의문이드는 점이 있습니다.
1. 왜 함수 이름이 같을까?
BookDTO라는 함수가 2개 정의 되있습니다.
같은 함수의 이름이지만 () 이 괄호안에 들어가는 매개변수(parameter)가 다르다면 중복사용이 가능한 것이
자바의 오버로딩(OverLoading)의 기능입니다.
2. this는 무엇이지?
위의 사진을보면 BookDTO에 정의되어있는 변수 public String name 이 있습니다.
그리고 BookDTO(String name, int price, String company, int page) 파라미터값이 존재하는 생성자가 있습니다.
우리는 다음 파라미터 생성자를 이용해서 인스턴스화를 시킬려고 할 때 아래와 같이 생성합니다.
그러면 파라미터값은 자바책, 12000, 책회사, 333 이 4개의 값들이 파라미터값 즉 매개변수 들어오는 데이터들이겠네요.
그럼 이 들어온 값들이 BookDTO에 정의되어있는 public String name의 복사본(힙메모리) 즉 javabook.name으로 값이 들어가야겠지요.
그러면 힙메모리에 있는 속성값 name과 사용자로부터 받아온 파라미터 name은 어떻게 구분할까요?
바로 this 입니다. this가 붙어져 있으면 힙메모리에 있는 name인겁니다.
this.name = name
힙메모리에 생성되 있는 name 안에 사용자로부터 받아온 name 저장시켜!
결론은, 힙메모리의 속성값과 파라미터로 받아온 데이터를 서로 구분해주기 위해 this를 사용합니다.
위에서 정의한 파라미터가있는 생성자를 한번 사용해 봅시다.
(메인함수)
이번에는 BooDTO() 괄호안에 데이터가 들어가있죠? 객체를 만들기 전에 그 값들을 초기화시켜주는 것
그것이 바로 생성자의 역할입니다.
데이터를 바로 할당해서 인스턴스를 만들어 줍니다.
다음과 같이 출력이 잘나옵니다.
[요약]
1. 생성자는 인스턴스화를 시킬 때 데이터값을 전부 초기화 해주기 위해서 사용한다.
2. 생성자는 같은 함수의 이름으로 다른 () 괄호의 파라미터를 정의해준다면 함수 이름중복 사용 가능 이를 오버로딩(overloading)이라고 한다.
3. ()에 아무것도 넣지 않고 인스턴화를 시킬 수 있는 디폴트 생성자 덕분이다. 디폴트 생성자가 없다면 아무것도 괄호에 넣지 않고 생성 자체가 불가하다.
4. 인스턴스화 시킬 때 힙메모리가 생성되고 클래스에 있는 속성들이 복사되는데 그 속성들과 파라미터값(매개변수)을 서로 구분해주기 위해서 this를 사용한다. this가 붙으면 힙메모리에 있는 속성이다.(javabook.name)
References