반응형

 


생성자(Constructor)
    생성자는 클래스를 구성하는 중요한 메서드
    자바에서 객체를 생성할 때 반드시 호출

 

앞의 예제들에서 다음과 같은 부분이 있다.


여기서 new는 클래스를 이용하여 객체를 생성하는 기능이라 했다.
근데 Counter클래스의 이름을 메서드 호출처럼 사용한 것이 보인다.
자바에서 모든 객체는 위와 같이 클래스를 메서드 형식으로 호출하여 생성하도록 되어 있다.
또한 배열도 String도 모두 객체로 생성하는 것이며 모두 생성자를 호출하도록 되어 있다.

 

생성자 특징
    - 클래스명과 동일
    - 멤버 필드 값 초기화
    - 결과형 리턴 값이 없다.
    - 오버로딩 가능
    - 객체 생성 시 반드시 하나의 생성자 호출
    - 생성자가 정의되지 않았다면 JVM이 디폴트 생성자를 만들어 호출

 

다음 예제를 통해 생성자를 이해하도록 한다.
x, y값을 전달받아 좌표 값을 저장하는 클래스


예제1. 생성자가 없는 클래스로 객체 생성

class Point {
	int x;
	int y;

	void pointPrint() {
		System.out.println("[" + x + "," + y + "]");
	}
	// Point(){} //디폴트 생성자 
}

public class Exam {
	public static void main(String[] args) {
		Point point = new Point();
		point.x = 10;
		point.y = 20;
		point.pointPrint();
	}
}

 

실행결과


예제2. 생성자로 인자를 전달받아 객체 생성

class Point {
	int x;
	int y;

	void pointPrint() {
		System.out.println("[" + x + "," + y + "]");
	}

	// Point(){} //디폴트 생성자  
	Point(int a, int b) {
		x = a;
		y = b;
	}
}

public class Exam {
	public static void main(String[] args) {
		Point point = new Point(10, 20);
		point.pointPrint();
	}
}

 

위와 같이 디폴트 생성자 없이 원하는 생성자를 정의한 경우
처음 예제처럼 객체를 생성하면( new Point(); )생성자가 없다는 에러가 발생한다.
디폴트 생성자는 인자를 받지 않는 생성자이다.
클래스에 생성자가 정의되지 않는 클래스에만 JVM에서 자동 추가한다.
물론 인자를 받지 않는 생성자를 직접 정의할 수 있다.
그래서 위와 같이 인자를 받는 생성자를 정의하는 경우 객체 생성을 위해
디폴트 생성자를 직접 정의하는 것이 좋다.(특별히 객체 생성에 제한을 두려는 경우는 재외)

 

예제3. 생성자 오버로딩 활용

class Point {
	int x;
	int y;

	void pointPrint() {
		System.out.println("[" + x + "," + y + "]");
	}

	Point() { // 디폴트 생성자
	
	} 

	Point(int a) {
		x = a;
		y = a;
	}

	Point(int a, int b) {
		x = a;
		y = b;
	}
}

public class Exam {
	public static void main(String[] args) {
		Point point1 = new Point();
		Point point2 = new Point(10);
		Point point3 = new Point(20, 30);
		point1.pointPrint();
		point2.pointPrint();
		point3.pointPrint();
	}
}

 

실행결과


객체를 사용할 때 해당 객체에 필요한 값이 있다면 생성 후에 대입할 수 있다.
하지만 생성자가 있다면 객체를 생성하며 값을 대입할 수 있어 편의성이 좋아진다.
그래서 클래스를 정의한다면 해당 객체를 생성할 때 필요한 값을 바로 전달받아 생성할 수 있도록 하는 기능을 생성자 메서드로 추가할 수 있는 것이다.

 

입출력에 사용하던 BufferedReader클래스는 생성자로 InputStreamReader객체를 전달받았고
InputStreamReader역시 System.in이라는 객체를 전달받아 생성되었던 것이다.

생성자를 사용하는 의미를 이해하고 다른 클래스를 사용할 때에도 생성자를 확인하여 이용하도록 한다.
직접 클래스를 정의하는 경우에도 객체가 필요한 값을 전달받아 객체가 생성될 수 있도록
생성자 메서드를 알맞게 정의하면 클래스를 사용할 때 유용할 것이다.

 

반응형

+ Recent posts