Java

[ JAVA ] 05. 클래스(Class)의 구성 요소인 생성자(Constructor)는 무엇인가?

2023. 7. 4. 22:54
목차
  1. 생성자(Constructor)
  2. 생성자는 어떻게 선언하는가?
  3. 생성자는 어떻게 사용하는가?

 

https://giryu.tistory.com/4

 

[ JAVA ] 02. 자바의 근간인 클래스(Class)는 무엇인가?

안녕하세요. 오늘은 자바에서 가장 기본적이지만, 중요한 클래스의 개념에 대해 알아보도록 하겠습니다. 자바는 클래스 기반의 언어라고도 할 정도로 모든 것들이 클래스를 위주로 돌아갑니다.

giryu.tistory.com

클래스의 개념

 

안녕하세요.

오늘은 클래스(Class)의 구성 요소 중 생성자(Constructor)에 대해 자세히 다뤄보고자 합니다.

 

 

생성자(Constructor)

자바에서 생성자는 클래스의 인스턴스를 초기화하고 객체를 생성하기 위해 사용되는 특별한 메서드(method)를 말합니다.

생성자는 객체가 생성될 때 자동으로 호출되게 됩니다.

생성자는 객체의 초기 상태를 설정하고 필요한 리소스를 할당하는 등의 작업을 수행하는 역할을 수행합니다.

 

생성자는 어떻게 선언하는가?

 

기본 생성자(Default Constructor)

// 소스 파일

public class Computer { }
// 바이트 코드 파일

public class Computer {

	public Computer { } // 자동 생성
    
}

모든 클래스는 생성자가 반드시 존재하여야 하며, 하나 이상을 가질 수 있습니다.

클래스 내부에 생성자 선언을 생략하게 됐다면, 컴파일러는 위와 같이

중괄호 ( { } ) 블록 내용이 비어있는 기본 생성자(Default Constructor)를 바이트 코드에 자동으로 추가시킵니다.

 

Computer myCom = new Computer(); // Computer()는 기본 생성자

따라서 클래스에 생성자를 선언하지 않아도,

위와 같이 new 연산자 뒤에 기본 생성자를 호출하여 객체를 생성할 수 있습니다.

클래스에 명시적으로 선언한 생성자가 한 개라도 존재한다면, 컴파일러는 기본 생성자를 추가하지 않습니다.

명시적으로 생성자를 선언하는 이유는 객체를 다양하게 초기화시키기 위해서입니다.

 

명시적 생성자(Explicit Constructor)

명시적 생성자는 기본 생성자를 대신하여 명시적으로 선언하기 위해 존재합니다.

클래스 ( 매개변수 선언, . . . ) { // 생성자 블록

	// 객체 초기화 코드

}

위에서 알 수 있듯 메서드와 비슷한 모양을 가지지만, 반환 타입이 없고 클래스의 이름과 동일합니다.

명시적 생성자는 생성자 블록 내부에 객체 초기화 코드가 존재하는데,

이는 일반적으로 필드에 초기값을 저장하거나 메서드를 호출하여 객체 사용 전에 필요한 준비입니다.

매개변수 선언은 생략이 가능하기도, 여러 개를 선언할 수도 있습니다.

매개변수는 new 연산자를 생성자 호출 시에 외부 값을 생성자 블록 내부로 전달하는 역할을 수행합니다.

 

예를 들어 Computer 생성자를 호출 시 3개의 값을 제공할 때

Computer MyCom = new Computer("인텔",  512, 4);

1개의 매개값은 String, 2개의 매개값은 int입니다.

3개의 매개값을 생성자가 받기 위해서는 아래와 같이 생성자를 선언해주어야 합니다.

public class Computer {

	// 생성자
    Computer(String company, int volume, int ports_Num) {
    
    . . .
    
    }

}

클래스 생성자가 명시적으로 선언되었을 경우에는 반드시 선언된 생성자를 호출하여 객체를 생성하여야 합니다.

 

 

생성자는 어떻게 사용하는가?

생성자는 객체 초기화에 사용되며, 필수적인 멤버변수를 초기화, 리소스 할당, 외부 종속성 주입 등을 수행할 때 사용합니다.

