Java 프로그램 만들기 기초

2020-08-28

.

JAVA_TIL(20200828)

  • study program : youtube 생활코딩 채널 ‘JAVA1’

  • 실습환경 : Ubuntu 18

[실습목표]

집에 있는 여러가지 사물을 제어한다고 가정하는 자바 어플리케이션을 만들어보자

[사전준비]

이클립스 실행, 실습파일에서 programming 프로젝트를 불러온다.

1

[실습내용]

어떤 프로그램을 만들때 처음부터 끝까지 전부개발하지는 않는다. 누군가가 이미 개발해놓은 부품들을 가지고, 그 부붐들을 결합해서 나만의 완제품을 만드는 것이다.

그래서 먼저 다른사람이 만든 부품을 나의 프로그램에 포함시키는 작업을 해볼것이다.

먼저 원하는 폴더에 git clone https://github.com/egoing/java-iot.git 명령어로 실습 파일을 다운로드 받는다.

다운로드 받은 폴더로 이동하면 아래와 같이 파일들이 생성된 것을 확인할 수 있다.

(base) minman@minman-ubuntu:~/바탕화면/minman/java-iot/org/opentutorials/iot$ ls -al
합계 48
drwxr-xr-x 2 minman minman 4096  8 28 13:14 .
drwxr-xr-x 3 minman minman 4096  8 28 13:14 ..
-rw-r--r-- 1 minman minman  157  8 28 13:14 .gitignore
-rw-r--r-- 1 minman minman  499  8 28 13:14 Aircon.java
-rw-r--r-- 1 minman minman  378  8 28 13:14 ColorDimmingLights.java
-rw-r--r-- 1 minman minman  319  8 28 13:14 DimmingLights.java
-rw-r--r-- 1 minman minman  399  8 28 13:14 Elevator.java
-rw-r--r-- 1 minman minman  438  8 28 13:14 Lighting.java
-rw-r--r-- 1 minman minman  104  8 28 13:14 OnOff.java
-rw-r--r-- 1 minman minman  491  8 28 13:14 Refrigerator.java
-rw-r--r-- 1 minman minman  516  8 28 13:14 Security.java
-rw-r--r-- 1 minman minman  270  8 28 13:14 Speaker.java

우리는 이 코드들을 활용해서 사물을 자바로 제어하는 나만의 프로그램을 만드려고 한다.

다른사람들이 만든 부품의 나의 프로그램에 추가하는 방법은 여러방법이 있겠지만 가장 심플한 방법은 org 폴더 전체를 나의 자바 프로젝트로 복사하는 것이다.

** 실습파일을 위에서 불러왔으면 org 폴더가 포함되어 있을것이다. 따라서 실제로 org 폴더를 복붙할 필요는 없고, 현재 이 org 폴더가 없다고 가정했을때를 생각해보자는 것이다.

아래와 같은 명령어로 또는 GUI로 해당 폴더를 복붙하면 된다.

(base) minman@minman-ubuntu:~/바탕화면/minman/java-iot/org/opentutorials/iot$ cp /home/minman/바탕화면/minman/java-iot/org /home/minman/바탕화면/minman/java1/Programming

이렇게 폴더를 내 프로젝트에 복사하게 되면 이클립스 네비게이터에 폴더가 추가 된것을 확인할 수 있고, 또한 project explorer에도 org.opentutorials.iot라는 패키지가 추가된것을 확인할 수 있고, 그 패키지 안에 프로그램들이 보일 것이다.

2

그리고 아래 그림과 같이 programming 프로젝트에서 클래스를 하나 만들어보자.

3

  • OkJavaGoInHome.java

내가 퇴근할때 집에 들어가면서 하는 루틴을 자바로 구현했다고 생각하면 된다.

import org.opentutorials.iot.Elevator;
import org.opentutorials.iot.Lighting;
import org.opentutorials.iot.Security;
// 사용하고자 하는 엘리베이터, 라이트닝, 시큐리티 클래스를 임포트

public class OkJavaGoInHome {

