1. 생성자
1-1. 생성자는 왜 필요한가?
- 객체를 생성하고 나면 멤버 변수 값을 초기화 해야 함
- 생성자가 없다면? ⇒ 객체의 멤버 변수 초기화 과정을 반복해야 함
- (객체 지향 프로그래밍) 객체 생성 시점에 객체가 자기 자신의 데이터를 초기화하는 기능 ⇒ 생성자 통해서!
1-2. this
- "자기 자신 객체 (인스턴스) 의 참조"
public class Student {
String name;
int age;
int grade;
void initStudent(String name, int age, int grade) {
// this : 자기 자신 객체를 가리킴
this.name = name;
this.age = age;
this.grade = grade;
}
}
- 멤버 변수와 메서드의 매개변수 우선순위
- 매개변수 ⇒ 코드 블럭 상 내부에 위치
📌 우선순위
매개변수 > 멤버 변수
⇒ 따라서 멤버 변수에 접근하려면 멤버 변수 앞에 this. 을 붙여야 함!!
- this 생략
- 변수 찾을 때, 가까운 지역변수 (매개변수 또한 지역변수) > 멤버 변수 순으로 찾음
- 매개변수와 멤버 변수 이름이 다른 경우에는 this 생략 가능!
public class Student {
String name;
void initStudent(String nameInput) {
name = nameInput; // this. 생략 가능!
}
}
1-3. 생성자
- 객체를 생성하는 시점에 즉시 필요한 초기화를 실행
1-3-1. 생성자 규칙
- 1. 클래스 이름과 동일해야 함
- 2. 반환 타입 x
public class Student {
String name;
int age;
int grade;
// 생성자 선언 예시
Student(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
1-3-2. 생성자 호출
- new 생성자이름 (매개변수) ( = new 클래스이름 (매개변수) )
public class Main {
public static void main(String[] args) {
// 생성자 호출
Student student1 = new Student("학생1", 20, 90);
}
}
1-3-3. 생성자의 장점
- 중복 코드 제거 (객체 생성과 동시에 멤버 변수 초기화 가능)
- 필수값 입력 보장 가능
- 직접 정의한 생성자 존재하면 ⇒ 직접 정의한 생성자를 반드시 호출해야 함!
- 호출하지 않으면 컴파일 오류 발생
- 초기화 안 되어있는 경우는 절대 발생하지 x!
- 직접 정의한 생성자 존재하면 ⇒ 직접 정의한 생성자를 반드시 호출해야 함!
1-4. 기본 생성자
- 매개변수가 없는 생성자
public class Student {
String name;
int age;
int grade;
// 기본 생성자
public Student() {
}
}
- 직접 정의한 생성자가 존재하지 않으면 자바가 자동으로 기본 생성자 생성해줌!
- 직접 정의한 생성자가 하나라도 존재하면 기본 생성자를 자동으로 생성해주지 x!
📌 자동 생성된 기본 생성자는 클래스와 동일한 접근 제어자를 가짐!
public class Student {
String name;
int age;
int grade;
}
public class Main {
public static void main(String[] args) {
// (자동 생성된) 기본 생성자 호출
Student student1 = new Student();
}
}
1-5. 생성자 오버로딩과 this()
1-5-0. 메서드 오버로딩
2023.12.10 - [Java] - [Java] 메서드 오버로딩, 메서드 오버라이딩 (Method Overloading, Method Overriding)
1-5-1. 생성자 오버로딩
- 생성자 오버로딩도 메서드 오버로딩과 동일!
public class Student {
String name;
int age;
int grade;
// 이름만 초기화, 나머지는 기본값으로 초기화 하는 생성자
Student(String name) {
this.name = name;
this.age = 20;
this.grade = 50;
}
// 이름과 나이를 초기화, 나머지는 기본값으로 초기화 하는 생성자
Student(String name, int age) {
this.name = name;
this.age = age;
this.grade = 50;
}
// 이름, 나이, 등급 모두 초기화 하는 생성자
Student(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
1-5-2. this()
- 위의 생성자 오버로딩 예제 코드에서 중복 코드가 많음
- this() : 클래스 내부에서의 다른 생성자 호출 기능 ⇒ 중복 코드 줄임!
📌 this() : 자기 자신 클래스의 다른 생성자 호출
public class Student {
String name;
int age;
int grade;
// this() 사용 => 3번째 생성자 호출
Student(String name) {
this(name, 20, 50);
}
// this() 사용 => 3번째 생성자 호출
Student(String name, int age) {
this(name, age, 50);
}
// 이름, 나이, 등급 모두 초기화 하는 생성자
Student(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
1-5-3. this() 규칙
1. 생성자 안에서만 사용 가능함!
2. 생성자 코드의 가장 첫줄에서만 사용 가능함!
'Java' 카테고리의 다른 글
[Java] 객체 지향 프로그래밍 - 캡슐화 (Encapsulation) (0) | 2024.07.08 |
---|---|
[Java] 접근 제어자 (Access Modifier) (0) | 2024.07.08 |
[Java] 객체 지향 프로그래밍 (Object-Oriented Programming, OOP) (0) | 2024.07.08 |
[Java] 기본형과 참조형 (0) | 2024.07.08 |
[Java] 클래스 (0) | 2024.07.08 |