안녕하세요.


지난시간에는 인간의 체력이 소진됐을때를 대비한 코드를 추가해줬습니다. 슬라임의 체력이 소진됐을때를 대비한 코드를 짜기 전에, 일단 코드를 한번 쭉 쳐다볼까요?





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Study01.java
 
package study;
 
import javax.swing.JOptionPane;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        // 슬라임과 인간 객체 생성
        Slime s1 = new Slime("슬라삐");
        Slime s2 = new Slime("슬라돌");
        Human h = new Human("알렉스");
 
        System.out.println(s1.name + "와 " + s2.name + "이 나타났다! 당신의 이름은 " + h.name + "이다\n");
 
        while (true) {
            
            // 인풋박스
            int target = Integer
                    .parseInt(JOptionPane.showInputDialog("어느 슬라임을 공격하겠습니까? 1은 " + s1.name + " 2는 " + s2.name));
 
            if (target == 1) {
                
                // 인간의 공격
                h.attack(s1.name);
                s1.hp = s1.hp - 10;
                System.out.println("현재 " + s1.name + "의 체력은 " + s1.hp + "이다\n");
 
                // 슬라임의 공격
                s1.attack();
                h.hp = h.hp - 10;
                
                // 인간의 사망
                if (h.hp < 1) {
                    JOptionPane.showMessageDialog(null"Game Over");
                    break;
                }
                
                System.out.println("현재 " + h.name + "의 체력은 " + h.hp + "이다\n");
 
            } else if (target == 2) {
 
                // 인간의 공격
                h.attack(s2.name);
                s2.hp = s2.hp - 10;
                System.out.println("현재 " + s2.name + "의 체력은 " + s2.hp + "이다\n");
 
                // 슬라임의 공격
                s2.attack();
                h.hp = h.hp - 10;
                
                // 인간의 사망
                if (h.hp < 1) {
                    JOptionPane.showMessageDialog(null"Game Over");
                    break;
                }
                
                System.out.println("현재 " + h.name + "의 체력은 " + h.hp + "이다\n");
 
            } else {
 
                System.out.println("올바른 숫자를 입력하세요");
 
            }
        } // while 끝
    }
 
}
 
cs


주석을 넣어서 이해하기는 좀 편해졌지만 메인함수가 너무 장황하고 비슷한 내용이 반복되어 있는 형태입니다. 대대적인 성형수술이 필요해 보이는데요, 실행결과는 똑같더라도 코드를 좀 더 효율적이고 알아보기 쉽게 개편하는 작업을 '리팩토링'이라고 합니다. 리팩토링을 하게되면 개발하기도 편하고 나중에 수정하기도 편하고 버그 발생률도 줄일 수 있죠.







일단 휴먼 클래스에서 빨간 네모 부분을 수정했는데요, 신기하지 않나요? 인수 속에 자료형이 int도 아니고 String도 아니고 Slime이네요 ㅎㅎ


이처럼 함수의 인수로서 객체를 집어넣을 수도 있습니다. '객체인수'라고 하죠. 


s.name이라고 적으면 해당 슬라임의 이름이 나오겠네요.


이제 스터디01 클래스를 수정하러 가봅시다.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Study01.java
 
package study;
 
import javax.swing.JOptionPane;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        // 슬라임과 인간 객체 생성
        Slime s1 = new Slime("슬라삐");
        Slime s2 = new Slime("슬라돌");
        Human h = new Human("알렉스");
 
        System.out.println(s1.name + "와 " + s2.name + "이 나타났다! 당신의 이름은 " + h.name + "이다\n");
 
        while (true) {
 
            // 인풋박스
            int target = Integer
                    .parseInt(JOptionPane.showInputDialog("어느 슬라임을 공격하겠습니까? 1은 " + s1.name + " 2는 " + s2.name));
 
            if (target == 1) {
 
                // 인간의 공격
                h.attack(s1);
 
            } else if (target == 2) {
 
                h.attack(s2);
 
            } else {
                
                JOptionPane.showMessageDialog(null"올바른 숫자를 입력하세요");
                
            }
 
        } // while 끝
    }
 
}
 
cs


다른 자질구레한 것들은 다 지우고 일단 이렇게 코딩해주세요. 어택함수의 인수로서 s1과 s2가 들어간점에 유의해주세요. 슬라임 객체를 그대로 넣어줬습니다. 실행해서 올바로 출력되는지 확인해주세요.






