생성자
생성자는 클래스에서 객체를 찍어내주는 요소이다.
인스턴스(클래스에서 찍어낸 변수, 메서드)를 초기화 하는 메서드 이다.
우리가 코딩을 할 때 변수 앞에 new를 넣어서 새로운 변수를 만들어 내곤 했는데, 사실 이 new을 사용해서 객체를 생성할 때 "호출되는 것이 생성자" 이다. (new가 생성자라는 말이 아니다, new를 작동시킬때 같이 오는게 생성자다!)
new 는 인스턴스 생성을 담당하고,
생성자는 인스턴스 변수들을 초기화 한다.
생성자는 메서드와 비슷한 구조를 가지고 있으나, 두 가지 차이점이 존재한다.
- 생성자의 이름른 반드시 클래스의 이름과 같아야 한다.
- 생성자는 리턴타입이 없다. (리턴타입 자체가 없음)
작성 예시
클래스명(매개변수) { // 생성자 기본 구조
//생성자 내의 내용
}
쉽게 말하면 생성자는 객체를 찍어낼 때 같이 나오는 녀석인데, 이녀석은 인스턴스 변수를 초기화 하는 것이다.
"초기화" 라는 말이 적절 한게, 이 상생자는 객체가 생성될때 처음에 튀어나오는 놈이므로, 마치 "일단 한번 실행되는 메소드"와 비슷하게 움직인다.
객체를 하나 만들게 되면 생성자의 내용이 실행된다 이거다.(변수를 정해진 값으로 세팅하든, println함수로 출력을 내든, 객체가 생성되는 순간 이 동작을 한다. 만약 println("응애!")을 생성자의 내용으로 써놓으면, 객체가 생성될 때 출력으로 응애! 가 나온다. (객체 탄생))
생성자도 메서드 처럼 오버로딩이 가능하기 때문에 객체를 생성할 때 넣어준 변수에 따라 다르게 생성 가능하다.
오버로딩 예시
public class sengsungEX {
public static void main(String[] args) {
Sengsung sengsung1 = new Sengsung();
Sengsung sengsung2 = new Sengsung("chicken");
Sengsung sengsung3 = new Sengsung(5,10);
}
}
class Sengsung {
Sengsung() { // (1) 생성자 오버로딩
System.out.println("1번 생성자");
}
Sengsung(String str) { // (2)
System.out.println("2번 생성자");
}
Sengsung(int a, int b) { // (3)
System.out.println("3번 생성자");
}
}
//출력
1번 생성자
2번 생성자
3번 생성자
위의 코드에서 아무 변수를 넣지 않은 sensung1을 생성 할 때, 오버로딩 된 생성자 중 변수가 들어있지 않은 메서드를 실행하게 되어 생성자 안의 System.out.println("1번 생성자"); 를 실행하게 된다. (1번 생성자 출력)
아래의 sensung2 , sensung3 생성자도 마찬가지로, 생성 할 때 넣은 변수에 따라 오버라이딩 된 생성자를 실행한다.
기본 생성자
기본 생성자는 매개변수 없이 생성되는 생성자를 의미한다.
위의 코드를 예시로 들면, 오버로딩된 1번 생성자와 같다.
작성예시
클래스명(){} //기본 생성자
chicken(){} // 예시) chicken 클래스의 기본 생성자
"기본" 생성자라고 했는데, 객체를 시용하기 위해서는 항상 있어야 하는것 아닌가? 라고 생각할 수 있는데, 클래스 내에 생성자를 선언 안한 상태로 컴파일 하면, 컴파일러가 알아서 잘 만들어 주기 때문에 상관없다.
매개변수가 있는 생성자
매개변수가 있는 생성자는 메서드처럼 매개변수를 통해 호출된다.
이 때, 생성되는 인스턴스 변수는 매개변수로 초기화가 된다.
오버로딩 예시의 sensung2, sensung3 생성자가 배개변수가 있는 생성자이며, 해당 매개변수 (str, a, b)를 이용한 변수가 있다면 객체를 선언할 때 넣은 (chicken, 5, 10)가 초기값으로 주어지게 된다.
작성예시
클래스명(매개변수){} //기본 생성자
chicken(int A, int B){
System.out.println("치킨%d 마리의 가격은 %d이다.", A, B);
} // 예시) chicken 클래스의 기본 생성자
//출력
치킨A 마리의 가격은 B이다.
위의 코드처럼, 매개변수를 넣어 해당 생성자에서의 변수를 초기화 한다. (A, B는 int현이지만 예를들기 위해 그냥 A, B로 썻다.)
'백엔드 > JAVA_이론공부' 카테고리의 다른 글
JAVA_내부 클래스 (0) | 2022.09.18 |
---|---|
JAVA_this(), this (0) | 2022.09.18 |
JAVA_메서드 오버로딩(overloading) (1) | 2022.09.04 |
JAVA_필드와 메서드 (0) | 2022.09.04 |
JAVA_클래스와 객체 (0) | 2022.09.04 |