본문 바로가기

생활코딩/JAVA1

생활코딩) JAVA1 - 14.11. 나의 앱 만들기 - 인스턴스

https://youtu.be/TOptBzGgJOw

 

우리 전 시간에 클래스를 이용해서 우리의 코드의 구조를 더 튼튼하게, 더 사용하기 쉽게 만드는 방법을 살펴 봤는데요. 객체 지향의 양대 산맥은 클래스와 인스턴스라는 개념입니다. 그래서 이번 시간에 인스턴스 를 살펴 볼 건데, 자 인스턴스는 이렇게 한번 얘기해 볼게요. 한번 따라해 보세요. 인스턴스는 하나의 클래스를 복제해서 서로 다른 데이터의 값과 서로 같은 메소드를 가진 복제본을 만드는 것이다. 

자 이 수업에서는 새로 클래스를 만들지 않구요 AccountingClassApp을 수정을 하면서 이걸 한번 개선을 시켜 보겠습니다. 자 여기 우리가 짰던 이 코드는 아무 문제가 없는 코드에요.  그런데 이런 경우를 한 번 생각해 보시죠. 자 이렇게 어카운팅에 내부적인 상태, 보통 상태라고 하는 변수의 값입니다. 상태가 뭐 수십 개를 세팅을 쭉 해서 뭐 수십 개의 메소드가 뭐 수백개의 메소드가 호출이 됐다. 그런데 어쩌다가 한번 다른 제품이 들어오는 거예요. Accounting.valueofSupply그리고 그 제품은 값이 2만원 이에요.  그리고 그 제품은 vatRate가 0.5인 거에요. 어떤 국가들은 부가가치세의 세율이 제품마다 다르거든요. vatRate는 0.05, expenseRate 이 제품의 경우에는 0.2이구요. 그래서 메소드를 딱 한번 호출 한 다음에 다시 이전에 작업했던 만원에 0.1% 0.3 에 해당되는 저걸 또 해야 된다. 저 작업에 대한 여러가지 작업을 또 해야 된다 라고 한다면 다시 상태를 세팅해 주고 그리고 또 거기서 메소드를 호출하는 걸 통해서 이렇게 코딩을 해 나가겠죠. 그리고 이 가정이 막 빈번하게 발생한다고 한다면 이렇게 클래스의 내부 저 상태를 바꾸는 행위가 버그를 유발 할 가능성이 굉장히 높습니다. 

자 이런 상황에서 일 잘하는 사람은 이 코드를 이렇게 바꿀 거에요. 자 class Accounting이라고 하는 저 클래스 에 이름을 Accounting1 으로 바꿉니다. 그리고 이걸 카피해서 Accounting2로 바꿔요. 그리고 쓰리 포 계속 몇 가지를 만든 다음에 여기 있는 이 코드는 어떻게 하냐. Accounting1의 valueofSupply . 그 다음에 어떻게 해요 어카운팅 여기있네요 부분이 만원짜리 저거에 대한 세팅은 Accounting2에게 주는 거예요.

 

class Accounting1{
	public static double valueofSupply;
	public static double vatRate;
	public static double expenseRate;
	
	private 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());
	}
	private static double getDividend3() {
		return getIncome() * 0.2;
	}
	
	private static double getDividend2() {
		return getIncome() * 0.3;
	}
	
	private static double getDividend1() {
		return getIncome() * 0.5;
	}

	private static double getIncome() {
		return valueofSupply - getExpense();
	}

	private static double getExpense() {
		return valueofSupply*expenseRate;
	}

	private static double getTotal() {
		return valueofSupply + getVAT();
	}

	private static double getVAT() {
		return valueofSupply*vatRate;
	}

}

class Accounting2{
	public static double valueofSupply;
	public static double vatRate;
	public static double expenseRate;
	
	private 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());
	}
	private static double getDividend3() {
		return getIncome() * 0.2;
	}
	
	private static double getDividend2() {
		return getIncome() * 0.3;
	}
	
	private static double getDividend1() {
		return getIncome() * 0.5;
	}

	private static double getIncome() {
		return valueofSupply - getExpense();
	}

	private static double getExpense() {
		return valueofSupply*expenseRate;
	}

	private static double getTotal() {
		return valueofSupply + getVAT();
	}

	private 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();
//		// ...
//		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();
		
		Accounting1.valueofSupply = 10000.0;
		Accounting1.vatRate = 0.1;
		Accounting1.expenseRate = 0.3;
		Accounting1.print();
		
		Accounting2.valueofSupply = 20000.0;
		Accounting2.vatRate = 0.05;
		Accounting2.expenseRate = 0.2;
		Accounting2.print();
	}
	
}	


자 이렇게 되면 Accounting1의 valueofSupply 와 vatRate, expenseRate 의 값은 이미 세팅이 됐기 때문에 이 이후에 print 이렇게 메소드를 호출 한다고 해도 아무 문제없이 잘 동작할 것입니다 왜냐하면 Accounting1의 내부적인 상태는 변경되지 않을 거니까요. 이거 어떻게 한 거에요 클래스를 복제해서 서로 다른 상태 서로 같은 메소드를 갖도록 한 것이죠. 그것을 통해서 우리가 하나의 클래스를 돌려 막기하는 것이 아니라 복제된 클래스를 이용해서 더 편리하고 더 버그가 적은 코딩을 할 수 있게 된다는 것입니다. 진짜 어려운 말이에요 이해가 금방 안될겁니다.