잘되죠? ㅎㅎ




이번시간에 배운 객체인수를 활용하면 보다 효율적인 코딩이 가능해집니다. 다음시간에 그 위력을 경험해봅시다^^


감사합니다.


안녕하세요.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Study02.java
 
package study;
 
import javax.swing.JOptionPane;
 
public class Study02 {
 
    public static void main(String[] args) {
 
        int hp = 100;
 
        while (true) {
            JOptionPane.showMessageDialog(null"현재 주인공의 체력은 " + hp + "이다");
            hp = hp - 20;
        }
 
    }
 
}
 
cs

지난시간의 코드에서 메세지만 살짝 바꿨습니다. 이대로는 무한히 체력이 깎이겠죠(영원히 고통받는 주인공...지못미ㅜ)

while의 조건식을 true상태로 유지해두고서 도중에 빠져나가는 방법이 있습니다. 아래를 보시죠.






if로 체력이 1보다 작은지 검사하고, 맞다면 게임오버 메세지를 띄운다음 break(중지)합니다. 브레이크는 반복문(for나 while)을 빠져나오는 구문이기 때문에 무한반복에서 빠져나올 수 있는거죠.


자, 이제 배운 기법을 실제 게임에 적용해봐야겠죠. 스터디01로 가봅시다.





// Study01.java



빨간 네모 부분이 추가해준 부분입니다. while문을 써서 무한반복을 시켜줬고, 사람의 체력이 깎인 직후에 if문을 넣어 체력이 소진됐는지 검사하고 게임오버를 표시하도록 했습니다.


실행해서 슬라삐와 슬라돌을 공격하다보면 '게임오버'를 맞이하실 수 있을 겁니다. 아래 그림처럼 말이죠.








이제 슬라임의 체력이 0이 됐을때도 코딩을 해야겠죠? 다음시간에 해보겠습니다.


감사합니다.


안녕하세요.


예전에 배운 for문 기억나시나요? 지정한 횟수만큼 반복하는 구문이었죠. 그런데 횟수가 아닌 다른 조건을 주거나 반복횟수가 정해져 있지 않을때, 그리고 무한반복 시키고 싶을 때 쓰는 구문이 있습니다. while문인데요. while은 사전적인 의미로 '~동안'이라는 뜻이죠.


스터디02 클래스를 만들고 아래와 같이 코딩해봅시다.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Study02.java
 
 
package study;
 
public class Study02 {
    
    public static void main(String[] args) {
        
        int hp = 100;
 
        while (hp > 0) {
            System.out.println(hp);
            hp = hp - 20;
        }
        
        System.out.println("Game Over");
    
    }
 
}
 
cs




while (조건식) {

     내용

}



이런 형태입니다. 조건식이 참일동안에만 내용을 반복하고 거짓이 되면 반복을 그만둡니다.


한가지 주의해야될 점은 while은 for와는 달리 변수를 초기화 하는 부분이 없기 때문에 10행처럼 미리 초기화를 해 둬야 된다는 것이죠.


아래 예제를 보실까요?





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Study02.java
 
 
package study;
 
import javax.swing.JOptionPane;
 
public class Study02 {
    
    public static void main(String[] args) {
        
        int hp = 100;
 
        while (true) {
            JOptionPane.showMessageDialog(null, hp);
            hp = hp - 20;
        }
        
    }
 
}
 
cs

14행에 주목해주세요. 조건식에 대놓고 '참'이라고 적었습니다. 이렇게 되면 항상 참이기 때문에 무한반복에 빠지게 됩니다. 실행을 한번 해볼까요?







네, 숫자가 계속 깎이다가 이제 마이너스로 돌입하네요. 이대로 영영 끝낼 수 없는 걸까요? 당황하지 마시고 아래 그림의 빨간 정지버튼을 누르면 되겠습니다^^







프로그램을 실행하다가 도중에 종료시키고 싶을때 사용하는 버튼입니다.





이번 시간에 배운 내용을 기존의 스터디01에 적용시키기 전에, 무한 반복을 빠져나오는 구문을 배우고 넘어가겠습니다. 다음 시간에 뵙죠.

감사합니다.



안녕하세요.


지난시간에는 사용자가 공격할 슬라임을 고를 수 있도록 구현을 해봤습니다.


