Write once, run anywhere
https://www.oracle.com/java/technologies/downloads/
Package Explorer : 개발하기 편리하게 화면을 바꿔서 보여줌
Navigator : 파일을 있는 그대로 보여줌
public class HelloWorldApp {
public static void main(String[] args ) {
System.out.println("Hello World!!");
}
}
.java를 컴파일 하여 .class 파일을 만든다.
원인 : source, code, language
결과 : application, program
Java Source code (.java)
↓(Compile)
Java Application (.class)
↓(Run)
Java Virtual Machine
↓(Run)
computer
5번 강의는 다 구경
import javax.swing.*;
import java.awt.Dimension;
import java.awt.Toolkit;
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, 500));
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);
}
});
}
}
결과 :
라즈베리파이에는 GPIO라고 부르는 핀이 있다.
라즈베리파이로 전구 키기
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
public class HelloWorldRaspberryPi {
public static void main(String[] args) throws InterruptedException {
final GpioController gpio = GpioFactory.getInstance();
final GpioPinDigitalOutput pin = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_01, "PinLED", PinState.LOW);
final int SHORT_INTERVAL = 200;
final int LONG_INTERVAL = SHORT_INTERVAL * 3;
final int LETTER_INTERVAL = SHORT_INTERVAL * 7;
while (true) {
// H
pin.high();
Thread.sleep(SHORT_INTERVAL);
pin.low();
Thread.sleep(SHORT_INTERVAL);
pin.high();
Thread.sleep(SHORT_INTERVAL);
pin.low();
Thread.sleep(SHORT_INTERVAL);
pin.high();
Thread.sleep(SHORT_INTERVAL);
pin.low();
Thread.sleep(SHORT_INTERVAL);
pin.high();
Thread.sleep(SHORT_INTERVAL);
pin.low();
Thread.sleep(LETTER_INTERVAL);
// e
pin.high();
Thread.sleep(SHORT_INTERVAL);
pin.low();
Thread.sleep(LETTER_INTERVAL);
// l
pin.high();
Thread.sleep(SHORT_INTERVAL);
pin.low();
Thread.sleep(SHORT_INTERVAL);
pin.high();
Thread.sleep(LONG_INTERVAL);
pin.low();
Thread.sleep(SHORT_INTERVAL);
pin.high();
Thread.sleep(SHORT_INTERVAL);
pin.low();
Thread.sleep(SHORT_INTERVAL);
pin.high();
Thread.sleep(SHORT_INTERVAL);
pin.low();
Thread.sleep(LONG_INTERVAL);
// l
pin.high();
Thread.sleep(SHORT_INTERVAL);
pin.low();
Thread.sleep(SHORT_INTERVAL);
pin.high();
Thread.sleep(LONG_INTERVAL);
pin.low();
Thread.sleep(SHORT_INTERVAL);
pin.high();
Thread.sleep(SHORT_INTERVAL);
pin.low();
Thread.sleep(SHORT_INTERVAL);
pin.high();
Thread.sleep(SHORT_INTERVAL);
pin.low();
Thread.sleep(LONG_INTERVAL);
}
}
}
pin.high(); : pin에 전기 줌
pin.low(); : pin에서 전기 뺌
final int SHORT_INTERVAL = 200;
Thread.sleep(SHORT_INTERVAL); : 0.2초만큼 키고 끔
구경
Number : +, -, /, *
String : length,substring,search
System.out.println(); 단축키 : sysout 쓰고 Ctrl+ Space
public class Datatype{
public static void main(String[] args) {
System.out.println(6); // Number
System.out.println("six"); // String
System.out.println("6"); // String 6
System.out.println(6+6); // 12
System.out.println("6" + "6"); // 66 결합연산자 (문자열을 위한 연산)
System.out.println(6*6); // 36
// System.out.println("6"*"6");
System.out.println("1111".length()); // 4
// System.out.println(1111.length());
System.out.println("Hello World"); //String 문자열
System.out.println('H'); //Char 문자
System.out.println("H");
}
}
public class Number {
public static void main(String[] args) {
// Operator(연산자)
System.out.println(6 + 2); // 8
System.out.println(6 - 2); // 4
System.out.println(6 * 2); // 12
System.out.println(6 / 2); // 3
System.out.println(Math.PI); // 3.141592653589793
System.out.println(Math.floor(Math.PI)); // floor : 소수점 아래 버림
System.out.println(Math.ceil(Math.PI)); // ceil : 올림
}
}
public class StringApp {
public static void main(String[] args) {
System.out.println("Hello World"); // String : 문자열
System.out.println("H"); // Character : 문자
System.out.println("Hello "
+ "World");
// \n: new line
System.out.println("Hello \nWorld");
// \"내용\": escape
System.out.println("Hello \"World\""); // Hello "World"
}
}
public class StringOperation {
public static void main(String[] args) {
System.out.println("Hello World".length());
System.out.println("Hello, [[name]] ... bye. ".replace("[[name]]", "egoing"));
}
}
작심삼일 : 공부를 그만하라는 뇌의 명령
지금까지 배운 것과 삶의 문제의 접점을 찾으려고 한다.
중간에 그만 둔 사람 -> 아무것도 할 수 없는 무능한 상태
완주한 사람 -> 무엇부터 해야할지 모르는 무기력한 상태
public class Variable {
public static void main(String[] args) {
int a = 1; // Number -> integer (정수)
System.out.println(a);
double b = 1.1; // real number (실수) ... -2.0, -1.0, 0, 1.0, 2.0, ...
System.out.println(b);
String c = "Hello World" ;
System.out.println(c);
}
}
public class Letter {
public static void main(String[] args) {
String name = "egoing";
System.out.println("Hello, " + name + "..." + name + " egoing ... egoing ... bye");
double VAT = 10.0;
System.out.println(VAT);
}
}
public class Casting {
public static void main(String[] args) {
double a = 1.1;
double b = 1; // int 1에서 double로 되도 잃는게 없어서 자동 변환
double b2 = (double) 1;
System.out.println(b);
// int c = 1.1; // 1.1은 바로 int로 변환하면 소수점 이하는 잃게되어 에러남
double d = 1.1;
int e = (int) 1.1; // int로 바꿔주겠다고 cast 해야 변환 가능
System.out.println(e);
// 1 to String
String f=Integer.toString(1);
System.out.println(f.getClass());
}
}
프로그램: 시간의 순서에 따라 어떤 일이 일어나는 것
자동화(Automation)
다른사람이 만든 소스코드 가져오기
https://github.com/egoing/java-iot
org 폴더를 추가하면 이게 패키지가 된다.
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의 데이터 타입은 Elevator 이다.
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 + " / floor Lamp");
floorLamp.on();
//
}
}
9.3에서 작성한 코드로 디버깅을 한다.
우측 상단 디버그 버튼은 perspective 라고 하며 누르면 디버깅을 위한 창으로 변한다.
각 숫자를 더블클릭하면 breakpoint가 생긴다.
좌측 상단 stepover를 누르면 한 줄씩 디버깅을 하고, stepinto를 누르면 메소드가 어떻게 작동되는지에 대한 정보가 나온다.
INPUT -> Program -> OUTPUT
Argument : 프로그램을 실행할 때 텍스트 정보를 주는 것
File
Network
Audio
Program
args : 매개변수 (사용자와 프로그램 사이의 값을 매개) = parameter
Run configurations에서 Arguments에 쓴 값이 args로 들어온다.
String[] : 문자열로만 되어있는 배열
// 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 {
// parameter, 매개변수
public static void main(String[] args) {
// String id =JOptionPane.showInputDialog("Enter a ID");
// String bright = JOptionPane.showInputDialog("Enter a Bright level");
String id = args[0];
String bright = args[1];
// Elevator call
Elevator myElevator = new Elevator(id); // myElevator의 데이터 타입은 Elevator 이다.
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 + " / floor Lamp");
floorLamp.on();
DimmingLights moodLamp = new DimmingLights(id+" moodLamp");
moodLamp.setBright(Double.parseDouble(bright));
moodLamp.on();
//
}
}
cmd에서 위치에 상관없이 java를 입력하면 실행되는 이유 : 환경변수 때문
환경변수 : 윈도우의 경우 내컴퓨터-> 오른쪽 마우스 ->설정->환경변수->path->편집->경로추가
cmd에서 .java 파일이 있는 위치로 이동하고 javac로 실행하면 컴파일이 된다.
java 클래스명 을 입력하면 클래스명에 부합하는 파일을 찾아서 main의 중괄호 안에 있는 내용을 순차적으로 출력하고 종료된다.
library : 다른사람이 사용할 수 있게 정리된 파일들
java -cp ".;lib" OKJavaGoinHome
.;lib 은 현재 폴더와 lib폴더에서 찾는다는 의미
args[0], args[1] 에 값을 넣는 방법
java OKJavaGoinHomeinput "Java APT 507" 15.0
API (Application Programming Interface) : 프로그램을 만들기 위해서 사용하는 조작 방법
UI (User Interface) : 우리가 사용하는 조작 방법
패키지 : 비슷한 성격의 클래스를 모아서 이름을 붙인 것 ex)java.lang
클래스 : 서로 연관된 변수와 메소드를 모아서 이름 붙임. 변수≈메소드
public class ClassApp {
public static void main(String[] args) {
System.out.println(Math.PI);
System.out.println(Math.floor(1.6));
System.out.println(Math.ceil(1.6));
}
}
https://docs.oracle.com/javase/7/docs/api/
documentation에서 찾았을 때 constructor(생성자)가 있으면 여러번 반복해서 쓸 때 사용(PrintWriter)
constructor를 이용해서 instance를 만드는 것이 허용되어 있다.
없으면 1회용 (Math. 함수)
Throws: 예외
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
public class InstanceApp {
public static void main(String[] args) throws IOException {
// PrintWriter p1 = new PrintWriter("result1.txt");
// p1.write("Hello 1");
// p1.close();
//
// PrintWriter p2 = new PrintWriter("result2.txt");
// p2.write("Hello 2");
// p2.close();
}
}
new PrintWriter("result1.txt") : constructor
p1 : instance, 여기에 어떤 값이 올 수 있냐를 규제하기 위해 p1 앞에 PrintWriter class를 준다.
PrintWriter는 Writer를 상속받고, Writer는 Object를 상속받기 때문에
PrintWriter에 사용하려는 메소드가 없으면 Writer에 있는지 찾아보고, 그래도 없으면 Object에서 찾아본다.
Override : 부모클래스에서 메소드를 그대로 덮어쓰기 하는것
이번에는 이런 프로세스에서 사용할 수 있는 앱을 만든다.
우선은 함수를 사용하지 않고 단순하게 작성해본다.
public class AccountingApp {
public static void main(String[] args) {
System.out.println("Value of supply : " +12345.0);
System.out.println("VAT : " +(12345.0*0.1));
System.out.println("Total : " +(12345.0+12345.0*0.1));
System.out.println("Expense : " +(12345.0*0.3));
System.out.println("Income : " +(12345.0-12345.0*0.3));
System.out.println("Dividend : " +(12345.0-12345.0*0.3)*0.5);
System.out.println("Dividend : " +(12345.0-12345.0*0.3)*0.3);
System.out.println("Dividend : " +(12345.0-12345.0*0.3)*0.2);
}
}
public class AccountingApp {
public static void main(String[] args) {
double valueOfSupply = 12345.0;
double vatRate = 0.1;
double expenseRate = 0.3;
double vat = valueOfSupply*vatRate;
double total = valueOfSupply+vat;
double expense = valueOfSupply*expenseRate;
double income = valueOfSupply-expense;
double dividend1 = income*0.5;
double dividend2 = income*0.3;
double dividend3 = income*0.2;
System.out.println("Value of supply : " +valueOfSupply);
System.out.println("VAT : " +vat);
System.out.println("Total : " +total);
System.out.println("Expense : " +expense);
System.out.println("Income : " +income);
System.out.println("Dividend : " +dividend1);
System.out.println("Dividend : " +dividend2);
System.out.println("Dividend : " +dividend3);
}
}
public class AccountingApp {
public static void main(String[] args) {
double valueOfSupply = Double.parseDouble(args[0]);
double vatRate = 0.1;
double expenseRate = 0.3;
double vat = valueOfSupply*vatRate;
double total = valueOfSupply+vat;
double expense = valueOfSupply*expenseRate;
double income = valueOfSupply-expense;
double dividend1 = income*0.5;
double dividend2 = income*0.3;
double dividend3 = income*0.2;
System.out.println("Value of supply : " +valueOfSupply);
System.out.println("VAT : " +vat);
System.out.println("Total : " +total);
System.out.println("Expense : " +expense);
System.out.println("Income : " +income);
System.out.println("Dividend : " +dividend1);
System.out.println("Dividend : " +dividend2);
System.out.println("Dividend : " +dividend3);
}
}
cmd로 실행할 때에는 java AccountingApp 33333.0 입력
제어문 : 조건문 + 반복문
public class AccountingAppif {
public static void main(String[] args) {
double valueOfSupply = Double.parseDouble(args[0]);
double vatRate = 0.1;
double expenseRate = 0.3;
double vat = valueOfSupply*vatRate;
double total = valueOfSupply+vat;
double expense = valueOfSupply*expenseRate;
double income = valueOfSupply-expense;
double dividend1;
double dividend2;
double dividend3;
if(income > 10000.0) {
dividend1 = income*0.5;
dividend2 = income*0.3;
dividend3 = income*0.2;
} else {
dividend1 = income*1;
dividend2 = income*0;
dividend3 = income*0;
}
System.out.println("Value of supply : " +valueOfSupply);
System.out.println("VAT : " +vat);
System.out.println("Total : " +total);
System.out.println("Expense : " +expense);
System.out.println("Income : " +income);
System.out.println("Dividend : " +dividend1);
System.out.println("Dividend : " +dividend2);
System.out.println("Dividend : " +dividend3);
}
}
public class AccountingArrayApp {
public static void main(String[] args) {
double valueOfSupply = Double.parseDouble(args[0]);
double vatRate = 0.1;
double expenseRate = 0.3;
double vat = valueOfSupply*vatRate;
double total = valueOfSupply+vat;
double expense = valueOfSupply*expenseRate;
double income = valueOfSupply-expense;
double[] dividendRates = new double [3]; // double형 데이터로 이루어진 배열, double형 3개 담을 수 있다.
dividendRates[0] = 0.5;
dividendRates[1] = 0.3;
dividendRates[2] = 0.2;
double dividend1 = income*dividendRates[0];
double dividend2 = income*dividendRates[1];
double dividend3 = income*dividendRates[2];
System.out.println("Value of supply : " +valueOfSupply);
System.out.println("VAT : " +vat);
System.out.println("Total : " +total);
System.out.println("Expense : " +expense);
System.out.println("Income : " +income);
System.out.println("Dividend : " +dividend1);
System.out.println("Dividend : " +dividend2);
System.out.println("Dividend : " +dividend3);
}
}
public class AccountingArrayLoopApp {
public static void main(String[] args) {
double valueOfSupply = Double.parseDouble(args[0]);
double vatRate = 0.1;
double expenseRate = 0.3;
double vat = valueOfSupply*vatRate;
double total = valueOfSupply+vat;
double expense = valueOfSupply*expenseRate;
double income = valueOfSupply-expense;
double[] dividendRates = new double [3]; // double형 데이터로 이루어진 배열, double형 3개 담을 수 있다.
dividendRates[0] = 0.5;
dividendRates[1] = 0.3;
dividendRates[2] = 0.2;
System.out.println("Value of supply : " +valueOfSupply);
System.out.println("VAT : " +vat);
System.out.println("Total : " +total);
System.out.println("Expense : " +expense);
System.out.println("Income : " +income);
int i = 0;
while(i < dividendRates.length) {
System.out.println("Dividend : " + income * dividendRates[i]);
i = i + 1;
}
}
}
메소드 : 서로 연관된 코드를 그룹핑해서 이름을 붙인 정리정돈의 상자
public class AccountingApp {
public static double valueOfSupply; // 전역변수
public static double vatRate;
public static double expenseRate;
public static void main(String[] args) {
valueOfSupply = 10000.0;
vatRate = 0.1;
expenseRate = 0.3;
print();
}
public static void print() {
System.out.println("Value of supply : " +valueOfSupply);
System.out.println("VAT : " +getVAT());
System.out.println("Total : " +getTotal());
System.out.println("Expense : " +getExpense());
System.out.println("Income : " +getIncome());
System.out.println("Dividend : " +getDividend1());
System.out.println("Dividend : " +getDividend2());
System.out.println("Dividend : " +getDividend3());
}
public static double getDividend1() {
return getIncome()*0.5;
}
public static double getDividend2() {
return getIncome()*0.3;
}
public static double getDividend3() {
return getIncome()*0.2;
}
public static double getIncome() {
return valueOfSupply-getExpense();
}
public static double getExpense() {
return valueOfSupply*expenseRate;
}
public static double getTotal() {
return valueOfSupply+ getVAT();
}
public static double getVAT() {
return valueOfSupply*vatRate;
}
}
getDividend1,2,3에서 각 퍼센트가 없는데 어떻게 계산이 되는건지 이해가 안된다.
코딩은 하면 할수록 마법같다.
객체(class)는 서로 연관된 메소드와 변수를 그룹핑하여 이름을 붙인 것이고 정리정돈의 상자이다.
class Accounting{
public static double valueOfSupply; // 전역변수
public static double vatRate;
public static double expenseRate;
public static void print() {
System.out.println("Value of supply : " +valueOfSupply);
System.out.println("VAT : " +getVAT());
System.out.println("Total : " +getTotal());
System.out.println("Expense : " +getExpense());
System.out.println("Income : " +getIncome());
System.out.println("Dividend : " +getDividend1());
System.out.println("Dividend : " +getDividend2());
System.out.println("Dividend : " +getDividend3());
}
public static double getDividend1() {
return getIncome()*0.5;
}
public static double getDividend2() {
return getIncome()*0.3;
}
public static double getDividend3() {
return getIncome()*0.2;
}
public static double getIncome() {
return valueOfSupply-getExpense();
}
public static double getExpense() {
return valueOfSupply*expenseRate;
}
public static double getTotal() {
return valueOfSupply+ getVAT();
}
public static double getVAT() {
return valueOfSupply*vatRate;
}
}
public class AccountingClassApp {
public static void main(String[] args) {
Accounting.valueOfSupply = 10000.0;
Accounting.vatRate = 0.1;
Accounting.expenseRate = 0.3;
Accounting.print();
// anotherVariable = ...;
// anotherMethod = ...;
}
}
class를 하나 만들어서 그 안에 다 넣고, variable들을 Accounting소속이라고 명시함으로써 더 구조를 단단하게 한다.
객체지향의 기본
인스턴스 : 하나의 class를 복제해서 서로 다른 데이터의 값과 같은 method를 가진 복제본을 만드는 것이다.
class Accounting{
public double valueOfSupply; // 전역변수
public double vatRate;
public double expenseRate;
public void print() {
System.out.println("Value of supply : " +valueOfSupply);
System.out.println("VAT : " +getVAT());
System.out.println("Total : " +getTotal());
System.out.println("Expense : " +getExpense());
System.out.println("Income : " +getIncome());
System.out.println("Dividend : " +getDividend1());
System.out.println("Dividend : " +getDividend2());
System.out.println("Dividend : " +getDividend3());
}
public double getDividend1() {
return getIncome() * 0.5;
}
public double getDividend2() {
return getIncome() * 0.3;
}
public double getDividend3() {
return getIncome() * 0.2;
}
public double getIncome() {
return valueOfSupply-getExpense();
}
public double getExpense() {
return valueOfSupply*expenseRate;
}
public double getTotal() {
return valueOfSupply+ getVAT();
}
public double getVAT() {
return valueOfSupply*vatRate;
}
}
public class AccountingClassApp {
public static void main(String[] args) {
//instance : class 앞에 new 붙여서 복제한 것
Accounting a1 = new Accounting();
a1.valueOfSupply = 10000.0;
a1.vatRate = 0.1;
a1.expenseRate = 0.3;
a1.print();
Accounting a2 = new Accounting();
a2.valueOfSupply = 20000.0;
a2.vatRate = 0.05;
a2.expenseRate = 0.2;
a2.print();
a1.print();
}
}
2021.09.25~2021.09.26