본문 바로가기

Web Development/Java

[Java] 객체지향개념3

생성자?

1. 생성자란?

-인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'

-인스턴스 변수의 초기화 또는 인스턴스 생성시 수행할 작업에 사용

-몇가지 조건을 제외하고는 메서드와 같음

-모든 클래스에는 반드시 하나 이상의 생성자가 있어야 함

*인스턴스 초기화: 인스턴스 변수에 적절한 값을 저장하는 것

 

Card c = new Card();

 

코드가 실행될 때

(1) 참조변수 c가 선언됨

(2) 연산자 new에 의해서 Card 인스턴스가 생성됨

(3) 생성자 Card()가 호출되어 생성된 인스턴스의 초기화를 수행

      (인스턴스의 생성은 생성자가 호출되기 이전 연산자 new에 의해 수행됨

        생성자의 목적은 new 연산자에 의해 생성된 인스턴스의 인스턴스변수에 적절한 값을 저장하는 것)

(4) new의 결과로 생성된 Card 인스턴스의 주소가 반환되어 참조변수 c에 저장됨

 

2. 생성자의 조건

-생성자의 이름은 클래스 이름과 같아야 한다

-생성자는 리턴값이 없다 (△ void를 쓰지 않음)

-생성자의 이름은 클래스 이름과 같기 때문에 같은 클래스 내의 모든 생성자들은 이름이 같음

 -> 오버로딩

 

3. 기본 생성자

-매개변수가 없는 생성자

-클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가함

  (생성자가 하나라도 있으면 컴파일러는 기본생성자를 추가하지 않음)

-클래스에 생성자를 정의할 때는 기본 생성자도 함께 정의해줄 것

 

4. 매개변수가 있는 생성자

-왼쪽 코드를 오른쪽 코드와 같이 사용할 수 있게 하기 위해 생성자를 적절히 제공하는 것이 바람직함

 

5. 생성자에서 다른 생성자 호출하기 - this()

▶ this() : 생성자

-같은 클래스의 다른 생성자를 호출할 때 사용

-호출을 통해 재사용성을 높

-다른 생성자 호출은 생성자의 첫 문장에서만 가능

 

6. 참조변수 this

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

-인스턴스의 주소가 저장되어 있음

-모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재

-인스턴스변수와 지역변수를 구별하기 위해 사용되는 경우가 많음

 

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

Car(Car c) {

       this.(c.color, c.gearType, c.door);

}

-초기화작업이 복잡한 인스턴스를 여러 개 생성해야 하는 경우 하나의 인스턴스만 복잡한 초기화작업을 거쳐 생성한 후

  그 다음부터는 인스턴스의 복사를 이용해 새로운 인스턴트들을 만들어 코드의 효율을 높일 수 있음

 

 

변수의 초기화?

1. 변수의 초기화

-변수를 선언하고 처음으로 값을 저장하는 것

-멤버변수(iv, cv)와 배열은 각 타입의 기본값으로 자동초기화되므로 초기화를 생략할 수 있다

-지역변수가 선언되는 호출스택은 매번 자동초기화를 진행하기에는 변경 빈도가 잦아 비효율적

 -> 지역변수는 사용전에 꼭!!! 초기화를 해주어야 한다

 

2. 멤버변수의 초기화

(1) 명시적 초기화

class Car {

           int door = 4;

           Engine e = new Engine();

}

(2) 생성자

(3) 초기화 블럭

       - 인스턴스 초기화 블럭: {}

       - 클래스 초기화 블럭 : static {}

 

3. 초기화 블럭

▶ 클래스 초기화 블럭: 클래스 변수의 복잡한 초기화에 사용되며 클래스가 로딩될 때 실행됨

▶ 인스턴스 초기화 블럭: 생성자에서 공통적으로 수행되는 작업에 사용되며

      인스턴스가 생성될 때 마다 (생성자보다 먼저) 실행됨

      (생성자를 이용하면 되기 때문에 거의 사용되지 않으나,

       각 생성자에서 공통적으로 수행해야하는 작업을 따로 뽑아서 처리하는데 사용됨)

 

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

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

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

 

*초기화 순서

(1) 기본값 -> (2) 간단한 초기화 -> (3) 복잡한 초기화

*인스턴스초기화 순서

(1) 기본값 -> (2) 명시적 초기화 -> (3) 인스턴스 초기화블럭 -> (4) 생성자

 

출처: 남궁성의 자바의정석 강의자료

 

 

'Web Development > Java' 카테고리의 다른 글

[Java] 객체지향개념4  (1) 2024.01.16
[Java] 캡슐화, TDA 원칙  (2) 2024.01.13
[Java] 객체지향개념2  (1) 2024.01.09
[Java] 객체지향개념1  (1) 2024.01.09
[Java] 변수 타입간의 변환 방법  (1) 2023.12.28