*모든 클래스는 하나 이상의 생성자를 가지고 있고 클래스 안에 직접 명시하지 않은 경우 자바 컴파일러에서 자동으로 기본 생성자를 추가한다.
public class CarTest {
public static void main(String[] args) {
Car car = new Car();
car.run();
}
}
class Car{
//필드
public String model;
public String color;
//생성자
//메서드
void run(){
System.out.println("gbargain runs!");
}
}
필드와 메서드만 정의하고 생성자를 정의하지 않았다. 이 경우 main 메서드에서 new 연산자를 통해 객체를 생성할 때 자동으로 기본 생성자를 추가한 것이다!
생성자
객체를 생성하는 역할을 하는 클래스의 구성요소이다.
인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드라고 이해한다.
즉, main 클래스에서 new 연산자로 클래스의 인스턴스를 생성할 때, 생성자가 인스턴스 변수들을 초기화한다.
!!!) 생성자의 이름은 반드시 클래스의 이름과 같아야 하고, 일반 메서드와 달리 리턴 타입이 아예 없다. (void X 없어요 그냥 없어요)
기본 생성자
코드를 작성할 때 클래스 안에 생성자를 만들어주지 않은 경우, 기본 생성자가 자동으로 추가된다.
기본 생성자는 매개변수를 가지지 않는다.
public class CarTest {
public static void main(String[] args) {
Car car = new Car();
car.run();
}
}
class Car{
//필드
public String model;
public String color;
//기본 생성자
Car(){
System.out.println("기본 생성자!");
}
//메서드
void run(){
System.out.println("gbargain runs!");
}
}
이 경우 메인 메서드에서 new 연산자를 통해 인스턴스를 생성할 때, Car 클래스에서 작성된 기본 생성자를 호출한다. 따라서 출력으로는 기본 생성자 안에 작성한 출력문+run 메서드 출력문이 같이 출력되어
기본 생성자!
gbargain runs!
가 나오게 되는 흐름이다!
매개 변수가 있는 생성자
생성자도 매개값을 받는 것이 가능하다. 매개변수가 있는 생성자는 메서드처럼 매개변수를 통해 호출될 때, 매개값으로 인스턴스를 초기화한다.
매개변수를 가진 생성자는 고유한 특성을 가진 인스턴스를 계속 만들어야 하는 경우 인스턴스마다 각기 다른 값을 가지고 초기화할 수 있어 유용하다. 만약, 벤츠라는 회사의 자동차 모델명과 자동차 색깔을 입력받아 인스턴스를 생성하고 싶은 경우 벤츠는 고유한 특성으로 바뀔 필요가 없다.
public class CarTest {
public static void main(String[] args) {
Car car = new Car();
Car car1 = new Car("gbargain", "red");
Car car2 = new Car ("sclass", "black");
}
}
class Car{
public String company = "benz";
public String model;
public String color;
//기본 생성자
Car(){
System.out.println("기본 생성자!");
}
//매개변수가 있는 생성자
Car(String model, String color){
this.company = company;
this.model = model;
this.color = color;
System.out.println(this.company + "-" + this.model + "-" + this.color);
}
}
기본 생성자!
benz-gbargain-red
benz-sclass-black
이 경우, model과 color를 매개변수로 입력받아 인스턴스에 입력된 company와 함께 출력한다.
this() 메서드
생성자끼리는 상호 호출이 가능하다. 이때 사용하는 것이 this 메서드이다.
public class Test {
public static void main(String[] args) {
Example example1 = new Example();
System.out.println(); //개행을 위해 사용했다
Example example2 = new Example(4);
System.out.println();
Example example3 = new Example("hi");
}
}
class Example {
public Example(){
System.out.println("기본 생성자입니다");
}
public Example(int x){
this(); //기본 생성자를 호출한다
System.out.println(x + "을(를) 받았어요!");
}
public Example(String str){
this(6); //매개변수로 int를 받는 생성자를 호출한다
System.out.println(str + "을(를) 받았어요!");
}
}
1. main 메서드에서는 변수 example1,2,3으로 생성자마다 인스턴스를 생성해주었다.
2-1. 기본 생성자 호출 시에는 "기본 생성자입니다"를 출력하록한다.
2-2. 매개값으로 int 타입을 받은 경우, 먼저 기본 생성자를 호출하고 입력받은 수 "x을(를) 받았어요!"를 출력하도록 한다.
2-3. 매개값으로 String 타입을 받은 경우, 먼저 int를 매개변수로 받는 생성자를 호출하고 입력받은 문자열 "str을(를) 받았어요!"를 출력하도록 한다.
출력
기본 생성자입니다
기본 생성자입니다
4을(를) 받았어요!
기본 생성자입니다
6을(를) 받았어요!
hi을(를) 받았어요!
이런 식으로 생성자를 연쇄해서 사용하는 것이 가능하다!
***이때 this() 사용 시 주의할 점은
1. 생성자 내부에서만 사용할 수 있다.
2. 반드시 생성자의 첫 줄에 위치해야 한다.
는 것이다. +)생성자의 첫 줄에만 위치해야 한다는 말은 즉 생성자를 한 개 이상 호출할 수 없다는 것이다.
this
class Car{
public String company = "benz";
public String model;
public String color;
//생성자
Car(String model, String color){
this.company = company;
this.model = model;
this.color = color;
System.out.println(this.company + "-" + this.model + "-" + this.color);
}
}
위의 코드 중, 생성자 블록 안에서 this. 를 쓴 것을 볼 수 있다. .(dot) 연산자는 메서드나 변수에 접근할 때 사용된다. 여기서는 클래스의 인스턴스 변수에 접근하기 위해 사용되었다. 일반적으로 자바에서 생성자의 매개값으로 받는 변수명을 필드명과 동일하게 사용하기 때문에 인스턴스 변수/생성자의 매개값을 구분하기 위해 사용된다.
this. 가 붙음으로써, this를 통해 인스턴스 자신의 변수에 접근할 수 있게 되고 생성자를 통해 입력받은 매개 변수를 필드에 대입하라는 것을 알 수 있다.
🐑 Daily 회고
1. 잠죽자
- 늙으면 잠이 줄어든다 그러던데..... 난 왜?
- 적어도 적어도 적어도 최소한 낮죽자 ㅠㅠㅠㅠ 제발 낮죽자
2. 이력서 특강 유익했다
- 오늘 자괴감 좀 많이 들었는데 특강 듣고 좀 정신 차릴 마음이 들었다. 3주차 들으면서 벌써 좀 지친 기분인데 특강으로 좀 환기가 됐다고 해야 하나 아무튼 앞으로 어떻게 공부하고, 어떤 것을 쌓아가야 할지 조금은 길이 잡히는 기분이라 좋았다.
- 일단을 할 수 있는 것부터 열심히 하자. 스터디도 지금 시작할까 싶다. 그치만 스터디를 하기엔 아직 개념이 부족하다. 개인적으로 개념 공부는 혼자 하는 게 훨씬 잘 맞는 타입인데 고민된다.......
- 정리한 건 날려먹기 전에 노션이나 원드라이브에 얼른 백업해두자.
총평 ⭐
오늘 같은 날이 다시 있어서는 안 된다. 낮죽자. 낮죽자. 낮죽자. 낮죽자. 낮죽자.
'diary > codestates (be39)' 카테고리의 다른 글
05/13/22 java/ 다형성과 추상화 (0) | 2022.05.14 |
---|---|
05/12/22 java/ 상속과 캡슐화 (0) | 2022.05.13 |
05/10/22 객체에 관해서~ (0) | 2022.05.11 |
05/09/22 Daily 회고 (0) | 2022.05.10 |
05/06/22 java 조건문과 반복문 후기 (0) | 2022.05.07 |