본문 바로가기
그 외 프로그래밍 언어/Java

자바, 저금통 만들기 (feat. this와 private, 그리고 생성자)

by Dreaming Coder 2021. 12. 13. 20:03

 


 

계속해서 객체지향 프로그래밍을 해보겠습니다.

그러면서 그동안 무슨 뜻인지도 몰랐지만 일단 몇 번 써봤었던 private라는 접근 제한자에 대해서 알아보겠습니다.

덤으로 this라는 키워드와 '생성자'라는 것에 대해서도 배우겠습니다.

 

 

 

지난 포스트

 

자바, 간단한 객체지향 프로그래밍을 해봅시다.

지난 포스트에서 공부한 객체지향 프로그래밍을 이해하기 위해 간단한 코드를 짜보도록 하겠습니다. 지난 포스트 자바, 객체지향 프로그래밍 (OOP) 갈수록 점점 더 어려워집니다. 이번에는 메소

gogogameboy.tistory.com

 

 

 

다시 보는 접근 제한자의 종류

 

 

자바, 메소드(method)의 기본 구조

이번에는 메소드method에 대해서 배워봅시다. 처음에는 분명 어렵고 복잡하게 느껴질 수도 있지만, 일단 해보면 조금씩 이해가 되실 겁니다. 지난 포스트 자바, 2차원 배열의 중복되는 코드를 for

gogogameboy.tistory.com

메소드의 기본 구조에 대해서 공부할 때 '접근 제한자'라는 것을 배웠고,

접근 제한자의 종류에는 public, protected, default, private, 4가지가 있다고 했습니다.

 

 

 

 

자바, 메소드(method) 실습 2

메소드에 익숙해지기 위해서 또 메소드 실습 문제를 풀어나가 보겠습니다. 지난 포스트 자바, 메소드(method) 실습 지금까지 공부한 내용들로 이번에는 문제를 보고 직접 메소드를 만들어봅시다.

gogogameboy.tistory.com

 

자바, 제곱 값 구하는 메소드 만들기

자꾸 새로운 문제들로 메소드를 반복하고 있는데, 문제를 푸는 것보다 중요한 것은 메소드에 익숙해지는 것입니다. 이번에도 메소드의 동작 원리에 익숙해지는 것을 의식하면서 공부해봅시다.

gogogameboy.tistory.com

 

자바, 메소드 오버로딩 (중복정의)

이번에는 메소드 오버로딩(중복정의)에 대해서 배워보겠습니다. 지난 포스트 자바, 제곱 값 구하는 메소드 만들기 자꾸 새로운 문제들로 메소드를 반복하고 있는데, 문제를 푸는 것보다 중요한

gogogameboy.tistory.com

그리고 지금까지 지난 포스트들 중에서 위의 3개의 포스트에서 무슨 뜻인지도 모르고 private 접근 제한자를 사용한 적이 있습니다.

이번 포스트에서는 private라는 키워드에 대해서 설명을 해드리겠습니다.

먼저 코드부터 보시겠습니다.

 

 

 

 

객체지향 프로그래밍으로 저금통 만들기

 

package 저금통;

public class BankBook {
	
	// 설계도면
	// 1. Field(속성)
	// - 이름(name)
	String name;
	// - 잔액(money)
	int money;
	
    
	
	// 2. Method(기능)
	// - 돈을 입금하기(deposit), 매개변수로 정수형 데이터, 리턴타입은 없음.
	public void deposit(int money) {
		this.money += money;	// this = 현재 내 클래스를 지칭!
	}
	
	// - 돈을 출금하기(withdraw), 매개변수로 정수형 데이터, 리턴타입은 없음.
	public void withdraw(int money) {
		this.money -= money;
	}
	
	// - 잔액 보여주기(showMoney). 매개변수 없음, 리턴타입은 없음.
	public void showMoney() {
		System.out.println(name + "님의 잔액 : " + money + " 달러");
	}

}

 

