Java

08. Java - 클래스(2)_실습편

코골면서 딩가딩가 2024. 5. 10. 13:46

 

안녕하세요 클래스 부분은 너무 길어서 한번에 다 정리해놓으면 읽다가 코골것같아서 나눠서 올리려고 합니다...! 이론이 공부안되셨거나 기억이 안나시는분들은 전 실습을 한번더 확인하고 와주세요!😋😋

 

07. Java - 클래스_이론편

안녕하세요 코를 너무 많이 골아서 그런가 늦잠을 자서 늦게 왔습니다..😴😴😴  오늘은 클래스에 대해서 공부를 해보려고합니다. 제 꿈이 건물주인데 현실에서는 쉽지않고...  자바에서라도

mom11230.tistory.com

그럼 오늘도 시작해보겠습니다..!

 

 

 

zzzz.......

 

 

✅ 00. 필드 선언

필드 선언이란?

필드는 객체의 데이터를 저장하는 역할을 합니다. 필드를 선언하는 방법은 변수를 선언하는 방법과 동일하지만 반드시 클래스 블록에서 선언되어야만 필드 선언이 가능합니다.  

타입 필드명 [ = 초기값 ];

다음 예제는 내부 객체 Class();라는 필드에서 다음과 같은 선언을 했습니다. 

package ch06;

public class Class {
	//필드선언
	String name = "코골다가 딩가딩가";
	boolean condition;
	int sound = 100;
}

객체 내부에서는 단순히 필드명으로 읽고 변경할 수 있지만 외부 객체인 ClassExample(); 에서는 도트(.)인 객체 접근 연산자로, 객체가 가지고 있는 필드나 메소드에 접근하고자 할 때 참조 변수 뒤에 붙입니다.

 

 

✅ 01. 생성자 선언과 호출 

생성자 호출

new 연산자는 객체를 생성한 후 연이어 생성자(Constructor)를 호출해서 객체를 초기화하는 역할을 합니다.

클래스 변수 = new 클래스(); //생성자 호출

생성자가 성공적으로 실행이 끝나면 new 연산자는 객체의 주소를 리턴합니다. 리턴된 주소는 클래스 변수에 대입되어 객체의 필드나 메소드에 접근할 때 이용됩니다.

 

생성자 선언

객체를 다양하게 초기화하기 위해 생성자를 직접 선언할 수 있습니다. 생성자는 메소드와 비슷한 모양을 가지고 있으나, 리턴 타입이 없고 클래스 이름과 동일하다. 매개 변수는 new 연산자로 생성자를 호출할 때 매개값을 생성자 블록 내부로 전달하는 역할을 합니다.

그러나 현재같은 상황에서는 실행을 했을때 Debug 가 나면서 오류가 난다. 이유는 클래스 블록에 필드를 선언하지 않고 바로 생성자 선언을 해서 그런것이다. 이러한 오류를 해결하기 위해서 필드 초기화가 필요하다.

 

 

✅ 02. 필드 초기화

필드 초기화

필드 초기화를 하는 이유는 개체마다 동일한 값을 갖고 있다면 필드 선언 시 초기값을 대입하는 것이 좋고, 객체마다 다른 값을 가져야 한다면 생성자는 필드를 초기화 해야합니다.

 다음 실습은 Constructor 클래스를 선언하였습니다. model 은 "그랜져" 로 동일하지만 차량의 색상과 번호는 다르므로 생성자에서 초기화 하는 것이 좋습니다.

 

만약 매개변수명이 필드명과 동일할 때에는 구분하기 위해 this 키워드를 필드명 앞에 붙여 줍니다.

public 클래스명(String 변수명1, String 변수명2){
	this.변수명1 = 변수명1;
	this.변수명2 = 변수명2;
}

this는 현재 객체를 말하며, "this.변수명"은 현재 객체의 데이터(필드)를 뜻합니다. 

 

 

※ 소소한꿀팁's

이클립스에서는 필드의 색깔은 파란색, 매개변수의 색깔은 갈색으로 보여주기 때문에 코드를 보면 구별하기 쉽습니다.

 

그냥 알록달록해서 이쁘다고 생각했는데..ㅋㅋ

 

 

✅ 03. 메소드 선언과 호출

메소드 선언은 객체의 동작을 생행 블록으로 정의하는 것이고, 호출은 실행 블록을 실제로 실행하는 것을 말합니다. 메소드 는 객체 내부에서도 호출되지만 다른 객체에서도 호출될 수 있습니다.

 

메소드 선언