이번시간에는 공격이 행해졌을때 실제로 체력이 줄어들도록 코딩을 해보겠습니다.


우선, 슬라임 클래스를 조금 수정하겠습니다.







슬라임의 초기체력을 80으로 세팅했습니다.


이제 스터디01로 가봅시다.






빨간네모 부분이 추가해준 부분입니다.


22행만 대표로 설명해드릴게요.



s1.hp = s1.hp - 10;



제가 처음에 변수에 대해 알려드릴때 =을 기준으로 오른쪽값이 왼쪽에 들어간다고 했죠? 그걸 떠올리시면 쉽습니다. 기존의 s1.hp 변수에 들어있는 값에다가 10을 뺀 값이 다시 s1.hp 변수에 들어가는 형태입니다. 따라서 체력이 10 감소하는 거죠.




근데 지금 이 상태로는 공격 한번하면 게임이 끝나버리죠?


다음 시간에는 주인공이 슬라임을 모두 퇴치하거나, 주인공이 사망할때까지 공격을 계속할 수 있도록 코딩해보겠습니다.


감사합니다.


안녕하세요.


일단 지난시간에 만들어두었던 코드를 보시죠.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Study01.java
 
package study;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        Slime s1 = new Slime("슬라삐");
        Slime s2 = new Slime("슬라돌");
        Human h = new Human("알렉스");
 
        System.out.println(s1.name + "와 " + s2.name + "이 나타났다! 당신의 이름은 " + h.name + "이다\n");
 
        h.attack(s1.name);
 
    }
 
}
cs

슬라임 두마리와 인간 한명을 생성하고, 각각이 나타났다는 멘트를 하고, 인간이 슬라임 중에 '슬라삐'를 공격하는 내용이네요.

이번 시간에는 인풋박스를 사용해서 사용자가 공격할 슬라임을 고를 수 있도록 코딩해보겠습니다.

간략하게 개요를 짜면 다음과 같습니다.


* 어느 슬라임을 공격하시겠습니까? 라는 인풋박스를 띄운다.

* 사용자가 1번을 입력하면 슬라삐를 공격하고, 슬라삐가 반격한다.

* 2번을 입력하면 슬라돌을 공격하고, 슬라돌이 반격한다.

* 다른 숫자가 입력되면 올바른 숫자를 입력하라는 메세지를 출력한다.


아래의 코드를 보시기 전에 위의 개요를 보고 코딩을 한번 해보셨으면 좋겠네요^^ 좌충우돌 하다보면 실력이 많이 늘거든요^^




자, 정답을 한번 보실까요?





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// Study01.java
 
package study;
 
import javax.swing.JOptionPane;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        Slime s1 = new Slime("슬라삐");
        Slime s2 = new Slime("슬라돌");
        Human h = new Human("알렉스");
 
        System.out.println(s1.name + "와 " + s2.name + "이 나타났다! 당신의 이름은 " + h.name + "이다\n");
 
        int target = Integer.parseInt(JOptionPane.showInputDialog("어느 슬라임을 공격하겠습니까? 1은 " + s1.name + " 2는 " + s2.name));
        
        if (target == 1) {
 
            h.attack(s1.name);
            s1.attack();
 
        } else if (target == 2) {
 
            h.attack(s2.name);
            s2.attack();
 
        } else {
 
            System.out.println("올바른 숫자를 입력하세요");
 
        }
 
    }
 
}
 
 
cs


알고나니 간단하죠? ㅎㅎ



지금은 공격함수를 실행했을때 멘트만 나올뿐 실제로 hp가 깎이지 않습니다. 다음시간에는 hp깎는 코드를 넣어보도록 하죠.


감사합니다.


안녕하세요.


이번 시간에는 슬라임 클래스와 대립되는 인간 클래스를 만들어보도록 하겠습니다.


프로젝트명에서 우클릭하시고 클래스 만들기 메뉴로 들어간 다음, 클래스명을 Human으로 적어주세요. 메인 함수 만들기는 체크하지 않고 확인을 눌러주시면 되겠습니다.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Human.java
 
package study;
 
class Human {
 
    String name;
    int hp = 100;
 
    public Human(String n) {
        name = n;
    }
 
    public void attack(String sName) {
 
        System.out.println("인간은 " + sName + "를 공격했습니다");
 
    }
 
}
 
cs


위와 같이 구성해보았습니다.


