생성자
- new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당
- 모든 클래스는 생성자가 반드시 존재하며, 생성자를 하나 이상 가질 수 있다.
객체 초기화
- 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것
- 생성자를 실행하지 않고는 클래스로부터 객체를 만들 수 없다.
기본 생성자
우리가 클래스 내부에 생성자 선언을 생략했다면 컴파일러는 다음과 같이 중괄호 {} 블록 내용이 비어 있는 기본 생성자를 바이트 코드에 자동 추가
[public] 클래스() {}
예를 들어 Car 클래스를 설계할 때 생성자를 생략하면 기본 생성자가 다음과 같이 생성한다.
그렇기 때문에 클래스에 생성자를 선언하지 않아도 다음과 같이 new 연산자 뒤에 기본 생성자를 호출해서 객체를 생성할 수 있습니다.
Car myCar = new Car();
생성자 선언
기본 생성자 대신 우리가 생성자를 명시적으로 선언하려면 다음과 같은 형태로 작성
클래스(매개변수선언, ...) {
//객체의 초기화 코드
}
// 세 매개값을 생성자가 받기 위해서는 다음과 같이 매개 변수를 선언
public class Car {
//생성자
Car(String model, String color, int maxSpeed) { ••• }
}
// Car 생성자를 호출할 때 3개의 매개값을 제공한다고 가정
public class CarExample {
public static void maingtring후] args) {
Car my Car = new Car("그랜저", "검정", 300);
// Car my Car = new Car(); (x) 기본 생성자를 호출할 수 없음
}
}
필드 초기화
- 클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정
- 다른 값으로 초기화하는 방법
1. 필드를 선언할 때 초기값을 주는 방법
- 동일한 클래스로부터 생성되는 객체들은 모두 같은 값을 갖게 된다.
public class Korean {
String nation = "대한민국";
String name;
String ssn;
}
Korean kl = new Korean();
Korean k2 = new Korean();
// Korean 클래스로부터 kl과 k2 객체를 생성하면 kl과 k2 객체의 nation 필드에는 모두 “대한민국”이 저장
2. 생성자에서 초기값을 주는 방법
- 객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화할 때 사용
public class Korean {
//필드
String nation = "대한민국";
String name;
String ssn;
//생성자
public Korean(String n, String s) {
name = n;
ssn = s;
}
}
Korean kl = new Korean("박자바", "011225-1234567");
Korean k2 = new Korean("김자바", "930525-0654321");
// 매개 변수 n(이름), s(주민번호)를 통해 전달되어 name 필드와 ssn필드의 초기값으로 사용
- 일반적으로 통상적으로 필드와 동일한 이름을 갖는 매개 변수를 사용하는데, 이 경우 필드 앞에 'this.'를 붙이면 된다.
- this는 객체 자신의 참조인데, 우리가 우리 자신을 ‘나’라고 하듯이 객체가 객체 자신을 this라고 한다.
- ‘this.필드’는 this라는 참조 변수로 필드를 사용하는 것과 동일
public Korean(String name, String ssn) {
this.name = name;
this.ssn = ssm;
}
생성자 오버로딩
매개 변수를 달리하는 생성자를 여러 개 선언하는 것
다른 생성자 호출 : this()
- 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법
- this()는 자신의 다른 생성자를 호출하는 코드로 반드시 생성자의 첫 줄에서만 허용
- this() 다음에는 추가적인 실행문들이 올 수 있다. 이 말은 호출되는 생성자의 실행이 끝나면 원래 생성자로 돌아와서 다음 실행문을 진행한다는 뜻
확인 문제
1. 생성자에 대한 설명으로 맞는 것에 O표, 틀린 것에 X표 하세요.
① 객체를 생성하려면 생성자 호출이 반드시 필요한 것은 아니다.( X )
-> 모든 클래스는 생성자가 반드시 존재하며, 생성자를 하나 이상 가질 수 있다.
② 생성자는 다른 생성자를 호출하기 위해 this()를 사용할 수 있다. ( O )
③ 생성자가 선언되지 않으면 컴파일러가 기본 생성자를 추가한다. ( O )
④ 매개 변수의 수, 타입, 순서가 다른 생성자를 여러 개 선언할 수 있다. ( O )
2. 다음과 같이 Member 객체를 생성하고 싶습니다. 생성자에서 name 필드와 id 필드를 외부에서 받은 값으로 초기화할 수 있도록 Member 클래스를 작성해보세요.
package ch6.test;
public class Member {
String name;
String id;
String password;
int age;
Member(String name, String id) { // 생성자에서 초기값을 주는 방법
this.name = name;
this.id = id;
}
}
3. Board 클래스의 생성자가 다음과 같이 오버로딩되어 있습니다. 생성자마다 중복 코딩된 부 분이 있습니다. this()를 활용해서 중복 코드를 제거 해보세요.
package ch6.test;
public class Board {
String title;
String content;
String writer;
String date;
int hitcount;
Board(String title, String content) {
this(title, content, "로그인한 회원아이디", "현재 컴퓨터 날짜", 0);
}
Board(String title, String content, String writer) {
this(title, content, writer, "현재 컴퓨터 날짜", 0);
}
Board(String title, String content, String writer, String date) {
this(title, content, writer, date, 0);
}
Board(String title, String content, String writer, String date, int hitcount) {
this.title = title;
this.content = content;
this.writer = writer;
this.date = date;
this.hitcount = hitcount;
}
}
4. Board 클래스가 위와 같이 선언되어 있을 경우 Board 객체를 생성하는 네 가지 방법을 모두 기술해보세요.
Board board = new Board("제목", "내용");
Board board = new Board("제목", "내용", "홍길동");
Board board = new Board("제목", "내용", "홍길동", "2025-12-31");
Board board = new Board("제목", "내용", "홍길동", "2025-12-31", 0);
'JAVA' 카테고리의 다른 글
인스턴스 멤버와 정적 멤버 (0) | 2022.10.13 |
---|---|
메소드 (0) | 2022.10.13 |
열거 타입 (0) | 2022.09.26 |
배열 (0) | 2022.09.26 |
참조 타입 (1) | 2022.09.26 |