생성자

생성자는 클래스로부터 객체를 생성할 때 자동으로 호출되는 메소드를 말한다. 객체의 멤버 변수 초기화를 담당하는 특수한 목적의 메소드이다.

 

생성자의 개념과 특징

  • 메소드 이름이 클래스 이름과 동일하다.
  • 리턴 타입이 없으며, void조차 허용하지 않는다.
  • 객체 생성 시 자동으로 호출되며, 일반 메소드처럼 참조 변수를 통해 호출할 수 없다.
  • 생성되는 객체의 멤버 변수 초기화를 담당한다.
  • 생성자가 하나도 정의되지 않은 클래스에는 기본 생성자가 자동으로 제공된다.
  • 하나의 클래스에 여러 개의 생성자를 오버로딩 할 수 있다.
  • this() 형태의 특수한 생성자가 있다.

 

기본 생성자

기본 생성자는 매개변수가 없는 생성자를 의미한다.

생성자의 가장 중요한 기능이 멤버 변수의 초기화인데, 기본 생성자는 매개변수를 가질 수 없기 때문에 멤버 변수를 기본값으로 초기화한다.

그래서 기본 생성자라는 이름을 갖게 된 것이다.

 

기본 생성자의 또 다른 특징으로는 클래스에 생성자가 하나도 없을 때 기본으로 제공된다는 것이다. 따라서 다음 두 클래스는 동일한 코드라고 볼 수 있다.

 

public class Student {
	String name;
    int score;
}
public class Student {
	String name;
    int score;
    
    Student() {}
}

 

 

생성자를 통해서 객체의 멤버변수를 초기화 하기

// 1. 클래스 선언부
public class Student {
    public String name;
    public int score;
    public boolean isPassed;
    public String major;

    public Student() {}

    public Student(String stdName, int stdScore, boolean stdIsPassed, String stdMajor) {
        name = stdName;
        score = stdScore;
        isPassed = stdIsPassed;
        major = stdMajor;
    }

    public void printInfo() {
        System.out.println(name + "의 전공 : " + major + " 점수 : " + score + " 시험 통과 여부 : " + isPassed);
    }

}

public Student() {}  는 기본생성자이고, 그 아래에 매개변수를 가지고 있는 public Student( ... ) {} 는 멤버변수 값을 초기화 해주는 오버로딩된 생성자이다.

 

기본 생성자로 객체를 선언하게 되면 멤버변수값들이 아래와 같이 기본값으로 초기화가 된다. int type의 score 는 0, boolean 타입의 isPassed는 false, 참조 변수 타입인 name, major는 null 값을 갖게 된다.

public class Main {
    public static void main(String[] args) {
        Student millpre = new Student();
        millpre.printInfo();
    }
}

 

아래와 같이 매개변수를 넣어 선언하게 되면 매개변수에 맞게 멤버변수 값들이 초기화 되는 것을 확인할 수 있다.

public class Main {
    public static void main(String[] args) {
        Student millpre = new Student("millpre", 90, true, "cs");
        millpre.printInfo();
    }
}

 

this() 생성자

생성자의 이름은 반드시 클래스의 이름과 동일해야 한다. 그런데 생성자 중에 클래스의 이름을 사용하지 않는 this() 라는 독특한 생성자가 존재한다.

this() 생성자를 이용하면 같은 클래스에 있는 다른 생성자를 호출할 수 있다. 이를 통해 생성자 내의 코드 중복을 제거할 수 있다.

코드를 보면 바로 이해할 수 있을 것이다.

// 1. 클래스 선언부
public class Student {
    public String name;
    public int score;
    public boolean isPassed;
    public String major;

    public Student() {}
    
    public Student (String stdName, int stdScore) {
        name = stdName;
        score = stdScore;
    }

    public Student(String stdName, int stdScore, boolean stdIsPassed, String stdMajor) {
        this(stdName, stdScore);
        isPassed = stdIsPassed;
        major = stdMajor;
    }

    public void printInfo() {
        System.out.println(name + "의 전공 : " + major + " 점수 : " + score + " 시험 통과 여부 : " + isPassed);
    }

}

 

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] Enum 열거형  (0) 2023.11.04
[JAVA] Getter/Setter  (0) 2023.11.02
[JAVA] 값 복사와 주소 복사  (0) 2023.10.25
[JAVA] Java Collections / Array / ArrayList  (2) 2023.10.25
[JAVA] 테스트코드 작성하기  (1) 2023.10.24

클래스

클래스는 현실 세계의 객체를 추상화하여 소스 코드 형태로 만든 결과물이며, 자바 프로그램의 가장 기본이다. 이런 클래스의 구조와 문법에 대해서 구체적으로 살펴보자.

 

클래스의 구조

클래스는 class 라는 예약어를 사용하여 선언하며, 클래스의 일반적인 구조는 다음과 같다.

// 클래스 선언부
class 클래스 이름 {
	// 멤버 변수 선언
    
    // 생성자 메소드 선언
    
    // 메소드 선언
}

먼저 class 라는 예약어 뒤에 클래스 이름이 온다. 그리고 클래스 이름 뒤에는 클래스에 대한 시작 블록이 등록하고, 이 블록 안쪽에 클래스의 구성 요소들이 선언된다.

 

