Java/생활코딩

생활코딩 JAVA1

hs_developer 2022. 3. 6. 19:50

실행 HelloWorld

 

public class HelloWorldApp {
	public static void main(String[] args) {
		System.out.println("Hello World!!");
	}
}

 

 

 


Java의 동작원리

 

 

사용자가 입력한 Java Source code.java 언어를 저장하면

프로그램이 Java Source code.class로 compile하고

이를 실행함으로서 Java Virtual Machine에 보내 computer에서 실행하게 한다.

 

 

 

 


 

자바 기술의 응용

 

 

자바를 통해 할 수 있는 일

 

1. 데스크탑 앱 만들기

2. 사물 제어하기 (IoT)

3. 안드로이드 앱 만들기

 

 

 


 

데이터와 연산

 

컴퓨터는 '데이터'를 '처리'하는 기계이다. 데이터마다 처리 방법이 다르다.

그렇기 때문에, 데이터의 분류를 아는 방법이 중요하다. 여기서 '데이터'와 '처리'의 의미에 대해 알아보자.

 

 

컴퓨터는 많은 데이터를 다룰 수 있는데 그 중에는

 

1. 숫자 Number

2. 문자 String

3. 기타

 

가 있다. 이러한 데이터 타입 제어를 자바로 할 수 있다.

 

이렇게 컴퓨터 데이터를 구분하는 이유는 각각의 데이터의 특성에 맞는 처리 방식이 존재한다. 

그렇기 때문에, 데이터의 형식을 잘 정리 정돈 할 필요가 있다.

 

자바에서는 어떻게 데이터를 정리 정돈 하고 있고, 각각의 데이터마다 어떤 연산 방법이 있는 지 살펴보자.

 

 


 

데이터 타입

 

 

자바로 숫자, 문자를 코드로 표현하는 방법을 살펴보자.

 

 

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());
	}
}

 

프로그래밍에서는 데이터 타입이 있고,

데이터 타입을 구분하는 이유는 데이터의 타입별로 어울리는 연산 방법이 있기 때문에 엄격하게 구분한다.

 

컴퓨터를 다루는 기술을 쌓는다는 건 2가지의 흐름을 갖는다.

1. 지금 하고 있는 시스템에 어떤 종류의 데이터 타입들이 존재하는지를 알아가는 방향
2. 각각의 데이터 타입별로 어떤 연산 방법들이 존재하는가

 

 

이 것들을 통해 우리가 컴퓨터를 통해 할 수 있는 것들이 늘어난다.

 

자바는 여러가지 데이터 타입들이 존재한다. 그 중에서 압도적으로 중요한 데이터 타입인 문자와 숫자를 알아봤다.

 

 


 

숫자와 연산

 

 

가장 중요한 데이터 타입인 숫자와 문자의 처리 방법을 살펴보자.

 

 

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)); // 내림 3.0
		System.out.println(Math.ceil(Math.PI)); // 올림 4.0
	}

}

 

 

 


 

문자열 다루기 

 

 

public class StringApp {

	public static void main(String[] args) {
		
		System.out.println("Hello"); // String
		System.out.println('H'); // Character 문자 1개 표현
		
		System.out.println("Hello "
				+ "World");
		
		// new line
		System.out.println("Hello \nWorld");
		
		// escape
		System.out.println("Hello \"World\""); // Hello "World"
	}

}

 

 


 

변수의 정의

 

public class Variable {

	public static void main(String[] args) {
		
		int a = 1; // Number -> integer
		System.out.println(a);
		
		double b = 1.1; // 실수 real number
		System.out.println(b);
		
		String c = "Hello World"; // 문자열
		System.out.println(c);
	}

}

 

int 정수
double 실수
String 문자열

을 붙여서 데이터 타입 정의한다.

 

 


 

변수의 효용

 

public class Letter {
 
