기본 생성자
- 클래스에 생성자 선언이 없으면 컴파일러는 기본 생성자를 바이트코드 파일에 자동으로 추가
출처, 이것이 자바다
생성자 선언
- 객체를 다양하게 초기화하기 위해 생성자를 직접 선언할 수 있음
출처, 이것이 자바다
- 생성자는 메소드와 비슷한 모양을 가지고 있으나, 리턴 타입이 없고 클래스 이름과 동일
- 매개변수의 타입은 매개값의 종류에 맞게 작성
package ch06.sec07.exam01;
/*
* 생성자 : 힙영역의 생성된 기억장소의 필드에 기본값을 저장목적.
* 클래스에 기본생성자가 존재하지 않으면, 컴파일과정에서 자동으로 생성해준다.
* 생성자를 수동으로 정의를 하면, 컴파일과정에서 기본생성자는 생성하지 않는다.
*/
public class Car {
String model;
String color;
int maxSpeed;
//생성자 선언
//Car() {}
Car(String model, String color, int maxSpeed) {
}
//일반메소드
public int aaa() {
return 0;
}
}
ackage ch06.sec07.exam01;
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car("그랜져", "검정", 250);
//기본생성자 호출 못함 Car클래스에 수동으로 다른 생성자가 존재하면 기본생성자 생성되지않기때문
//Car myCar = new Car();
}
}
필드 초기화
- 객체마다 동일한 값을 갖고 있다면 필드 선언 시 초기값을 대입하는 것이 좋고, 객체마다 다른 값을 가져야 한다면 생성자에서 필드를 초기화하는 것이 좋음
출처, 이것이 자바다
package ch06.sec07.exam02;
public class Korean {
//필드선언
String nation = "대한민국";
String name;
//String gender = "남자";
String ssn;
//생성자 선언 : 컴파일과정에서 기본생성자는 자동생성 안됨
public Korean(String n, String s) {
name = n;
ssn = s;
}
}
package ch06.sec07.exam02;
public class KoreanExample {
public static void main(String[] args) {
//생성자를 이용하여 힙영역의 필드에서 값을 초기화.
Korean k1 = new Korean("홍길동", "123456-1234567");
//필드를 접근하는 형태
// k1.name = "홍길동";
// k1.ssn = "123456-1234567";
System.out.println("k1.nation: " + k1.nation);
System.out.println("k1.name: " + k1.name);
System.out.println("k1.ssn: " + k1.ssn);
System.out.println();
Korean k2 = new Korean("김자바", "234567-2345678");
System.out.println("k2.nation: " + k2.nation);
System.out.println("k2.name: " + k2.name);
System.out.println("k2.ssn: " + k2.ssn);
System.out.println();
k2.name = "김스프링";
System.out.println("k2.nation: " + k2.nation);
System.out.println("k2.name: " + k2.name);
System.out.println("k2.ssn: " + k2.ssn);
}
}
package ch06.sec07.exam03;
public class Korean {
//필드선언
String nation = "대한민국";
String name;
// String gender = "남자";
String ssn;
//생성자 선언 : 컴파일과정에서 기본생성자는 자동생성 안됨
public Korean(String name, String ssn) {
this.name = name;
this.ssn = ssn;
}
}
생성자 오버로딩
- 매개변수를 달리하는 생성자를 여러 개 선언하는 것
출처, 이것이 자바다
- 매개변수의 타입, 개수, 선언된 순서가 똑같을 경우 매개변수 이름만 바꾸는 것은 생성자 오버로딩이 아님
- 생성자가 오버로딩되어 있을 경우, new 연산자로 생성자를 호출할 때 제공되는 매개값의 타입과 수에 따라 실행될 생성자가 결정
package ch06.sec07.exam04;
public class Car {
//필드선언
String company = "현대자동차";
String model; //null
String color; //null
int maxSpeed; //0
//생성자 : 힙영역에 생성된 필드의 초기값 할당.
//생성자 선언
Car() {} //기본 생성자
//model필드에 값을 대입하는 생성자
Car(String model) {
this.model = model;
}
//생성자 오버로딩 : 생성자를 선언시 매개변수의 타입과 개수, 순서가 같은 것은 만들수 없다.
// Car(String color) {
// this.color = color;
// }
Car(String model, String color) {
this.model = model;
this.color = color;
}
Car(String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
package ch06.sec07.exam04;
public class CarExample {
public static void main(String[] args) {
//객체생성시 필드에 기본값을 생성자를 통하여 사용하는 방법.
//객체선언및 생성
Car car1 = new Car();
System.out.println("car1.company: " + car1.company);
System.out.println();
Car car2 = new Car("자가용");
System.out.println("car2.company: " + car2.company);
System.out.println("car2.model: " + car2.model);
System.out.println();
//car3 "자가용", "빨강"
Car car3 = new Car("자가용", "빨강");
System.out.println("car3.company: " + car3.company);
System.out.println("car3.model: " + car3.model);
System.out.println("car3.color: " + car3.color);
System.out.println();
//car4 "택시", "검정", 200
Car car4 = new Car("택시", "검정", 200);
System.out.println("car4.company: " + car4.company);
System.out.println("car4.model: " + car4.model);
System.out.println("car4.color: " + car4.color);
System.out.println("car4.maxSpeed: " + car4.maxSpeed);
System.out.println();
}
}
다른 생성자 호출
- 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있음
- 이 경우 공통 코드를 한 생성자에만 집중적으로 작성하고, 나머지 생성자는 this (...)를 사용해 공통 코드를 가진 생성자를 호출
출처, 이것이 자바다
package ch06.sec07.exam05;
public class Car {
//필드선언
String company = "현대자동차";
String model; //null
String color; //null
int maxSpeed; //0
//생성자 : 힙영역에 생성된 필드의 초기값 할당.
//다른 생성자 호출 : this(매개변수와 개수와 타입은 일치)
//생성자 선언
Car() {} //기본 생성자
//model필드에 값을 대입하는 생성자
Car(String model) {
// this.model = model;
this(model, null, 0);
}
Car(String model, String color) {
// this.model = model;
// this.color = color;
this(model, color, 0);
}
Car(String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
package ch06.sec07.exam05;
public class CarExample {
public static void main(String[] args) {
//객체생성시 필드에 기본값을 생성자를 통하여 사용하는 방법.
//객체선언및 생성
Car car1 = new Car();
System.out.println("car1.company: " + car1.company);
System.out.println();
Car car2 = new Car("자가용");
System.out.println("car2.company: " + car2.company);
System.out.println("car2.model: " + car2.model);
System.out.println();
//car3 "자가용", "빨강"
Car car3 = new Car("자가용", "빨강");
System.out.println("car3.company: " + car3.company);
System.out.println("car3.model: " + car3.model);
System.out.println("car3.color: " + car3.color);
System.out.println();
//car4 "택시", "검정", 200
Car car4 = new Car("택시", "검정", 200);
System.out.println("car4.company: " + car4.company);
System.out.println("car4.model: " + car4.model);
System.out.println("car4.color: " + car4.color);
System.out.println("car4.maxSpeed: " + car4.maxSpeed);
System.out.println();
}
}
'객체 지향 프로그래밍 - 클래스' 카테고리의 다른 글
인스턴스 멤버 (0) | 2023.01.16 |
---|---|
메소드 선언과 호출 (0) | 2023.01.16 |
필드 선언과 사용 (0) | 2023.01.16 |
객체와 클래스, 클래스 선언, 객체 생성과 클래스 변수, 클래스의 구성 멤버 (0) | 2023.01.16 |
객체 지향 프로그래밍 (0) | 2023.01.16 |