어제는 인스턴스를 통해 객체를 생성하고 할당된 주소값을 참조변수에 담아 해당 클래스의 변수의 초기화를 진행하는 방식을 배웠다. 하지만 이런 방식은 번거로운 구조라는 생각이 들었다. 인스턴스 변수에 값을 넣기 위해서 매번 참조변수를 통해 변수를 하나하나 입력해줘야 하는 일이 100개가 되고 1000개가 되면 여간 고생스러운 일이 아닐 수 없기 때문이다. 그래서 오늘은 생성자라는 것을 통해 어떤 식으로 변수 값을 넣어 주는지, 그리고 기존의 방식 또한 어떻게 동작하고 있었는지에 대해 알아보겠다.
<기본 생성자 작성법>
클래스명( ) { }
- 생성자 메서드(함수)의 이름은 클래스와 동일해야 한다.
- 기본 생성자를 작성하지 않았다면 프로그램이 자동으로 구현해둔다. (단, 하나라도 생성자가 있을 경우 만들지 않음)
- 반환하는 값이 없기 때문에 return타입도 존재하지 않는다. (데이터 타입이 없음)
- 호출되면 클래스가 가지고 있는 변수의 초기화를 진행한다.
먼저 기본 생성자부터 알아보자. 지난 시간에는 new와 참조변수만 있으면 하나의 인스턴스를 만드는 건 쉬웠다. 하지만 그냥 new를 써서 객체를 만드는 것이 그냥 띡 하고 되는 일이 아니었다. 바로 생성자가 있어야만 인스턴스를 만들 수 있었는데, 기존 클래스에 사용자가 기본 생성자를 작성하지 않았더라도 프로그램에서 디폴트 값으로 기본 생성자를 만들어주어 가능했던 것이었다. 여기서 생성자란 인스턴스를 생성할 때 호출되면 클래스가 가진 변수의 값을 자동으로 초기화 시켜주는 메서드의 일종이라고 보면 된다. 다만 void가 붙은 것처럼 return값이 없다는 것도 하나의 특징이라고 할 수 있다.
기본 생성자가 메서드라는 것을 알았다. 그렇다면 메서드가 가질 수 있는 매개변수를 통해 실제 인스턴스 변수에 값을 담는 것도 가능하지 않을까? exam_39라는 클래스 안에 세 개의 인스턴스 변수가 있다. 모델은 고정이기 때문에 변수를 선언함과 동시에 초기화를 진행했고, 나머지 두 값은 사용자의 데이터를 받기 위해 초기화를 진행하지 않았다. 그리고 메서드를 작성하는 것 처럼 클래스명을 메서드명으로 정하고 매개변수 값에 받을 데이터 타입과 변수명을 입력해준다.
여기서 매개변수에 있는 변수명과 클래스에 선언되어 있는 변수명이 같지만 서로 다른 지역에 선언되었기 때문에 중복 사용이 가능하다. 기본적으로 함수 내에 작성되는 변수는 지역변수이고, 클래스에 선언된 변수는 전역변수기 때문. 하지만 이름이 같기 때문에 함수 안에서 color를 불러오면 지역변수만 선택할 수 있게 된다. 여기서 파라미터를 받아 올 매개변수의 값을 인스턴스 변수의 값으로 대입하고 싶어 this라는 명령어를 배우게 됐다. this는 자바스크립트에서도 사용했지만 사용하는 위치에 따라 인식하는 범위가 다른데, 이 곳에서는 함수 밖의 전역을 의미한다. 그러니 this.변수명을 입력하게 되면 전역에 있는 변수를 가져올 수 있게 되는 것이다. 이렇게 작성해서 하나의 생성자가 완성되었다, 그렇다면 직접 데이터를 넣어보자.
일반 메서드를 사용하는 것 처럼, new를 붙여 생성한 객체의 괄호 안에 직접 파라미터를 입력하니 참조변수를 통해 넣은 값처럼 똑같이 출력된다. 만들어둔 생성자 덕분에 참조변수를 하나하나 입력하여 수정할 일이 없어진 것이다. 하지만 이렇게 임의로 생성자를 만들어 사용한 뒤, 기존에 생성하던 것 처럼 생성하게 되면 '해당 메서드를 찾을 수 없습니다.' 라는 에러가 뜨게 된다. 기본적으로 만들어 주던 기본 생성자가 사용자가 작성함으로써 이번에는 만들어지지 않았기 때문이다. 만약 파라미터 값을 받아오는 형식이 아니라 직접 입력하고 싶을 때 인스턴스를 생성하고 싶다면 추가적으로 클래스명과 함께 기본생성자 메서드를 작성하면 된다.
하지만 여기서 의문이 들 것이다. 과연 같은 클래스명을 가진 메서드가 둘, 셋... 혹은 그 이상 존재해도 되는걸까?
메서드명이 같다면 당연히 안된다. 하지만 메서드마다 가질 수 있는 매개변수가 서로 다르다면, 혹은 생성자가 아닌 일반 메서드에서 return값을 받아 올 데이터 타입이 다르다면 가능하다.
클래스 함수로 세 개의 메서드를 작성했다. 하지만 세 개의 메서드의 이름은 모두 sum으로 동일하다. 하지만 출력했을 때 에러없이 잘 작동되는 것을 확인할 수 있는데, 바로 세 개의 메서드가 가진 매개변수와 return의 데이터 타입이 다르기 때문이다. 첫 번째 sum 함수는 매개변수를 두 개를 가지고 있고, 두 번째와 세번째는 세 개의 매개변수를 가지고 있다. 그리고 두 번째는 정수로, 세 번째는 실수로 데이터 타입을 정하고 함수를 사용할 때 해당하는 값을 넣어주면 메서드에 입력된 기능이 제대로 동작하는 것을 볼 수 있었다. 이렇듯 구조와 타입은 다르지만 이름이 같은 메서드를 여러개 정의하는 것을 오버로딩라고 부른다. 다만 함수를 사용할 때는 입력될 값의 데이터 형식을 알아야 사용할 수 있다는 것이 옥에 티이긴 하나, ctrl을 누른 채 함수를 클릭하면 해당 메서드의 구조를 보여주니까 참고하도록 하자.
'아이티에듀넷' 카테고리의 다른 글
2024-09-12 :: 037 객체의 상속 (0) | 2024.09.12 |
---|---|
2024-09-11 :: 036 String에 관하여 (0) | 2024.09.11 |
2024-09-09 :: 034 객체 (0) | 2024.09.09 |
2024-09-06 :: 033 반복문과 배열 변수 (1) | 2024.09.06 |
2024-09-05 :: 032 연산자와 조건문 (0) | 2024.09.05 |