본문 바로가기
JAVA

[JAVA] 자바 객체지향 개념 정리(4)

by DeveloperJang 2021. 11. 5.

생성자란?

인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드(인스턴스 변수를 초기화함)

생성자의 조건

  • 생성자의 이름은 클래스의 이름과 같음
  • 생성자는 리턴값이 없음(void는 생략)

생성자의 정의

클래스이름(타입 변수명, 타입변수명, ...){
// 인스턴스 생성 시 수행 될코드,
// 주로 인스턴스 변수의 초기화 코드를 적음
}

class Card{ Card(){ // 매개변수가 없는 생성자 } Card(String k, int num){ // 매개변수가 있는 생성자. }

여기서 주의해야하는 것은 인스턴스를 생성하는 것은 new이지 생성자가 아니다!

생성자는 인스턴스를 초기화 하는 역할 만 할 뿐임

기본생성자(default constructor)

클래스 이름() { } Card() { }

  • 매개변수가 없는 생성자
  • 생성자가 하나도 정의 되어있지 않은 경우 기본생성자 추가

단,
자동적으로 기본 생성자를 추가하는 경우는 클래스 내에 생성자가 하나도 없을 경우임!!

매개변수가 있는 생성자

class Car{ 
           String color; String gearType; int door; Car(){} // 생성자 
           Car(String c, String g, int d){ // 생성자 
           color=c; gearType=g; door=d; 
          }

 

 

Car c=new Car("white", "auto", 4);

위와 같이 인스턴스 생성후 별도로 초기화를 하지 않도록 하는 것이 바람직

this()와 this

this()

생성자 간에 다른 생성자를 호출할 때 사용

  • 반드시 첫줄에서 호출가능
    why? 초기화 작업도중 다른 생성자를 호출하면 호출된 생성자 내에서 멤버변수 값을 초기화 하기 때문
  • 클래스이름 대신 this를 사용

this

인스턴스 자신을 가리키는 참조변수

  • this를 통해 인스턴스 변수에 접근가능
  • static메서드에서는 사용불가
  • 인스턴스 메서드 내에 지역변수로 숨겨져잇음

생성자를 이용한 인스턴스 복사

 

Car(Car c){ color=c.color; gearType=c.gearType; door=c.door; }

 

위의 코드는 참조변수를 매개변수로 선언한 생성자임

참조변수가 가리키는 iv들을 인스턴스 자신에 복사한다.

-> 인스턴스를 복사하여 생성해도 독립적인 저장공간을 갖는다.
따라서 c1의 값을 변경해도 c2의 값이 변경되지는 않음

 

 

변수의 초기화

변수를 선언하고 처음으로 값을 저장하는 것을 변수의 초기화라고함.

 

 

멤버변수(iv,cv)는 자동적으로 기본값으로 초기화가 됨

but 지역변수는 반드시 직접 초기화 해야한다!!

 

 

 

멤버 변수는 지역변수와 달리 초기화 방법에 3가지가 있다.

 

 

멤버변수의 초기화 방법

1. 명시적 초기화(explicit initialization)

변수를 선언과 동시에 초기화 하는 방법

class Car{
    int door=4;      // 기본형(primitive type) 변수의 초기화
    Engine e=new Engine();      // 참조형(reference type) 변수의 초기화
    
    // ...
  }

가장 간단하고 명료한 방법이다.

하지만 보다 복잡한 초기화 작업이 필요할 때는 초기화 블럭이나 생성자를 사용해야함

 

2. 초기화 블럭(initialization block)

- 클래스 초기화 블럭

  • 클래스가 메모리 로딩될 때 한번만 수행
  • 앞에 static을 붙임

 

- 인스턴스 초기화 블럭

  • 인스턴스를 생성할 때 마다 수행됨
  • 모든 생성자에서 공통으로 수행돼야 하는 코드를 넣는 곳에 사용

 

멤버변수의 초기화 시기와 순서

클래스 변수 초기화 시점: 클래스가 처음 로딩 될 때

인스턴스변수 초기화 시점: 인스턴스가 생성 될 때

 

[초기화 순서]

cv 기본값 → cv 명시적 초기화 → cv 초기화 블럭 → iv 기본값 → iv 명시적 초기화 → iv 초기화 블럭 → 생성자

 

클래스 변수는 항상 인스턴스 변수보다 먼저 생성되고 초기화 됨!

댓글