본문 바로가기
Java/생활코딩

생활코딩 자바 입문 리뉴얼

by 자연송어 2021. 5. 10.

4.2. 실행 - Java의 동작원리

컴퓨터 

자바 버츄얼 머신(JVM)

확장자가 자바인 파일 (자바 문법에 맞게 만들어진 소스코드)

기계는 소스코드를 이해할 수 없음.

컴파일 : 기계가 확장자가 자바인 파일을 이해할 수 있도록 전환하는 작업

자바 애플리케이션 : .class 확장자를 가진 파일

이클립스 Run 버튼 : JVM이 확장자가 .class인 파일을 읽어서 적혀있는 대로 컴퓨터를 동작 시키는 것.

 

- 사람이 이해할 수 있게 만들어진 컴퓨터 언어 "java"로 소스코드를 입력한다. (.java)

- 컴파일하면 이클립스가 컴퓨터가 이해할 수 있는 언어로 변환한다. (.class)

- 실행을 누르면 이클립스가 컴퓨터에 설치된 java virtual machine으로 사인을 보낸다.

- 사인을 받은 java virtual machine은 컴퓨터에 사인을 보낸다.

- 프로그램이 실행된다!

 

설명할 수 있어야 함!

 

5.a. 데스크톱 애플리케이션 만들기

