자바 공부기록7일차
-생성자 만들기
default생성자 말고 사용자가 직접 생성자를 만들 수 있다. 어떤 경우에 생성자를 직접 구현할까? 생성자는 주로 멤버 변수에 대한 값들을 매개변수로 받아 인스턴스가 새로 생성될 때 멤버변수의 값들을 초기화(선언)하는 역할을 한다.
즉 인스턴스가 생성됨과 동시에 멤버변수의 값을 지정하고 인스턴스를 초기화(선언)하기 위해 생성자를 직접 구현한다.
Person클래스를 생성할 때 이름을 매개변수를 받는 생성자를 구현해보자.
public class person
String name;
float height;
float weight;
public Person(String pname) {
name = pname;
}//사람 이름을 매개변수로 입력받아서 Person클래스 생성하는 생성자
}
새로 만든 생성자는 문자열 String형 매개변수를 하나 입력받아서 이름을 지정한다. 그런데 person클래스를 저장하면 컴파일되는 순간 이전에 만든 PersonTest.java 코드에서 오류가 발생한다.
public class PersonTest {
public static void main(String[ ]args) {
Person perosnLee = new Person( ); //Person오류
}
}
new Person
부분이 오류가 난 이유는 생성자를 직접 구현하여 디폴트 생성자가 없기 때문이다. 프로그래머가 생성자를 직접 추가하면 디폴트 생성자는 만들어짖 않는다. 오류를 없애려면 매개변수가 있는 생성자로 호출하거나 프로그래머가 디폴트 생성자를 직접 구현하면 된다.
직접 디폴트 생성자를 추가해보자.
public class Person {
String name;
float height;
float weight;
public Person( ) { } //디폴트 생성자 직접추가
public Person(String pname);
name = pname;
}
}
그런데 pname은 그냥 person 앞 글자를 따와서 pname이라고 한건가?책이 정말 불친절하군뇽
이렇게 person클래스를 생성할 때 두 생성자 중에 하나를 선택해 사용할 수 있다.
①디폴트 생성자로 클래스를 생성한 경우
Person personLee = new Person( );
②이름을 매개변수로 받아 클래스를 생성한 경우
Person personLee = new Person(이땡땡);
생성자 오버로드
이렇게 클래스에 생성자가 두 개 이상 제공되는 경우를 생성자 오버로드라고 한다.
✍잠깐 메모
객체 지향 프로그램에서는 메서드 이름이 같고 매개변수만 다른 경우를 '오버로드'라고 한다.
필요에 따라 매개변수가 다른 생성자를 여러 개 만들 수 있다. 클래스에 생성자를 여러 개 제공하면 이 클래스를 사용하는 코드에서는 원하는 생성자를 선택해 사용할 수 있다. 경우에 따라서는 클래스에서 일부러 디폴트 생성자를 제공하지 않기도 한다.
다음 Student클래스를 살펴보자.
public class Student {
int studentID;
}
학생이 생성될 때는 반드시 학번이 있어야 한다면 다음처럼 생성자를 제공할 수 있다.
public class Student {
int studentID;
public Student(int studentID) {
this.studentID = studentID;
} //학번을 매개변수로 입력받아 Student클래스를 생성하는 생성자
}
이러한 경우에 항상 학번을 사용해 Studnet클래스를 생성할 수 있다. 이 경우 생성자를 구현하지 않는다. 왜냐하면 학생이 생성 될 때 학번이 꼭 필요하기 때문이다. 매개변수가 있는 생성자를 추가한다고 해서 프로그래머가 꼭 디폴트 생성자를 추가로 작성해야 한는 것은 아니다.
생성자 오버로드에 대해 더 살펴보자. 앞에서 생성자의 역할은 주로 인스턴스 변수의 초기화라고 했다. 다음과 같이 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;
}//이름, 키, 몸무게를 매개변수로 입력 받는 생성자
}
위와 같이 Person 클래스가 있을 때 이 클래스를 사용하는 PersonTest.java 클래스는 다음과 같이 구현할 수 있다.
public class PersonTest {
Person perosnkim = new Person( );
personKim.name = "김유신";
personkim.weight = 85.5F;
personKim.height = 180.0F;
//디폴트 생성자로 클래스를 생성한 후 인스턴스 변수 값을 따로 초기화
Person personLee = new Person("이순신", 175, 75);
} //인스턴스 변수 초기화와 동시에 클래스 생성
}
위 예제는 디폴트 생성자를 사용하는 매개변수가 있는 생성자를 사용하는 두 가지 경우를 보여준다.
①위에 것은 디폴트 생성자를 사용하는 경우 클래스를 생성한 후 인스턴스 변수 값을 따로 초기화한다.
②밑에 것처럼 매개변수가 있는 생성자를 사용하면 생성자 내부에서 변수를 초기화할 수 있도록 구현되어 있어 코드도 간결하고 사용하기도 편리하다.