생성자 함수(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이 자동으로 메모리 회수를 함
'웹개발 교육 > Java' 카테고리의 다른 글
[32일] Java (22) - String 연습 문제 (0) | 2022.09.08 |
---|---|
[32일] Java (21) - String 클래스 (0) | 2022.09.08 |
[32일] Java (19) - Class (0) | 2022.09.08 |
[31일] Java (18) - Main (0) | 2022.09.07 |
[31일] Java (17) - 연습 문제 (0) | 2022.09.07 |