Java

초기화와 생성자

초기화

회사에 출근해서 업무를 시작하기 전에 제일 먼저 하는 일이 아마 책상 정리일 것이다. 커피를 내리는 경우도 있을 것이고, 컴퓨터 부팅을 시작하기도 할 것이다. 즉 어떤 일을 시작하기 전에 준비를 하게 되는데 이것을 다른 말로 초기화라고 한다. 

객체 지향 프로그래밍도 초기화에 해당하는 기능이 제공되는데 이것을 생성자(constructor)라고 한다. 앞에서 살펴봤던 계산기 예제를 보자.

객체를 이용하기 위한 로직은 아래와 같다.

Calculator c1 = new Calculator();
c1.setOprands(10, 20);
c1.sum();		
c1.avg();	

위의 예에서 메소드 setOprands의 값으로 10과 20을 지정했다. 이 값들은 객체 내부에서 인스턴스 변수 left와 right의 값으로 설정되어서 유지된다. 그런데 이 객체를 이용하기 위해서는 기억해야 할 것이 있다. 아래와 같이 메소드 setOprands를 호출하기 전에 sum과 avg를 호출한다면 원하는 결과를 얻을 수 없을 것이다.

Calculator c1 = new Calculator();
c1.sum();		
c1.avg();

이것은 객체 Calculator를 사용하기 위해서 사용자는 메소드 sum을 호출하기 전에 setOprands를 호출해야 한다는 것을 기억하고 있어야 한다는 것을 의미한다. 이러한 절차를 기억해야 한다는 것은 사용자 입장에서는 불편할 뿐 아니라 잘못된 사용으로 오류가 발생할 확률을 높이는 결과를 초래 할 수 있다.

생성자

그래서 사용하는 것이 생성자(Constructor)이다. 아래와 같이 인스턴스가 생성될 때 left, right의 값을 입력하도록 강제한다면 어떨까?

Calculator c1 = new Calculator(10, 20);
c1.sum();
c1.avg();

위와 같이 Calculator의 사용방법을 변경하기 위해서는 아래와 같이 코드를 작성한다. (실행)

package org.opentutorials.javatutorials.constructor;

class Calculator {
    int left, right;

	public Calculator(int left, int right) {
		this.left = left;
		this.right = right;
	}

	public void sum() {
		System.out.println(this.left + this.right);
	}

	public void avg() {
		System.out.println((this.left + this.right) / 2);
	}
}

public class CalculatorDemo1 {

	public static void main(String[] args) {

		Calculator c1 = new Calculator(10, 20);
		c1.sum();
		c1.avg();

		Calculator c2 = new Calculator(20, 40);
		c2.sum();
		c2.avg();
	}

}

7행에 아래와 같은 내용이 추가 되었다. 이것이 바로 생성자이다.

public Calculator(int left, int right) {
	this.left = left;
	this.right = right;
}

생성자는 그 이름처럼 객체를 생성할 때 호출된다. 25행은 위의 생성자를 이용해서 객체를 생성하는 방법을 보여준다.

Calculator c1 = new Calculator(10, 20);

생성자 덕분에 Calculator 객체를 사용하기 위해서 사실상 반드시 필요한 작업이라고 할 수 있는 좌항(left)과 우항(right)의 값을 설정하는 과정을 객체 생성 과정에서 강제할 수 있게 되었다. 절차를 하나 줄인 것뿐이지만, 객체를 사용하기 위해서는 객체를 생성해야 한다는 사실은 기본적으로 숙지하고 있는 절차이기 때문에 이 절차에 필수적인 작업을 포함시킨다는 것은 중요한 의미를 갖게 된다.

생성자의 특징

생성자의 특징은 아래와 같이 정리할 수 있다.

  • 값을 반환하지 않는다.
    생성자는 인스턴스를 생성해주는 역할을 하는 특수한 메소드라고 할 수 있다. 그런데 반환 값이 있다면 엉뚱한 객체가 생성될 것이다. 따라서 반환 값을 필요로하는 작업에서는 생성자를 사용하지 않는다. 반환 값이 없기 때문에 return도 사용하지 않고, 반환 값을 메소드 정의에 포함시키지도 않는다.
  • 생성자의 이름은 클래스의 이름과 동일하다.
    자바에서 클래스의 이름과 동일한 메소드는 생성자로 사용하기로 약속되어 있다.

댓글