저금통이라는 패키지를 만들고 BankBook이라는 이름으로 클래스(설계 도면)를 만들었습니다.

public void deposit(int money)는 돈을 입금할 때 사용하는 메소드이고,

public void withdraw(int money)는 출금할 때 사용하는 메소드입니다.

그리고 마지막으로 잔액을 보여주는 메소드인 public void showMoney() 가 있습니다.

위의 코드는 아직 완성된 코드는 아니고, 접근 제한자 private에 대해서 설명을 하면서 코드가 바뀔 예정입니다.

 

 

 

this

 

일단 위의 코드에서 주목할만한 새로운 키워드는 this입니다.

this.money 라는거 보이시죠?

money 앞에 this가 붙은 this.money는 메소드 내의 매개변수인 money가 아니라

필드(속성)에서 만들어진 잔액을 뜻하는 int money; 입니다.

만약 위의 코드에서 this.를 빼버린다면 메소드 내의 두 개의 money는 전부 매개변수로 변해버릴 것입니다.

이렇게 필드를 확실하게 지칭해주고 싶을 때 this. 라는 키워드를 씁니다.

 

여기서 의문이 생길 수도 있습니다.

'굳이 this. 라는걸 쓰지 않고 매개변수의 이름을 다른 것으로 주면 되지 않나?'

 

일단 this. 라는 것을 보여주기 위해서 매개변수의 이름도 일부러 똑같이 money로 줬습니다.

위의 코드처럼 간단한 코드라면 굳이 this를 쓰지 않아도 복잡하게 보이지 않을 수도 있는데,

점점 커져가고 복잡해져 가는 프로그램을 만들게 된다면 수십 개의 변수명들이 생길 수도 있습니다.

그런 때에 헷갈리지 않기 위해서 필드에서 가져오는 변수들 앞에는 this.를 붙여서 확실히 지칭해주는 것이 좋습니다.

 

 

 

private

 

저금통Main 오브젝트입니다.

 

BankBook 설계 도면으로 bank 객체를 생성해줬고,

이름과 잔액도 추가를 했습니다.

 

그런데 잔액을 추가하는 코드를 일부러 각각 다른 방법으로 두 줄의 코드를 썼습니다.

일단 두 가지 방법으로 다 잔액을 추가하는 것이 가능하고, 문제도 없어 보입니다.

 

그런데 사실 bank.money = 7000;bank.deposit(7000); 은 큰 차이가 있습니다.

bank.deposit(7000); 은 설계 도면에 만들어놓은 돈을 입금하는 기능을 하는 메소드를 사용한 것이고,

bank.money = 7000; 은 직접 내 계좌를 열어서 7000을 집어넣은 것입니다.

이렇게 되면 객체지향 프로그래밍의 특징 4가지 중에서 캡슐화에 위배가 됩니다.

이것은 사용자가 설계자의 설계 도면(필드)에 함부로 접근을 해서 값을 마음대로 바꾸는 것입니다.

 

 

 

 

그래서 다시 설계 도면인 BankBook으로 가서 name과 money의 앞에 private이라는 키워드를 달아줍니다.

 

 

 

그러고 나서 다시 Main으로 돌아가 보면 private 키워드를 달아준 name과 money에 직접 값을 넣었던 코드들에 에러가 떠있는 것을 볼 수가 있습니다.

이제 private을 달아준 설계 도면에 함부로 접근을 할 수가 없게 된 것입니다.

우리가 만들고 공개를 시킨 메소드를 통해서만 들어올 수 있게끔 바뀐 것입니다.

 

 

 

생성자 (constructor)

 

다시 설계 도면으로 이동해서 위와 같은 코드를 추가시켰습니다.

메소드는 메소드인데 뭔가 지금까지의 메소드와는 조금 다른 점이 있습니다.

