생성자 (Constructor)
new연산자에 의해 호출되어 객체의 초기화를 담당한다
new 클래스();
필드의 값을 설정하거나,
메소드를 호출해서 객체를 사용할 수 있도록 준비하는 역할을 수행
- 이름이 클래스이름과 같아야한다.
- 리턴값이 없다.(void 안붙임) = 항상 반환값이 없으니까 void를 안붙임! 이것은 규칙
- 모든 클래스는 반드시 생성자를 가져야 한다.
기본생성자 (default constructor)
모든 클래스는 생성자가 반드시 존재하며 하나 이상을 가질 수 있다.
생성자가 하나도 없을 때만, 컴파일러가 기본 생성자 자동추가
Car myCar = new Car();
//소스파일 우리가 보는 파일
public class Car{
}
//바이트코드파일
public class Car{
public Car() // 자동추가
}
생성자 선언
매개변수는 new연산자로 생성자를 호출할 때 외부의 값을 생성자 블록 내부로 전달하는 역할을 한다.
예를 들어 다음과 같이 Car 생성자를 호출할때 세개의 값을 제공한다고 보면
Car myCar = new Car("그랜저", "검정", "300");
두개의 매개값은 String 타입이고 마지막 매개값은 int 타입인 것을 볼 수 있다.
세 매개 값을 생성자가 받기 위해서는 다음과 같이 생성자를 선언해야 한다.
public class Car {
//생성자
Car(String model, String color, int maxSpeed){
...}
}
클래스에서 생성자가 명시적으로 선언되어 있을 경우
반드시 선언된 생성자를 호출해서 객체를 생성 해야만 한다.
//생성자 선언
public class Car {
//생성자
Car(String color, int cc) {
}
}
//생성자를 호출해서 객체 생성
public class CarExample {
public static void main(String[] args){
Car myCar = new Car("검정", 3000)};
//Car myCar = new Car()' <---기본생성자를 호출할 수 없다.
}
}
생성자 호출하는 이유↓
//객체생성
Time t = new Time();
t.hour = 12;
t.minute = 34;
t.second = 56;
//생성자호출
Time t = new Time(12,34,56);
//둘 다 초기화라는 것은 같지만 아래 코드가 더 간결하죠?
필드 초기화
초기값 없이 선언된 필드는 객체가 생성 될 때 기본값으로 자동 설정된다.
다른 값으로 필드를 초기화 하는 방법
- 필드를 선언 할 때 초기값을 설정
- 생성자의 매개값으로 초기값을 설정
아래와 같이 Korean 클래스에 nation 필드를 선언하면서 "대한민국"으로 초기값을 준 경우,
Korean 클래스로 부터 k1과 k2 객체를 생성하면 두개의 객체의 nation 필드에는 모두 "대한민국"이 저장되어있다.
public class Korean{
String nation = "대한민국";
//필드를 선언할때 초기값을 설정
String name;
String ssn;
//객체가 선언할때 초기값을 주지않음
//객체가 생성이 될때 기본적으로 null값으로 설정된다
//null 값으로 하고 싶지않다면, 아래 처럼 생성자 생성
//생성자 //매개변수선언 new에 있는 값이 저장된다
public Korean(String n, String s){
name = n;
ssn = s;
//매개값으로 초기화 설정
}
}
↑ 아래값이 위 String n, String s에 전달되어 name과 ssn에 대입된다.
Korean k1 = new Korean("박자바", "010123-12345");
//박자바는 String n으로 전달 name에저장 // 번호는 String s 로 전달 ssn에 저장
Korean k2 = new Korean("김자바", "930525-0654321");
public class KoreanExample {
public static void main(String[] args){
Korean k1= new Korean("박자바", "0111225-11234567");
System.out.println("k1.name :" + k1.name);
System.out.println("k1.ssn :" + k1.ssn);
//외부에서 객체의 필드에 값을 읽기 위해선 참조 변수를 통해서 읽어야 한다.
Koraen k2= new Korean("김자바", "930525-0654321");
System.out.println("k2.name :" + k2.name);
System.out.println("k2.ssn :" + k2.ssn);
}
}
생성자 this()
생성자에서 다른생성자 호출할 때 사용
다른생성자 호출시 첫줄에서만 사용가능
class Car2 {
String color;
String gearType;
int door;
car2() {
this("white", "auto", 4);
}
//맨 아래에있는 car2생성자 호출
car2(String color) {
this(color, "auto", 4);
}
//맨 아래에있는 car2생성자 호출
car2(String color, String gearType, int door){
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
- 같은클래스안에있는 생성자를 호출할때 this를 사용 = 규칙!
생성자의 매개변수와 필드명이 동일할 경우 this.
this는 필드값을 가르킨다.
관례적으로 매개변수의 필드값으로 설정할 경우 매개변수와 필드명을 동일하게 해준다.
생성자 내부에서는 매개변수가 우선 순위를 갖는다
*예를 들어 this를 쓰지않았을때, name = name 해버리면 매개변수가 우선순위를 갖기때문에 매개변수를 뜻하게 된다.
필드임을 명시하기 위해 this.필드명 을 사용한다.
- this는 객체 자신의 참조로서 자신의 번지를 가지고 있다.
- 우리가 우리자신을 "나"라고 하듯이 객체가 객체 자신을 this라고 한다.
//매개변수 //외부에서 받는다
public Korean(String name, String ssn){
this.name = name;
//필드 매개변수
this.ssn = ssn;
//필드 매개변수
}
출처 : 이것이자바다
'STUDY > JAVA' 카테고리의 다른 글
[JAVA] 22-06-28 for문 이용해서 별 찍기 ☑ (0) | 2022.06.21 |
---|---|
[JAVA] 22-06-21 Getter와 Setter / 싱글톤 ☑ (0) | 2022.06.21 |
[JAVA] 22-06-17 Package ☑ (0) | 2022.06.17 |
[JAVA] 22-06-17 클래스 (CLASS) ☑ (0) | 2022.06.17 |
[JAVA] vscode 상위하위 packaging 만들기 (0) | 2022.06.17 |