import javax.swing.*; 
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
public class HelloWorldGUIApp{
    public static void main(String[] args){
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame("HelloWorld GUI");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setPreferredSize(new Dimension(800, 300));
                JLabel label = new JLabel("Hello World!!", SwingConstants.CENTER);
                frame.getContentPane().add(label);
                Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
                frame.setLocation(dim.width/2-400/2, dim.height/2-300/2);

                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

- 소스코드를 복붙해서 붙였지만 실행이 되지 않음.

 

package org.opentutorials.javatutorials.io;

import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
public class HelloWorldGUIApp{
    public static void main(String[] args){
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame("HelloWorld GUI");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setPreferredSize(new Dimension(800, 300));
                JLabel label = new JLabel("Hello World!!", SwingConstants.CENTER);
                frame.getContentPane().add(label);
                Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
                frame.setLocation(dim.width/2-400/2, dim.height/2-300/2);

                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

-> 필요한 라이브러리 import하기 위해 ctrl+shift+O (import javax.swing.*;) 삭제

-> org.opentutorials.javatutorials.io;추가 (내가 다른 패키지에 소스를 복붙해서 추가)

-> 해결

 

9.3. IOT 프로그램 만들기

import org.opentutorials.iot.Elevator;
import org.opentutorials.iot.Lighting;
import org.opentutorials.iot.Security;
 
public class OkJavaGoInHome {
 
    public static void main(String[] args) {
         
        String id = "JAVA APT 507";
         
        // 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();
 
    }
 
}

- 자바를 이용해서 집에 갔을때 엘리베이터를 호출하고 시류리티를 끄고 램프는 켜주는 프로그램 만들기 예제

 

10. 디버거


디버그란? 

디버깅 또는 디버그는 컴퓨터 프로그램 개발 단계 중에 발생하는 시스템의 논리적인 오류나 비정상적 연산을 찾아내고 그 원인을 밝히고 수정하는 작업 과정을 뜻한다.

 

이클립스 perspective

궁금증 = 이클립스 perspective에 대해서

 

- 코드를 입력하다가 궁금한 부분의 왼쪽 편을 더블클릭 -> 파란점 생성 

- 디버그 원하는 구간의 첫번째 코드 옆에 파란점을 생성하고, 마지막 구간의 코드 옆에 파란점을 생성하면 한번에 여러 줄 실행가능함.

- 왼쪽 위에 있는 Debug 클릭

- switch 클릭 -> 디버그 시작

 

- step into : 전 단계로 가기 

- step over : 명령어 1개 실행

- step return : 전 단계로 가기

 

- step over, return 등을 누르면 명령어가 어떤 순서로 진행되는지 확인할 수 있음. 

 

11.2. 입력과 출력 : arguments & parameter

 

- Run Configuration - Arguments 에서 입력값을 줄 수 있음.

- Java APT 507 입력 시 3개의 문자로 인식하여 원하는 값이 나오지 않을 수 있기 떄문에 작은 따옴표를 사용해서 묶어주면 하나의 덩어리로서 사용할 수 있다.

- 여러 개의 값을 주고 싶으면 한칸 띄어서 동일하게 작은 따옴표로 값을 입력한다.

- 이클립스 내에서 입력값(arguments)를 설정할 때 작은 따옴표로 동작하지 않으면 큰 따옴표를 이용한다.

 

테스트를 할 때

- Duplicate를 이용해서 똑같은 값을 만든 후 Arguments에 값을 입력한다.

 

 

- 입력한 값과 동일하게 이름을 세팅한다.

 

- Organize Favorites - add

- 자주사용하는 프로그램을 목록에 추가할 수 있다.

 

12.2. 직접 컴파일하고 실행하기 : 실행환경 살펴보기

 

MAC에서

- cmd 명령프롬프트 실행

- pwd (Print Working Directory) : 컴퓨터의 명령 줄 인터페이스에서 현재 작업 중인 디렉터리의 이름을 출력

/usr/libexec/java_home
//자바가 어디 설치되어 있는지 알 수 있는 명령어

 

위 작성 내용 설명

- pwd (현재 위치 출력)

- /usr/libexec/java_home (자바가 어디에 설치되어 있는지 확인하는 명령어)

- cd (change directory) : 자바 설치 된 곳으로 디렉토리 변경

- ls (list) : 현재 디렉토리에 존재하는 파일 확인

 

 

윈도우 cmd에서 java만 입력해도 바로 실행이 되는 이유

- 시스템 - 고급시스템설정 - 환경변수 - xx에 대한 사용자 변수

- path 환경설정으로 인해 시스템이 자동으로 자바 위치를 탐색하기 떄문

 

 

- cd : 체인지 디렉토리

- dir :  dir은 컴퓨터 파일 및 디렉토리 목록에 사용되는 다양한 컴퓨터 운영 체제의 명령입니다. 파일 시스템 탐색을 돕는 기본 명령 중 하나입니다. (윈도우용 현재 위치 확인)

 

클래스파일 생성된 모습

- 윈도우의 경우 ls -> dir

- 에러가 있을 경우 (javac -cp "." program.java) <- 이것도 안될 수 있음.

 

javac OkJavaGoInHomeInput.java
//클래스 파일 만들기
java OkJavaGoInHomeInput
//실행하기 
입력값이 0이라서 에러 발생
java OkJavaGoInHomeInput "Java APT 507" 15.0
//값 입력

 

13.2. 자바 문서 보는 법 - 패키지,클래스,변수,메소드

- api documentation java 검색

- 생성자(Constructor)가 없으면 일회용

- 생성자(Constructor)가 있으면 인스턴스를 만드는 것이 허용되어 있다는 것.

 

 

13.5. 자바 문서 보는 법 - 상속

 

- open type hierarchy

 

상속 관계를 확인할 수 있음.

제어문 - 5. == vs equals

primitive (원시) : 더이상 쪼갤 수 없는 데이터 <-- 더 알아보기!

non primitive (원시가 아닌) 

 

 

 

원시 데이터 : 데이터 낭비를 막기 위해 같은 데이터 생성 시 같은 공간(메모리)에 데이터를 저장함. equals 메소드 사용 불가

동등비교연산자 (==) : p1과 p2가 같은 곳을 가리키고 있는지 확인 (값이 같다는 것) 

equals 메소드 : 같은 공간에 데이터가 없어도 내용이 같은 지 확인

 

non-primitive : 같은 데이터 생성 시 다른 공간에 데이터를 생성함. 같은 곳을 가리키고 있지 않기 때문에 동등비교연산자로 비교 시 false 출력. 이때 equlas메소드를 사용하면 내용이 같을 때 true 출력.

 

primitive : 동등 비교연산자 (==) 사용.

non primitive : equals 메소드 사용. 

String : String o3 = "java2" <--동등비교연산자 사용가능

          Sting o1 = new Sting("java") <--equlas 메소드 사용

 

제어문 - 8.1. 종합응용 1

public class AuthApp3 {
 
    public static void main(String[] args) {
         
        String[] users = {"egoing", "jinhuck", "youbin"};
        String inputId = args[0];
         
        boolean isLogined = false;
        for(int i=0; i<users.length; i++) {
            String currentId = users[i];
            if(currentId.equals(inputId)) {
                isLogined = true;
                break;
            }
        }
        System.out.println("Hi,");
        if(isLogined) {
            System.out.println("Master!!");
        } else {
            System.out.println("Who are you?");
        }
 
    }
 
}

유저ID를 배열 1개를 이용하여 세팅하고 ID값을 입력하면 "Hi Master", 다른 값을 입력하면 "Hi Who ar you?" 출력하는 코드

 

제어문 - 8.2. 종합응용 2과 수업을 마치며

public class AuthApp3 {
 
    public static void main(String[] args) {
         
        //String[] users = {"egoing", "jinhuck", "youbin"};
        String[][] users = {
                {"egoing", "1111"},
                {"jinhuck", "2222"},
                {"youbin", "3333"}
        };
        String inputId = args[0];
        String inputPass = args[1];
         
        boolean isLogined = false;
        for(int i=0; i<users.length; i++) {
            String[] current = users[i];
            if(
                    current[0].equals(inputId) && 
                    current[1].equals(inputPass)
            ) {
                isLogined = true;
                break;
            }
        }
        System.out.println("Hi,");
        if(isLogined) {
            System.out.println("Master!!");
        } else {
            System.out.println("Who are you?");
        }
 
    }
 
}

유저ID와 패스워드값을 2개의 배열을 활용하여 세팅하고 ID와 패스워드값을 정확히 입력하면  "Hi Master", 다른 값을 입력하면 "Hi Who ar you?" 출력하는 코드

 

method - 4. 메소드의 입력

-
a
a
*
a
a
&
!
b
b
//결과값

 

메소드와 클래스의 차이

메소드는 서로 연관된 명령을 그룹핑해서 이름을 붙인 것.

클래스는 서로 연관된 메소드와 변수를 그룹핑해서 이름을 붙인 것. 

method - 9. 부록 - static

- 메인메소드에 있는 구분자(-,*)이 반복되고 있어서 인스턴스로 그룹핑하고 싶다.

 

//결과값
-
a
a
-
b
b
*
a
a
*
b
b

- 메소드 a(),b()는 인스턴스 t1의 소속이라서 static을 삭제 해야함.

 

- 맨 밑에 print.a를 실행하고 싶다. 

- 하지만 a()는 static이 없어서 클래스 소속이 아니라 인스턴스 소속이다.

- static을 사용하는 메소드c를 추가해서 print.c 를 실행하는 모습.