클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

클래스와 객체 2 - 자바 클래스 만들기 1 : 객체 생성에서 생성자까지 실습 본문

프로그래밍 언어/자바

클래스와 객체 2 - 자바 클래스 만들기 1 : 객체 생성에서 생성자까지 실습

huenuri 2024. 8. 16. 11:43

이제 클래스를 만드는 실습을 진행하려고 한다. 전에는 공부한 자료를 각기 다른 워크스페이스에 담았는데 그렇게 하니 찾아보기가 힘들어서 요즘은 모두 하나의 작업공간 파일에 담고 있다.

근데 클래스부터는 패키지 하나에 여러 파일이 담기기 때문에 프로젝트를 여러 개 만들어야 할 것 같다. 이제 첫번째 실습부터 시작해보자!


 

 

 

 

1. 사람 클래스 만들기

 

 

Person 클래스

 

 

 

Person 클래스에는 필드와 메서드를 작성해서 객체를 생성하고 행동에 해당되는 메서드를 호출한다.

 

 

 

 

main 클래스

 

메인에서는 생성한 객체를 new라는 키워드를 통해 만들고 이를 변수로 불러올 수 있도록 한다. 참조 연산자를 통해 호출할 수 있음을 볼 수 있다.


 

 

 

 

실습 문제 풀어보기

 

 

이제 객체를 생성하는 방법을 어느 정도 알게 되었다. 문제를 혼자서 풀어보았다. 또 다른 예제 문제를 풀어보며 감을 익혀보기도 하자.


 

 

 

 

 

 

2. 저금통 클래스 만들기

::

앞에서 했던 것처럼 main과 메소드 클래스를 만들어 이 기능을 구현해볼 것이다.

 

 

 

 

 

 

 

 

설계도에서 객체를 생성한다. pig라는 공간(정적 메모리)에 주소값이 저장되어 있다. 이 주소값에는 PiggyBank에 만들어놓은 money, withdraw, showMoney 등의 공간이 동적 메모리로 할당되어 있는 것이다.

 


 

 

 

1) 필드와 메서드 만들기

 

 

필드와 메서드를 PiggyBank 클래스에서 만든다. 그런 다음 메인에서도 PiggyBank 클래스에서 만든 것을 불러오는데 다음과 같은 오류가 뜬다. 그 이유는 무엇일까? 이는 객체를 생성하지 않았기에 여기서 불러올 수 없는 것이다.

처음에는 공간만 만들고 값을 초기화시키지 않는다. 왜냐하면 처음에 초기화시키면 모든 값을 그대로 사용해야 하기 때문이다. 현재 이 필드에 값이 1만원으로 초기화된 상태이다.

입금하는 기능은 main에 설계되어 있고, PiggyBank 클래스에서는 이러한 정보를 입수받는 곳이다. 5천원을 deposit이라는 전달인자로 보내준다. main에 5000원이 들어가고


 

 

 

 

 

2) 객체 생성하고 매개변수로 타입 가져오기

 

 

이렇게 매개변수로 money를 넣어주자 빨간줄이 사라졌다. 하지만 아직 withdrow에서는 오류가 지워지지 않았다. 소리가 없어서 무슨 말인지는 확실히 잘 모르겠다.

 

 

 

 

 

이제 입금한 돈의 합계를 업데이트 해야 하는데 money라는 변수로 모두 같아서 어떤 것인지 구분하기 어렵다. 이럴때 this라는 키워드를 사용하면 이 문제를 쉽게 해결할 수 있다.


 

 

 

 

 

3) this 키워드를 사용해 변수에 값 저장하기

 

이제 withdraw에 있던 빨간줄도 사라졌다. 이건 main에서 매개변수를 int형으로 받을 수 있게 하자 사라진 것이다. 이제 인출과 입금을 할 때 그 값이 현재의 금액에 저장이 되고 있다.

this를 사용하지 않으면 매개변수의 값이 더해지기에 현재 필드에 있는 money 값을 가리키려면 this를 사용해야 한다.

 

showmoney()에서는 출력하는 기능이 없기 때문에 class에서 이러한 내용을 추가해준다. 이 부분은 매개변수가 없기에 바로 필드를 가리키고 있다.

 


 

 

 

 

 

 

 

4) 접근 제한자로 중요한 부분 감추기 + getter, setter로 값을 불러오고 수정하기

 

 

 

생성자는 아직 배우지 않았는데 이것까지 다루니까 좀 어렵다. 이 부분은 엘리스와 책으로 학습해볼 것이다. private으로 금액에 접근하지 못하도록 만들어주었다. 왜냐하면 사용자가 마음대로 값을 수정하면 안되는 부분이기 때문이다.

 

 

 

 

getter는 필드에 있는 값을 돌려주는 기능을 한다. 결과값을 돌려줄 때는 return을 사용해서 money로 반환된다.

 

 

 

 

 

