안녕하세요.


지난시간에는 슬라임 클래스를 만들어보았습니다.


하나의 슬라임 클래스가 하나의 슬라임 개체(객체)였는데요.


이번 시간에는 하나의 슬라임 클래스를 여러 슬라임의 설계도처럼 사용해보도록 하겠습니다.





기존에는 변수와 함수에 static이라는 글자가 붙어 있었는데요, 과감하게 제거를 해줍시다!





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Slime.java
 
package study;
 
public class Slime {
    
    String name;
    int hp;
 
    public void attack() {
        
        System.out.println(name + "는 인간을 공격했습니다");
 
    }
}
 
cs

에러가 날 것 같지만 에러가 나지 않습니다^^

스터디01 클래스로 가볼까요?







헉스... 이게 웬일? 슬라임 클래스에 만들어둔 변수와 함수들이 하나도 뜨질 않네요.


static을 제거한 변수와 함수들은 개체를 생성해야 사용할 수 있다는 법칙이 있습니다.





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

9행이 좀 신기하죠?



자료형 변수명;



이런 형태인데 자료형이 슬라임이네요 ㅎ 클래스명과 같습니다. 슬라임 개체를 담을 박스가 준비되었습니다.


11행도 되게 생소해 보이실텐데 새로운 슬라임을 생성해서 s1변수에 집어넣는 내용입니다.





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

한줄로 적고 싶으면 이렇게 하면 되겠죠^^ 공식으로 나타내면 아래와 같습니다.


클래스명 변수명 = new 클래스명();


앞으로 자주 쓸 형태이므로 아주 중요합니다~!






s1에서 점을 찍으니 보고싶었던 변수와 함수가 보이네요^^ (다른 것들도 많이 뜨는데 무시합시다^^)






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
// Study01.java
 
package study;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        Slime s1 = new Slime();
        s1.name = "슬라삐";
        s1.hp = 100;
        s1.attack();
 
        Slime s2 = new Slime();
        s2.name = "슬라돌";
        s2.hp = 200;
        s2.attack();
 
        Slime s3 = new Slime();
        s3.name = "슬라밍";
        s3.hp = 300;
        s3.attack();
 
    }
 
}
cs


이런식으로 클래스 하나로 슬라임들을 마구마구 만들어낼 수 있습니다. 클래스가 마치 설계도처럼 사용된거죠.


이렇게 개체(객체)를 만들어낼때 꼭 알아야 하는 개념이 '생성자'입니다. 다음시간에는 '생성자'에 대해 배우도록 하죠.


감사합니다.



안녕하세요.


지난 시간에는 MyMath 클래스를 만들어서 수학과 관련된 변수와 함수로 구성해 봤습니다.


이번 시간에는 슬라임 클래스를 만들어서 슬라임과 관련된 변수와 함수로 구성해볼까 합니다.


우선 Slime 클래스를 만든다음(메인함수 없이 만드세요) 아래와 같이 코딩해주세요.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Slime.java
 
package study;
 
public class Slime {
    
    static String name;
    static int hp;
 
    public static void attack() {
        
        System.out.println(name + "는 인간을 공격했습니다");
 
    }
}
 
cs


- 1행: 어느 클래스 파일인지 구분하기 위해 주석을 달았습니다.


- 7행: 슬라임의 이름을 저장하기 위한 name변수


- 8행: 슬라임의 체력을 저장하기 위한 hp변수


- 10행: 공격 함수입니다. 공격을 했다는 메세지가 뜹니다.




클래스라는 개념이 게임에 사용될때는 이런 느낌입니다. 게임에 나오는 등장인물에 대해 그 녀석이 어떤 속성(변수)을 가지고 있고 어떤 행동(함수)을 하는지 미리 구상해서 클래스를 만들어 놓는 거죠.