오브젝트(객체)를 생성할 때 필드(설계 도면)에 있는 데이터를 처음부터 채워줄 수 있게끔 하는 생성자라고 하는 메소드입니다.

 

이 생성자 메소드는 위의 이미지에서 주석으로 처리된 글에 쓰여있는 것과 같이,

생성자 메소드의 이름은 클래스의 이름과 동일해야 합니다. 대소문자까지 완벽하게 말이죠.

그리고 리턴 타입을 지정하지 않습니다. void 조차도 쓰지 않습니다.

 

 

 

 

package 저금통;

public class BankBook {
	
	// 설계도면
	// 1. Field(속성)
	// - 이름(name)
	private String name;
	// - 잔액(money)
	private int money;	// 필드에 private 키워드를 추가함.
				// -> OOP의 특징 중에 캡슐화(정보 은닉) 지켜주기
	
	
	// 2. Method(기능)
	// 객체를 생성할 때 Field에 있는 데이터를 초기화 시킬 수 있는 메소드 생성
	// 생성자(constructor)
	// 1) 생성자도 메소드이다.
	// 2) 메소드의 이름은 클래스의 이름과 동일하다.
	// 3) 리턴 타입을 지정하지 않는다.
	public BankBook(String name, int money) {
		this.name = name;
		this.money = money;
	}
	


	// - 돈을 입금하기(deposit), 매개변수로 정수형 데이터, 리턴타입은 없음.
	public void deposit(int money) {
		this.money += money;	// this = 현재 내 클래스를 지칭!
	}
	
	// - 돈을 출금하기(withdraw), 매개변수로 정수형 데이터, 리턴타입은 없음.
	public void withdraw(int money) {
		this.money -= money;
	}
	
	// - 잔액 보여주기(showMoney). 매개변수 없음, 리턴타입은 없음.
	public void showMoney() {
		System.out.println(name + "님의 잔액 : " + money + " 달러");
	}

}

 

 

 

위의 소스 코드는 PC에서 드래그 후,
ctrl+x로 잘라내서 다른 곳으로 붙여넣기가 가능합니다.
ctrl+c(복사)는 불가능합니다.

 

 

 

결국 최종적으로 수정이 된 클래스(설계 도면)와 오브젝트입니다.

 

 

 

package 저금통;

public class Main {

	public static void main(String[] args) {
		// 실행공간
		// 1. BankBook 설계도면을 가지고 bank 객체 생성
		BankBook bank = new BankBook("미스티", 1000);
		
		// 2. bank 객체의 잔액에 7000을 추가해주세요.
		bank.deposit(7000);
		
		// 3. 잔액을 출력
		bank.showMoney();
		
		// 4. bank 객체의 잔액에서 2000을 출금해주세요.
		bank.withdraw(2000);
		
		// 5. 잔액을 출력 (5000 나오는지 확인하기)
		bank.showMoney();
		
	}

}

 

 

 

위의 소스 코드는 PC에서 드래그 후,
ctrl+x로 잘라내서 다른 곳으로 붙여넣기가 가능합니다.
ctrl+c(복사)는 불가능합니다.

 

 

 

완성된 코드들을 실행시키면 이런 결과가 나옵니다.

 

 

 

 

 

 

다음 포스트

 

자바, 생성자 (constructor) 빠르게 만드는 법

지난 포스트에서는 여러 가지를 다뤘던 것 같은데, 그중에서 생성자라는 것이 있었습니다. 이번에는 생성자를 빠르게 만드는 방법을 알아보겠습니다. 지난 포스트 https://gogogameboy.tistory.com/entry/j

gogogameboy.tistory.com

 

 

 


이 글이 도움이 됐다면 하단의 공감 버튼을 꾹 눌러서
빨간 하트로 만들어주세요.
지인에게 보여주고 싶은 글이었다면
공감 버튼 옆을 클릭해서 SNS 공유해주세요.
댓글은 블로그 운영에 큰 힘이 됩니다.

 


 


댓글