객체지향의 양대산맥은 클래스와 인스턴스이다.
인스턴스는 하나의 클래스를 복제해서 서로 다른 데이터의 값(상태)과 서로 같은 메소드를 가진 복제본을 만드는 것이다. 또 클래스를 실제로 실행시킨 실체화된 클래스라고도 할 수 있다. 이를 통해 다양한 상태에 있는 여러 개의 클래스를 돌릴 수 있다.
여러 조건에 따라서 다른 출력을 내고 싶다고 가정해 본다.
OO 상품
공급가 : 10000
부가가치세율 10%
공급가 대비 비용률 : 30%
XX 상품
공급가 : 20000
부가가치세율 5%
공급가 대비 비용률 : 20%
and so on...
이럴 경우 기존의 방식으로 프로그램을 실행하게 된다면, 변수를 조정하는 과정에서 프로그램이 꼬일 수 있다. 이 때 각각의 상태에 따라 인스턴스를 생성해서 실행하는 것이 방법이다.
a1 인스턴스는 a2 인스턴스의 작업이 끝난 후에도 여전히 남아 있다. 그래서 마지막에 a1 인스턴스의 print 메소드를 실행해도 같은 결과를 낸다.
인스턴스를 만들어주는데 옆의 노란 부분을 클릭해보면 'static'이라는 것을 사용하지 말라고 나온다.
위의 코드에서 static을 모두 지워준 다음 코드를 실행시켜주면 정상 작동한다.
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 1: " + (getIncome() * getDividend1()));
System.out.println("Dividend 2: " + (getIncome() * getDividend2()));
System.out.println("Dividend 3: " + (getIncome() * getDividend3()));
}
private double getDividend3() {
return getIncome() * 0.2;
}
private double getDividend2() {
return getIncome() * 0.3;
}
private double getDividend1() {
return getIncome() * 0.5;
}
private double getIncome() {
return valueOfSupply - getExpense();
}
private double getExpense() {
return valueOfSupply*expenseRate;
}
private double getTotal() {
return valueOfSupply+getVAT();
}
private double getVAT() {
return valueOfSupply*vatRate;
}
}
public class AccountingClassApp {
public void main(String[] args) {
// Accounting.valueOfSupply = 10000.0;
// Accounting.vatRate = 0.1;
// Accounting.expenseRate = 0.3;
// Accounting.print();
//
// Accounting.valueOfSupply = 20000.0;
// Accounting.vatRate = 0.05;
// Accounting.expenseRate = 0.3;
//
Accounting a1 = new Accounting(); // Accounting 클래스를 복제 - instance
a1.valueOfSupply = 10000.0;
a1.vatRate = 0.1;
a1.expenseRate = 0.3;
a1.print();
Accounting a2 = new Accounting();
a2.valueOfSupply = 10000.0;
a2.vatRate = 0.1;
a2.expenseRate = 0.3;
a2.print();
a1.print();
}
}
추가)
댓글에 클래스와 인스턴스의 차이에 대해 기가막힌 비유를 해둔 분의 덧글이 있어서 기억하기 위해 추가해둔다.
내용출처
예를 들어 '가수' 클래스가 있다면 그 인스턴스로 '아이유', '김범수' 등을 만들 수 있다. '가수' 클래스가 '노래하기' '안무하기' 등의 메서드를 가지고 있다면 '아이유'와 '김범수' 인스턴스는 모두 '노래하기' '안무하기' 메서드를 실행할 수 있다. 새 가수를 추가해야 한다고 해서 다시 '가수' 클래스를 만들 필요는 없고, '박효신'이라는 인스턴스를 만들면 된다.
역시나 쉽지 않다 클래스, 인스턴스, 객체지향!