자, 이제 스터디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.name = "슬라삐";
        Slime.hp = 100;
 
        System.out.println("슬라임의 이름은 " + Slime.name);
        System.out.println(Slime.name + "의 체력은 " + Slime.hp);
 
        Slime.attack();
 
    }
 
}
cs


별로 어렵지는 않죠?^^



자, 이 시점에서 한가지 의문이 드실지 모르겠습니다. 보통, 게임에는 슬라임이 엄청 많이 나오는데 슬라임의 개체수만큼 Slime2, Slime3, Slime4... 이렇게 클래스를 많이 만들어줘야 하나? 라는 의문이죠.


다음 시간에는 그 의문을 해소해보겠습니다.


감사합니다.


안녕하세요.


이번 시간에는 클래스가 어떤 녀석인지 개념을 잡아보도록 하겠습니다.






위는 기존의 코드인데요. 메인함수에서 sum함수를 사용할때 바로 함수 이름을 적어줬지만,







사실은 이렇게 앞에 클래스명을 적어주는 것이 기본 형태입니다. 스터디01 클래스 속에 있는 함수이기 때문에 Study01.sum()인거죠.



클래스명.함수명();



하지만 메인 함수와 sum 함수가 같은 클래스에 있기 때문에 클래스명을 생략할 수 있었습니다.



그렇다면 말입니다... sum 함수를 다른 클래스에 한번 만들어볼까요?


https://ridd-coding.tistory.com/17


위 글을 참고해서 MyMath라는 이름의 클래스를 만들고 함수를 집어넣도록 합시다. (메인함수 만들기에 체크하지 말고 만드세요)





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package study;
 
public class MyMath {
 
    public static int sum(int num1, int num2) {
 
        return num1 + num2;
    }
 
    public static int cha(int num1, int num2) {
 
        return num1 - num2;
    }
 
    public static int gop(int num1, int num2) {
 
        return num1 * num2;
    }
 
}
 
cs

자, 이렇게 sum함수 외에도 뺄셈과 곱셈을 해주는 함수도 넣어줬습니다. (스터디01 클래스에 있는 sum함수는 지워주세요)







다시 스터디01 클래스로 돌아와서 MyMath라고 적고 점을 찍으면 이렇게 그 클래스에 속해있는 함수들이 나열됩니다. 골라서 쓸 수 있는 거죠^^




여기까지 보신 분들은 '클래스는 함수를 모아놓는 곳이구나' 라고 생각하실지 모르겠는데 변수를 넣어둘 수도 있습니다. 아래를 보시죠.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package study;
 
public class MyMath {
    
    static double pi = 3.14// 실수형 변수 pi
 
    public static int sum(int num1, int num2) {
 
        return num1 + num2;
    }
 
    public static int cha(int num1, int num2) {
 
        return num1 - num2;
    }
 
    public static int gop(int num1, int num2) {
 
        return num1 * num2;
    }
 
}
 
cs


여태까지 메인함수 안에만 변수를 적어줬었는데, 사실은 함수 밖에도 변수를 적어줄 수 있습니다. 변수의 자료형 앞에 static이 붙은 이유는 다음에 설명해드릴게요.






이제 리스트에 pi변수도 추가되었습니다. 메인함수를 실행하면 콘솔창에 3.14가 출력되겠죠~




클래스가 뭔지 감이 잡히셨나요? 관련있는 변수와 함수를 모아놓은 꾸러미라고 하고 싶네요.


강좌 초반에 제가 슬라임 퇴치 게임을 만든다고 했었죠? 다음 시간에는 슬라임 퇴치 게임의 기초가 되는 슬라임 클래스를 만들어보도록 하겠습니다.


감사합니다.


안녕하세요.


이번시간은 클래스를 배우기에 앞서 클래스 이름에 색을 넣는 작업을 해보도록 하겠습니다.






ㄴ 지난시간에 만들어 뒀던 코드인데요,  Study01 같은 경우 클래스 이름인데도 검은색으로 표시되어 눈에 잘 띄지 않습니다. 그래서 클래스 이름이 굵은 주황색으로 표시되도록 설정을 해보겠습니다.