    public static void main(String[] args) {
        String name = "leezche";
        System.out.println("Hello, "+name+" ... "+name+" ... egoing ... bye");
         
        double VAT = 10.0;
        System.out.println(VAT);
    }
 
}

 

변수에 담을 때,

 

데이터 타입 정의 String, double 잘 붙인다.

 

 


 

데이터 타입의 변환 (casting)

 

 

public class Casting {

	public static void main(String[] args) {
		
		double a = 1.1;
		double b = 1;
		System.out.println(b);
		
//		double c = 1.1;
		double d = 1.1;
		int e = (int) 1.1;
		System.out.println(e); // 1 (소수점 0.1을 잃는다.)
		
		// 1 to String 숫자를 문자열로 바꾸기
		String f = Integer.toString(1);
		System.out.println(f.getClass()); // 변수의 '데이터 타입' 알려줌

	}

}

 

 


 

 

프로그램 만들기

 

 

라이브러리를 미리 다운받아야 함.

 

java1-b14d380976e09d525c44726f6337cc726e28425f.zip
0.01MB

 

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

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 Light(id + " / Hall Lamp");
		hallLamp.on();
		
		Lighting floorLamp = new Light((id + " / floorLamp");
		floorLamp.on();

	}

}

 

 

 

 

 


 

입력과 출력

 

 

 

 

입력 값에 따라 프로그램이 다르게 동작한다.

 

 

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.setBright(Double.parseDouble(bright)); // string → double 변경 // 추가
        moodLamp.on();
    }
 
}

 

 

 

 

 

 


 

입력과 출력: arguments & parameter

 

프로그램을 실행했을 때 입력 값을 받는 가장 표준적인 방법 = 인자 argument (args) 로 받는다.

parameter에 여러개의 값이 들어올 때 대괄호에 순서 입력을 통해 입력 값을 받아올 수 있다. 

 

 

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 OkJavaGoInHome {
 
  // 매개변수 parameter
    public static void main(String[] args) {
         
        String id = args[0];
        String bright = args[1];
         
        // 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.setBright(Double.parseDouble(bright)); // string → double 변경 // 추가
        moodLamp.on();
    }
}

 

 

 

argument 지정하는 법

run configurations → Arguments → " "로 인자 지정 

 

 

 

 

결과

 

 

id = arg[0] = Java APT 507
bright = arg[1] = 15.0

 

로 결과 값 도출 됨.

 

 

 

 


 

 

직접 컴파일하고 실행하기: 소개

 

 

이클립스 같은 개발 도구를 이용하지 않고 자바로 만든 파일을 compile하고 실행하는 방법을 살펴보자.

 

이 걸 할 수 있으면 어느 환경에서든 자바 파일만 있으면 compile과 실행할 수 있다.

 

 

중요 키포인트 3가지

1. Compile
java 확장자가 붙은 소스 코드를 class 확장자가 붙은 실행 파일로 변경(compile)하기.

2. Run
class 확장자가 붙은 파일을 실행(run)한다. 

3. Input
 실행 시 입력 값(input)을 준다. 입력 값에 따라 다른 출력 값을 만든다. 

 

 

 


 

자바 문서 보는 법 : API vs UI

 

자바가 제공하는 기본 라이브러리를 사용하는 방법, 즉 api 사용 방법을 살펴보자.

 

어플리케이션 프로그래밍 인터페이스 (API)
= 자바가 기본적으로 제공하는 부품들의 조작 방법
= 자바를 응용해 프로그래밍적으로 실행되는 프로그램을 만들기 위해서 사용하는 조작 장치, 조작 방법

 

 

프로그램

= 시간의 순서에 따라 실행된다는 시간이 강조된 표현

 

어플리케이션

= 자바가 제공하는 부품들을 응용해서 만든다는 표현

 

 

프로그램을 잘 만들기 위해서는

1. 어떤 API가 있고, 2. API를 어떻게 조작하는가를 안다.

 

 

