본문 바로가기
[JAVA]/[자바 기초]

[자바 기초] this 키워드

by 북방바다코끼리표범 2023. 8. 2.

복습

https://shins99.tistory.com/18

 

[자바 기초] 접근 제어 지시자, get(), set() 메서드

복습 https://shins99.tistory.com/17 [자바 기초] 객체와 객체 간 상호작용 복습 https://shins99.tistory.com/16 [자바 기초] 생성자 복습 https://shins99.tistory.com/12 [자바 기초] 함수와 메서드 복습 https://shins99.tistory

shins99.tistory.com


💡 학습 목표 

1. this 란 무엇일까? 
2. this 3가지 사용방법을 알고 있는가? 
3. 코드에 실행 흐름을 반드시 이해 하자!

this란? (this의 기능)

  • 1 instance(객체) 자기자신의 메모리를 가르킴
  • 2 생성자에서 다른 생성자를 호출함
  • 3 자신의 주소(참조값)을 반환함

1 instance(객체) 자기자신의 메모리를 가르킴

public Person(String name, int age) {
		// 1. 자기 자신을 가리키는 this
		this.name = name;
		this.age = age;
		System.out.println("사용자 정의 생성자 기능 종료 --1");
	}

2 생성자에서 다른 생성자를 호출함

public Person(String name, int age, String phone) {
		// 2. 생성자에서 다른 생성자를 호출 할 때, this를 사용할 수 있다.
		// () <-- 괄호를 사용한다. tip!
//		this.name = name;
//		this.age = age;
		this(name, age);
		this.phone = phone;
		System.out.println("사용자 정의 생성자 기능 종료 --2");
	}

3 자신의 주소(참조값)을 반환함

// this는 자기 자신을 반환(주소값) 리턴 시킬 수 있다.
	public Person getPerson() {
		return this;
	}

- 해당 기능을 이용하면 디자인 패턴 중 builder 패턴 생성가능

 

응용

정말 간단한 스타크래프트 유닛을 생성해 게임 만들어보기

 

질럿 클래스 설계

public class Zealot {

	private String name;
	private int power;
	private int hp;

	public Zealot(String name) {
		this.name = name;
		this.power = 5;
		this.hp = 80;
	}

	// getter 메서드 만들기
	public String getName() {
		return this.name;
	}

	public int getPower() {
		return this.power;
	}

	public int getHp() {
		return this.hp;
	}

	// 기능

	// 마린 공격
	public void attackMarine(Marine targetMarine) {
		targetMarine.beAttacked(power);
		System.out.println(this.name + "이 " + targetMarine.getName() + "을 공격합니다.");
	}

	// 저글링 공격
	public void attackZergling(Zergling targetZergling) {
		targetZergling.beAttacked(power);
		System.out.println(this.name + "이 " + targetZergling.getName() + "을 공격합니다.");
	}

	// 공격 당하다
	public void beAttacked(int power) {
		if (this.hp <= 0) {
			System.out.println(this.name + "이 이미 죽었습니다.");
			return; // 실행의 제어권을 반환한다.
		}
		this.hp -= power;
	}

	public void showInfo() {
		System.out.println("==== 상태창 ====");
		System.out.println("이름 : " + name);
		System.out.println("공격력 : " + power);
		System.out.println("체력 : " + hp);
	}

}

저글링 클래스 설계

public class Zergling {

	private String name;
	private int power;
	private int hp;

	public Zergling(String name) {
		this.name = name;
		this.power = 2;
		this.hp = 45;
	}

	// getter 메서드 만들기
	public String getName() {
		return this.name;
	}

	public int getPower() {
		return this.power;
	}

	public int getHp() {
		return this.hp;
	}

	// 기능

	// 마린 공격
	public void attackMarine(Marine targetMarine) {
		targetMarine.beAttacked(power);
		System.out.println(this.name + "이 " + targetMarine.getName() + "을 공격합니다.");
	}

	// 질럿 공격
	public void attackZealot(Zealot targetZealot) {
		targetZealot.beAttacked(power);
		System.out.println(this.name + "이 " + targetZealot.getName() + "을 공격합니다.");
	}

	// 공격 당하다
	public void beAttacked(int power) {
		if (this.hp <= 0) {
			System.out.println(this.name + "이 이미 죽었습니다.");
			return; // 실행의 제어권을 반환한다.
		}
		this.hp -= power;
	}

	public void showInfo() {
		System.out.println("==== 상태창 ====");
		System.out.println("이름 : " + name);
		System.out.println("공격력 : " + power);
		System.out.println("체력 : " + hp);
	}

}

마린 클래스 설계

public class Marine {

	private String name;
	private int power;
	private int hp;

	public Marine(String name) {
		this.name = name;
		this.power = 3;
		this.hp = 50;
	}

	// getter 메서드 만들기
	public String getName() {
		return this.name;
	}

	public int getPower() {
		return this.power;
	}

	public int getHp() {
		return this.hp;
	}

	// 기능

	// 질럿 공격
	public void attackZealot(Zealot targetZealot) {
		targetZealot.beAttacked(power);
		System.out.println(this.name + "이 " + targetZealot.getName() + "을 공격합니다.");

	}

