프로그래밍 언어/JAVA

[JAVA] 자바의 생성자 Constructor

Rateye 2021. 1. 18. 14:26
728x90
반응형

생성자 Constructor

  • 객체를 생성할 때 new 연산자 뒤에 붙어서 호출되며, 객체 초기화를 담당하는 메서드의 일종
  • 객체 생성 시 단 한 번만 호출 가능(임의로 호출 불가능)
  • 메서드와 다른 점
    1. 생성자의 이름은 반드시 클래스명과 동일해야한다
    2. 리턴타입을 기술하지 않는다 (void 도 사용하지 않음)
  • 클래스 정의 시 생성자를 하나도 정의하지 않을 경우 컴파일러에 의해 기본 생성자 Default Constructor가 자동으로 생성됨 매개변수가 없고, 중괄호 블록 내에 코드가 없는 빈 생성자

생성자 정의 기본 문법

[접근제한자] 클래스명([매개변수...]) {
 		// 생성자 호출(객체 생성) 시 수행할 코드들...
 }

기본 생성자 형태

public 클래스명() {}

 

/*
 * Person 클래스 정의
 * 멤버변수 : 이름(name, 문자열), 나이(age, 정수)
 */
class Person {
	// 생성자가 하나도 정의되지 않은 클래스는 컴파일러에 의해
	// 기본 생성자가 자동으로 생성됨
	
	// public Person() {}
	// => 컴파일러에 의해 생성될 기본 생성자
	
	String name;
	int age;
}
// 파라미터가 없는 기본 생성자 정의
class DefaultPerson {
	String name;
	int age;
	
	// 매개변수가 없는 기본 생성자와 동일한 형태의 생성자를 정의
	// => 출력문을 사용하여 메세지 출력
	public DefaultPerson() {
		// DefaultPerson 클래스의 인스턴스가 호출될 때
		// 생성자가 호출되며, 내부의 코드가 실행됨
		System.out.println("DefaultPerson() 생성자 호출됨!");
		
		// 생성자에서는 주로 멤버변수의 초기화나 다른 메서드의 호출을 통해
		// 객체가 실행될 때 수행할 초기 작업을 수행하는 내용이 기술됨
		name = "홍길동";
		age = 20;
	}
	
}
// 파라미터가 1개 이상인 파라미터 생성자 정의
class ParameterPerson {
	String name;
	int age;
	
	// 일반 메서드와 동일하게 생성자에 전달할 데이터가 있을 경우
	// 생성자 정의 시 파라미터 부분에 매개변수를 선언할 수 있다!
	// 이름(newName)과 나이(newAge)를 전달받는 파라미터 생성자 정의
	// => "ParameterPerson(String, int) 생성자 호출됨" 출력 후
	//    이름과 나이를 멤버변수에 저장
	public ParameterPerson(String newName, int newAge) {
		System.out.println("ParameterPerson(String, int) 생성자 호출됨!");
		// 생성자 호출 시 전달받는 데이터를 사용하여 멤버변수 초기화
		name = newName;
		age = newAge;
	}
	// => 파라미터 생성자를 하나라도 정의하게 되면
	//    기본 생성자는 더 이상 자동으로 생성되지 않는다!
	
}
		// Person 클래스 인스턴스 생성
		// 이름 : "홍길동", 나이 : 20 으로 초기화
		Person p = new Person();
		// => Person 클래스의 매개변수가 없는 Person() 생성자를 호출
		//    만약, Person() 생성자가 없으면 컴파일러에 자동으로 생성
		p.name = "홍길동";
		p.age = 20;
		System.out.println("이름 : " + p.name); 
		System.out.println("나이 : " + p.age);
		
		System.out.println("-------------------------");
		
		DefaultPerson dp = new DefaultPerson();
		// new DefaultPerson() 코드에 의해 객체 생성 시점에서 
		// DefaultPerson() 생성자가 호출됨
		System.out.println("이름 : " + dp.name); 
		System.out.println("나이 : " + dp.age);
		
		System.out.println("------------------------");
		
		// 파라미터 2개(String, int)를 전달받는 생성자 ParameterPerson() 호출
		ParameterPerson pp = new ParameterPerson("홍길동", 20);
		// => 객체 생성 시 전달된 데이터를 사용하여 생성자에서 초기화 수행
		System.out.println("이름 : " + pp.name); 
		System.out.println("나이 : " + pp.age);
		
		// 파라미터 생성자가 1개 존재하는 클래스의 기본 생성자를 호출하면
		// 자동으로 생성되지 않기 때문에 컴파일 에러 발생한다!
		//		ParameterPerson pp2 = new ParameterPerson(); // 컴파일 에러 발생!
		// => The constructor ParameterPerson() is undefined

 