UI
= 사용자가 우리가 만든 프로그램을 조작하기 위해서 사용하는 조작 장치
= 웹이면 링크, 데스크탑이면 어플리케이션 버튼, 커맨트라인 시스템이면 argument 같은 것

 

 

 


 

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

 

 

패키지 package
= 서로 연관된 비슷한 성격의 클래스 class를 모아서 이름 붙인 것


클래스 class
= 서로 연관된 변수 variable과 메서드 method를 모아서 거기에 이름 붙인 것


클래스 간의 충돌 방지를 위해 패키지로 묶는다.

 

 

 


 

자바 문서 보는 법 : 클래스

 

 

Math class

= 자바는 수학과 관련된 작업을 할 때 도움을 주기 위해서 기본적으로 수학과 관련된 클래스

 

 

public class ClassApp {

	public static void main(String[] args) {
		
		System.out.println(Math.PI); // 파이 값 구하기 3.14..
		System.out.println(Math.floor(1.6)); // 내림 1.0
		System.out.println(Math.ceil(1.6)); // 올림 2.0

	}

}

 

 

 

클래스 사용법만 알자.

 

 


 

자바 문서 보는 법 : 인스턴스 instance

 

 

import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class InstanceApp {

	public static void main(String[] args) throws FileNotFoundException {
		
		PrintWriter p1 = new PrintWriter("result1.txt");
		p1.write("Hello 1");
		p1.close();
		
		PrintWriter p2 = new PrintWriter("result2.txt");
		p2.write("Hello 1");
		p2.close();
	}

}

 

 

 

 

클래스는 한번만 사용하는 게 있고 여러번 사용하는 게 있다.

만약 파이를 프린트하고 싶다면 클래스의 내용이 여러번 반복되어야 할 필요가 없다.

하지만 클래스의 내용이 계속 바뀌어야 한다면, 예를 들어 텍스트 파일의 글이 계속 바뀌어야 한다면, 하나의 클래스의 같은 메서드를 여러번 반복해서 쓰는 건 비효율적이고 보기도 힘들다. 

인스턴스 : 하나의 파일에 대해서만 후속 작업을 하는 게아니라 여러 파일에 대해 해야하는 경우가 많다. new를 이용해 복제해서 인스턴스를 만들어 사용하는 것이 효율적이다.

 

Math 클래스는 constructor가 없지만, 

PrintWriter는 constructor가 있다 = constructor를 이용해 instance를 만드는 것이 허용되어 있다. 

 

클래스를 인스턴스화하고 싶을 때,

constructor 앞에 new를 붙이면 그게 복제되어 인스턴스가 되고 그 인스턴스의 어떤 값이 올 수 있냐를 규제하기 위해서 앞에 PrintWriter라고 하는 클래스 이름을 적는다.

 

 


 

자바 문서 보는 법 : 상속

 

클래스 만들 때 처음부터 끝까지 다 만들기 힘드니까 부모 클래스의 변수와 메서드를 그대로 가져와 쓰는 것

클래스에 기능이 확장되는 것

 

중복된 정의에 확장된 기능을 추가할 수 있어 편리하다.

 

상위 클래스의 변수나 메서드를 사용해서 새로운 클래스를 만들고 싶을 때 상위 클래스를 상속 받은 자식 클래스를 만들 수 있다.

 

자신이 메서드를 가지고 있지 않아도 부모나 조부모가 가지고 있다면 그 것을 이어받아 사용할 수 있다.

 

 

 

 

가장 기본적인 object class 
= 모든 클래스는 object class를 반드시 상속 받는다.

Writer라 하는 클래스를 만드는데 object를 상속받는다. 이 때 사용하는 키워드가 extends다. 
= object를 확장 extends 해서 Writer 클래스를 만들었다.

PrintWriter라 하는 클래스를 만드는데 처음부터 끝까지 만드는 게 아니라 Writer 클래스를 확장해 상속받아 만든다.

 