어택 함수에 인수를 넣었습니다. 인수의 이름은 슬라임 네임이라는 뜻의 sName으로 정했습니다. 슬라임을 두마리 만들 예정이므로 어느 슬라임을 공격하는지 특정할 필요가 있는거죠.


스터디01로 가봅시다.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Study01.java
 
package study;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        Slime s1 = new Slime("슬라삐");
        Slime s2 = new Slime("슬라돌");
        Human h = new Human("알렉스");
 
        System.out.println(s1.name + "와 " + s2.name + "이 나타났다! 당신의 이름은 " + h.name + "이다\n");
 
        h.attack(s1.name);
 
    }
 
}
cs


13행: 맨끝에 붙어있는 '\n'은 엔터키를 한번 누른 것 같은 효과를 줍니다. \는 엔터키 위에 있는 '돈 기호'를 누르면 됩니다.


15행: 어택함수의 인수에 주목해주세요. s1.name 또는 s2.name은 슬라임의 이름을 나타내기 때문에 사용이 가능합니다.







잘 되는군요^^







다음 시간에는 어느 슬라임을 공격할지 사용자가 고를 수 있도록 구현을 해보겠습니다.


감사합니다.


안녕하세요


지난시간에는 생성자라는 것에 대해 배웠습니다.


이번시간에는 생성자의 존재가치에 대해 배워보겠습니다.






1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Study01.java
 
package study;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        Slime s1 = new Slime();
        s1.name = "슬라삐";
        
    }
 
}
cs


9행에서 s1이라는 슬라임 객체를 만들어줬고, 10행에서 그 객체에 이름을 정해줬습니다. 마치 어떤 홈페이지에 회원가입할때 아이디를 정하고 실명을 입력시키는 것과 비슷하네요.


자, 그런데말입니다. 생성자를 이용하면 이 과정을 한줄로 축약할 수 있습니다. 슬라임 클래스로 가서 아래와 같이 생성자를 수정해주세요.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Slime.java
 
package study;
 
public class Slime {
    
    String name;
    int hp;
    
    
    // 생성자
    public Slime(String n) {
        
        name = n;
        
    }
 
    
    // 공격
    public void attack() {
        
        System.out.println(name + "는 인간을 공격했습니다");
 
    }
}
 
cs


생성자도 함수이기 때문에 인수를 넣어줄 수가 있어요. 인수가 들어오면 그 값을 일단 n 변수가 받는데, 14행에서 n에 들어있는 값을 name 변수에 집어넣는군요! 컨트롤+S를 눌러 저장해놓고, 스터디01 클래스로 다시 돌아옵시다.






어라? 9행에 에러가 나있네요? 생성자에 인수를 넣도록 수정했는데 괄호속이 비어있어서 나는 에러입니다. 괄호속에 슬라임의 이름을 적고 10행은 삭제해주도록 합시다.






이름이 잘 들어갔는지 확인해보기 위해 어택 함수도 적어줬습니다. 콘솔창에 출력이 잘 되었군요^^



이 시점에서, 객체를 생성하는 공식에 대한 설명을 조금 정정할 필요가 있어 보이는군요.



클래스명 변수명 = new 생성자(인수);




게임이 구성되려면 슬라임 클래스만 있어서는 안되겠죠? 다음 시간에는 인간 클래스도 만들어보겠습니다.


감사합니다.


안녕하세요.


지난 시간에는 슬라임 클래스 하나로 여러 슬라임 객체를 만들어보았습니다.


이번 시간에는 '생성자 함수'에 대해 알아볼건데요, 아래를 보시죠.






빨간 네모 부분이 새로 추가한 '생성자 함수'입니다.


생긴게 일반 함수하고는 사뭇 다르군요.



public 클래스명() {


내용


}



이렇게 생겼습니다. 변수와 일반 함수 사이에 만들어 주시면 되겠습니다.


'생성자 함수'는 주로 줄여서 '생성자'라고 하는데요, 객체가 생성될때 자동으로 호출됩니다. 정말 그런지 한번 해보죠.






스터디01 클래스에서 s1이라는 슬라임 객체를 만드는 코딩을 하고 실행을 하니 콘솔창에 '탄생'이라고 찍혔습니다^^


그렇다면 이 생성자의 존재이유는 무엇일까요? 다음 시간에 알아봅시다~


감사합니다.

+ Recent posts