[STUDY HALLE] 5주차 과제: 클래스

3 minute read

/* 실제로는 2021-03-04에 작성된 게시물입니다. */

학습 목표

자바의 Class에 대해 학습하세요.

  • 클래스 정의하는 방법
  • 객체 만드는 방법 (new 키워드 이해하기)
  • 메소드 정의하는 방법
  • 생성자 정의하는 방법
  • this 키워드 이해하기

Deadline: ~2020/12/19 15:00

클래스 정의

클래스
클래스는 객체지향 프로그래밍(Object-oriented programming)에서 객체를 생성하기 위해 상태(state)와 행동(behavior)을 정의하는 일종의 설계도이다. 즉, 객체(Object)를 찍어내는 틀이라고 할 수 있다. 클래스의 구조와 구성요소는 다음과 같다.

  • 필드 : 해당 클래스 객체의 상태를 나타내며, 멤버 변수라고도 불린다.
    • 인스턴스 변수 : 인스턴스(객체)가 갖는 변수이다. 인스턴스를 생성할 때 만들어지고, heap영역에 생성되어 gc에 의해 관리된다.
    • 클래스 변수 : static키워드가 앞에 붙으면 클래스 변수이다. 해당 클래스로 생성된 모든 인스턴스가 공유하는 변수로, 메소드영역에 할당된다.
  • 메소드 : 해당 클래스 객체의 행동을 나타낸다. 인스턴스 메소드와 클래스 메소드로 나뉜다.
  • 생성자 : 생성자는 객체가 생성된 직후 객체를 초기화하는데 사용된다. 리턴 타입이 없으며, 클래스에는 최소 한개 이상의 생성자가 있어야 한다.
class Car {                    // 클래스 이름
    private String modelName;  // 필드
    private int modelYear;     // 필드

    Car() {}                               // 생성자
    Car(String modelName, int modelYear) { // 생성자
        this.modelName = modelName;
        this.modelYear = modelYear;
    }

    public String getModel() { // 메소드
        return this.modelYear + "년식 " + this.modelName + " " + this.color;
    }
}

new 키워드

객체를 생성하기 이전에 우선 객체를 참조하기 위한 참조변수를 선언해야한다.

클래스이름 객체참조변수이름;
Car myCar;

그 후에 new 키워드를 사용하여 인스턴스를 생성하고, 해당 인스턴스의 주소를 미리 선언한 참조 변수에 저장하는 과정을 거친다.

객체참조변수이름 = new 클래스이름();
myCar = new Car();

혹은, 참조변수의 선언과 인스턴스의 생성을 동시에 할 수 있다.

Car myCar = new Car();

위에서 사용한 ‘new’키워드의 정확한 역할은 무엇일까?
new 키워드는 객체의 생성자 중 하나와 함께 사용되어 heap영역에 객체를 생성하고, 그 객체의 주소를 리턴해주는 역할을 한다.

메소드 정의하는 방법

메소드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라고 할 수 있다. 특정 작업에 대한 메소드를 작성해두면, 다시 그 작업을 하기 위해 다른 코드를 작성하지 않고 해당 메소드를 호출하면 되기 때문에 코드의 중복을 피할 수 있고, 기능 변경을 위한 유지보수도 쉬워진다.

접근제어자 반환타입 메소드이름(매개변수목록) { // 선언부
    // 구현부
}

public void accelerate(int speed, int second) {
    System.out.println(second + "초간 속도를 시속 " + speed + "(으)로 가속함!!");
}

접근 제어자 개념 같은 경우는 7주차 스터디 포스트에서 다루었으므로 넘어가도록 한다. 위처럼 클래스 내에 메소드를 정의해두면, 참조연산자(.)를 이용하여 호출할 수 있다.

Car myCar = new Car();
myCar.accelerate(10,10);

생성자 정의하는 방법

자바에서 생성자(constructor)의 이름은 해당 클래스의 이름과 같아야 한다. 즉, Car 클래스의 생성자의 이름은 Car 가 되어야 한다. 이러한 생성자는 다음과 같은 특징을 가진다.

  1. 생성자는 반환값이 없지만, 반환 타입을 void로 선언하지 않는다.
  2. 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있다.
  3. 객체를 초기화하는 방법이 여러 개 존재할 경우에는 하나의 클래스가 여러 개의 생성자를 가질 수 있다.
    즉, 생성자도 하나의 메소드이므로, 메소드 오버로딩이 가능하다.
클래스이름(인수1, 인수2, ...) { ... }

‘클래스에는 최소 한개 이상의 생성자가 있어야 한다’라는 제약이 있는데, 실제로는 생성자를 만들지 않고도 클래스를 이용해 인스턴스를 생성할 수 있다. 이것은 이것은 자바 컴파일러가 기본 생성자(default constructor)라는 것을 기본적으로 제공해 주기 때문이다. 기본 생성자는 매개변수가 없고, 아무 명령어도 포함하지 않는 생성자이다. 만약 생성자를 하나라도 정의한다면, 기본 생성자는 자동으로 추가되지 않는다.

this 키워드

this 참조 변수는 인스턴스가 바로 자기 자신을 참조하는 데 사용하는 변수로, 해당 인스턴스의 주소를 가리킨다.

class Car {
    private String modelName;
    private int modelYear;
    private String color;
    private int maxSpeed;
    private int currentSpeed;

    Car(String modelName, int modelYear, String color, int maxSpeed) {
        this.modelName = modelName;
        this.modelYear = modelYear;
        this.color = color;
        this.maxSpeed = maxSpeed;
        this.currentSpeed = 0;
    }
}

이러한 this 참조 변수를 사용할 수 있는 영역은 인스턴스 메소드뿐이며, 클래스 메소드에서는 사용할 수 없다. 위의 예시를 보면 멤버변수의 접근제어자가 private이므로, 외부에서 직접 값에 접근하는 것이 불가능하다. 때문에 생성자 혹은 인스턴스 메소드 내부에서 this키워드를 통해 접근하여 값을 변경하고 가져올 수 있게 되는 것 이다.

this() 메소드
this() 메소드는 생성자 내부에서만 사용할 수 있으며, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

class Car {
    private String modelName;
    private int modelYear;
    private String color;
    private int maxSpeed;
    private int currentSpeed;

    Car(String modelName, int modelYear, String color, int maxSpeed) {
        this.modelName = modelName;
        this.modelYear = modelYear;
        this.color = color;
        this.maxSpeed = maxSpeed;
        this.currentSpeed = 0;
    }

    Car(){
       this("소나타", 2012, "검정색", 160); // 다른 생성자를 호출함.
    }
}

단, 한 생성자에서 다른 생성자를 호출할 때에는 반드시 해당 생성자의 첫 줄에서만 호출할 수 있다.

참고문헌

http://www.tcpschool.com/java/

Leave a comment