ㄴ 이클립스 상단 메뉴 중에 윈도우 -> 프레퍼런스





ㄴ 왼쪽 트리에서 자바 -> 에디터 -> 신택스 컬러링. (신텍스는 구문이라는 뜻)





ㄴ 우측단에서 자바 -> 클래스 -> 활성화 -> 주황색 선택 -> 굵게 -> 적용하고 닫기





ㄴ 짜잔~ 클래스명에 주황색이 칠해졌습니다. 스트링과 시스템도 클래스였네요? 자세한 건 차차 알게 되실 겁니다^^



다음 시간에는 본격적으로 클래스 공부에 돌입해보겠습니다~


감사합니다.



안녕하세요


지금까지 우리는 인수가 없는 보이드함수, 인수가 있는 보이드함수, 인수가 없는 리턴함수를 배웠습니다. 오늘은 마지막 남은 인수가 있는 리턴함수를 배워보도록 합시다.


사실, 리턴함수의 존재가치는 인수가 있을때 극대화 됩니다. 메인함수에서 받은 인수를 가지고 계산을 하여 다시 메인함수쪽으로 내놓으면 메인함수가 그걸 처리하는거죠.



그럼, 원의 반지름을 입력하면 원의 넓이를 리턴하는 circle(써클) 함수를 만들어보도록 하겠습니다. 원 넓이 공식은 아래와 같습니다.


반지름 * 반지름 * 3.14





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package study;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        System.out.println(circle(5));
 
    }
 
    public static double circle(int ban) {
 
        return ban * ban * 3.14;
    }
 
}
cs



원의 반지름은 정수만 입력할 수 있다고 가정하고, 인수를 받아오는 변수를 int ban이라고 정했습니다.


그런데 반지름이 정수일지라도 3.14가 곱해지면 소수점이 생기기 때문에 리턴하는 값은 실수가 됩니다. 그래서 11행을 보면 함수가 리턴하는 자료형에 double을 적어주었습니다. double은 실수 자료형이기 때문이죠.





자, 함수를 하나더 만들어볼까요? 인수들을 더한 값을 리턴하는 sum함수를 만들어보겠습니다.






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package study;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        System.out.println(sum(34));
 
    }
 
    public static int sum(int num1, int num2) {
 
        return num1 + num2;
    }
 
}
cs


이처럼 인수는 두개 이상 넣어줄 수도 있다는 걸 알 수 있습니다.


이렇게 해서 기본적인 함수의 유형에 대해 다 배웠습니다. 다음 시간에는 클래스라는 개념에 대해 배워보도록 하겠습니다.

감사합니다.



안녕하세요.


얼마전에 우리는 '인수가 없는 함수'와 '인수가 있는 함수'를 배웠습니다. 근데 이 두가지를 좀더 자세히 말하자면 '인수가 없는 void함수, '인수가 있는 void함수'라고 말할 수 있습니다.



public static void 함수명()



이처럼 여태까지는 void를 함수명 앞에 적어줬는데 void의 뜻은 리턴값(반환값)이 없다는 뜻입니다. 그럼 도대체 리턴값이 무슨 뜻일까요?


리턴값이 있는 함수 즉, 리턴함수를 한번 만들어보면 이해가 빠를 것 같네요. 아래를 보시죠.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package study;
 
import javax.swing.JOptionPane;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        String back_pack = teacher();
        JOptionPane.showMessageDialog(null, back_pack);
 
    }
 
    public static String teacher() {
 
        return "homework";
    }
}
cs



컴퓨터는 항상 메인함수부터 처리한다고 했습니다.


9행을 처리하다가 back_pack이라는 스트링변수에다가 teacher()함수를 집어넣으라는 명령을 맞딱뜨립니다.