PrintWriter p1 = new PrintWriter("result 1");
p1.toString()

 

이 상태에서 PrintWriter에 인스턴스를 만들고 그 인스턴스에 toString을 하게 되면,

 

이 toString이 object에 있다고 하면 자바는 어떻게 동작할까?

 

PrintWriter 클래스에 toString 메서드가 있는지 보고 없으면,

extends가 가리키는 Writer에서 찾는다. 그래도 없으면,

extends가 가리키는 Object에서 찾는다. 그래도 없으면,

에러가 나고, 있으면

toString이 실행된다.

 

 

Writer 클래스는 write 입력 값으로 String을 받는 메서드가 정의되어 있다. 

 

그런데, PrintWriter에서도 write 입력 값이 String인 메서드가 정의되어 있다.

 

Writer에도 있는데 그 것을 상속 받는 PrintWriter도 write를 가지고 있다. 

 

즉, 덮어 쓰기 overriding이 된 상태다.

 

 

 

 

Writer에서 write 기능을 만들었는데,

 

PrintWriter를 만든 사람이 이 writer 메서드가 맘에 들지 않아 덮어쓰기 했다.

 

다른 사람이 만든 클래스, 메서드, 변수가 상속 관계에 있을 때 그 것의 관계, 매뉴얼 상에서 어떻게 해석하는 지 파악하는 게 중요하다. 

 

 


 

나의 앱 만들기 - 오리엔테이션

 

 

지금까지 배운 것을 활용 해 앱을 만들어 보자.

 

 

 

 


 

나의 앱 만들기 - 기본 기능 구현

 

변수 사용하지 않고 앱 만들기

 

변수를 사용하지 않고 시간의 순서에 따라 실행한다.

화면에 결과 값을 출력한다.

더하기, 빼기, 곱하기, 나누기와 같은 연산만을 가지고 문제를 해결한다.

 

 

public class AccountingApp {

	public static void main(String[] args) {
		
		System.out.println("Value of supply : " +10000.0); //공급가
		System.out.println("VAT : " + (10000.0*0.1)); //부가세
		System.out.println("Total : " + (10000.0 + 10000.0*0.1)); //총합
		System.out.println("Expense : " + (10000.0*0.3) ); //비용
		System.out.println("Income : " + (10000.0 - 10000.0*0.3) ); //이익(전체수익)
		System.out.println("Dividended 1 : " + (10000.0 - 10000.0*0.3) * 0.5 ); //배당금
		System.out.println("Dividended 2 : " + (10000.0 - 10000.0*0.3) * 0.3 ); //배당금
		System.out.println("Dividended 3 : " + (10000.0 - 10000.0*0.3) * 0.2 ); //배당금
		

	}

}

 

 

// 결과값

Total : 11000.0
Expense : 3000.0
Income : 7000.0
Dividended 1 : 3500.0
Dividended 2 : 2100.0
Dividended 3 : 1400.0

 

 


 

나의 앱 만들기 - 변수 도입

 

변수 사용해서 앱 만들기

 

한번에 변수화 시키는 방법

alt + shift + L

 

 

public class AccountingApp {

	public static void main(String[] args) {
		
		double valueOfSupply = 10000.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("Dividended 1 : " + dividend1 ); //배당금
		System.out.println("Dividended 2 : " + dividend2 ); //배당금
		System.out.println("Dividended 3 : " + dividend3 ); //배당금
		

	}

}

 

 


 

나의 앱 만들기 - 입력 값 도입

 

 

입력 값을 주면 그에 따는 출력 값을 출력한다.

 

 

 

변경 코드 

double valueOfSupply = Double.parseDouble(args[0]);

 

String 타입만 입력 가능이라 Doube 타입으로 변환

 

 

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("Dividended 1 : " + dividend1 ); //배당금
		System.out.println("Dividended 2 : " + dividend2 ); //배당금
		System.out.println("Dividended 3 : " + dividend3 ); //배당금
		

	}

}

 

 