생성자 오버로딩

  • 메서드 오버로딩과 기본적인 규칙 및 동작이 동일함
  • 객체 생성 시 다양한 타입 및 갯수의 파라미터를 갖는 여러 생성자를 호출하여 다양한 초기화를 수행하는 용도로 사용
class Person2 {
	String name;
	int age;
	
	// 1. 기본 생성자 정의 
	// => Person2() 생성자 호출됨! 출력
	public Person2() {
		System.out.println("Person2() 생성자 호출됨!");
	}
	
	// 2. 이름(newName)을 전달받아 초기화하는 생성자 정의
	// => Person2(String) 생성자 호출됨! 출력 및 이름 초기화
	public Person2(String newName) {
		System.out.println("Person2(String) 생성자 호출됨!");
		name = newName;
	}
	
	// 3. 이름(newName)과 나이(newAge)를 전달받아 초기화하는 생성자 정의
	// => Person2(String, int) 생성자 호출됨! 출력 및 이름, 나이 초기화
//	public Person2(String newName, int newAge) {
//		System.out.println("Person2(String, int) 생성자 호출됨!");
//		name = newName;
//		age = newAge;
//	}
	
	// 생성자 자동 생성 단축키 : Alt + Shift + S -> O
	public Person2(String name, int age) {
		System.out.println("Person2(String, int) 생성자 호출됨!");
		this.name = name;
		this.age = age;
	}
	
	// 멤버변수(이름, 나이)를 출력하는 print() 메서드 정의
	public void print() {
		System.out.println("이름 : " + name);
		System.out.println("나이 : " + age);
	}

	
}
		Person2 p1 = new Person2();
		p1.print();
		
		System.out.println("-----------------------");
		
		Person2 p2 = new Person2("홍길동");
		p2.print();
		
		System.out.println("-----------------------");
		
		Person2 p3 = new Person2("이순신", 44);
		p3.print();

상속에서의 생성자

  • 생성자는 상속되지 않는다. 생성자의 이름은 자신의 클래스 이름과 동일해야하므로 부모의 생성자를 상속받으면 클래스 이름과 다르기 때문이다
  • 서브클래스의 ****인스턴스를 생성하기 위해 생성자를 호출하면 암묵적으로 슈퍼클래스의 ****인스턴스가 생성되고 슈퍼클래스의 ****생성자를 호출하여 작업을 수행한 후 서브클래스 생성자 내의 코드가 실행됨
class Person {
	// => Person 클래스는 별도의 상속이 표시되지 않았으므로
	//    자동으로 Object 클래스를 상속받는다!
	String name;
	int age;
	
	// 기본 생성자 정의
	public Person() {
		// Object 클래스의 기본 생성자 Object() 가 자동으로 먼저 호출됨
		System.out.println("생성자 Person() 호출됨!");
	}

	// name, age 를 파라미터로 갖는 파라미터 생성자 정의
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
}
// Person 클래스를 상속받는 SpiderMan 클래스 정의
class SpiderMan extends Person {
	
	public SpiderMan() {
		// 서브클래스 생성자 호출 시 다른 코드를 실행하기 전
		// 먼저 슈퍼클래스의 생성자가 자동으로 호출됨
		// => Person() 생성자 호출됨
		System.out.println("생성자 SpiderMan() 호출됨!");
	}
	
	public void fireWeb() {
		System.out.println("거미줄 발사!");
	}
	
}
		// 아무런 생성자도 정의하지 않고, 생성자가 상속되지 않았으므로
		// 컴파일러에 의해 기본 생성자가 자동으로 생성됨
		SpiderMan s = new SpiderMan();
		
		// 생성자가 상속되지 않았으므로
		// 파라미터 생성자는 SpiderMan 클래스에 존재하지 않는다.
		//		SpiderMan s2 = new SpiderMan("피터 파커", 20); // 오류 발생!

 

728x90
반응형