클래스는 멤버 변수, 생성자 메소드 그리고 일반 메소드로 구성되며, 각 요소의 순서는 바뀔 수 있다. 즉, 멤버 변수가 맨 아래 선언돼도 상관없다는 의미다. 하지만 일반적으로는 위 순서대로 작성하는 것이 가독성 측면에서 바람직하다.

 

위와 같은 구조로 학생에 해당하는 Student 클래스를 작성한다면 다음과 같은 형태가 될 것이다.

//  1. 클래스 선언
class Student {
    // 2. 멤버 변수 선언
    String name;
    int score;
    
    // 3. 생성자 메소드
    Student() {
        System.out.println("---> Student 객체 생성");
    }
    
    // 4. 메소드
    void printInfo() {
        System.out.println(name + "의 점수 : "+ score);
    }



}

 

자바는 하나의 파일에 하나의 클래스를 작성하는 것을 원칙으로 한다. 가끔 테스트를 목적으로 하나의 파일에 여러 클래스를 작성하기도 하지만, 이런 경우 public 예약어가 붙은 클래스는 하나만 지정할 수 있다. 그리고 반드시 다음과 같이 public 예약어가 붙은 클래스를 파일 이름으로 지정해야 한다.

public class MainClass {
	
}

class subClass {
}

 하나의 파일에 여러 클래스를 작성한 경우, 자바 파일은 MainClass.java 로 하나지만 컴파일 결과로 만들어진 .class 파일은 클래스 수 만큼 만들어진다.

즉 위 코드를 컴파일하면 MainClass.class, subClass.class 두개의 클래스가 만들어진다.

 

클래스 선언부

클래스 선언부에는 가장 먼저 class 라는 예약어가 등장한다. class는 지금부터 새로운 클래스가 정의된다는 것을 JVM에게 알려준다. class 예약어 뒤에 나오는 Student 가 클래스 이름이며, 클래스 이름은 대문자로 시작한다는 것만 제외하면 변수 이름 규칙과 동일한 규칙을 적용받는다.

 

멤버 변수

클래스 선언부 바로 밑에는 가장 먼저 멤버 변수가 등장한다. 멤버 변수는 클래스에 속한 변수라고 하여 '클래스 변수' 또는 '필드' 라고 하는데, 우리는 이후에 진행되는 모든 설명과 실습에서 멤버 변수로 통일하여 부를 것이다.

 

멤버 변수는 우리가 알고 있는 일반 변수와 동일하다. 다만 지금까지 사용했던 변수가 main()이라는 특수한 메소드 안에서만 선언되고 사용됐던 로컬 변수라면, 멤버 변수는 main() 메소드가 아닌 다른 메소드에서도 사용할 수 있는 글로벌 변수이다. 심지어 다른 클래스에서도 사용할 수 있다.

 

래스에서 멤버변수가 중요한 이유는 클래스로부터 객체가 생서될 때 객체에 포함되는 유일한 요소이기 때문이다. 즉, 클래스로부터 생성된 객체는 생성자 메소드나 일반 메소드는 포함하지 않고 오직 멤버 메소드만 포함한다.

 

우리가 프로그램에서 객체를 이용한다는 것은 결국 멤버 변수에 할당된 데이터를 이용한다는 것을 의미한다. 또한 클래스에 포함된 생성자나 메소드는 모두 멤버 변수를 위해 존재한다.

 

생성자 메소드

멤버 변수 다음에 등장하는 것이 생성자(constructor)메소드다. 생성자 라고도 부른다. 생성자는 클래스 이름과 동일한 이름을 가지고 있으며, 기능적으로는 멤버 변수의 초기화를 담당한다. 

생성자 역시 큰 범위에서 보면 메소드에 해당하기 떄문에 누군가에 의해 호출되어야만 한다. 생성자가 호출되는 시점은 클래스로부터 객체(인스턴스)를 생성할 때다. 즉, 생성자를 통해 클래스로부터 객체를 생성할 수 있으며, 이때 객체에 포함되는 멤버변수 초깃값을 갖게 된다. 

 

메소드

클래스 마지막에 선언된 것이 메소드인데, 메소드를 함수(function)와 동일한 개념으로 이해하면 쉽다. 즉, 메소드는 객체가 제공하는 동사적 특징인 기능이다. 클래스에 선언된 메소드를 실행하기 위해서는 우선 메소드가 포함된 클래스의 객체가 생성되어야 한다. 그래야 객체를 참조하는 참조변수를 통해서 메소드를 호출할 수 있다.

 

대부분의 메소드는 메소드 이름에 해당하는 기능을 제공하며, 메소드에 포함된 기능이 실행되기 위해서는 데이터가 필요하다. 이런 데이터는 메버 변수에 할당된 데이터를 이용할 수도 있지만, 매개변수를 통해 전달된 데이터를 이용할 수도 있다. 

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] 접근 제어자  (0) 2023.10.19
[JAVA] 클래스 Class (3)  (0) 2023.10.18
[JAVA] 클래스 Class (1)  (0) 2023.10.18
[JAVA] 버블 정렬 알고리즘  (0) 2023.10.18
[JAVA] 참조 변수와 null  (0) 2023.10.18

+ Recent posts