안녕하세요, 여행벌입니다.

오늘은 자바에서 가장 중요한 개념인 클래스와 메소드, 객체에 대해서 알아보겠습니다.


클래스

 클래스(Class)는 유사한 특성을 지닌 객체들을 묶어 놓은 집합체라고 간단하게 표현할 수 있습니다.

 또, 클래스는 데이터(Data) + 메소드(Method) 라고 얘기할 수 있습니다. 프로그램 상에서 유지하고 관리해야 할 데이터와 데이터를 처리하고 조작하는 기능인 메소드를 같이 묶어 놓은 것입니다. 데이터는 '변수의 선언' 을 통해 유지 및 관리가 되고, 변수에 저장된 데이터는 '메소드의 호출'을 통해 처리가 됩니다.

 즉, 유사한 특성을 지닌 데이터와 그 데이터를 다루는 기능들이 묶여 있는 것! 이라고 이해하시면 될 것 같습니다.

 

 계좌를 나타내는 클래스를 만들어 보겠습니다. 데이터로는 계좌 번호와 현재 잔액이 필요할 것이고, 메소드(기능)으로는 입금, 출금, 계좌 번호 확인, 잔액 확인이 필요할 것입니다.

package Hello;

public class BankAccount {
	private String accountInfo = "1002-***-******"; // 계좌번호
	private int balance = 0; // 현재 잔액
	// 계좌 번호를 알려주는 메소드(기능)
	public void printAccountInfo() {
		System.out.println("게좌 번호는 : " + accountInfo + "입니다");
	}
	// 잔고를 알려주는 메소드(기능)
	public void printBalance() {
		System.out.println("현재 계좌 잔고는 : " + balance + "입니다");
	}
	// 입금하는 메소드(기능)
	public void deposit(int amount) {
		System.out.println(amount + "원을 입금하셨습니다.");
		balance += amount;
	}
	// 출금하는 메소드(기능)
	public void withdraw(int amount) {
		if(amount > balance)
			System.out.println("잔고보다 많은 금액을 인출하려고 합니다.");
		else {
			System.out.println(amount + "원을 출금하셨습니다.");
			balance -= amount;
		}
	}
	public static void main(String args[]) {
		BankAccount account1 = new BankAccount();
		account1.printAccountInfo();
		account1.printBalance();
		account1.deposit(10000);
		account1.printBalance();
		account1.withdraw(9000);
		account1.printBalance();
	}
}

 코드를 뜯어보겠습니다.

"BankAccount" 라는 이름의 계좌를 나타내는 클래스를 만들고, 그 안에 계좌번호와 현재 잔고를 나타내는 데이터를 2개 선언하고, 계좌 번호, 현재 잔고를 출력하는 메소드 2개와 입금, 출금을 하는 메소드 2개와 main 메소드가 선언되어있는 것을 확인할 수 있습니다. main 메소드는 뒤에서 자세히 다뤄보겠습니다.

 이렇듯 클래스는 "데이터" + "메소드" 의 집합체이고 위와 같이 클래스를 정의할 수 있습니다.

인스턴스 변수, 인스턴스 메소드

 위에서 우리는 다음과 같이 클래스를 선언했습니다. 

 이때, 데이터에 해당하는 accountInfo / balance 를 "인스턴스 변수" 라 하고 메소드를 "인스턴스 메소드" 라고 부릅니다.

· 인스턴스 변수 : 클래스 내에 선언된 변수

· 인스턴스 메소드 : 클래스 내에 정의된 메소드

인스턴스 변수는 메소드 내부가 아니라 클래스 내부에 선언된 변수입니다. 따라서 "같은 클래스 내에 위치한 메소드 내에서 접근이 가능" 합니다.

