프로그래밍 언어들

초기화와 생성자

토픽 프로그래밍 언어들 > 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. 24.01.19 완료
  2. 서달
    20230323
  3. coster97
    .
  4. wwwqiqi
    완료
  5. asdfds
    22.11.04
  6. infernist
    2022.10.31
  7. 하앙
    완료
  8. Alan Turing
    09/08
  9. 람보
    2022.9.1
  10. PassionOfStudy
    복습 2일차!
  11. 치키티타
    220610
  12. PassionOfStudy
    생성자!
  13. 김은희
    20220601 완료

    생성자의 특징
    값을 반환하지 않는다.
    생성자의 이름은 클래스의 이름과 동일하다.
  14. 자바잡아
    디폴트 생성자에 대한 설명이 없으면 처음 공부하거나 독학하시는 분들은 모르고 넘어갈 수도 있겠네요.

    다른 파트에 있는지 계속 정독 하면서 공부하겠습니다.
  15. 20220426
  16. 상상
    생성자는 값을 봔환하지않는다.......그러면 void붙여야하는거아닌가요 ??
  17. 모찌말랑카우
    22.02.14 완료
  18. 김지훈
    220213
  19. aesop0207
    220207 Mon.
  20. 행달
    2022.02.05 완료!!
  21. syh712
    2021-12-06
    *초기화
    어떤 일을 시작하기 전에 준비를 하게 되는데 이것을 다른 말로 초기화라고 한다.
    객체 지향 프로그래밍도 초기화에 해당하는 기능이 제공되는데 이것을 생성자(constructor)라고 한다.
    생성자 덕분에 Calculator 객체를 사용하기 위해서 사실상 반드시 필요한 작업이라고 할 수 있는 좌항(left)과 우항(right)의 값을 설정하는 과정을 객체 생성 과정에서 강제할 수 있게 되었다.
    객체를 사용하기 위해서는 객체를 생성해야 한다는 사실은 기본적으로 숙지.

    *생성자의 특징
    값을 반환하지 않는다.
    생성자의 이름은 클래스의 이름과 동일하다.
  22. 드림보이
    2021.12.03. 초기화와 생성자 파트 수강완료
  23. 네제가해냈습니다
    211114
  24. IaaS
    2021-11-01 수강완료
  25. 성치
    2021-11-01 완료
  26. 까만콜라
    완료 10.16
  27. 미NI언
    완료 10.11
  28. 하성호
    210923
  29. 멋을아는남자
    학습하고갑니다.감사합니다.
  30. 베이스박
    Calculator c1 = new Calculator(10, 20);
    여기에서 뒤에있는 Calcaulator는 생성자이고
    앞에 있는 Calculator는 무었인가요?
  31. super1Nova
    210820
  32. 이땅콩
    생성자는 class를 사용하기 위해서 적용하는 basic form을 정의하는 것과도 같군요!
    필요한 argumets를 반드시 정의 하라고 강요하는 행위랑 비슷하다고 말 할 수 있을까요?
  33. Eunyoung Eunice Kang
    2021.8.16(월) 완료
  34. 개발꾸꾸
    5.14
  35. 악어수장
    2021-5-13
  36. 드림보이
    수강완료했습니다...
  37. wksekrdl1
    오류: javaPrj.ConstructorExam 클래스에서 기본 메소드를 찾을 수 없습니다. 다음 형식으로 기본 메소드를 정의하십시오.
    public static void main(String[] args)
    또는 JavaFX 애플리케이션 클래스는 javafx.application.Application을(를) 확장해야 합니다.

    이렇게오류뜨는건 어떻게해결해야할까요 ㅠㅠ
  38. class에서 새로운 instance를 만들때 메소드를 빼먹는경우가있다. 이를보완하기위해 자바는 constructor라는 기능을
    가지고있는데 새로운 instance에 class와 같은이름의 코드를 작성하게되면 constructor는 메소드의역할을 해주는 기능이다.
  39. 더덕
    210329.완
  40. 하연주
    210207 완료
  41. 코딩하는 요리사
    20201110 학습완료
  42. 김태현
    2차 수업완료
  43. hvii
    20200810 학습완료
  44. yulrinam
    200810 시청완료 감사합니다 :)
  45. 생성자는 클래스 명과 같은 이름일 때 사용되어지며
    같은 명이 없으면 비어있는 메소드를 생성하여 적용한다.
    생성자는 초기화값이다.(인스턴스에 값이 처음으로 작용하는 단계)
    Calculator c1 = new Calculator(); 에서 ();가있는 이유는 생성자 매소드에 값을 바로 넣어주기 위함이다.
  46. 흐무
    2020.03.06 완료

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

    생성자와 클래스의 이름이 반드시 동일해야하고 반환값을 받지 않기 때문에 각메소드마다 선언을 해야 값을 제대로 받을수있다.
    자바에서 클래스 이름과 동일한 메소는 기본생성자로 사용하기로 약속되어있다.
  47. aminora
    쉽게 말하면 클래스에 소속된 메서드들(아기새들)끼리는 소통이 안되니
    클래스에게 입력받은 값(생성자)을 알려주면 그것을 클래스(어미새)가 밥필요한 초기값) 달라는(this.~) 메서드들에게 뿌려주는거네요.
    생성자가 돈벌어오는 아버지 클래스는 어머니 메서드는 자식들이네요 ㅎㅎ
  48. aminora
    this를 제대로 아니까 이제 이해가 되네요 감사합니다.
  49. 없으면안돼요
    20191218 완료
  50. 엘비
    20191129 완료