    public static void main(String[] args) {

        // 자바아파트 507호에 살고있다고 가정하자
        // 이거를 정의해줘야 하는데 왜냐하면 엘리베이터가 어디에 있는 엘리베이터인지 구분하기 위헤서이다.
        String id = "JAVA APT 507";

        // Elevator를 call한다. 
        // myElevator라는 변수는 Elevator라는 데이터 타입이라는 것이다.
        // myElevator라는 변수는 반드시 Elevator라는 데이터 타입에 해당하는 데이터만   있다는 것이다.
        Elevator myElevator = new Elevator(id);
        // 엘리베이터를 1층으로 호출하고 위로 올라가도록 하게 하는 메서드를 호출한다.
        myElevator.callForUp(1);
        
        // Security off 한다.
        // 마찬가지로 누구의 시큐리티인지 id 변수로 할당해준다.
        Security mySecurity = new Security(id);
        // off 메서드 호출
        mySecurity.off();
        
        // Light on한다.
        Lighting hallLamp = new Lighting(id+" / Hall Lamp");
        // 홀램프 , 플로어 램프를 각각의 메서드를 호출해서 명시한다.
        hallLamp.on();
        
        Lighting floorLamp = new Lighting(id+" / floorLamp");
        floorLamp.on();

    }

}

위의 자바소스를 실행하면 아래와 같이 자바 아파트의 엘리베이터가 호출되어 1층으로 내려갔고, 보안이 해제가 되었고, 거실에 있는 등과 스텐드 등이 켜진것을 확인할 수 있다.

[실행결과]
JAVA APT 507  Elevator callForUp stopFloor : 1
JAVA APT 507  Security off
JAVA APT 507 / Hall Lamp  Lighting on
JAVA APT 507 / floorLamp  Lighting on
  • bug란

우리가 짠 코드의 의도하지 않는 문제

이 버그를 잡는 것을 디버깅이라고 함

디버깅을 할때 사용하는 도구를 디버거라고 함

위에서 짰던 코드에서 코드에 어떤 문제가 있거나 또는 이 코드를 분석하고 싶을때 디버거를 이용할 수 있다.

첫번째 스텝은 프로그램이 실행되는 것을 일단 멈춘다.

그러려면 멈추고 싶은줄에서 숫자 왼쪽에 더블클릭을 하면 아래그림과 같이 파란점이 생긴다. 이 점을 브레이크포인터라고 부른다.

이거를 더블클릭을 다시 하면 꺼진다.

4

이렇게 브레이크 포인터를 마킹하고 실행을 해보려고 하는데 그냥 실행하는게 아니라 좌측상단에 벌레모양의 아이콘을 누르면 디버거를 실행하는 것이다.

벌레모양의 아이콘을 누르면 perspective(자바코드작업 관점)를 디버거로 switch할건지 물어보는데 이때 switch 버튼을 클릭하면 화면구성이 아래와 같이 바뀌게 된다.

화면중간에 파란색으로 마킹된 것은 실행이 해당부분에서 중지된 상태에서 대기하고 있다는 것이다.

5

우리는 좌측상단의 메뉴 아이콘들에 대해 주목해야 한다.

좌측 상단의 아이콘중에 ‘step over’ 라는 것을 클릭하면 다음의 코드라인으로 내려가게 되고, 동시에 우측메뉴에 variables 즉, 우리가 실행하고 있는 프로그램 내에 id라는 변수가 ‘JAVA APT 507’ 이라고 하는 값으로 셋팅되었다는 것을 알 수 있다.

따라서 디버거를 사용하게 되면 프로그램을 한줄한줄 실행시킬 수 있고, 그 실행되는 순간에 나의 어플리케이션 변수의 상태를 하나하나 체크할 수 있다.

또 스텝오버를 한번 더 누르면 마이엘베라는 변수가 셋팅되었다는 것을 확인할 수 있다.

6

만약에 hallLamp on 부분까지 원샷으로 체크하고 싶다 그러면 아래 그림과 같이 20라인 숫자 쓰여저 있는 부분 왼쪽에 커서를 대고 더블클릭을 하여 브레이크 포인터를 만들어주면 된다.

그런 다음에 좌측상단에 resume 버튼을 누르면 한칸한칸 실행되는 것이 아니라 그 다음 브레이크 포인트가 나올때까지 쭉 실행하고 변수정보도 쭉 보여줄 것이다.

7

