자바스터디 5주차

Updated:

개요🙌

목표: 자바의 Class에 대해 학습하자.

학습할 것

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

객체지향 프로그래밍에서는 클래스(Class)는 객체의 청사진, 템플릿이라 하고, 쉽게 생각하면 붕어빵 틀이다. 클래스는 특정 상태(state)를 담고 있도록 하고, 특정 행위(behavior)를 할 수 있도록 정의한다.

클래스 정의하는 방법

자바에서 클래스는 객체의 정의, 유형(Type)을 나타낸다. 클래스는 fields, constructors, methods로 정의한다. fields로 특정 상태(state)를 담을 수 있고, methods를 통해 특정 행위(behavior)를 할 수 있도록 한다.

클래스 선언

<access modifier> class ClassName {
    // fields, constructors
    // methods
}

클래스 선언은 class라는 키워드를 사용하고 뒤에 클래스명을 입력하고 블록({}) 내에 fields, constructor, methods를 입력한다.

붕어빵 클래스

// class declaration
public class FishBread {

    // fields
    private String flavor;
    private String dough;
    private String topping;
    private int price;

    // constructor
    public FishBread(String flavor, String dough, int price) {
        this.flavor = flavor;
        this.dough = dough;
        this.price = price;
    }

    // method
    public void choiceTopping(String topping) {
        this.topping = topping;
    }

    public int getPrice() {
        return price;
    }

    @Override
    public String toString() {
        return "주문하신 붕어빵: [" + flavor + ", " + dough +"] 붕어빵은 가격 " + price + " 원 입니다.";
    }
}

클래스 명을 한글로도 쓸 수 있다. 하지만 한글로 사용하지 않는다.

Naming Convention

class를 선언할 때, 클래스명은 다음과 같은 Naming Convention을 지켜야 한다.

  • 클래스 이름은 명사
  • 첫 글자는 무조건 대문자(Captial Letter)
  • 카멜 케이스(낙타 대문자)
  • 축약어보단 명사 전체 단어를 다 작성해야 함.

객체 만드는 방법

클래스로부터 객체를 만들 때, new키워드로 객체를 생성한다.

FishBread fishBread = new FishBread("슈크림", "기본반죽", 500);

new키워드로 객체를 생성할 때, 생성자(constructor) 형태에 맞게 생성할 수 있다.

new 객체 생성 시 기억할 점

  1. new키워드로 객체 생성 시, runtime에 메모리에 할당된다.
  2. 객체는 메모리 중 heap영역을 차지한다.
  3. 생성자와 형태를 맞춰야 한다.

보통 객체를 생성할 때, new키워드로 생성하지만, 다른 방법도 있다.

new 키워드 말고 다른 객체 생성 방법

  • Class.forName() 메서드

자바에는 java.lang 패키지에 Class라는 미리 정의된 클래스가 있다. Class클래스를 이용하여 객체를 생성할 수 있다.

Class.forName()의 메서드 인자로 클래스패스를 넣으면 클래스 객체를 반환하는데, 클래스 객체 내에는 인자로 넘긴 클래스의 메타 정보(클래스이름, 클래스 생성자, 필드명, 메소드 명 등등)를 확인할 수 있다.

Class객체의 newInstance메서드를 통해서 객체를 생성하는 방법도 있지만, deprecated이다. 사용을 권장하지 않고 있다. 대신 생성자 클래스 Constructor클래스로 newInstance매서드를 통해 객체를 생성할 수 있다.

class_constructor_newinstance

  • clone() 매서드

clone()매서드를 사용하기 위해서는 해당 클래스가 Cloneable 인터페이스를 @Override해야 한다.

fish_bread_class_cloneable

이제 clone매서드를 사용해서 객체를 복사할 수 있다.

create_object_clone

  • 역직렬화(Deserialization)

역직렬화를 통해서도 객체를 만들 수 있는데, 다음에 정리하도록 하겠다.

메소드를 정의하는 방법

메소드를 정의하는 방법은 다음과 같다.

<access modifier> <return type> methodName(<parameter) {
    // @TODO
}

Naming Convention

  1. 메소드는 행위를 나타내기 때문에 메서드 명에 동사가 포함되도록 작성한다.
  2. 클래스와 다르게 첫 글자는 소문자로 작성하고 카멜 케이스를 따른다.

생성자를 정의하는 방법

생성자는 객체를 초기화 하는 데 사용된다.(생성 + 설정)

클래스를 정의할 때, 생성자를 필수로 들어가야 되며, 생성자를 따로 작성하지 않으면 default 생성자가 컴파일 타임에 작성된다.

<access modifier> ClassName (<parameters>) {
    //initialization
}

생성자에 대해 알아야 할 사항

  • 생성자 이름은 클래스 이름과 같아야 한다.
  • 생성자는 return type이 없다. (void가 아니라는 것 주의!)
  • 생성자는 입력을 받을 수 있다.(parameters를 가질 수 있다.)
  • overload를 할 수 있다.

생성자 overload 하는 방법

  • 입력으로 사용하는 매개변수 수를 다르게 한다.
  • 입력 매개변수의 개수가 같을 경우, 매개변수 타입의 순서에 따라 overload할 수 있다.

클래스에 생성자가 없을 경우

클래스에 생성자가 하나도 정의되어 있지 않을 경우, Java 컴파일러가 자동으로 default constructor를 생성한다.(컴파일 타임에)

default constructor란 매개변수 뿐만 아니라 블록({}) 내에 아무것도 없는 생성자를 말한다.

public class ConstructorClass {
    
    // default constructor
    public ConstructorClass {
        // empty
    }
}

만약, 클래스 내에 생성자를 하나라도 정의한다면, Java 컴파일러는 default constructor를 생성하지 않는다.

this

this는 자신 객체의 참조 변수이다. 그래서 생성자 또는 매서드 내에서 이름이 같은 변수지만, 앞에 this를 붙이면서, 구분할 수 가 있다.

또한 this()라는 코드도 볼 수 있는데, 이것은 자기 자신의 생성자를 의미한다. 또한, super도 있는데, 이것은 부모를 참조하는 변수로 상속 개념을 공부하고 정리하도록 하자.

참고자료

Comments