일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Tree
- 파이썬
- Data Structure
- 코테
- Class
- Binary Search
- Matrix
- array
- 자바
- database
- 구현
- 코딩테스트
- implement
- bit manipulation
- SQL
- two pointers
- greedy
- java
- simulation
- Number Theory
- Counting
- geometry
- hash table
- dynamic programming
- Binary Tree
- Math
- sorting
- Stack
- string
- Method
- Today
- Total
코린이의 소소한 공부노트
생성자 본문
코딩을 하다 보면 기본형 변수만 가지고는 도저히 모든 내용들을 표현할 수 없다. 그래서 객체라는 것을 만들어 내가 원하는 형태로 자료를 구성하고 저장해 관리하는데, 이때 필요한 것이 객체 설계도인 클래스이다. 하지만 설계도만 있다고 해서 물건이 뾰롱 튀어나오는 것이 아니다. 이번에 공부할 것은 객체를 채워주는 역할을 하는 생성자다.
생성자는
- 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드로
- 인스턴스 생성시 수행할 작업에 사용된다.
- 인스턴스 생성시 iv는 해당 타입의 기본값으로 자동 초기화되지만,
- 우리가 유용하게 쓰려면 iv가 내가 원하는 값으로 초기화되어야 하는데, 이때 생성자를 이용한다.
- 변수 초기화에 쓰이기 때문에 메서드이긴 하지만 대입문에 더 가깝다.
hour, minute, second가 iv로 있는 Time 클래스를 이용해 Time 객체를 생성해보자.
class Time{
int hour;
int minute;
int second;
// 생성자 #1
// 매개변수 없는 생성자 = 기본 생성자
Time() {}
// 생성자 #2
// 매개변수 있는 생성자
Time(int h, int m, int s){
// 매개변수로 받은 값을 iv에 저장
hour = h;
minute = m;
second = s;
}
}
// 메인 메서드 내부
Time t1 = new Time(); // 생성자: Time()
t1.hour = 7;
t1.minute = 28;
t1.second = 51;
Time t2 = new Time(7, 28, 51); // 생성자: Time(7, 28, 51)
4줄이 1줄로 줄어들었다. 이것이 생성자의 힘이다.
생성자의 특징을 코드와 함께 살펴보자.
1. 생성자의 이름은 클래스 이름과 같아야 한다.
- 이름이 다를 경우, 일반 메서드로 인식해 반환 타입이 없는 메서드라는 에러가 발생한다.
(error: Return type for the method is missing)
2. 생성자는 리턴값이 없지만 void는 붙이지 않는다.
3. 모든 클래스는 최소 1개 이상의 생성자를 가져야 한다.
- 위의 코드에는 2가지 생성자가 있기 때문에 2가지 모두 사용 가능
- 만약 위의 코드에서 1, 2번 생성자 모두 없다면 컴파일러가 자동으로 1번 생성
- 만약 위의 코드에서 1번만 있어도 에러 발생X. 생성자는 당연히 1번의 형태로만 사용 가능
- 만약 위의 코드에서 2번만 있다면 컴파일러가 1번을 자동으로 추가해주지 않음.
-> 1번이 없다고 해서 에러 발생X. 생성자는 2번의 형태로만 사용 가능
4. 생성자는 오버로딩이 가능하다.
- 객체 생성 시 사용자의 편의성을 높이기 위해 오버로딩을 제공한다.
생성자는 매개변수의 유무에 따라 기본 생성자와 매개변수가 있는 생성자로 나뉘게 된다.
1. 기본 생성자(default constructor)
- 매개변수가 없는 생성자
Card() {} // Card 클래스의 기본 생성자
People() {} // People 클래스의 기본 생성자
- 생성자가 하나도 없을 때만 컴파일러가 자동으로 추가해주는 생성자
class Card(){ } // 생성자가 없으므로 컴파일러가 기본 생성자를 자동 추가해줌
class Time(){
Time(int h, int m, int s) { // 매개변수가 있는 생성자
// ...
}
} // 생성자가 존재하므로 기본 생성자를 자동으로 추가해주지 않음
// 이때는 기본 생성자를 꼭 만들어줘야함
// 메인 메서드 내부
Time t = new Time(); // error: The constructor Time() is undefined
// 기본 생성자가 없는데 사용해서 발생하는 에러
2. 매개변수가 있는 생성자
- 매개변수가 1개 이상 있는 생성자
- 사용자의 편의에 따라 몇 개든 오버로딩 가능
class Time{
int hour;
int minute;
int second;
Time() {}
Time(int h, int m, int s){
hour = h;
minute = m;
second = s;
}
}
// 메인 메서드 내부
Time t = new Time(12, 34, 56);
매개변수가 있는 생성자를 사용하면 다음과 같은 일이 차례대로 일어난다.
1) 참조변수 생성 = Time t
2) new로 객체 생성 -> 메모리상에 Time 객체 생성 후 객체 주소가 t에 저장, iv는 기본값으로 자동 초기화
3) 생성자 호출 = Time(12, 34, 56)
4) iv 초기화 -> t.hour, t.minute, t.second에 각각 12, 34, 56 저장
클래스를 작성할 때 가능하면 기본 생성자도 함께 쓰는 습관을 들이고, 객체 생성 시 어떤 생성자가 있는 것이 편리할지 생각하면서 코딩해보자.
'Java' 카테고리의 다른 글
변수의 초기화 (0) | 2022.03.12 |
---|---|
생성자 this() vs 참조변수 this (0) | 2022.03.12 |
메서드 오버로딩 (0) | 2022.03.09 |
스태틱/인스턴스 메서드 (0) | 2022.03.07 |
메서드의 매개변수 (0) | 2022.03.06 |