댓글 본문
작성자
비밀번호
  1. 아.. 그렇군요..
    상속일때와 아닐때의 차이군요..

    상세한 답변 감사드립니다.
    대화보기
    • 상속 받은 subclass 객체 생성시에 superclass의 default 생성자를 호출하기때문에 default 생성자가 없으면 애러가 발생합니다 그리고 상속관계가 아닌 상황에서는 default생성자가 없더라도 컴파일할때 자동으로 생성되기때문에 별문제가 안됩니다
      대화보기
      • 문의 드립니다.
        생성자와 초기화를 보면

        public Calculator(int left, int right) {
        this.left = left;
        this.right = right;
        }
        위 처럼 선언 후엔 왜 생성자가 없어도 되죠?

        상속과 생성저2를 보면
        public Calculator(int left, int right){
        this.left = left;
        this.right = right;
        }
        한 후 생성자가 없어서 오류가 발생하는데..

        두개는 동일한데.. 상속에서는 생성자가 있어야 하고,
        지금은 생성자가 없어도 된단 말씀인가요?

        약간 헤깔리네요.. 조언좀 부탁 드리겠습니다.
      • Joon Lee
        강의를 연속적으로 듣는게 매우 중요하네요..앞 강의를 바로 뒷 강의에서 이해할 수 있어서..^^
      • 알릭
        오늘도 좋은 강의 감사드립니다.
      • 좋은 강의 항상 감사드립니다 열심히 듣고 있습니다.
      • 감사합니다!
      • Weaver
        강의 잘들었습니다!!
      • joo0914krs
        감사합니다
      • JustStudy
        고맙습니다
      • 김트라슈
        감사합니다
      • 감사합니다♡
      • 오빠는다르다
        감사합니다!!!
      • 이웃집토토로
        계산기 예제 링크 안뜨는군요 ~ ~
      • 박첩구드
        생성자 좋네여~~ ㅎㅎ
      • 개똥이
        머리아프당....
      • Byunghawk Lee
        잘보고 갑니당.
      • ㄷㄷㄷ
        개편함ㄷㄷ
      • cocohodu
        좋은강의 감사합니다
      • 자바를자바라
        자바를 자바보기위해 오늘도 헤딩 ㅠ
      • 네네네네dpdpdpdp
        System.out.println(this.left + this.right);

        =>

        System.out.println(left + right);

        로 바꿔 주세요.
        대화보기
        • 박진혁
          class Calculator {
          int left, right;
          public Calculator(){}

          public Calculator(int left, int right) {
          this.left = left;
          this.right = right;
          }

          public void sum() {
          System.out.println(this.left + this.right);
          }

          public void avg() {
          System.out.println((this.left + this.right) / 2);
          }
          }

          public class Calculatorexperiment {

          public static void main(String[] args) {

          Calculator c1 = new Calculator();
          c1.Calculator(10,20);
          c1.sum();
          c1.avg();

          Calculator c2 = new Calculator(20, 40);
          c2.sum();
          c2.avg();
          }

          }

          --------------------------------------
          main에
          [Calculator c1 = new Calculator();
          c1.Calculator(10,20);]
          한 거 처럼 인스턴스를 만든뒤 메소드를 다루듯이 매개변수가 들어가는 생성자를 불러오는 건 안되나요? 지금 이상태로는 에러가 나네요 ㅠㅠ
        • 김곰
          오프라인 강의도 하시나요?
        • Jung Hwan Sung
          생성자를 사용해 꼭 초기화를 해야 하는 것이 아니고,
          초기화를 해야 할 필요성(즉, 변수 세팅이나 기본적으로 실행해야 할 것 등)이 있을때에만
          생성자를 사용해야 한다는 내용 같습니다~
          대화보기
          • bepositive1223
            초기화는 왜하는 건가요?
          • 최재필
            만약에 인자가 있는 생성자 Calculator(int left, int right)가 만들어져 있는상태에서
            인스턴스 Calculator c1 = new Calculator(); 를 생성했다면
            JVM은 new 키워드를 통해 Calculator();를 찾게 되지만 먼저 만들어진
            인자있는 생성자 때문에 디폴트생성자를 못만들어 에러가 나게 됩니다.

            위의 예제가 에러가 나지 않는 것은 인자있는 생성자를 통해 인스턴스를 만들어서 그렇...ㄴ것 같습니다ㅎㅎ
            Calculator c1 = new Calculator(10, 20);
            대화보기
            • 완전 굿입니다.
            • 고지식한남자
              감사합니당
            • jhjonim
              계산기 예제 링크가 깨져있습니다. 좋은콘텐츠 정말 감사합니다.
            • 설림
              public Calculator(int left, int right) {
              this.left = left;
              this.right = right;
              }
              는 인자가 있으니까 기본생성자가 아니지만, 자기 안에서 인스턴스화시키지 않으니까 오류가 발생하지 않는 건가요?
            • Diew
              감사합니다~~
            • 자바쟁이
              잘 배우고 갑니다~
            버전 관리
            egoing
            현재 버전
            선택 버전
            graphittie 자세히 보기