<1. MyPoint클래스>
class MyPoint {
public MyPoint(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "MyPoint (" + x +", " + y +")";
}
private int x, y;
}
public class app {
public static void main(String[] args) {
MyPoint a = new MyPoint(3, 20);
System.out.println(a);
}
}
toString만 오버라이딩 해주면 됩니다~~
함수 매개변수랑 반환값은 java se 15 oracle에 Object클래스의 메소드를 검색해서 복붙해줬습니다!
똑같아야 오버로딩이 아니라 오버라이딩이 될테니까요.
<2. 공백으로 분리된 어절이 몇 개인지 출력>
import java.util.Scanner;
import java.util.StringTokenizer;
public class App {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
String input = scanner.nextLine();
if (input.equals("exit"))
break;
StringTokenizer st = new StringTokenizer(input, " ");
int n = st.countTokens();
System.out.println("어절 개수는 " + n);
}
System.out.println("종료합니다...");
scanner.close();
}
}
StringTokenizer를 사용하면 어렵지 않게 풀 수 있습니다.
<3. 모두 같은 수가 나오면 프로그램 종료>
public class app {
public static void main(String[] args) {
int[] randarr = new int[3];
while (true) {
for (int i =0; i<3; i++) {
randarr[i] = (int)(Math.random()*3+1);
System.out.print(randarr[i] + "\t");
}
System.out.println();
if (randarr[0] == randarr[1] && randarr[1] == randarr[2])
break;
}
System.out.println("성공");
}
}
저는 Random객체를 만들지 않고 Math의 static메소드 random()을 이용했습니다.
<4. 덧셈 결과 출력 프로그램>
import java.util.Scanner;
import java.util.StringTokenizer;
public class plus {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
int sum = 0;
StringTokenizer st = new StringTokenizer(str, "+");
while (st.hasMoreTokens()) {
String temp = st.nextToken().trim();
sum += Integer.parseInt(temp);
}
System.out.println("합은 " + sum);
scanner.close();
}
}
이렇게 응용할 수 있군요!
<5. Adder>
package util;
public class Adder {
private int x, y;
public Adder(int x, int y) {
this.x = x;
this.y = y;
}
public int add() {
return x + y;
}
}
package app;
import util.Adder;
public class Main {
public static void main(String[] args) {
Adder adder = new Adder(2,5);
System.out.println(adder.add());
}
}
import해줘야 Adder이름만 써서 클래스를 만들 수 있죠!
<6. 가위바위보게임>
진짜 질릴정도로 많이 만드는 가위바위보 게임이네요.
저는 가위바위보 게임 클래스를 하나 새로 만들어줬습니다.
main먼저 보면
public static void main(String[] args) {
RockScissorGame game = new RockScissorGame();
boolean go = true;
while (go) {
go = game.run();
}
System.out.println("게임을 종료합니다.");
}
아주 간결하게 만들었습니다.
RockScissorGame이라는 클래스 객체를 만들어서 run메소드만 반복호출 해주면 됩니다.
run메소드는 true/false값을 호출하는데, 게임을 끝내라는 입력을 받으면 false를 반환하고 게임이 종료됩니다.
RockScissorGame클래스는 멤버변수 2개, 메소드 5개로 구성되어 있습니다.
메소드 중에서 외부에서 사용하는 건 run뿐이라 나머지 4개는 private에 넣어줬습니다.
private int com; | 컴퓨터의 입력. 1(가위), 2(바위), 3(보) 중 랜덤한 값이 할당된다. |
private int user; | 사용자의 입력. 1(가위), 2(바위), 3(보), 4(끝내기) 중 하나이며, 4가 대입되면 프로그램이 종료됨. |
private void inputUser() | 1(가위), 2(바위), 3(보), 4(끝내기) 중 하나를 사용자에게 입력받아 user필드에 넣음. |
private void setCom() | com변수에 1~3중 랜덤한 값이 들어간다. |
private String get(int key) | 1~3의 키값을 입력받아 키값에 해당하는 문자열을 반환함. ex) 1을 입력받으면 "가위"를 반환. |
private void whoIsWin() | com변수와 user변수를 비교하여 누가 이겼는지 화면에 출력해주는 함수. |
public boolean run() | inputUser메소드를 수행한 후 user가 4이면 프로그램을 종료하도록 false값을 리턴한다. 4가 아니라면 사용자와 컴퓨터의 패를 출력하고 whoIsWin() 메소드를 호출한 후 true를 리턴한다. |
코드입니다.
class RockScissorGame {
private int com;
private int user;
private void inputUser() {
Scanner scanner = new Scanner(System.in);
while (true) {
try {
System.out.println("==================================");
System.out.print("가위(1), 바위(2), 보(3), 끝내기(4)>>");
user = scanner.nextInt();
if (1 <= user && user <= 4)
break;
else {
System.out.println("잘못된 입력입니다. 다시 입력하세요!");
continue;
}
} catch (InputMismatchException e) {
System.out.println("잘못된 입력입니다. 다시 입력하세요!");
scanner.next();
}
}
}
private void setCom() {
com = (int) (Math.random() * 3 + 1);
}
private String get(int key) {
String temp = "";
switch (key) {
case 1:
temp = "가위";
break;
case 2:
temp = "바위";
break;
case 3:
temp = "보";
break;
}
return temp;
}
private void whoIsWin() {
int m;
if (com == user)
m = 0;
else if (com - user == -1 || com - user == 2)
m = 1; //사용자 이김
else
m = 2;
switch (m) {
case 0:
System.out.println("비겼습니다.");
break;
case 1:
System.out.println("사용자가 이겼습니다.");
break;
case 2:
System.out.println("사용자가 졌습니다.");
break;
}
}
public boolean run() {
inputUser();
if (user == 4)
return false;
setCom();
String user_s = get(user);
String com_s = get(com);
System.out.println("사용자 " + user_s + " : 컴퓨터 " + com_s);
whoIsWin();
return true;
}
}
이번에는 승리 알고리즘을 다르게 짜봤습니다.
종이에 경우의 수를 써봤는데
com | user(win) | com-user |
1 | 2 | -1 |
2 | 3 | -1 |
3 | 1 | 2 |
com(win) | user | com-user |
2 | 1 | 1 |
3 | 2 | 1 |
1 | 3 | -2 |
이렇게 빼기를 이용하니 사용자가 이기는 경우가 컴퓨터와 이기는 경우와 겹치지 않고,
(com - user == -1 || com - user == 2) 와 같이 깔끔하게 나오더라고요.
예전 알고리즘은 (com == 1 && user ==2)||(com == 2 && user ==3)||(com == 3 && user ==1)
이런식이었는데, 이거보다 훨씬 간결해보이는 것 같습니다.
물론 코드 보는 사람은 바로 이해 못할 수도 있지만요... 뭐가 좋다고는 딱 못 말하겠습니다.
'프로그래밍 언어 > javastudy' 카테고리의 다른 글
영어 어휘 테스트 프로그램/ 명품 자바 에센셜 7 (0) | 2021.07.17 |
---|---|
명품 Java Essential 6단원 Bonus 1 ~ 3 (0) | 2021.07.16 |
명품 자바 에센셜 6단원/ 영문자 알파벳 히스토그램 (0) | 2021.07.14 |
명품 Java Essential 5단원 실습문제 #2 (0) | 2021.07.14 |
명품 Java Essential 5단원 실습문제 #1 (0) | 2021.07.14 |