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. hvii
    20200810 학습완료
  2. yulrinam
    200810 시청완료 감사합니다 :)
  3. 생성자는 클래스 명과 같은 이름일 때 사용되어지며
    같은 명이 없으면 비어있는 메소드를 생성하여 적용한다.
    생성자는 초기화값이다.(인스턴스에 값이 처음으로 작용하는 단계)
    Calculator c1 = new Calculator(); 에서 ();가있는 이유는 생성자 매소드에 값을 바로 넣어주기 위함이다.
  4. 흐무
    2020.03.06 완료

    클래스를 생성할때 생성자도 같이 만들어진다.

    생성자와 클래스의 이름이 반드시 동일해야하고 반환값을 받지 않기 때문에 각메소드마다 선언을 해야 값을 제대로 받을수있다.
    자바에서 클래스 이름과 동일한 메소는 기본생성자로 사용하기로 약속되어있다.
  5. aminora
    쉽게 말하면 클래스에 소속된 메서드들(아기새들)끼리는 소통이 안되니
    클래스에게 입력받은 값(생성자)을 알려주면 그것을 클래스(어미새)가 밥필요한 초기값) 달라는(this.~) 메서드들에게 뿌려주는거네요.
    생성자가 돈벌어오는 아버지 클래스는 어머니 메서드는 자식들이네요 ㅎㅎ
  6. aminora
    this를 제대로 아니까 이제 이해가 되네요 감사합니다.
  7. 없으면안돼요
    20191218 완료
  8. 엘비
    20191129 완료
  9. 허공
    감사합니다!
  10. 완료
  11. PassionOfStudy
    191002(수) - (2)
    수강완료~
  12. 이채
    사실 처음 보았을땐 제대로 이해하지 못했었는데
    (이해하지 못했지만 그럭저럭 알아들었다고 생각했는데)
    두번째 보니까 확실히 저번보다 더 많이 이해했다는게 느껴지네요.
    끝까지 보고 헷갈리는 부분이 있으면 다시 돌아오겠습니다^^
  13. 홍주호
    20190910 완료
  14. 다나가
    190830 - 수강완료!!!!!
  15. doevery
    수강완료
  16. 지미츄
    감사합니다!!!
  17. 진한
    봤어요!
  18. 얼그레이
    감사합니다! 190710
  19. 6/17시작
    6월 25일 완료
  20. 이현정
    6.24 7시 12분 와뇨
  21. JLetter
    감사합니다.
  22. 밍밍
    좋아용!
  23. silver94
    감사합니다!
  24. 라또마니
    감사합니다. 강의 잘 들었습니다. 복습하면서 천천히 듣고 있어요
  25. 호두
    고맙습니다

    생성자의 이름은 클래스의 이름과 동일하다.
  26. Jiwoo Park
    베릭굿
  27. j-graphy
    2019. 2. 7. 학습완료
  28. Daydream
    간단한데 꽤 중요한 내용이더군요
    2번 다시 봤어요
    20181028
  29. hi개발자
    2018/10/10 공부 완료
  30. 전민희
    2018/10/06 완료!
  31. 완료
  32. 이태호
    7/4
    생성자의 특징)
    1. 값을 반환하지 않는다.
    2. 생성자의 이름은 클래스의 이름과 동일하다.
  33. 멀캠A_Son
    완료
  34. 추가적인답변??(ㅁㄴㅇㄹ님과는 다른사람입니다.)
    추가적으로 이렇게 설명하면 2번이 안되는 이유를 더 잘 알 수 있지않을까요?

    public static Calculator() // 2번
    {/*...*/}
    이 안되는 이유는

    생성자자체도 인스턴스메소드라고 할 수 있기때문에
    static이라는 클래스메서드를 정의 할 수가 없습니다
    대화보기
    • ㅎㅇ
      중1때 오버로딩까지 배웠었는데
      지금 중3때 다시 배우니까 정말 효율이좋은거같아요!
    • 답변
      전역변수가 static만 붙인다고되는게아니에요
      class내에 어느 메소드가아닌 그냥 클래스내에서 static없이 변수를 설정하면
      전역변수가됩니다
      예를들어
      class hello{
      int a; //어느 메소드에 소속되는 지역변수가아닌 이 클래스내 전역변수가되는거죠

      void ios(){

      }
      }
      대화보기
      • 수용
        ㅠㅠ 설명이 잘못된거같아요.
        전역변수는 static을 붙여야 되는거고,
        설명으로 하신부분은 instance변수인데,
        인스턴스화 해서 그 변수를 사용했기때문에 작동한건데...

        전역변수와 인스턴스 변수를 구분해서 말씀해주셨으면 좋았을거같아요. :/
      • 김현태
        여기서 부터 내일 시작
      • 열정하나
        good
        point
        생성자의 이름은 클래스의 이름과 동일하다.
        자바에서 클래스의 이름과 동일한 메소드는 생성자로 사용하기로 약속되어 있다.
      • 5월 2일 초기화와 생성자 완료! 앞에 했었던 Calculator예제와 비교하면서 보니까 더 이해가 쏚쏚 됩니다!
      • 박현모
        감사합니다~ 잘 봤습니다~
      • 배성재
        완료
      • 하면된다하자
        완료
      • popinbompin
        완료
      • 코딩초보자
        정말 감사합니다! 덕분에 수업 진도에 맞춰서 따라갈 수 있게 되었네요. 항상 많은 도움 받고 있습니다. 이런 홈페이지를 만들어주셔서 다시 한번 감사드려요!
        -자바를 처음 배우는 비전공자 학생이
      • selina
        완료
      • 데이터정복
        생성자 완료!
      • JeongHo Park
        역시 잘 봤습니다~~
      • kuroJay
        정말.... 이고잉님의 강의는 최고인 것 같습니다.
        처음 이 강의부분을 클릭하고 "길이가 꽤 길어보이네." 하고 생각했는데
        다 보고 나서는, "어라? 언제 끝났지?" 라는 생각이 들었습니다.
        몰입도 최고, 설명 최고 입니다.. 참고로 알바아님. ㅎㅎ
      • Younghun Liam Youn
        어쩐지 setOprands와 같은 메소드를 왜 생성해야 하는지 조금 의아했었는데 이 수업을 위한 것이었군요! 앞선 클래스에서 가질 수 있는 의문이 다음 클래스 주제와 연관되어 해결되는 구성이 정말 좋은 것 같습니다 :D 감사합니다!
      버전 관리
      egoing
      현재 버전
      선택 버전
      graphittie 자세히 보기