생성자를 통해서 객체의 일관성과 안정성을 보장할 수 있습니다.

 

필드 초기화

클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정됩니다.

만일 다른 값으로 초기화하고 싶다면

 

필드를 선언할 때 초기값을 주는 방법

생성자에서 초기값을 주는 방법

 

위 두가지가 있습니다.

 

필드를 선언할 때 초기값을 주는 방법은 동일한 클래스로부터 생성되는 객체들이 모두 같은 데이터를 갖게 됩니다.

객체 생성 후에는 값을 변경할 수 있지만, 객체 생성 시점에는 필드 값이 모두 같은 특징이 있습니다.

 

public class Computer {

    // 필드
    String company = "인텔";
    int volume;
    int ports_Num;

}

위와 같이 Computer클래스에 company필드를 선언하면서 "인텔"로 초기값을 설정한 경우

Computer myCom1 = new Computer();
Computer myCom2 = new Computer();

Computer클래스로부터 myCom1, myCom2 객체를 생성하면, 두 객체의 company필드는 "인텔"이 저장됩니다.

 

객체 생성 시점에서 외부에서 제공되는 다양한 값으로 초기화 되어야 한다면 생성자에서 초기화 하여야 합니다.

위 코드에서 volume과 port_Num의 필드 값은 초기값을 미리 줄 수 없고 객체 생성 시점에 다양한 값을 가져야 합니다.

 

때문에 생성자의 매개값으로 이 값들을 받아 초기화 하여야 합니다.

public class Computer {

    // 필드
    String company = "인텔";
    int volume;
    int ports_Num;

    // 생성자
    public Computer(int v, int p) {
    
        volume = v;
        ports_Num = p;
    
    }
    
}

위와 같이 v와 p 같은 매개변수를 통해 값을 받으면 됩니다.

 

통상 매개변수는 필드와 동일한 이름으로 사용합니다.

하지만 이렇게 사용할 경우, 필드와 매개변수의 이름이 동일하기 때문에

생성자 내부에서 해당 필드에 접근할 수 없게 됩니다.

이유는 동일한 이름의 매개변수가 우선순위가 높기 때문입니다.

 

이를 해결하기 위해서는 필드 앞에 this 를 붙이면 됩니다.

public class Computer {

    // 필드
    String company = "인텔";
    int volume;
    int ports_Num;

    // 생성자
    public Computer(int volume, int ports_Num) {
    
        this.volume = volume; // this.volume은 필드 volume은 매개변수
        this.ports_Num = ports_Num; // this.ports_Num은 필드 ports_Num은 매개변수
    
    }
    
}

this는 객체 자신의 참조이며, 자신을 가르키듯 객체 자신을 this라고 칭한다는 뜻 입니다.

 

객체의 필드는 여러 개가 있고, 이 필드들은 모두 생성자에서 초기화한다면,

생성자의 매개변수의 수는 필드 수만큼 선언되어야 합니다.

 

실제로는 중요한 몇 가지의 필드만 매개변수를 통해 초기화하고, 나머지 필드들은 필드 선언 시 초기화하거나,

생성자 내부에서 임의의 값이나 계산된 값으로 초기화하는 것을 선택합니다.

혹은, 객체 생성 후에 필드값을 별도로 저장하기도 합니다.

 

 

생성자 오버로딩(Overloading)

생성자도 메서드와 마찬가지로 외부에서 제공되는 다양한 데이터들을 이용하여 객체를 초기화하기 위해

다양화할 필요가 있습니다.

이를 위해 자바는 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩을 제공하고 있습니다.

 

public class Computer {

    Computer() { . . . }
    Computer(String company) { . . . }
    Computer(String company, int volume) { . . . }
    . . .

}

생성자 오버로딩은 매개 변수를 달리하는 생성자를 여러 개 선언할 수 있도록 해주는 것을 말합니다.

 

public class Computer {

    Computer(String company, int volume) { . . . }
    Computer(String gpu_name, int ports_Num) { . . . } // 오버로딩이라고 볼 수 없음

}

생성자 오버로딩 시 주의하여야 할 점은

메서드 오버로딩과 마찬가지로 매개변수의 타입과 개수, 선언된 순서가 똑같은 경우