	// 저글링 공격
	public void attackZergling(Zergling targetZergling) {
		targetZergling.beAttacked(power);
		System.out.println(this.name + "이 " + targetZergling.getName() + "을 공격합니다.");
	}

	// 공격 당하다
	public void beAttacked(int power) {
		if (this.hp <= 0) {
			System.out.println(this.name + " 이 이미 죽었습니다.");
			return; // 실행의 제어권을 반환한다.
		}
		this.hp -= power;
	}

	public void showInfo() {
		System.out.println("==== 상태창 ====");
		System.out.println("이름 : " + name);
		System.out.println("공격력 : " + power);
		System.out.println("체력 : " + hp);
	}

}

main 설계

import java.util.Scanner;

public class StartCraftGame1 {

	public static void main(String[] args) {

		final int ZEALOT = 1;
		final int MARINE = 2;
		final int ZERGLING = 3;
		final int GAME_END = 4;

		Zealot zealot1 = new Zealot("질럿1");
		Zealot zealot2 = new Zealot("발업질럿1");

		Marine marine1 = new Marine("마린1");
		Marine marine2 = new Marine("스팀팩마린1");

		Zergling zergling1 = new Zergling("저글링1");
		Zergling zergling2 = new Zergling("발업저글링1");

		Scanner sc = new Scanner(System.in);
		int unitChoice = -1;

		// do while 활용하기
		do {
			System.out.println("유닛을 선택 하세요");
			System.out.println("1.질럿\t 2.마린\t 3.저글링\t 4.종료");
			unitChoice = sc.nextInt();

			if (unitChoice == ZEALOT) {
				System.out.println("질럿을 선택하셨습니다.");
				zealot1.showInfo();
				System.out.println("------------------");
				System.out.println("공격할 유닛을 선택하세요");
				System.out.println("2.마린 3.저글링");
				System.out.println("게임을 종료하고싶으시면 4.를 입력해주세요");
				System.out.println("------------------");
				int num1 = sc.nextInt();
				if (num1 == GAME_END) {
					System.out.println("게임을 종료합니다.");
					break;
				}
				System.out.println("몇 회 공격할지 숫자를 입력해주세요");
				int num2 = sc.nextInt();
				if (num1 == MARINE) {
					for (int i = 0; i < num2; i++) {
						zealot1.attackMarine(marine1);
					}
					marine1.showInfo();
				} else if (num1 == ZERGLING) {
					for (int i = 0; i < num2; i++) {
						zealot1.attackZergling(zergling1);
						zergling1.showInfo();
					}
				}
			} else if (unitChoice == MARINE) {
				System.out.println("마린을 선택하셨습니다.");
				marine1.showInfo();

				System.out.println("------------------");
				System.out.println("공격할 유닛을 선택하세요");
				System.out.println("1.질럿 3.저글링");
				System.out.println("게임을 종료하고싶으시면 4.를 입력해주세요");
				System.out.println("------------------");
				int num1 = sc.nextInt();

				if (num1 == GAME_END) {
					System.out.println("게임을 종료합니다.");
					break;
				}
				System.out.println("몇 회 공격할지 숫자를 입력해주세요");
				int num2 = sc.nextInt();
				if (num1 == ZEALOT) {
					for (int i = 0; i < num2; i++) {
						marine1.attackZealot(zealot1);
						zealot1.showInfo();
					}
				} else if (num1 == ZERGLING) {
					for (int i = 0; i < num2; i++) {
						marine1.attackZergling(zergling1);
						zergling1.showInfo();
					}
				}

			} else if (unitChoice == ZERGLING) {
				System.out.println("저글링을 선택하셨습니다.");
				zealot1.showInfo();

				System.out.println("------------------");
				System.out.println("공격할 유닛을 선택하세요");
				System.out.println("1.질럿 3.저글링");
				System.out.println("게임을 종료하고싶으시면 4.를 입력해주세요");
				System.out.println("------------------");
				int num1 = sc.nextInt();
				if (num1 == GAME_END) {
					System.out.println("게임을 종료합니다.");
					break;
				}
				System.out.println("몇 회 공격할지 숫자를 입력해주세요");
				int num2 = sc.nextInt();
				if (num1 == ZEALOT) {
					for (int i = 0; i < num2; i++) {
						zergling1.attackZealot(zealot1);
						zealot1.showInfo();
					}
				} else if (num1 == MARINE) {
					for (int j = 0; j < num1; j++) {
						zergling1.attackMarine(marine1);
						marine1.showInfo();
					}
				}
			}

		} while (unitChoice == GAME_END);
		System.out.println("게임을 종료합니다.");
		System.out.println("------------------");
	}

}

결과 출력

유닛을 선택 하세요
1.질럿	 2.마린	 3.저글링	 4.종료
1
질럿을 선택하셨습니다.
==== 상태창 ====
이름 : 질럿1
공격력 : 5
체력 : 80
------------------
공격할 유닛을 선택하세요
2.마린 3.저글링
게임을 종료하고싶으시면 4.를 입력해주세요
------------------
2
몇 회 공격할지 숫자를 입력해주세요
1
질럿1이 마린1을 공격합니다.
==== 상태창 ====
이름 : 마린1
공격력 : 3
체력 : 45
게임을 종료합니다.
------------------

목표

조금 더 코드를 깔끔하게 만들어 보자!

가독성이 좋은 코드 만들어보기