티스토리 뷰
안녕하세요 Shiny Ocean입니다.
이전 시간까지 자바의 기본적인 프로그래밍 방법과 클래스와 추상클래스 상속등을 이용하여 자바 프로그래밍을 진행하였습니다.
자바를 주제로한 네번째 포스팅은 지금까지 포스팅한 내용들과 스트링 객체를 이용한 끝말잇기
텍스트 게임을 구현해 보겠습니다.
Java 예제문제 5 - 끝말잇기 게임 구현
Step1 )
두 개의 String s1, s2에서 s1의 끝말과 s2의 앞말이 같은지 다른지 판별할 수 있나?
Step2 )
Player 클래스에 word 가 멤버로 있는데, 그 객체 p1, p2의
뒷말, 앞말이 같은지 다른지 판별할 수 있나?
Step3 )
Player를 p1, p2로 만들지 말고, 배열로 만들어서 Step2 와 같은 기능을 구현할 수 있나?
해결 과정)
Step1 )
두 개의 String s1, s2에서 s1의 끝말과 s2의 앞말이 같은지 다른지 판별할 수 있나?
9번 줄부터 13번 줄까지는S1과 s2를 스캐너로 입력받아 저장하는 과정입니다
중요한 것은 다음줄 부터있는 비교과정인데 그림을 첨부하여 스트링의 구조와 비교과정을 서술하겠습니다
위의 그림과 같은 구성요소들로 스트링은 이루어져있습니다
이번 과제에서 요구된 과정은 스트링 s1,s2의 제일끝 글자와 첫글자를 서로 비교하는것입니다.
스트링에서 글자 하나를 char형 자료타입으로 뽑아내는 메소드는 charAt()입니다.
CharAt(index)은 스트링 안에서 해당 인덱스 안의 글자를 하나 따로 받아냅니다.
예를 들어 위의 그림의 변수이름을 string이라 선언하면
String.charAt(0) = 아
String.charAt(1) = 름
String.charAt(2) = 다
String.charAt(3) = 워
입니다.
그렇다면 이제 과제 해결을 위해 charAt를 사용해보겠습니다
(참고, string.length()는 해당 string의 길이, 즉 마지막 인덱스값+1 한값을 담고있습니다.)
1) s1스트링의 제일 마지막 인덱스의 한글자를 따로 저장하고
2) s2 스트링의 제일 첫글자를 저장하여
3)비교해보겠습니다
위 두 스트링을 각각 s1 s2값이라고 선언할경우 S1의 제일 마지막글자(워)의 인덱스는 3입니다.
또 이값은 s1스트링의 전체길이인 4에서 -1한 값입니다.
S2의 첫번째 글자(워)의 인덱스 값은 0입니다
그러므로 두스트링 s1, s2 의 첫번쨰, 마지막 두 글자를 비교하기 위해 필요한 인덱스 값은
S1의 legth-1값과 s2의 0값입니다.
이 두 인덱스 값을 이용하여, 스트링에서 해당인덱스 값으 글자를 뽑아내는 메소드인 charAt을 사용하면
다음과 같은 코드로 두 인자를 비교할수 있습니다.
c1 = s1.charAt(user1.word.length()-1);
c2 = s2.word.charAt(0);
if (c1==c2) System.out.println("성공");
else System.out.println("실패");
두 값을 비교시 같으면 성공 다르면 실패라는 출력을 하게 자바코드로 이루어 져있었습니다.
이제 이를 바탕으로 step2를 수행해보겠습니다.
Step2 )
Player 클래스에 word 가 멤버로 있는데, 그 객체 p1, p2의 뒷말, 앞말이 같은지 다른지 판별할 수 있나?
Step2 에서 달라지는 부분은 클래스로 표현하여 변수를 따로 저장하는 것입니다.
제가 이전과제인 R02를 제출할 때 느낀점에 자바의 클래스와 생성자는 c언어의 구조체와 비슷한 것 같다라는 말을 했던 것 같습니다. 구조체가 메인함수가 아닌 다른 공간에 정보를 저장할 양식과 틀을 만들고 초기화 하는 것 처럼 클래스도 마찬가지로 메인 메소드가 포함된 클래스가 아닌 다른 공간을 구현하여 초기화 한다는 생각으로 수행해보았습니다.
1. 클래스 구현하기
클래스부터 구현 해보겠습니다. 이과제에서 필요한 양식은 player라는 이름을 가진 클래스가 플레이어들의 단어정보를 저장할 word라는 이름의 변수를 멤버로 같는 것 입니다.
class player{
String word;
String array[] = new String[10]; //step3에서 사용할 멤버
}
일단 저는 위 와같이 두 멤버로 클래스를 구현했습니다, array[]멤버는 step3에서 다루겠습니다.
클래스의 구현은 간단하다 생각합니다 하지만 비교적 중요한 부분은 이 클래스안의 멤버필드를 불러올 때 라고 생각합니다.
불러 들일때의 양식은 간단합니다. 먼저 객체를 생성하고 사용해야 함으로
player user1 = new player();
player user2 = new player();
이런식으로 플레이어 2명을 객체로 선언했습니다.
만들어진 객체내에 정보를 초기화 하기 위해서는 불러들이는 양식이 필요합니다.
양식 : 클래스이름.멤버이름
Ex) player 라는 클래스양식으로 user1이라는 객체를 만들었을가정입니다.
이 user1은 player양식이기 때문에 word라는 멤버를 포함하고 있습니다. 이때 이 word안에 정보를 저장하고싶을 때 사용하는 것이 위의 빨간글씨로 표시한 양식입니다. 저 양식을 통해 작성하면
클래스이름.멤버이름 = user1.word 가 됩니다.
이제 중요한 부분은 다 해결했습니다. 나머지 과정은 step1에서의 코드에서 s1을 user1.word로 바꾸고 s2를 user2.word로 바꾸면 해결입니다. 저는 123번을 하나의 패키지 안에 작성했기 때문에 return 타입이 void로 작성된 step2라는 메소드 안에 이내용들을 작성했습니다.
static void step2() {
Scanner s = new Scanner(System.in);
player user1 = new player();
player user2 = new player();
System.out.println("첫번째 단어를 입력해 주시오");
user1.word = s.nextLine();
System.out.println("두번째 단어를 입력해 주시오");
user2.word = s.nextLine();
char c1,c2;
c1 = user1.word.charAt(user1.word.length()-1);
c2 = user2.word.charAt(0);
if (c1==c2) System.out.println("성공");
else System.out.println("실패");
s.close();
}
Step3 )
Player를 p1, p2로 만들지 말고, 배열로 만들어서 Step2 와 같은 기능을 구현할 수 있나?
이번엔 player클래스에 배열을 선언하여 해결해보겠습니다.
Step2의 방법은 과정은 간단했지만 새로운 user가 들어올때마다 새로운 객체를 만들어서 사용해야한다는 단점이 있었습니다 예를들어 두명이 끝말잇기게임을 하는 것이 아닌 10명이 게임을 한다고 가정하면
player user1 = new player();
player user2 = new player();
player user3 = new player();
player user4 = new player();
player user5 = new player();
player user6 = new player();
player user7 = new player();
player user8 = new player();
player user9 = new player();
player user10 = new player();
이런식으로 10명의 객체를 생성하여 코딩을 진행해야 하는 과정이 필요합니다. 물론 가능은합니다.
하지만 언어에서 지원되는 기능을 사용하지 않은 매끄럽지 못한 과정이 될수 있습니다.
그래서 배열을 이용하여 하나의 객체만 선언하여도 여러 유저의 정보를 저장할수 있도록 하는것입니다.
class player{
String word;
String array[] = new String[10];
}
저는 일단 10명으로 가정하여 10개의 방이 있는 배열로 선언했지만, 메소드를 선언하고 스캐너를 사용하면 유저가 몇 명이 되던 받아내서 배열을 선언 할수 있습니다.
배열에의 사용은 step2와 거의 비슷하지만 []안에 인덱스 번호를 부여하여 사용합니다
Step2에서의
user1.word = user.array[1]
user2.word = user.array[2]
이런식으로 변환하면 객체의 생성은 user로 한번하지만 배열의 인덱스만 변경하여 사용할수 있습니다.
player user = new player();
user.array[1] = a;
user.array[2] = b;
이렇게 변환 하고 step2와 같이 동일한 방법으로 코딩합니다.
static void step3() { //문제3
player user = new player();
System.out.println("첫번째 단어를 입력해 주시오");
user. user.array[1] = s.nextLine();
System.out.println("두번째 단어를 입력해 주시오");
user. user.array[2] = s.nextLine();
char c3,c4;
c3 = user.array[1].charAt(user.array[1].length()-1);
c4 = user.array[2].charAt(0);
if (c3==c4) System.out.println("성공");
else System.out.println("실패");
}
+a )여기서 부터는 제가 욕심이 생겨 지금까지 배운 내용들과 조합하여 코딩을 진행해보았습니다.
1.스트링 인자를 받아들여 결과를 출력하는 void문 작성
(return을 true or false로도 작성해볼수 있음)
static void step3(String a, String b) { //문제3
player user = new player();
user.array[1] = a;
user.array[2] = b;
char c3,c4;
c3 = user.array[1].charAt(user.array[1].length()-1);
c4 = user.array[2].charAt(0);
if (c3==c4) System.out.println("성공");
else System.out.println("실패");
}
2.sw변수로 step 2,3둘중 하나를 출력하는 run 메소드
static void run(int sw) {
Scanner s = new Scanner(System.in);
if(sw==1) {
System.out.println("첫번째 단어를 입력해 주시오");
String a = s.nextLine();
System.out.println("두번째 단어를 입력해 주시오");
String b = s.nextLine();
step3(a,b);
}
else if(sw==2) {
step2();
}
else {System.out.println("잘못된입력입니다.");}
s.close();
}
3.모든 메소드를 하나의 클래스내에 만들어 두어 메인에서는 상속받아 사용
(추상클래스로 만들어 메소드를 선언하면서 사용하도록도 해볼수도 있음)
class method{
static void step3(){…}
static void step2(){…}
static void run(int sw) {…}
}
public class ClassAndStringArrayEx extends method
{…}
전체 코드)
import java.util.Scanner;
class player{
String word;
String array[] = new String[10];
}
class method{
static void step3(String a, String b) {
player user = new player();
user.array[1] = a;
user.array[2] = b;
char c3,c4;
c3 = user.array[1].charAt(user.array[1].length()-1);
c4 = user.array[2].charAt(0);
if (c3==c4) System.out.println("성공");
else System.out.println("실패");
}
static void step2() {
Scanner s = new Scanner(System.in);
player user1 = new player();
player user2 = new player();
System.out.println("첫번째 단어를 입력해 주시오");
user1.word = s.nextLine();
System.out.println("두번째 단어를 입력해 주시오");
user2.word = s.nextLine();
char c1,c2;
c1 = user1.word.charAt(user1.word.length()-1);
c2 = user2.word.charAt(0);
if (c1==c2) System.out.println("성공");
else System.out.println("실패");
s.close();
}
static void run(int sw) {
Scanner s = new Scanner(System.in);
if(sw==1) {
System.out.println("첫번째 단어를 입력해 주시오");
String a = s.nextLine();
System.out.println("두번째 단어를 입력해 주시오");
String b = s.nextLine();
step3(a,b);
}
else if(sw==2) {
step2();
}
else {System.out.println("잘못된입력입니다.");}
s.close();
}
}
public class ClassAndStringArrayEx extends method {
public static void main(String[] args) {
System.out.println("프로그램을 시작합니다");
System.out.println("실행 방식을 선택해주세요, \n<1> Step2 <2> step3");
Scanner scan = new Scanner(System.in);
int a= scan.nextInt();
run(a);
scan.close();
}
}
결과 콘솔)
'Language > Java' 카테고리의 다른 글
Java - Swing, Jslider 스윙과 슬라이더 (0) | 2021.01.28 |
---|---|
Java - Class의 상속과 메소드 응용 (0) | 2021.01.28 |
Java - Abstract Class, 추상클래스 (0) | 2021.01.28 |
Java - Class & 생성자 (0) | 2021.01.28 |
Java - Array & Exception처리 (0) | 2021.01.28 |