3.4 Constructor (생성자)

작성자 : 진은영 ( 2004-07-26 )

[메인] [목록]

목차

3.4.1 Construction 이란

new 키워드를 통해 객체를 생성하는 역할을 한다. 생성자 호출하는 과정은 아래와 같다.

하나의 클래스에는 생성자가 0개 이상 있을 수 있으며, 개발자가 생성자를 구현하지 않으면 자바 컴파일러가 컴파일시 자동으로 default Constructor 를 생성해준다.

생성자의 형식은 아래와 같다.

중요한 것은 리턴타입이 없다는 것이다.
class Car{
        String name ; 

        public Car( String n ){
                name = n ; 
        }
}


3.4.2 Constructor 생성하려면

  • 접근제한자는 외부에서도 객체를 생성하게 해야 하기 때문에 public으로 지정한다.
  • 생성자 명은 반드시 클래스명과 동일하게 한다.
  • 매개변수는 멤버변수에 값을 대입하고 싶은 변수의 타입을 지정한다.
class Car {
	//멤버변수 선언
	String name ; 
	String brand ;
	String color ; 

	public Car(){}  //default constructor

	pbulic Car( String n ){ //name 멤버변수에 n의 값을 대입하는 생성자
			name = n ; 
	}
	
	public Car( String n , String b , String c ){   //멤버변수에 각각의 값을 대입하는 생성자
			name = n ; 
			brand = b ;
			color = c ; 
	}
}

하나의 클래스에 생성자가 꼭 하나만 있을 필요는 없다. 추상화 할 때 필요한 갯수만큼 생성자를 구현할 수 있다.

그렇다면 생성자를 기입하는 것과 그렇지 않은것의 차이점은 무엇일까?
3-3에 있었던 Employees 클래스의 객체를 생성해 보자
public class EmployeesTest{
        public static void main( String [] args ){
                Employees e1 = new Employees() ; 
                e1.setEmpID( "emp001" ) ; 
                e1.setName( "홍길동" ) ; 
        }
}

객체를 생성한 후 멤버변수에 직접 값을 대입할 수는 없다. 각 멤버변수에는 변수의 값을 보호하기 위해 접근제한자를 private으로 주었기 때문이다. 접근이 가능한 메소드를 통해 값을 대입해야 하는데, 하나하나 대입하려니 귀찮다. 아래의 로직으로 바꿔보자.

public class Employees {
        
	//멤버변수 선언
	private String empID ; 
	private String name ; 
	private String position ; 
	private int salary ; 
	
	//생성자 선언 
	public Employees ( String id , String n ){
	   empID = id ; 
	   name = n ; 
	}

	//메소드 선언
	//public void print(){}

	// public int calSalary(){}

	// set Method
	.......... 생략 ............	   
}
위와 같이 작성한다면 아래와 같이 객체를 생성할 수 있다.
public class EmployeesTest{
        public static void main( String [] args ){
                Employees e1 = new Employees( "emp001" , "홍길동" ) ; 
        }
}

여기에서 주의할 것은 개발자가 하나 이상의 생성자를 구현한다면 컴파일러는 default constructor를 만들어 주지 않는다는 것이다. 즉,
public class EmployeesTest{
	public static void main( String [] args ){
		Employees e1 = new Employees( "emp001" , "홍길동" ) ; 
		Employees e2 = new Employees() ; 
	}
}
컴파일

---------- javac ----------
EmployeesTest.java:3: cannot resolve symbol
symbol : constructor Employees (java.lang.String,java.lang.String)
location: class Employees
Employees e1 = new Employees( "emp001" , "홍길동" ) ;
^ 1 error
출력 완료 (2초 경과) - 정상 종료
즉 Employess() 를 찾을수 없다고 나온다. 자주 착각하는 문제이기 때문에 반드시 짚고 넘어가야한다