[Java] 07. 클래스를 작성하는 방법 (생성자를 작성하는 방법)


Study/Java  2020. 5. 6. 10:28

안녕하세요. 명월입니다.


이 글은 Java에서 클래스를 작성하는 방법(생성자를 작성하는 방법)에 대한 글입니다.


자바에서 클래스는 실행을 하기 위한 가장 최소 단위의 동작 형태입니다. 우리가 main 함수로 프로그램을 실행했습니다만, 구조로 확인해 보면 지금까지 전부 class의 키워드로 스택을 감싸왔습니다.

public class Program {
  public static void main(String[] args) {
    // 소스 작성
  }
}

위 예제는 Program의 클래스에 main함수를 작성해서 실행하는 예제 소스입니다.

정리하면 자바에서는 클래스가 없이는 프로그램을 작성할 수 없습니다. main함수만 있는 경우에도 클래스는 작성해야 합니다.

클래스 내부에는 어떤 것을 작성할 수 있냐면, 기본적으로 함수를 작성할 수 있습니다. 그리고 클래스의 크기를 결정하는 변수를 설정할 수 있고, 특수 함수인 생성자를 작성할 수 있습니다.

클래스 맴버 설명
생성자 클래스 초기화와 관련된 기능 처리
맴버 변수 필드라고 하는 멤버 변수는 전역 변수의 역할을 함
함수 메서드

이 세가지 속성에는 반드시 접근 제한자가 있어야 합니다. 접근 제한자는 설명할 내용이 많아서 따로 글을 작성하겠습니다.

일단은 변수는 private, 함수는 public으로 설정합시다.

// 클래스
public class Program {
  // 맴버 변수
  private int a;

  // 생성자
  public Program(int data) {
    // 생성자로 받은 데이터를 맴버 변수 a에 넣는다.
    this.a = data;
  }
  // 반환 값이 int형인 함수
  // void가 아니면 반드시 return이 있어야 한다.
  public int func() {
    // this를 붙이면 맴버 변수를 뜻 함.
    // 즉 맴버 변수 a를 반환한다.
    return this.a;
  }

  // 반환이 필요없는 함수
  // 반환값이 void이기 때문에 return이 필요없다.
  public void print() {
    // 콘솔 출력
    System.out.println("Print!");
  }
  // main 함수
  public static void main(String... args) {
    // Program 클래스 생성
    Program p = new Program(10);
    // 변수 p(Program 클래스)의 func함수 호출하여 int형을 반환 받음
    int ret = p.func();
    // 콘솔 출력
    System.out.println("ret = " + ret);
    // 변수 p(Program 클래스)의 print함수 호출
    p.print();
  }
}

처음 프로그램을 실행할 때는 static main에서 실행됩니다. static이 붙으면 클래스 내부의 변수나 함수가 아니라고 생각하면 됩니다.

즉, main이 Program 클래스 내부에서 작성되었지만 내부가 아닌 외부에 있다고 생각하면 됩니다.

main이 Program 외부이기 때문에 Program 클래스를 선언합니다.

클래스를 선언하는 방법은 new라는 키워드를 사용해서 선언합니다. new는 클래스의 메모리 할당입니다만,new에 대한 설명은 메모리 구조의 설명이 필요해서 따로 글을 작성하겠습니다.


간단하게 new Program를 사용하면 생성자가 실행됩니다.

생성자는 클래스 이름과 같은 함수명이며 반환자가 없습니다. 항상 new로 클래스가 만들어 질때 자동으로 실행되는 함수입니다.

생성자에도 파라미터를 넣을 수 있는데 이 파라미터는 클래스를 new로 할당할 때 파라미터를 넘기면 사용할 수 있습니다.

위 예제에서 생성자에 this.a를 사용해서 내부 맴버 변수 a에 파라미터의 값 10을 설정했습니다.


그리고 다시 main으로 돌아오면 Program 클래스가 p라는 변수에 할당이 되었습니다.

