public class Person {
String name;
float height;
float weight;
}
public class PersonTest {
public class void main(String[ ] args) {
Person personLee = new Person();
}
}
PersonTest 클래스에서 클래스를 생성할 때 사용하는 Person()같은 함수를 생성자라고 한다.
클래스의 멤버 변수는 메서드에 의해 값이 변경될 수도 있지만, 처음 클래스를 생성할 때 값을 정해야 하는 경우도 있다.
생성자가 하는 일은 클래스를 처음 만들 때 멤버 변수나 상수를 초기화하는 것이다.
위의 Person 클래스를 보면 생성자가 따로 없지만 new Person()을 사용해서 객체를 만들 수 있었다.
생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자바 컴파일러에서 자동으로 생성자를 만들어 주는데, 이렇게 만들어진 생성자를 디폴트 생성자라고 한다. 매개 변수가 없고, 구현 코드 또한 없다.
public class Person {
String name;
float height;
float weight;
public Person(String pname) {
name = pname;
}
}
생성자는 주로 멤버 변수에 대한 값들을 매개 변수로 받아서 인스턴스가 생성될 때 멤버 변수 값들을 초기화 하는 역할을 한다. 즉 인스턴스가 생성됨과 동시에 멤버 변수의 값을 지정하고 인스턴스를 초기화하기 위해 생성자를 직접 구현하여 사용한다.
위 코드는 pname 매개변수를 받아서 이름을 지정한다.
자바 컴파일러는 생성자가 하나도 없는 경우에만 디폴트 생성자를 제공하는데, 위 코드의 경우네는 생성자를 직접 구현한게 있기 때문에 main 함수 내에서 new Person();을 사용하면 오류가 난다.
public class Person {
String name;
float height;
float weight;
public Person(String pname) {
name = pname;
}
public Person() { } // 디폴트 생성자 직접 추가
}
오류를 없애기 위해서는 매개변수가 있는 생성자로 호출하거나 디폴트 생성자를 추가로 직접 구현하면 된다.
그리고 위 코드처럼 생성자가 두 개 이상 제공되는 경우를 생성자 오버로드라고 한다.
public class Person {
String name;
float height;
float weight;
public Person() { } // 디폴트 생성자 직접 추가
public Person(String pname) {
name = pname;
}
public Person(String pname, float pheight, float pweight) {
name = pname;
height = pheight;
weight = pweight;
}
위 코드처럼 여러 가지 생성자를 제공한다면 이 클래스를 사용하여 인스턴스를 만드는 경우에 필요한 생성자를 골라서 사용할 수 있다.
public class PersonTest {
public static void main(String[ ] args) {
Person personKim = new Person();
personKim.name = "김유신";
personKim.weight = 85.5F;
personKim.height = 180.0F; // 디폴트 생성자로 클래스 생성 후 변수 값을 따로 초기화
Person personLee = new Person("이순신", 175, 75); // 인스턴스 변수 초기화와 동시에 클래스 생성
}
}
크기가 정해진 기본 자료형(int, float, double 등)으로 선언하는 변수가 있고,
클래스형으로 선언하는 참조 자료형 변수가 있다.
public class Student {
int studentID;
String studentName;
int koreaScore;
int mathScore;
String koreaSubject;
String mathSubject;
}
학생 클래스에 학번과 이름이 있고, 수학과목과 점수, 국어과목과 점수가 있다. 이렇게 하면 뭔가 좀 찝찝하지 않나 ????
학생에 대한 클래스인데 과목에 대한 변수가 계속 늘어날 수도 있다.
과목의 이름과 성적을 분리해서 Subject라는 클래스를 따로 만들고, 학생 클래스에 클래스형 변수 Subject를 추가해보자.
public class Subject {
String SubjectName;
int scorePoint;
}
public class student {
int studentID;
String studentName;
Subject korean; // Subject형을 사용하여 선언
Subject math;
}
기존에는 koreanSubjectName, mathSubjectName 이렇게 두 개의 이름 변수를 추가해야 하지만,
Subject 클래스를 분리하면 subjectName은 Subject 클래스에 선언하면 된다. 국어과목 이름은 korean.subjectName으로 사용하면 더 편하다.
'자바 기초' 카테고리의 다른 글
자바 static 변수, 클래스 변수- Do it! 자바프로그래밍기초 (0) | 2022.07.19 |
---|---|
자바 객체 간 협력 - Do it! 자바프로그래밍기초 (0) | 2022.07.19 |
자바 접근제어자, public, private - Do it ! 자바프로그래밍기초 (0) | 2022.07.19 |
자바 클래스 인스턴스 - Do it ! 자바프로그래밍기초 (0) | 2022.07.19 |
자바 class, 함수, method, - Do it 자바프로그래밍기초 (0) | 2022.07.19 |