[Java] 나의 앱 만들기 3
목차
1. 메소드
2. 클래스
3. 인스턴스
메소드
메소드는 클래스의 동작을 나타내는 함수이다.
메소드를 이용해 프로그램을 정리한다.
1) 메소드 추출하기
· vat 값을 블록으로 지정한 후 Refactor - Extract Method를 클릭 or Alt+Shift+M
· 메소드의 이름을 지정하고 public 옵션을 선택한 후 OK 클릭
· vat를 구하는 getVAT 메소드 생성
public static double getVAT(double valueOfSuppyly, double vatRate) {
return valueOfSuppyly*vatRate;
}
· vat 변수는 getVAT 메소드를 통해 값을 가져온다.
double vat = getVAT(valueOfSuppyly, vatRate); //부가가치세
getVAT는 main 메소드 내부의 변수(지역 변수)인 valueOfSupply와 vatRate를 매개변수로 사용한다.
지역 변수를 전역 변수로 바꾸면 메소드의 매개변수를 없앨 수 있다.
2) 지역 변수를 전역 변수로 바꾸기
· valueOfSupply와 vatRate 변수에서 Refactor - Convert Local Variable to Field 클릭
** 전역 변수는 Field라고도 한다.
· 변수 이름을 지정하고 public 변수로 만든다.
valueOfSupply는 클래스 어디에서나 접근 가능한 변수가 되었고, 변수의 값은 main 메소드 안에서 할당하고 있다.
이제 getVAT의 파라미터를 없앨 수 있다.
public static double getVAT() {
return valueOfSuppyly*vatRate;
}
마찬가지로 다른 변수들에 대해서도 메소드를 생성하고, 출력하는 부분들도 메소드로 정리한다.
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 double getVAT() {
return valueOfSupply*vatRate;
}
public double getTotal() {
return valueOfSupply+getVAT();
}
public double getExpense() {
return valueOfSupply*expenseRate;
}
public double getIncome() {
return valueOfSupply-getExpense();
}
public double getDividend1() {
return getIncome()*0.5;
}
public double getDividend2() {
return getIncome()*0.3;
}
public double getDividend3() {
return getIncome()*0.2;
}
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("Divididend 1: "+getDividend1());
System.out.println("Divididend 2: "+getDividend2());
System.out.println("Divididend 3: "+getDividend3());
}
}
main 메소드 안의 동작들은 단순해졌고, 세부적인 동작들은 다른 메소드 안에서 정의되어 보기 단정한 코드가 되었다.
클래스
클래스는 서로 연관된 변수와 메소드를 묶어 놓은 것이다.
클래스를 이용해 프로그램을 정리한다.
1) 변수와 메소드 확인하기
· 이클립스 상단 Window - Show View - Outline
-> 클래스의 변수와 메소드들을 볼 수 있다.
2) 클래스 생성하기
· 맨 위에 Accounting 클래스를 생성한다.
· AccountingMethodApp에서 작성한 메소드들을 Accounting 클래스 안에 작성한다.
아래와 같이 Outline이 바뀌는 것을 볼 수 있다.
main 메소드 안의 코드를 수정하면 이전과 똑같이 동작한다.
class Accounting{
public static double valueOfSupply; //공급가
public static double vatRate;
public static double expenseRate;
public double getVAT() {
return valueOfSupply*vatRate;
}
public double getTotal() {
return valueOfSupply+getVAT();
}
public double getExpense() {
return valueOfSupply*expenseRate;
}
public double getIncome() {
return valueOfSupply-getExpense();
}
public double getDividend1() {
return getIncome()*0.5;
}
public double getDividend2() {
return getIncome()*0.3;
}
public double getDividend3() {
return getIncome()*0.2;
}
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("Divididend 1: "+getDividend1());
System.out.println("Divididend 2: "+getDividend2());
System.out.println("Divididend 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();
}
}
이렇게 만든 클래스를 인스턴스화하여 여러 개의 프로그램을 실행할 수 있다.
인스턴스
인스턴스는 클래스를 실제로 실행시킨 실체화된 클래스라고 할 수 있다.
이를 통해 다양한 상태에 있는 여러 개의 클래스를 돌릴 수 있다.
이번에는 여러 조건에 따라 다른 출력을 내고 싶다.
1. A 상품 - 공급가 10000 - 부가가치세율 10% - 공급가 대비 비용률 30% 2. B 상품 - 공급가 20000 - 부가가치세율 5% - 공급가 대비 비용률 20% |
기존 방식으로 프로그램을 실행한다면, 변수를 조정하는 과정에서 프로그램이 꼬일 수 있다.
Accounting.valueOfSupply=10000.0;
Accounting.vatRate=0.1;
Accounting.expenseRate=0.3;
//...
Accounting.print();
//...
//anotherVariable=...;
//anotherMethod=...;
Accounting.valueOfSupply=20000.0;
Accounting.vatRate=0.05;
Accounting.expenseRate=0.2;
Accounting.print();
//...
Accounting.valueOfSupply=10000.0;
Accounting.vatRate=0.1;
Accounting.expenseRate=0.3;
Accounting.print();
이때 각각의 상태에 따라 인스턴스를 생성해서 해결할 수 있다.
우선 Accounting 클래스의 static 키워드를 모두 제거한다.
이번 상황에서는 2가지 상태가 있기 때문에 2개의 인스턴스를 생성한다.
Accounting a=new Accounting();
Accounting b=new Accounting();
각각의 인스턴스를 상태에 맞춰 조절한다.
Accounting a=new Accounting();
a.valueOfSupply=10000.0;
a.vatRate=0.1;
a.expenseRate=0.3;
a.print();
Accounting b=new Accounting();
b.valueOfSupply=20000.0;
b.vatRate=0.05;
b.expenseRate=0.2;
b.print();
a.print();
a는 b의 작업이 끝난 후에도 여전히 남아 있다. 그래서 마지막에 a의 print 메소드를 실행해도 동일한 결과가 나온다.