그리고 hallLamp.on()이 실행이 되면 콘솔상에 실행결과가 찍히게 되는데 어떤 원인에 의해서 찍히는지 궁금할 수 있다. 그러면 아래 그림과 같이 좌측상단에 step over 버튼을 눌러서 21번라인까지 간다. 그 다음에 좌측에 step into 아이콘을 클릭하면 hallLamp.on() 메소드가 어떻게 되어 있는지 확인할 수 있다.

step into를 클릭하면 hallLamp.on() 메소드가 어떤 코드로 구성이 되어있고 어떻게 동작하는지 확인할 수 있다.

아까 hallLamp.on()가 있는 소스코드 화면으로 다시 돌아가고 싶으면 좌측상단에 step return 이라는 아이콘을 누르면 다시 원래 소스화면으로 back할것이다.

그리고 좌측에 메뉴를 보면 우리가 실행하고 있는 파일과 그 실행하고 있는 파일에서 몇번째 줄이 실행되고 있는지도 확인할 수 있다.

그리고 디버거를 끝내고 싶다하면 좌측상단에 terminate 아이콘을 누르면 된다.

그런다음에 우리가 자바코딩작업을 하고 있던 perspective 화면으로 돌아가고 싶다면 우측상단에 J모양의 버튼을 클릭하면 자바로 코딩할때 편리한 화면으로 돌아간다.

8

  • 입력과 출력

input —> program —> output

input : Argument(텍스트 정보), File의 내용을 읽어서 input으로 날림, 웹사이트의 정보를 다운받아서 input으로 날림, Audio, 다른 Program의 output을 입력으로 받을 수도 있음

output : Monitor, File, Audio, Program

프로그램은 input에 따라 다르게 동작할 수 있다.

예를 들어서 우리가 이사를 간다고 하면 ‘JAVA APT 507’이 아니라 다른 주소가 될 것이다. 그러면 우리는 이클립스를 열고 자바파일을 연 다음에 id값을 직접 수정해서 컴파일하고 실행해줘야 한다. 그러면 이 아이디값을 번거롭게 수정하지 않는 방법이 있을까

이 프로그램을 실행하면 사용자가 해당 정보를 텍스트로 입력받아서 즉, id값을 셋팅하면 좋을 것이다.

예를들어서 프로그램을 실행하면 팝업이 실행되면서 거기에 텍스트 정보를 입력하면 좋을것이다.

그래서 아래 그림과 같이 OkJavaGoInHome.java 파일을 복사해서 OkJavaGoInHomeInput.java로 이름을 바꾸고 아래 코드 내용과 같이 수정해준다. 그러면 빨간색줄이 쫙그어지면서 뭔가 문제가 있음을 표시한다.

pane이라는 기능은 기본적으로 사용할 수 없다. 임포트해서 읽어와야 한다.

JoptionPane에 마우스를 갖다대고, import JOptionPane을 누르면 해당 클래스가 임포트되어 로드가 되고, JoptionPane 메서드를 사용할 수 있게된다.

9

그리고 아래과 같이 Enter a path를 Enter a id로 바꾸고 실행하면 id를 입력할 수 있는 창이 뜨면서 주소를 입력하면 주소를 입력받아 실행되는 것을 확인할 수 있다.

10

  • OkJavaGoInHomeInput.java
import javax.swing.JOptionPane;

import org.opentutorials.iot.Elevator;
import org.opentutorials.iot.Lighting;
import org.opentutorials.iot.Security;

public class OkJavaGoInHomeInput {

    public static void main(String[] args) {

        String id = JOptionPane.showInputDialog("Enter a ID");

        // Elevator call 
        Elevator myElevator = new Elevator(id);
        myElevator.callForUp(1);

        // Security off 
        Security mySecurity = new Security(id);
        mySecurity.off();

        // Light on
        Lighting hallLamp = new Lighting(id+" / Hall Lamp");
        hallLamp.on();

        Lighting floorLamp = new Lighting(id+" / floorLamp");
        floorLamp.on();

    }

}

String id = JOptionPane.showInputDialog("Enter a ID"); 에서 자바가 swing.JOptionPane이라는 클래스를 통해서 showInputDialog 메서드로 팝업상자에 우리가 어떤 텍스트를 입력할때까지 실행을 멈춰있는 것이다. 그리고 우리가 어떤 텍스트를 입력하면 그 텍스트를 입력받아서 String id 변수로 쓰는 것이다.