p라는 변수로 접근이 가능한 건 public의 접근 제한자가 있는 것 뿐입니다. 변수는 private이므로 직접 접근이 불가능합니다.

그러므로 가능한 건 func함수와 print함수 뿐입니다.

func함수에서는 this라는 키워드를 사용해서 클래스 내부의 맴버 변수 a를 반환했습니다.


main 측에는 ret 변수로 Program의 맴버 변수 a의 값을 설정합니다.

콘솔에 그 값을 출력하니, 생성자에서 설정한 a의 10의 값이 func함수를 통해 ret에 설정이 되고 그 결과 값이 10이 나왔습니다.


그리고 마지막에 변수 p(Program 클래스)의 print함수를 호출했습니다.

print함수 내부에서 콘솔 출력을 하므로 결과는 Print!라는 결과가 출력이 되었습니다.


Program클래스를 new로 선언하여 변수로 할당하기 전에는 func함수나 print를 사용할 수 없습니다. 할당없이 함수를 사용할 수 있는 건 static이 붙은 함수 뿐입니다.


Program 클래스를 작성하기 위해서는 클래스 파일명과 일치시켜서 파일을 생성해야 합니다.

마지막으로 클래스는 목적을 가진 객체로 생각하며 작성합니다.(그것이 객체 지향에서 이야기하는 핵심)


예제로 제가 가계부의 목적을 가진 클래스를 만들어 보겠습니다.

import java.util.List;
import java.util.ArrayList;

// 클래스
public class Privatefinance {
  // 맴버 변수
  // 입금에 관계된 변수
  private List<Integer> input;
  // 출금에 관계된 변수
  private List<Integer> output;
  // 생성자
  public Privatefinance() {
    // 리스트를 할당한다.
    this.input = new ArrayList<>();
    this.output = new ArrayList<>();
  }
  // 입금을 한다.
  public void input(int money) {
    // 맴버 변수에 금액을 추가한다.
    this.input.add(money);
  }
  // 출금을 한다.
  public void output(int money) {
    // 맴버 변수에 금액을 추가한다.
    this.output.add(money);
  }
  // 계산한다.
  public int calculator() {
    // 결과를 위한 변수
    int sum = 0;
    // 리스트에 저장된 모든 입금 금액을 더한다.
    for (int i = 0; i < input.size(); i++) {
      sum += input.get(i);
    }
    // 리스트에 저장된 모든 출금 금액을 뺀다.
    for (int i = 0; i < output.size(); i++) {
      sum -= output.get(i);
    }
    // 결과를 반환
    return sum;
  }

  // main 함수
  public static void main(String... args) {
    // Privatefinance를 선언
    Privatefinance p = new Privatefinance();
    // 5만원 입금
    p.input(50000);
    // 2천원 삼각 김밥 사먹음.
    p.output(2000);
    // 3천원 피시방
    p.output(3000);
    // 만원 점심 값
    p.output(10000);
    // 현재 잔액은?
    System.out.println("Current Balance - " + p.calculator());
  }
}

35000원이라는 결과가 나왔습니다. 이 가계부 클래스에는 입금과 출금을 받고 입출금을 계산하는 목적을 가진 클래스입니다.

여기서 내역을 추가하면 그에 따른 리스트도 추가하고, 이자 계산 등의 처리를 추가하면 이 클래스 하나로 가계부를 처리할 수 있는 객체를 만들 수 있습니다.


그런데, 여기에 뜬금없이 요리 레시피에 관계된 내용이 추가가 되면.. 클래스는 짬뽕이 되고 단일의 목적성을 잃어버리게 됩니다. 이게 프로그램으로 작성을 못 한다는 건 아니지만, 개발 방법론에서는 매우 좋지 않는 형태의 개발 형태입니다.


여기까지 Java에서 클래스를 작성하는 방법(생성자를 작성하는 방법)에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.