본문 바로가기

JAVA/기본

생성자(Constructor)

생성자
객체가 만들어 질 때 초기값을 위해 실행되는 (특별한)메소드
객체가 생성될 때 자동으로 호출되는 메소드
생성자 안에는 값을 초기화 하는 코드가 있다.
생성자 안에서 변수를 선언하지 않는다.

생성자의 이름은 반드시 클래스 이름과 동일해야 한다.
생성자는 메소드이므로 여러 개 작성 가능(오버로딩)
생성자는 new 연산자를 통해 객체를 만들 때 한 번만 호출된다.
생성자는 리턴타입이 없다.

매개변수(전달인수)와 실행코드가 없는 단순 생성자를 '기본 생성자'라 한다.
또는 디폴트 생성자라고도 한다.
기본 생성자는 조건에 따라 자동으로 생성되기도 하고 직접 입력 해줘야 한다.

자동생성: 생성자가 하나도 없을 때 컴파일러가 자동으로 생성한다.
생성자가 하나라도 있을 경우 기본 생성자는 자동으로 생성되지 않는다.

 

왜 하는가?

-main()메소드를 간단 명료하게 제작(편하다)

-메모리 할당을 예약(참조변수)

-네트워크 관련 작업 등 여러가지 기능

 


public class Constructor_01 {

	public static void main(String[] args) {
		
		//객체가 생성되면 해당 이름으로 되어 있는 생성자가 있는지 확인
		//car 객체를 만들면 Car 클래스 안에 Car()로 되어 있는 생성자가 있는지 확인한다.
		Car car = new Car(); 
		
		//해당 클래스의 생성자가 없으면 자동생성해준다.
		Car2 car2 = new Car2();
		
		//해당 클래스의 생성자가 매개변수가 있는경우도 있다.
		Car3 car3 = new Car3("포르쉐", 30000);
	}

}

//생성자가 있는 클래스
class Car {
	int speed;
	
	//Car 클래스의 생성자
	//만약 없다면 컴퓨터가 자동으로 만들어준다
	Car(){
		System.out.println("Car 클래스에 생성자가 만들어졌습니다.");
	}
	
}

//생성자 없는 클래스
class Car2 {

}

//매개변수 생성자가 있는 클래스
class Car3 {
	
	String name;
	int price;
	
	//객체 생성할때 넣은 매개변수를 전역변수에 넣을 수 있다.
	Car3(String name, int price){
		this.name = name;	//매개변수이름과 멤버함수와 같으면 this를 붙여서 식별해준다.
		this.price = price; //this는 자기자신(Class)을 의미 즉! 여기선 class Car3의 멤버변수인 name과 price를 의미한다.
		System.out.println("차종: " + name +" / 가격: " + price);
	}
}

초기화

public class C15constructor {
    public static void main(String[] args) {
        
        MyClass15 o1 = new MyClass15(27);
        o1.printAge();
    
        //이렇게 초기화 하면 새로 생성된 인스턴스의 값이 들어감
        MyClass15 o2 = new MyClass15(30);
        o2.printAge();
    }

}

class MyClass15 {
    private int age;

    //생성자: 인스턴스 만들 때 처음 해야하는 일(코드) 작성
    //주로 필드 초기화 코드 작성
    //초기화가 안되면 age 값에 기존에 호출된 값이 남아있음
    MyClass15(int age) {
        this.age = age;
    }

    public void printAge() {
        System.out.println("age : " + age);
    }
}

상위 클래스에 생성자가 있는경우

public class C16extends {
    public static void main(String[] args) {
        
        MySubClass16 o1 = new MySubClass16();
        
    }
}

class MyClass16 {
    MyClass16() {
        
        //초기화 하는 코드 작성됨....
        System.out.println("상위 클래스 초기화 코드");
    }
}

class MySubClass16 extends MyClass16 {
    MySubClass16() {
        //상속받은 경우는 부모 클래스 생성자 호출이 꼭 되어야함 super();
        //맨위에 작성 얘가 먼저 작동해야함 무조건
        super();
        
        //MySubClass16 인스턴스 필드 초기화 코드들....
        System.out.println("하위 클래스 초기화 코드");
    }
}
반응형