[자바/JAVA] 생성자 (Contructor)

박정현·2023년 9월 2일
0

🏠자바의 기초완성

목록 보기
18/23

1. 생성자란?

생성자는 new연산자를 통해서 인스턴스를 생성할 때 반드시 호출되고 제일 먼저 실행되는 일종의 void 타입 메소드이다. 생성자는 인스턴스 변수를 초기화 시키는 역할을 담당한다.


2. 생성자 선언

생성자는 일종의 void 타입의 메소드라고 했다. 따라서 메소드를 선언하는 방식과 비슷하다.

  • public: 생성자를 선언할 때는 public을 사용한다. 다른 곳에서 객체를 사용할 때 생성자를 사용하므로 외부에서도 접근이 가능해야 하므로 public을 사용하는 것이다. 생략이 가능하다.
  • 클래스: 생성자명이다. 생성자명은 생성자를 정의하는 클래스 이름과 동일하게 작성해야 한다.
  • 매개변수: 매개변수에 아무것도 적지 않으면 기본생성자이고, 매개변수를 여러 개 작성할 수도 있다.

3. 생성자의 특징

① 클래스와 이름이 같은 메소드이다.

생성자명은 생성자를 정의하는 클래스명과 동일하게 작성해야 한다.

② 반환타입이 void이다.

반환타입이 무조건 void이기 때문에 생략이 가능한 것이다.

③ 기본생성자는 컴파일러가 자동으로 생성해준다.

앞서 메소드를 호출할 때 먼저 new 연산자로 객체를 생성한 후에 해당 객체에 있는 메소드를 사용할 수 있었다. 객체를 생성할 때 사실은 기본생성자를 호출하여 객체를 초기화한 것이다.

😯 기본생성자를 만들지 않았었는데?

기본생성자는 따로 개발자가 작성하지 않아도 컴파일러가 자동으로 생성해주기 때문에 생성자 호출이 가능했던 것이다.

④ 다른 생성자를 생성할 때는 기본생성자가 자동으로 생성되지 않는다.

매개변수가 없는 기본생성자 이외의 다른 생성자를 생성할 때는 기본생성자가 생성되지 않는다. 다른 생성자를 만들고 기본생성자도 같이 사용하려면 기본생성자를 직접 작성해주어야 한다.

이 경우 기본생성자와 다른 생성자는 오버로딩 관계이다. 매개변수의 타입과 개수가 다르면 같은 이름의 메소드를 사용할 수 있는 것을 오버로딩이라고 했었다. 생성자도 메소드이고 같은 메소드명을 사용하면서 매개변수가 다르기 때문에 오버로딩이라 할 수 있다.

public class Student{
	// 필드
	String name;
	int age;

	public Student(){ }// 1)기본생성자
	
	public Student(String name, int age){ // 2)매개변수를 가진 생성자
		this.name = name;
		this.age = age;
	}

	public void test(){ //3) 실행메소드
		System.out.print("학생이름: " + name);
		System.out.print(", 학생나이: " + age);
	}
}
public static void main(String[] args) {
	Student s1 = new Student(); // 4)객체생성 -> 기본생성자 호출
	Student s2 = new Student("김사과", 20); // 5) 객체생성 -> 매개변수를 가진 생성자 호출 

	s1.test(); // 6)
	s2.test(); // 7)
}

1) 기본생성자. 매개변수를 가진 생성자를 만들면 기본생성자가 자동으로 생성되지 않기 때문에 직접 작성해준다.

2) 매개변수를 가진 생성자.

1) 과 2)는 생성자 오버로딩 관계이다.

3) 변수를 출력하는 실행메소드이다.

4) 메인메소드에서 기본생성자를 호출하여 객체를 생성해주었다.

5) 메인메소드에서 매개변수를 가진 생성자를 호출하여 객체를 생성해주었다. 매개변수 타입과 수에 맞게 값을 넣어야 한다.

6) [결과] 학생이름: null, 학생나이: 0

7) [결과] 학생이름: 김자바, 학생나이: 20


4. 생성자의 필드 초기화

변수를 필드에서 초기화하지 않고 생성자에서 변수를 초기화 할 수 있다. 국적이나 성별 등과 같은 경우는 하나의 값으로 고정할 수도 있지만 이름, 나이, 주민번호와 같은 경우는 사람마다 다르기 때문에 생성자에서 초기화해야 한다.

생성자에서 값을 넣으면 필드의 변수가 초기화될 수 있다. 매개변수의 이름은 필드이름과 유사하거나 동일하게 사용할 것을 권장한다. 필드와 매개변수이름이 완전히 동일한 경우는 “this.”을 통해 필드를 표현한다.

this?

this는 객체 자신을 가리키는 참조변수이다. 자신의 객체에 접근할 때 사용한다. 주로 멤버변수와 매개변수의 이름이 동일할 때, 이를 구분하기 위해 사용된다. “this.”이 붙은 변수가 필드이다.

↪️ 위의 예제를 다시 살펴보자.

public class Student{
	// 필드
	String name;
	int age;

	public Student(){ 
	
	public Student(String name, int age){ // 2)매개변수를 가진 생성자
		this.name = name; //1)
		this.age = age; //2)
	}

	public void test(){ 
		System.out.print("학생이름: " + name);
		System.out.print(", 학생나이: " + age);
	}
}

1)과 2)는 필드의 멤버변수 name과 age를 가리키는 것을 알 수 있다.

profile
개발을 개발괴발하지 않기 위한 노력

0개의 댓글