setter는 필드를 수정하는데 main에서는 어떤 값을 수정할 것인지 보내주고 필드에서는 그 값을 받아준다. 그리고 받은 값으로 money를 바꿔준다.


 

 

 

 

5) 생성자로 값을 초기화시키기

객체 생성은 기본이고 필드는 초기화시키는 기능은 개발자가 만들어야 하는 것이다. 생성자는 사실 사용하고 있지만 생략되어 있다. new 옆의 PiggyBank()가 생성자이다.

 

 

 

 

이 생성자를 만들지 않으면 객체 생성에서 오류가 뜬다.

 

 

 

이렇게 기본 생성자에 아무것도 없을지라도 만들어주면 이러한 오류가 사라지는 것을 보게 된다. 이 문제를 가지고 한참을 고민했었다.

기본 생성자는 매개변수가 없는 생성자를 의미하며, 클래스에 생성자를 명시적으로 정의하지 않으면 컴파일러가 자동으로 기본 생성자를 추가한다. 그러나 클래스에 사용자 정의 생성자(매개변수가 있는 생성자)를 정의하면, 기본 생성자는 자동으로 추가되지 않는다.

 

문제점

PiggyBank 클래스에서 다음과 같은 생성자가 정의되어 있습니다:

public PiggyBank(int money) { 
	this.money = money; 
}
 
 
 

이 생성자는 객체를 생성할 때 int 타입의 매개변수를 요구한다. 그러나 Main 클래스에서 PiggyBank 객체를 생성할 때 매개변수를 제공하지 않고 기본 생성자를 사용하려고 한다.

 
 
PiggyBank pig = new PiggyBank();

 

이렇게 하면 컴파일 오류가 발생한다. 오류 메시지는 "The constructor PiggyBank() is undefined"일 가능성이 높다. 이는 기본 생성자가 정의되지 않았음을 의미한다.


 

 

해결 방법

문제를 해결하기 위해서는 두 가지 방법이 있다

  1. 기본 생성자 추가:
    • 매개변수를 받지 않는 기본 생성자를 PiggyBank 클래스에 추가한다. 이렇게 하면 PiggyBank 객체를 생성할 때 매개변수를 제공하지 않아도 된다.
  2. 객체 생성 시 매개변수 전달:
    • Main 클래스에서 PiggyBank 객체를 생성할 때 int 타입의 매개변수를 전달한다.
public PiggyBank() { 
	this.money = 0; // 기본 값으로 money를 초기화할 수 있습니다. 
}

 

PiggyBank pig = new PiggyBank(10000); // 10000원으로 초기화

 

객체 생성할 때 초기화시키고 싶은 값이 있으면 초기화시키면 된다. 생성자를 통해 객체 생성과 동시에 초기화시킬 수 있는 방법이다.

 

 

 

이렇게 입금한 돈 5000원과 인출한 1200원을 뺀 나머지 3800원이 현재 금액으로 출력되었다.


 

 

 

6) 이름도 출력되도록 하기

 

 

 

name을 사용하지 않았더니 노란줄이 뜨는 것 같아서 사용할 수 있게 메소드를 두 개 만들어주고 이를 출력하고자 했다. 하지만 이름에서 값이 null이 되었다.  이 부분을 어떻게 해결할 수 있을까?


 

 

 

7) 최종 수정하기

name 필드가 null로 출력되는 이유는 PiggyBank 객체를 기본 생성자 PiggyBank()를 사용하여 생성했기 때문이다. 기본 생성자는 name 필드를 초기화하지 않기 때문에 name 필드는 null로 남아 있다.

 

해결 방법

  1. 기본 생성자에서 name을 초기화: 기본 생성자에서 name 필드를 초기화할 수 있다.
  2. Setter 메서드 사용: 객체를 생성한 후에 setName() 메서드를 사용하여 name을 설정할 수 있다.
  3. 오버로딩된 생성자 사용: 객체를 생성할 때 오버로딩된 생성자 PiggyBank(int money, String name)를 사용하여 name을 초기화할 수 있다.

 

PiggyBank 클래스

 

 

 

main 클래스

 

 

오버로딩을 하는 방법을 사용해보았다. 정말 많은 것들을 배운 시간이었다. 선생님의 코드를 그대로 따라치는 것이 아니라 내가 하고 싶은대로 변경해보면서 깨닫는 바가 크다.


 

 

 

 

 

학습을 마치고

다음날 선생님께서 처음부터 다시 설명해주셔서 소리가 들어간 부분을 다시 들으면서 수업 내용을 정리해보았다. 2시간 반 넘게 이 공부를 진행하여 드디어 이해할 수 있게 되었다.

이제 생성자도 어느 정도 이해가 되었다. 다음 포스트에서는 책 학습을 통해 부족한 부분을 공부해볼 것이다.