웹개발 교육/Java

[32일] Java (20) - 생성자 함수

ewok 2022. 9. 8. 13:18

생성자 함수(Constructor)

클래스명과 동일한 함수로 new 연산자와 함께 메모리를 할당할 때 사용한다. 클래스로부터 객체를 생성할 때 생성자가 호출되어 객체의 초기화를 담당한다.

 

객체 초기화는 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것이다. 생성자를 실행하지 않고는 클래스로부터 객체를 만들 수 없다.

 

모든 클래스에는 생성자함수가 반드시 존재하며 하나 이상을 가질 수 있다. 생성자함수 선언을 생략했다면 컴파일러가 { } 안에 기본 생성자함수를 자동으로 추가한다.

 

하지만 생성자함수를 선언하였다면 기본생성자함수는 자동으로 추가되지 않는다.

우리는 생성자함수를 직접 여러 개 선언할 경우가 많이 있다. 이 경우 기본생성자함수를 선언하짐 않으면 자동으로 추가되지 않기 때문에 기본생성자함수를 직접 생성할 것을 추천한다.

 

예시)

public class Sungjuk {

}
public class Sungjuk {
	public Sungjuk() { } //자동 추가
}

 

util 패키지 안에 있는 GregorianCalendar 클래스로부터 객체를 만들기 위해 생성자를 실행하였다.

package oop0908;

import java.util.GregorianCalendar;

public class Test02_constructor {

	public static void main(String[] args) {
				
		GregorianCalendar today = new GregorianCalendar();
		
		if(today.isLeapYear(2022)) {
			System.out.println("윤년");
		} else {
			System.out.println("평년");
		}//if end
		
		//문) 서기 1년 ~ 서기 2022년까지 윤년의 갯수를 구하시오
		//1)GregorianCalendar 클래스 활용(추천)
		int count1 = 0;
		for(int y=1; y<=2022; y++) {
			if(today.isLeapYear(y)) {
				count1++;
			}//if end
		}//for end
		System.out.println(count1); //502
				
	}//main() end
}//class end

 

생성자 함수도 오버로딩이 가능하다.

class School {
	//멤버변수 field (보통 private으로 준다)
	private String name;
	private int kor, eng, mat;
	private int aver;

	public School() { //기본 생성자 함수 default constructor
		              //자동으로 생성된다\
		System.out.println("School() 호출됨");
	}//end
	
	//생성자 함수도 오버로딩(함수명 중복정의)이 가능하다
	public School(String n) {
		name = n;
	}//end
	
	public School(int k, int e, int m) {
		kor = k;
		eng = e;
		mat = m;
	}//end
	
	public School(String n, int k, int e, int m) {
		name = n;
		kor = k;
		eng = e;
		mat = m;
	}//end

 

 

package oop0908;

import java.util.GregorianCalendar;

class School {
	//멤버변수 field (보통 private으로 준다)
	private String name;
	private int kor, eng, mat;
	private int aver;
	
	//생성자 함수 constructor
	//-> 클래스 명과 동일한 함수
	//-> 리턴형이 없다. public void School() { }  주의!!
	public School() { //기본 생성자 함수 default constructor
		              //자동으로 생성된다\
		System.out.println("School() 호출됨");
	}//end
	
	//생성자 함수도 오버로딩(함수명 중복정의)이 가능하다
	public School(String n) {
		name = n;
	}//end
	
	public School(int k, int e, int m) {
		kor = k;
		eng = e;
		mat = m;
	}//end
	
	public School(String n, int k, int e, int m) {
		name = n;
		kor = k;
		eng = e;
		mat = m;
	}//end
	
	//멤버함수 method
	void calc() {
		aver=(kor+eng+mat)/3;
	}//calc end
	
	public void disp() {
		System.out.println(name);
		System.out.println(kor);
		System.out.println(eng);
		System.out.println(mat);
		System.out.println(aver);
	}//disp() end
	
}//class end

public class Test02_constructor {

	public static void main(String[] args) {
		// 생성자 함수(Constructor)
		//-> 클래스명과 동일한 함수
		//-> new 연산자와 함께 메모리 할당할 때 사용한다
		//-> 오버로딩이 가능하다
		
		//소멸자 함수(Destructor) -> 자바에는 없음!
		//가비지 콜렉팅(Garbage Collecting)
        //->JVM이 자동으로 메모리 회수를 함.
		
		School one = new School();
		System.out.println(one.hashCode());
		one.calc();
		one.disp();
		
		//null 비어 있는 값
		String a = new String();    //빈 문자열
		String b = null;  //메모리 할당은 하지 않고 b라는 참조변수 선언만 해놓음
		System.out.println(a.length()); //글자 갯수 0
		System.out.println(b.length());

	}//main() end
}//class end

 

생성자 함수의 전달값은 객체 선언과 동시에 초기값을 전달해 주는 역할을 한다.

public School(String n) {
	name = n;
}//end

//멤버함수 method
void calc() {
    aver=(kor+eng+mat)/3;
}//calc end

public void disp() {
    System.out.println(name);
    System.out.println(kor);
    System.out.println(eng);
    System.out.println(mat);
    System.out.println(aver);
}//disp() end

public static void main(String[] args) {

    School two = new School("개나리");
    two.calc();
    two.disp();

class School {
    public School(int k, int e, int m) {
        kor = k;
        eng = e;
        mat = m;
    }//end

public class Test02_constructor {
	public static void main(String[] args) {
    
		School three = new School(10, 20, 35);
		three.calc();
		three.disp();

class School {
	public School(String n, int k, int e, int m) {
		name = n;
		kor = k;
		eng = e;
		mat = m;
	}//end
    
public class Test02_constructor {
	public static void main(String[] args) {
    
		School four = new School("진달래", 40, 50, 55);
		four.calc();
		four.disp();

 

두 방식 모두 사용이 가능하다.

String str1 = "손흥민";
String str2 = new String("박지성");
System.out.println(str1);  //손흥민
System.out.println(str2);  //박지성

 

※ 참고    소멸자 함수(Destructor) -> 자바에는 없음!
가비지 콜렉팅(Garbage Collecting)
JVM이 자동으로 메모리 회수를 함