본문 바로가기

자바 기초

자바 생성자, 생성자 오버로딩, 참조 자료형 - Do it ! 자바프로그래밍기초

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으로 사용하면 더 편하다.