14~17행의 모든 글자를 집어넣으라는 뜻... 이 아닙니다.



14~17행에 정의되어 있는 teacher()함수를 한번 살펴봐야겠네요.



return "homework";



딸랑 이게 내용 다입니다. homework이라는 문자열을 내놓는다 는 뜻이죠. return이 사전상으로는 반환한다는 뜻인데 내놓는다가 더 이해하기 쉬워서 내놓는다라고 하겠습니다.



String box = teacher();



다시 이걸 보실까요? teacher 함수를 호출하니까 homework를 내놓으셨습니다(선생님이니까 높임말 ㅋ)



String box = "homework";



결국 이 문장하고 똑같은거죠.




제가 함수의 제작법을,



public static void 함수명()



이렇게 알려드렸는데 사실 이건 void함수의 제작법이었습니다.


이쯤에서 함수의 사용방법을 다시 알려드릴게요.



public static 리턴할 값의 자료형 함수명()



이렇게 사용하는 거죠. 위 예제에서는 빨간색 부분에 스트링이 들어가 있습니다. 리턴값이 없을 경우에는 빨간색 부분에 void가 들어갑니다.



이쯤에서 리턴의 존재의미에 대해 이의를 제기하는 분이 계실 것 같습니다. 그냥 아래처럼 만들면 편하지 않느냐 라구요.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package study;
 
import javax.swing.JOptionPane;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        teacher();
        
    }
 
    public static void teacher() {
 
        JOptionPane.showMessageDialog(null"homework");
        
    }
}
cs


확실히 이렇게 void함수로 만들면 메인함수가 간결해집니다.

사실, 함수를 void함수로 만들지, 리턴함수로 만들지는 바로 처리를 어디서 할 것이냐 에 따라서 갈립니다.

위처럼 void함수로 만들면 처리를 그 함수 내에서 합니다. 메세지박스까지 띄워버리네요. 근데 메세지박스로 띄울때도 있고 다르게 출력할 때도 있고 다양하다면? 또는 어떻게 출력할지 정해지지 않았다면?

그럴때는 리턴함수로 만들어서 그 함수 내에서는 계산만 하도록 코딩해놓아야겠죠. 그 함수가 결과값을 내놓으면 처리는 메인함수에서 하는 겁니다. 아래를 보시죠.






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package study;
 
import javax.swing.JOptionPane;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        JOptionPane.showMessageDialog(null, teacher());
        System.out.println(teacher());
 
    }
 
    public static String teacher() {
 
        return "homework";
    }
    
}
cs


처리를 메인함수에서 하고 있습니다. 리턴값을 이용해서 콘솔출력도 하고 메세지박스에 띄우기도 하네요^^


감사합니다.




안녕하세요.


지난시간에 함수를 배웠는데 형태가 어땠나요?



함수명()



이렇게 괄호 속에 아무것도 없는 형태였습니다.



함수명(인수)



오늘은 이렇게 인수를 포함하고 있는 함수를 배울건데요, 인수를 다른말로 매개변수, 인자, 파라미터라고도 합니다.


일단 아래 예문을 보시죠.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package study;
 
import javax.swing.JOptionPane;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        insa("자바");
 
    }
 
    public static void insa(String s) {
 
        System.out.println(s + "야 안녕");
 
    }
cs



결과가 흥미롭군요. 설명 들어갑니다~



insa("자바");



인사 함수의 인수로 "자바"라는 문자값을 넣어줬습니다.

컴퓨터는 이 코드를 접하는 순간, 아래쪽에 정의되어 있는 insa 함수 쪽으로 시선을 돌립니다. 지난시간에는 괄호속에 아무것도 없었는데 이번엔 String s라고 적혀있군요. 컴퓨터는 괄호 속의 String s와 "자바"를 매칭시킵니다.



String s = "자바";



이런 과정이 수행되는 거죠. 그래서 콘솔창에 '자바야 안녕'이 뜨는 겁니다.