자 그런데 이제 이렇게 하는건 좀 별로잖아요. 이것도 좋은 방법이지만 어떤 점에서요.  만약에 우리가 이 클래스의 메소드를 바꾸려면 복제한 모든 클래스의 메소드를 바꿔 줘야 될 겁니다. 그리고 이제 클래스를 생성할 때마다 이렇게 정의를 추가하는 것 좀 그렇잖아요. 
그쵸 그래서 이 자바를 만든 사람들은 클래스라는 것을 복제할 수 있는 기능을 마련했습니다. 아 요거는 요것도 쭉 이렇게 주석처리 하구요. 어떻게 하냐 Accounting 앞에다가 new를 붙여요. 그렇게 뭐다 어카운팅 클래스 를 복제하는 명령입니다. 자 그리고 이렇게 괄호 열고 괄호 닫고 해주셔야 됩니다. 자 그러면 요걸 실행했을 때 Accounting2 복제된 무엇이 만들어지는데 저는 a1 이라는 이름을 붙이고 저의 a1이라는 저 변수의 값으로는 반드시 어카운팅 의 복제 분만 들어올 수 있다라고 이렇게 표시를 해 줬습니다. 자 그렇게 한 다음에 a1의 valueofSupply는 이렇게 처리를 한 거죠. 자 그럼 이제 또 다른 복제본이 필요할 때는 a2 그리고 여기 있는 코드는 이렇게 해서 ...

 

		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를 해도 정상적으로 잘 동작할 거란 말이죠. 그러면서도 클래스를 복제 하지 않아도 되니까 얼마나 좋아요. 잘 이해 안될꺼예요 물론. 자 이렇게 하는 것이 이렇게 할 수 있다는 거구요. 이때에 new를 붙여서 클래스 이름 앞엔 new 를 붙여서 만들어진 그 무엇을 뭐라고 하냐면 인스턴스 라고 부릅니다. 자 그리고 이 코드가 동작하기 위해서는 여기 있는 static이라고 하는 키워드가 이제는 사용되면 안돼요. 


자 그리고 실행시켜 볼까요. 어 우리가 예상한 대로 잘 동작하고 있는 것을 볼 수가 있죠. 자 코드를 좀 정리 할까요. 자 이것이 바로 인스턴스 라고 하는 것입니다. 그래서 자바에서는 메소드로 구조를 잡고 또 메쏘드 와 변수를 그룹핑해서 클래스로 구조를 또 잡고요,  그 클래스를 복제한 인스턴스를 통해서 또 다른 구조를 만드는 방식으로 이 코드의 성을 쌓아 가는 것이 자바라고 하는 컴퓨터 언어의 독특한 특징이라고 할 수 있고 이런 특징을 현대의 많은 컴퓨터 언어들이 따르고 있는 특징이기도 합니다.

자 여기까지 할까요 더 할 수도 있겠지만 뭐 이정도면 제 생각에는 적당한 것 같아요. 아니 조금 과한 면도 있는 것 같습니다. 더 중요한 것은 여러분이 스스로 불편함을 느끼고 또 그 불편함을 극복할 수 있는 방법을 스스로 찾아서 해결하다 보면 어 더 이상 이제 그 선생님의 의존하는 엑스트라가 아니라 자기 자신이 뭔가를 주체적으로 하고 있는 주인공이 되실 겁니다. 그 상태까지 가면 노력하지 않아도 노력한다고 저는 생각합니다. 자 그럼 요 정도 까지 해서 나의 앱 만들기는 마무리 짓고 이제 여러분이 직접 불만족을 찾아서 발전을 시켜 나가시길 바랍니다. 응원합니다

 


------

* 유튜브 강의에서 자막을 추출해 정리했습니다.

-----

 

 

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

* 클래스를 복제해서 서로 다른 상태 서로 같은 메소드를 갖도록 한 것이죠. 그것을 통해서 우리가 하나의 클래스를 돌려 막기하는 것이 아니라 복제된 클래스를 이용해서 더 편리하고 더 버그가 적은 코딩을 할 수 있게 된다는 것입니다.

* 자바에서는 메소드로 구조를 잡고 또 메쏘드 와 변수를 그룹핑해서 클래스로 구조를 또 잡고요,  그 클래스를 복제한 인스턴스를 통해서 또 다른 구조를 만드는 방식으로 이 코드의 성을 쌓아 가는 것이 자바

 

- 유튜브 댓글 퍼옴

- 인스턴스는 클래스를 복제한 복제본이다. - 인스턴스를 사용하는 이유는 "클래스의 각 기능들을 갖고있는 동시에 각 인스턴스마다 다른 데이터값을 넣어 사용할 수 있기 때문"이다. 클래스의 기능들에 여러 값을 자꾸 넣어줘야 할 시 이랬다 저랬다 하면 버그가 발생할 수 있는데, 인스턴스를 만들어 사용해 아예 '경우1' '경우2' ... 식으로 독립적인 인스턴스를 생성해 사용해버리면 버그발생과 같은 일을 미연에 방지할 수 있기 때문이다. - 인스턴스는 클래스로부터 비롯된 분신인데, 클래스가 붕어빵 틀이라면 인스턴스는 각 붕어빵 이다.

반응형