실행 방법:

 

1. Run Configurations에서 Argument로 값 추가

 

2. cmd

 

 

 

 


 

나의 앱 만들기 - 조건문

 

 

자바의 제어문은 크게 1. 조건문 2. 반복문이 있다.

 

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.0;
    dividend2 = income * 0;
    dividend3 = income * 0;
}

 

 

 

// 전체 코드

public class AccountingIFApp {

	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.0;
			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("Dividended 1 : " + dividend1 ); //배당금
		System.out.println("Dividended 2 : " + dividend2 ); //배당금
		System.out.println("Dividended 3 : " + dividend3 ); //배당금
		

	}

}

 

 

// Run Configurations에서 공급가 5만 설정
Value of supply : 50000.0
VAT : 5000.0
Total : 55000.0
Expense : 15000.0
Income : 35000.0
Dividended 1 : 17500.0
Dividended 2 : 10500.0
Dividended 3 : 7000.0

 

 

// Run Configurations에서 공급가 5천 설정
Value of supply : 5000.0
VAT : 500.0
Total : 5500.0
Expense : 1500.0
Income : 3500.0
Dividended 1 : 3500.0
Dividended 2 : 0.0
Dividended 3 : 0.0

 

 

 

 


 

나의 앱 만들기 - 배열

 

배열이란 여러 값을 담는, 순서가 있는 변수이다.

 

배열의 값은 인덱스를 가지며 모두 같은 타입이라는 특징이 있다. 인덱스는 0부터 시작한다.

 

배열 사용 이유는 다수의 변수를 선언할 때의 편의성을 위해서다.

선언해야 하는 변수가 적다면 사용할 필요 없지만 프로젝트의 값과 변수들이 많아지면 혼동이 되거나 겹칠 수 있으므로 배열 이용한다.

 

반복문과 같이 사용하면 수정도 편리하게 할 수 있다.

 

 

double[] = dividendRates = new double[3] 

3가지의 더블로 이루어진 배열을 의미

 

// 수정 전

rate1 = 0.5;
rate2 = 0.3;
rate3 = 0.2;

double dividend1 = income * rate1;
double dividend2 = income * rate2;
double dividend3 = income * rate3;

 

 

// 수정 후

double[] dividendRates = new 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];

 

 

 

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];
        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 1 : " + dividend1);
        System.out.println("Dividend 2 : " + dividend2);
        System.out.println("Dividend 3 : " + dividend3);
 
    }
 
}

 

 

 


 

나의 앱 만들기 - 반복문

 

단순히 데이터가 반복되는 경우 이를 하나의 코드로 모두 처리할 수 있도록 하는 기능이다.

 

하나의 코드를 수정하는 것으로 수 많은 데이터가 동시에 수정돼 유용하다.

 

반복문은 배열로만 적용 가능한건가?

 

// 수정 전

double[] dividendRates = new 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];

 

// 수정 후
int i = 0;
while(i < dividendRates.length) {
	System.out.println("Dividend : " + (income * dividendRates[i]));
    	i = i + 1;
}

 

 

// 전체 코드
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;
         
       
        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);
        
        double[] dividendRates = new double[3];
        dividendRates[0] = 0.5;
        dividendRates[1] = 0.3;
        dividendRates[2] = 0.2;
         
        int i = 0;
        while(i < dividendRates.length) {
        	System.out.println("Dividend : " + (income * dividendRates[i]));
        	i = i + 1;
        }
 
    }
 
}

 

 

// 결과값

Value of supply : 10000.0
VAT : 1000.0
Total : 11000.0
Expense : 3000.0
Income : 7000.0
Dividend : 3500.0
Dividend : 2100.0
Dividend : 1400.0

 

 


 

나의 앱 만들기 - 메소드

 

 