클래스 인스턴스화

 클래스는 붕어빵 틀에 많이 비유하고는 합니다. 우리가 위와 같이 클래스를 정의하면 우리는 클래스라는 틀을 이용해 "인스턴스" 를 찍어 내야 사용이 가능합니다. 즉, 클래스를 인스턴스화해서 "인스턴스" 를 만들고, "인스턴스"는 이제 실제 메모리 공간에 존재하게 됩니다.

 위와 같이 우리는 클래스를 인스턴스화해 "인스턴스"를 생성할 수 있습니다. 클래스를 기반으로 만들어진 "인스턴스"를 가리켜 "객체" 라고도 표현합니다. 자바가 객체지향언어인 이유가 클래스 기반 언어이기 때문입니다.

 키워드 'new'를 통해서 인스턴스를 생성하면 생성된 인스턴스의 주솟값이 반환되고, 이렇듯 인스턴스를 담는 변수를 "참조변수"라고 합니다. 즉 참조변수에는 생성된 인스턴스의 주솟값이 저장되는 셈입니다.

참조변수의 특성

· 참조변수는 인스턴스를 참조한다.

· 참조변수는 인스턴스를 가리킨다.

 참조변수는 인스턴스의 주솟값을 저장하고 있습니다. 따라서, 하나의 인스턴스를 다음과 같이 둘 이상의 참조변수가 동시에 참조하는 것도 가능합니다.

account1, account2 라는 이름을 가진 참조변수를 2개 선언하고, account2 참조변수는 account1 이 가리키는 인스턴스를 그대로 참조하는 코드입니다. 따라서, account1에 deposit 메소드를 이용해 "1000" 을 입금하면, account2가 참조하는 인스턴스의 잔고가 1000원으로 증가한 것 이므로 결과는 다음과 같습니다.

참조변수의 매개변수 선언

 메소드를 호출할 때 값을 전달할 수 있고, 이를 우리는 "매개변수" 라고 합니다. 참조변수 또한 매개변수로 메소드에 전달할 수 있습니다.

 다음과 같이 메소드의 매개변수로 참조변수인 BankAccount 를 전달할 수 있고, 매개변수를 이용해 메소드를 호출할 수 있습니다.

참조변수에 null 대입

 참조변수가 가리키는 인스턴스와의 관계를 끊고 아무런 인스턴스도 참조하지 않도록 하고 싶으면 참조변수에 null을 대입하면 됩니다.

 참조변수 account1에 null을 대입하면 참조하는 인스턴스와의 관계가 끊깁니다.

메소드

 메소드란 클래스 내에서 "기능" 을 담당하는 부분입니다. 메소드는 기본 적으로 어떤 값을 전달받고, 어떤 값을 돌려줍니다. 물론 어떤 값을 전달 안받아도 되고, 값을 돌려주지 않아도 되는 기능들은 값을 전달받거나, 전달하는 과정이 생략돼도 됩니다.

 인사를 해주는 메소드를 만들어보았습니다. 어떤 값을 전달받을 필요도, 전달할 필요도 없으므로 다음과 같이 값을 전달하는 부분은 void 로, 값을 전달받는 부분은 비어있는 것을 확인할 수 있습니다.

 "Input" 이라고 박스친 부분이 메소드에서 값을 전달받는 부분이고, 이때 전달받는 값을 "매개변수" 라고 합니다. 또, "Output" 이라고 박스친 부분이 메소드에서 기능을 다 수행하고 값을 돌려주는 부분입니다.

 이번에는 나이와 이름을 입력받고 인사를 하는 메소드를 만들어 보겠습니다.

 int 형 매개변수, String 형 매개변수 age와 name을 전달받아 인사하는 메소드입니다.

 이번에는 값을 반환하는 메소드를 만들어 보겠습니다. 간단하게 숫자 2개를 입력받아 합친 값을 돌려주는 메소드를 만들어 보겠습니다.

 우리는 int 형 매개변수 2개를 입력받고, int 형을 돌려줄 것이기 때문에 void 대신 반환형의 자료형인 int 를 Output 에 명시한 것을 확인할 수 있습니다. 이처럼 값을 반환하는 메소드는 어떤 값을 반환하는지 자료형을 명시해줘야 합니다.


 

+ Recent posts