매개변수 이름만 바꾸는 것은 오버로딩으로 볼 수 없습니다. (컴퓨터가 구분을 못하기 때문)

 

다른 생성자는 어떻게 호출하는가?

생성자 오버로딩이 많아질 경우 생성자 간의 중복 코드가 많아질 수 있습니다.

매개변수의 수만 다르게 하고 필드 초기화 내용이 비슷한 생성자에서 이러한 현상이 많아집니다.

 

이런 경우에는 필드 초기화 내용은 한 생성자에서만 집중적으로 작성하고

나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선이 가능합니다.

 

이를 위해서는

초기화 내용을 가진 생성자

초기화 내용을 가진 생성자를 호출하는 생성자

위 두가지 사전 준비가 필요합니다.

 

생성자에서 다른 생성자를 호출할 때에는 this( ) 코드를 사용합니다

public class Computer {

    // 필드
    int volume;
    int ports_Num;

    // 첫번째 생성자
    public Computer(int volume) {
    
    	this(volume); // 두번째 생성자 호출
    
    }
    
    // 두번째 생성자
    public Computer(int volume, int ports_Num) {
    
    	this.volume = volume; // 공통으로 실행되는 코드
    	this.ports_Num = ports_Num; // 공통으로 실행되는 코드
    
    }
    
}

위와 같이 this ( )를 사용하여 첫번째 생성자에서 두번째 생성자를 호출할 수 있습니다.

 

이상으로 클래스에서 생성자에 대해 자세히 알아보았습니다.

생성자는 자바에서 중요한 객체를 담당하는만큼 꼭 알고 가야하는 것 중 하나입니다.

생성자의 개념에 대해 헷갈리지 않도록 자세히 공부하고 지나간다면 좋을 것 같습니다.

저작자표시 (새창열림)

'Java' 카테고리의 다른 글

[ JAVA ] 07. 자료형을 사용할 때 고려해야 할 부분은 무엇이 있을까?  (0) 2023.07.07
[ JAVA ] 06. 자료형에 대해 알아보자.  (0) 2023.07.06
[ JAVA ] 04. 클래스의 구성 요소인 메서드(Method)는 무엇인가?  (0) 2023.07.03
[ JAVA ] 03. 클래스의 구성 요소인 필드(Field)는 무엇인가?  (0) 2023.07.02
[ JAVA ] 02. 자바의 근간인 클래스(Class)는 무엇인가?  (0) 2023.07.01
  1. 생성자(Constructor)
  2. 생성자는 어떻게 선언하는가?
  3. 생성자는 어떻게 사용하는가?
'Java' 카테고리의 다른 글
  • [ JAVA ] 07. 자료형을 사용할 때 고려해야 할 부분은 무엇이 있을까?
  • [ JAVA ] 06. 자료형에 대해 알아보자.
  • [ JAVA ] 04. 클래스의 구성 요소인 메서드(Method)는 무엇인가?
  • [ JAVA ] 03. 클래스의 구성 요소인 필드(Field)는 무엇인가?
giryu
giryu
초심부터 시작하는 전공자의 일기
giryu
giryu's Learn coding
giryu
전체
오늘
어제
  • 분류 전체보기 (15)
    • Java (15)
    • Spring (0)
    • Python (0)
    • Algorithm (0)
    • Data_Structure (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 객체 프로그래밍
  • 구동원리
  • 객체초기화
  • 오버로딩
  • 필드
  • 자바
  • 메서드 오버로딩
  • 필드선언
  • java
  • 자바구동원리
  • 객체
  • 참조
  • 인스턴스
  • 추상화
  • 객체인스턴스차이
  • 자바상속
  • Class
  • 추상클래스
  • 클래스
  • 자료형
  • 객체지향프로그래밍
  • 상속
  • 생성자
  • 메서드
  • 자바원리
  • 객체지향
  • Instance
  • 프로그래밍
  • 자바란
  • 인터페이스

최근 댓글

최근 글

hELLO · Designed By 정상우.
giryu
[ JAVA ] 05. 클래스(Class)의 구성 요소인 생성자(Constructor)는 무엇인가?
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.