서로 연관된 코드를 그룹핑해서 이름 붙인 정리 정돈 상자

 

 

alt+shift+M

메소드로 만드는 단축키

 

 

// 수정 전

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 1 : " + dividend1);
        System.out.println("Dividend 2 : " + dividend2);
        System.out.println("Dividend 3 : " + dividend3);
 
    }
 
}

 

 

// 수정 후

public class AccountingMethodApp {
    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 1 : " + getDiviend1());
        System.out.println("Dividend 2 : " + getDiviend2());
        System.out.println("Dividend 3 : " + getDiviend3());
    }
 
    public static double getDiviend1() {
        return getIncome() * 0.5;
    }
    public static double getDiviend2() {
        return getIncome() * 0.3;
    }
    public static double getDiviend3() {
        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 전역 변수로 빼고,

 

나머지는 메서드로 만들기

 

valueOfSupply 입력 값이 정해지지 않았을 때는 어떻게 구현?

 

 

 

이렇게 상자에 저장한 후 print(); 만 입력하면 메소드 안에 있는 코드들이 출력된다.

많은 코드들이 한 줄의 코드로 출력이 가능해졌다.

 


 

나의 앱 만들기 : 클래스

 

 

print(); 메서드는 흔해서 더 분류해주지 않으면 어떤 코드를 print 한다는 건지 알 수 없다. 

어떤 것을 print 하는지 구분하기 위해서 Accounting.print(); 식으로 코드를 불러내야 헷갈리지 않는다.

 

그러기 위해서는 class를 잘 이용해야 한다.

 

 

// AccountingMethodApp 복사
// 전체 코드

class Accounting {
  public static double valueOfSupply;
  public static double vatRate;
  public static double expenseRate;
  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();
  }

  private static double getVAT() {
    return valueOfSupply*vatRate;
  }
 
  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("Dividended 1 : " + getDividend1());
    System.out.println("Dividended 2 : " + getDividend2());
    System.out.println("Dividended 3 : " + getDividend3());
   
  }

}

public class AccountingClassApp {
 
  public static void main(String[] args) {  
    Accounting.valueOfSupply = 10000.0;
    Accounting.vatRate = 0.1;
    Accounting.expenseRate = 0.3;
    Accounting.print();

  }
}

 

 


 

나의 앱 만들기 : 인스턴스

 

하나의 클래스를 복제해서 서로 다른 데이터의 값과 서로 같은 메소드를 가진 복제본을 가지는 것

 

변수만 다른 클래스를 추가할 때마다 복사, 붙여넣기를 이용해 클래스 전체를 새로 정의하는 건 비효율적이기 때문에

같은 클래스를 이용하되 데이터 변수를 다르게 하고 싶을 때

인스턴스 기능을 이용한다.

 

 

 

class Accounting{
    public double valueOfSupply; // 변수 새로 정의하는 클래스는 static 다 지운다
    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 1 : " + getDiviend1());
        System.out.println("Dividend 2 : " + getDiviend2());
        System.out.println("Dividend 3 : " + getDiviend3());
    }
 
    public double getDiviend1() {
        return getIncome() * 0.5;
    }
    public double getDiviend2() {
        return getIncome() * 0.3;
    }
    public double getDiviend3() {
        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 { // 기존 메서드에서는 static이 빠지면 안된다
     
    public static void main(String[] args) {
        // instance 
        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();
         
    }
}

 

 

new 들어가는 인스턴스화된 클래스는 static 그대로 두고,

 

데이터 값 끌어오는 클래스는 static 지운다.

 

'Java > 생활코딩' 카테고리의 다른 글

생활코딩 JAVA 상속  (0) 2022.03.17
생활코딩 JAVA 객체 지향 프로그래밍  (0) 2022.03.16
메소드 Method  (0) 2022.03.16
생활코딩 JAVA 제어문  (0) 2022.03.15
인스턴스 Instance  (0) 2022.03.15