[Live Study] #5 클래스

Jihoon Oh·2021년 1월 19일
0

Live Study

목록 보기
5/13
post-thumbnail

목표

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

학습할 것 (필수)

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

클래스

자바는 객체 지향적 언어로, 모든 동작이 객체(Object)를 통해서 이루어진다. 클래스(Class)는 이런 객체를 정의하는 설계도나 틀이라고 볼 수 있는데, 클래스를 가지고 여러 객체를 생성하여 사용하게 된다. 클래스는 객체의 상태를 나타내는 필드(Field)와 객체의 행동을 나타내는 메소드(Method)로 구성된다.

public class Car {
    String modelName;
    int modelYear;
    String color;
    // 필드
    
    public String getColor() {
        return this.color;
    } // 메소드
}

### 클래스 정의하는 방법

클래스의 이름은 자바의 식별자 규칙에 따르며, 강제된 규칙은 아니지만 대체로 이름의 첫 글자를 대문자로 작성한다. 클래스를 작성할 때는 "클래스이름.java" 파일에 작성하며, 하나의 java 파일에 여러 클래스를 정의할 수는 있지만, public 접근 제어자를 붙일 수 있는 것은 java 파일명과 같은 클래스 하나 뿐이다. 하나의 java 파일에 여러 클래스를 정의 하더라도, 컴파일 시 바이트코드인 .class 파일은 클래스의 개수만큼 생성된다.

"클래스이름.java" 파일에 public 클래스를 정의할 때는
```java
public class 클래스이름 {
}

와 같이 정의한다. 예를 들어, Car라는 이름의 클래스를 정의할 때는

public class Car {

}

라고 선언할 수 있다.

객체 만드는 법

앞서 클래스는 객체의 설계도라고 비유했다. 실제 프로그램에 사용하기 위해서는 설계도를 가지고 실체를 만들어내야 한다. 자바에서는 클래스를 가지고 객체를 만들어 내는 것을 new 키워드로 할 수 있다.

public class Car {
    public static void main(String[] args) {
        Car car = new Car(); // new 키워드와 생성자를 통해 객체 생성
    }
}

이렇게 클래스 Car를 이용해 생성된 객체 car를 Car의 인스턴스(Instance)라고 한다. new 키워드를 통해 인스턴스를 만들면 생성된 인스턴스는 힙 영역에 생성되고, 스택 영역의 클래스 변수에 주소를 저장하여 사용한다.

같은 클래스로 만들었더라도, 서로 다른 인스턴스 간에는 서로의 멤버 변수를 참조할 수 없다.

메소드 정의하는 법

자바의 메소드는 다음과 같은 구조로 정의한다.

(접근제어자) (반환타입) (메소드 이름) ((매개변수)) {

}

// 예시

public String getColor() {
    return this.color;
}

접근제어자는 public, private 등 메소드의 접근 권한을 정의하는 역할을 하며, 반환 타입은 메소드가 최종적으로 return 할 자료의 타입을 의미한다. 매개변수는 메소드가 입력받는 자료를 정의한다.

때문에 메소드는 입출력에 따라 다음과 같이 네 가지의 경우가 나온다.

  • 입력과 출력이 모두 있는 메소드
    예) public int sum(int a, int b)
  • 입력과 출력이 모두 없는 메소드
    예) public void playGame()
  • 입력은 없고 출력은 있는 메소드
    예) public String getColor()
  • 입력은 있고 출력은 없는 메소드
    예) public void setName(String name)

만약 메소드에 static이나 final 키워드를 써야 한다면 접근제어자와 반환 타입 사이에 쓴다.

메소드의 이름이 같더라도, 매개변수가 다르다면 다른 메소드로 취급된다. 때문에 같은 이름으로 여러 가지 메소드를 작성할 수 있다. 이를 메소드 오버로딩이라고 한다. (상속에서 쓰이는 오버라이딩과 헷갈리지 말것)

메소드 오버로딩을 하려면 메소드의 이름이 같고 매개변수의 타입과 개수가 달라야한다. 이 때, 매개변수의 이름이나 메소드의 반환값 타입은 오버로딩에 영향을 미치지 않는다.

생성자 정의하는 방법

클래스를 통해 인스턴스를 만들려면 생성자(Constructor)가 필요하다. 생성자는 반환 타입이 없고(void가 아니다. 타입 자체가 존재하지 않는다.) 메소드명이 클래스와 동일한 메소드다. 생성자는 new 키워드를 통해 객체가 생성될 때 호출된다.

생성자는 메소드와 마찬가지로 입력을 받을 수 있다. 예를 들어 위에서 작성했던 Car 클래스의 생성자를 만들 때,

public class Car {
    public Car() {
    
    }

와 같이 매개변수 없이 생성자를 만들 수도 있고,

public class Car {
    public Car(String modelName) {
        this.modelName = modelName;
    }
}

와 같이 매개변수를 입력받아서 만들 수도 있다. 일반적으로 생성자가 매개변수를 받을 때는 해당 매개변수를 클래스의 필드값으로 초기화해서 사용한다.

만약 클래스를 작성할 때 생성자를 작성하지 않으면, 컴파일러가 자동적으로 내용이 비어있는 생성자를 추가한다.

생성자도 메소드기 때문에, 오버로딩이 가능하다. 때문에 매개변수가 다른 여러 개의 생성자를 작성할 수 있다.

public class Car {
    public Car() {
        
    }
    
    public Car(String modelName) {
        this.modelName = modelName);
    }
    
    public Car(String modelName, int modelYear) {
        this.modelName = modelName;
        this.modelYear = modelYear;
    }
}

this 키워드 이해하기

위에서 메소드와 생성자를 설명하면서 계속 this라는 키워드가 등장했다. 자바에서의 this는 인스턴스 자기 자신을 가리키는 키워드로, this에는 인스턴스 자기 자신의 주소가 들어있다. this 키워드를 통해 클래스의 생성자 및 메소드에서 필드에 접근할 수 있다. this가 인스턴스 자체가 아니라 인스턴스 자기 자신을 가리키는 "참조" 임에 주의하자.

일반적으로 this는 자기 자신의 멤버 변수를 표현하기 위해 쓰지만, 생성자가 여러개 있을 때 한 생성자 안에서 다른 생성자를 호출하는 역할도 한다.

public class Car {
    String color;
    int modelYear;
    
    public Car(String color) {
        this(color, 2020); // 생성자 안에서 다른 생성자 호출
    }
    
    public Car(String color, int modelYear) {
        this.color = color;
        this.modelYear = modelYear;
    }
}

참고 자료
https://wikidocs.net/214
https://wikidocs.net/281

profile
Backend Developeer

0개의 댓글