JAVA/자바 기초

[JAVA]객체지향 프로그래밍(4)-생성자

다당근 2021. 10. 12. 10:23

📖이전글

객체지향 프로그래밍(1)-클래스와 객체,객체지향의의미,장단점

객체지향 프로그래밍(2)-객체와 인스턴스

객체지향 프로그래밍(3)-변수와 메서드

 

 

생성자

생성자란 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드' 이다. 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다.

생성자로 인스턴스 변수 초기화 하는 방법

1. new 연산자를 이용해 메모리(heap)에 Animal클래스의 인스턴스를 생성한다.

2. 생성자 Animal( )이 호출되어 수행된다.

3. 연산자 new의 결과로, 생성된 Animal 인스턴스의 주소가 반환되어 참조변수 c에 저장한다.

 

new연산자를 사용해야되는 것 까지는 알겠다.

그런데 2번에서 생성자 Animal( )은 어디서 호출되는 것일까?

 

사실 모든 클래스에는 반드시 하나 이상의 생성자가 있어야한다. 하지만 우리가 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 이유는 컴파일러가 제공하는 '기본 생성자' 때문이다.

컴파일 할 때, 소스파일(.java)의 클래스에 생성자가 하나도 없을 경우 컴파일러는 자동적으로 기본 생성자를 만든다. 매개변수도 없고 아무런 내용도 없는 간단한 기본 생성자이다.

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

따라서 2번에서 호출된 생성자Animal( )은 컴파일러가 자동적으로 만들어준 기본 생성자인 것을 알 수 있다.

 

생성자 만들기

생성자는 메서드처럼 클래스 내에 선언한다. 구조도 메서드와 비슷하지만 리턴값이 없다. 그렇다고 해서 생성자 앞에 리턴값이 없음을 뜻하는 void 를 사용하지는 않고, 단지 아무것도 적지 않는다. 생성자의 조건은 다음과 같다.

1. 생성자의 이름은 클래스의 이름과 같아야 한다.
2. 생성자는 리턴 값이 없다.

생성자는 다음과 같이 정의한다.

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

class Animal{
	Animal(){      //매개변수가 없는 생성자.
    	//...
    }
    Animal(int legs){      //매개변수가 있는 생성자
        //...
    }
}

컴파일러가 자동적으로 기본 생성자를 추가해주는 경우는 '클래스 내에 생성자가 하나도 없을 때' 이다. 매개변수가 있는 생성자를 만들었다면, 필요한 경우 꼭! 매개변수가 없는 생성자도 만들어 주어야 한다.

 

매개변수가 있는 생성자 사용하기

동물 클래스를 만들고, 이를 통해 토끼 객체 두개를 만들려고 한다.

매개변수가 있는 생성자를 통해 인스턴스를 생성할 때 동물의 나이를 지정해주자.

 

1. Animal 클래스에 기본생성자와 매개변수가 있는 생성자를 만든다.

public class Animal {

    int age=0;//기본 나이는 0살
    
    //이 메서드를 호출하면 동물이 자기 나이를 말합니다.
    void sayAge(){
        System.out.println("제 나이는 " + age + "살 입니다.");
    }
    
    Animal(){} //기본 생성자 생성
    
    Animal(int age){ //매개변수가 있는 생성자 생성
        this.age = age;
    }
}

2. 매개변수가 있는 생성자로 인스턴스를 생성하면, 매개변수로 넘긴 값이 age가 된다. 즉, 그냥 토끼는 2살이다.

기본 생성자는 age 값을 따로 설정해주지 않기 때문에 빨간 토끼는 기본 나이인 0살이 된다.

class AnimalTest{
    public static void main(String[] args) {
        Animal rabbit = new Animal(2); //매개변수가 있는 생성자로 인스턴스 생성
        Animal redRabbit = new Animal(); //기본 생성자로 인스턴스 생성
        
        //나이를 말해보세요
        rabbit.sayAge(); // 제 나이는 2살입니다.
        redRabbit.sayAge(); //제 나이는 0살입니다.
    }
}

참고

자바의 정석-남궁성