[JAVA]/[자바 기초]
[자바 기초] this 키워드
북방바다코끼리표범
2023. 8. 2. 12:26
복습
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
게임을 종료합니다.
------------------
목표
조금 더 코드를 깔끔하게 만들어 보자!
가독성이 좋은 코드 만들어보기