우리가 만든 프로그램이 언제나 똑같이 동작하는게 아니라 사용자가 입력한 값에 따라 다르게 동작되는 범용적으로 쓸수 있는 프로그램이 된 것이다.

그러면 입력값을 여러개 넣고 싶으면 어떻게 할까 먼저 위에 코드를 아래와 같이 수정해준다.

주소를 입력받고 추가로 moodLamp라는 것을 또 킬건데 이 moodLamp의 밝은 수준도 얼마정도로 할건지 입력받을 것이다.

  • OkJavaGoInHomeInput.java
import javax.swing.JOptionPane;

import org.opentutorials.iot.DimmingLights;
import org.opentutorials.iot.Elevator;
import org.opentutorials.iot.Lighting;
import org.opentutorials.iot.Security;

public class OkJavaGoInHomeInput {

    public static void main(String[] args) {

        String id = JOptionPane.showInputDialog("Enter a ID");
        String bright = JOptionPane.showInputDialog("Enter a Bright level");

        // Elevator call 
        Elevator myElevator = new Elevator(id);
        myElevator.callForUp(1);

        // Security off 
        Security mySecurity = new Security(id);
        mySecurity.off();

        // Light on
        Lighting hallLamp = new Lighting(id+" / Hall Lamp");
        hallLamp.on();

        Lighting floorLamp = new Lighting(id+" / floorLamp");
        floorLamp.on();
        
        DimmingLights moodLamp = new DimmingLights(id+" moodLamp");
        // moodLamp의 밝기를 bright 변수 수치만큼의 밝기 퍼센트로 유지하라는 의미
        // 아래에 setBright안에 bright를 변수로 집어넣어야 하는데 String으로 집어넣을 수가 없다.
        // Double 형태의 숫자데이터만 받기 때문이다.
        // 그래서 text to Double 형태로 데이터를 변환해준다.
        moodLamp.setBright(Double.parseDouble(bright));
        // moodLamp를 이제 켜라는 의미
        moodLamp.on();
    }

}

아래 그림과 같이 실행하면 된다.

11

그러면 argument 설정까지 집어넣고 실행하는 것까지 해보자.

아래와 같이 어플리케이션의 argument 설정을 해준다.

12

그리고 소스를 아래와 같이 argument를 받아서 실행하도록 수정한다.

  • OkJavaGoInHomeInput.java
import javax.swing.JOptionPane;

import org.opentutorials.iot.DimmingLights;
import org.opentutorials.iot.Elevator;
import org.opentutorials.iot.Lighting;
import org.opentutorials.iot.Security;

public class OkJavaGoInHomeInput {

    // 아래에 args 라는 것도 변수다. 어떤 변수냐면  프로그램을 사용하는 사람과
    //  프로그램사이에 값을 매개해준다고해서 매개변수(파라미터)라고 부른다.
    // argument configuration에서 설정한 두개의 인자들이 args를 통해서 들어오게  것이다.
    // 그냥 문자열로 받을  없어서 String바로뒤에 대괄호를 붙여서 String[] 앞에다 써줬는데
    // 이는 문자열로만 이루어져있는 배열이다.
    // 중요한건 args라는 변수값에 사용자가 입력한 값들이 들어올거라는 것이다.
    public static void main(String[] args) {

        // args의 첫번째, 두번째 string을 가져와서 각각의 변수로 넣어줄 것이다.
        String id = args[0];
        String bright = args[1];

        Elevator myElevator = new Elevator(id);
        myElevator.callForUp(1);

        Security mySecurity = new Security(id);
        mySecurity.off();

        Lighting hallLamp = new Lighting(id+" / Hall Lamp");
        hallLamp.on();

        Lighting floorLamp = new Lighting(id+" / floorLamp");
        floorLamp.on();
        
        DimmingLights moodLamp = new DimmingLights(id+" moodLamp");
        moodLamp.setBright(Double.parseDouble(bright));
        moodLamp.on();
    }

}

위와 같이 코드를 수정하고 디버거로 아래와 같이 실행을 해보자.

argument로 데이터가 들어와서 변수로 활용되는 것을 확인할 수 있다.

13

이런식으로 argument configuration에서 input data만 바꿔서 실행할 수 있다.