다음은 메소드를 선언하는 방법입니다.

 

리턴타입

리턴 타입은 메소드가 실행한 후 호출한 곳으로 전달하는 결과값의 타입을 말합니다.

void // 리턴값의 없는 메소드 선언

리턴 타입이 있는 메소드는 실행 블록 안에서 return 문으로 리턴값을 지정해야 한다.

 

매개변수

매개변수는 메소드를 호출할 대 전달한 매개값을 받기 위해 사용된다.

 

실행블록

메소드 호출 시 실행되는 부분이다.

 

메소드 호출

메소드 호출은 메소드 블록을 실행하는 것을 말합니다. 앞에서 언급했듯이 클래스에서 메소드를 선언했다고 해서 바로 호출할 수 있는 것은 아닙니다. 메소드는 객체의 동작이므로 객체가 존재하지 않으면 메소드를 호출할 수 없습니다. 클래스로부터 객체가 생성된 후에 메소드는 생성자와 다른메소드 내부에서 호출될 수 있고, 객체 외부에서도 호출될 수 있습니다.

타입 변수 = 메소드();

 

 

✅ 04. return

return이란?

return문은 메소드의 실행을 강제 종료하고 호출한 곳으로 돌아간다라는 의미입니다. 메소드 선언에 리턴 타입이 있을 경우에는 return문 뒤에 리턴값을 추가로 지정해야합니다.

다음 예제는 이제까지 배운 클래스를 전부 사용했습니다. 코드를 보면서 공부해봅시다.

 

Constructor.java

package ch06;

public class Constructor {

	int stamina;

	void getStamina(int stamina) {
		this.stamina = stamina;
	}

	void setStamina(int stamina) {
		this.stamina = stamina;
	}

	boolean remainStamina() {
		if (stamina == 0) {
			System.out.println("stamina가 없습니다.");
			return false;
		}
		System.out.println("stamina가 남았습니다.");
		return true;
	}

	void run() {
		while (true) {
			if (stamina > 0) {
				System.out.println("아자자잣!!!!(남은 체력: " + stamina + ")");
				stamina -= 1;
			} else {
				System.out.println("허억허억...(남은 체력: " + stamina + ")");
				return;
			}
		}
	}

	void stop() {
		System.out.println("어후 숨차 그만뜁니다.;;아오");
	}

}

우선 Constructor 클래스입니다. int stamina(상태) 객체를 생성하고, 해당 클래스와 다른 클래스에서도 stamina 객체를 사용할 수 있도록 get,set 메소드를 사용해서 초기화하였습니다. 

 

그 다음, boolean 문을 사용해서  stamina 상태에 대해 판단하기 위해 remainStamina 라는 메소드를 선언했습니다. stamina가 있을때는 return true를 선언시키고 강제 종료시켰으며, stamina가 없을때는 반대로 false를 선언시켰습니다.

 

그다음 run 메소드를 선언하였고,  stamina > 0 이면 while문을 통해  작성해논 문구가 나오며 대입연산자를 사용해 stamina 값이 1씩 감소하게 하였습니다. 

 

 

 

ConstructorExample.java

package ch06;

public class ConstructorExample {

	public static void main(String[] args) {
		Constructor con = new Constructor();

		con.setStamina(5);

		if (con.remainStamina()) {
			System.out.println("달리기 시작합니다.");
			con.run();
		}
		con.stop();
	}
}

다음으로 ConstructorExample 클래스입니다. 

우선 new 연산자를 사용해서 Constructor 클래스를 호출하였고, con이라는 변수명으로 교체했습니다.

 

다음으로 도트연산자(.)를 사용해서 setStamina(5) 즉, Constructor 클래스에서 선언한 void setStamina(int stamina) 메소드를 호출하여 5라는 값을 집어넣었습니다.

따라서, int stamina =5; 라는 리턴값이 없는 값으로 설정되었습니다.

 

그 다음으로는 if 문을 사용하여 remainStamina() 메소드를 호출해서 받은 리턴값이 true일 경우 if 블록 실행이 되도록 구현했습니다. run() 메소드는 리턴값이 없는 void 타입으로 설정했으며 조건이 모두 만족하면 stop() 메소드가 실행되게 했습니다,

 

 

 

드디어 좀 알겠네 크크크크... 흡족😊

 

 

 

클래스는 확실히 하면 할수록 어렵지만 재미있다.. 근데 아직도 공부해야 할게 많아서 3번까지 나눠서 진행할 예정입니다... TO BE CONTINUE... 뿅..