Java

[Java] 생성자

공대생안씨 2024. 7. 8. 20:26

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)

 

[Java] 메서드 오버로딩, 메서드 오버라이딩 (Method Overloading, Method Overriding)

1. 메서드 오버로딩 (Method Overloading)자바에서 같은 이름의 메서드를 여러개 정의하는 것을 오버로딩 (Overloading) 이라고 함즉, 이름이 같고 매개변수가 다른 메서드를 여러 개 정의하는 것을 의미 

blogan99.tistory.com

 

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. 생성자 코드의 가장 첫줄에서만 사용 가능함!