다음 예문도 보실까요?






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package study;
 
import javax.swing.JOptionPane;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        round_round(5);
 
    }
 
    public static void round_round(int cnt) {
 
        for (int i = 1; i <= cnt; i++) {
 
            JOptionPane.showMessageDialog(null"빙글");
 
        }
 
    }
cs



이번엔 int cnt = 5 가 수행이 되겠죠?


cnt가 for문의 끝값으로 쓰였으니 5번 반복하게 됩니다.


마지막 예문을 보시죠.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package study;
 
import javax.swing.JOptionPane;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        age_calc(2000);
 
    }
 
    public static void age_calc(int year) {
 
        int age = 2019 - year + 1;
 
        JOptionPane.showMessageDialog(null"당신의 나이는 " + age + "세입니다");
 
    }
}
 
cs


인풋박스를 없애고 출생년도를 age_calc 함수의 인수로 넣어줬습니다.


어떠신가요? 인수가 없는 함수와 있는 함수의 차이점을 아시겠나요? 경우에 따라서 적당한 함수를 골라서 만드시면 되겠습니다.

다음 시간에는 '리턴 함수'라는걸 배워보겠습니다.

감사합니다.



안녕하세요


지난시간에는 함수 만드는 방법에 대해 배웠는데요, 이번시간에는 함수의 필요성에 대해 생각해보겠습니다.


아래 코드를 보시죠.





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
package study;
 
import javax.swing.JOptionPane;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        // 콘솔창에 인삿말 출력
        System.out.println("안녕");
 
        // 빙글빙글
        for (int i = 1; i <= 3; i++) {
 
            JOptionPane.showMessageDialog(null"빙글");
 
        }
 
        // 나이 계산기
        int year = Integer.parseInt(JOptionPane.showInputDialog("당신의 출생년도는?"));
 
        int age = 2019 - year + 1;
 
        JOptionPane.showMessageDialog(null"당신의 나이는 " + age + "세입니다");
 
    }
 
}
 
cs



여태까지 배웠던 내용들을 사용해서 코딩을 해놓았는데요, 별도의 함수를 만들지 않고 메인함수에다가 계속 코딩을 하게 되면 메인함수가 너무 장황해지고 가독성이 떨어지는 단점이 있습니다. 그래서 각각의 기능마다 함수로 만들어 놓는걸 추천드립니다.


아래처럼 말이죠.





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
package study;
 
import javax.swing.JOptionPane;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        insa();
        round_round();
        age_calc();
 
    }
 
    public static void insa() {
        
        System.out.println("안녕");
        
    }
 
    public static void round_round() {
        
        for (int i = 1; i <= 3; i++) {
 
            JOptionPane.showMessageDialog(null"빙글");
 
        }
        
    }
 
    public static void age_calc() {
        
        int year = Integer.parseInt(JOptionPane.showInputDialog("당신의 출생년도는?"));
 
        int age = 2019 - year + 1;
 
        JOptionPane.showMessageDialog(null"당신의 나이는 " + age + "세입니다");
        
    }
}
 
cs



이처럼 각각의 기능을 함수화 시켜놓으면,



        insa();
        round_round();
        age_calc();



메인함수의 이 세줄만 봐도 뭐하는 프로그램인지 알 수 있죠(주석도 필요없네요). 만약 함수 이름 짓는게 어렵다 싶으면 한글 이름도 괜찮습니다.





1
2
3
4
5
6
7
    public static void main(String[] args) {
 
        round_round();
        insa();
        insa();
 
    }
cs


이런식으로 자유자재로 호출해서 사용해도 됩니다. 두번 호출하면 두번 실행되고 호출을 안한 함수는 실행이 되지 않겠죠.

다음 시간에는 함수의 괄호 속에 들어가는 '인수'라는 녀석에 대해 배워보겠습니다.

감사합니다.


+ Recent posts