본문 바로가기

Java/Java 객체지향프로그래밍

객체지향 프로그래밍 활용~

728x90
반응형

하하 영상은 열심히 봤는데 도통 머리에 제대로 남은게 맞나 의심이 간다

 

일단 class를 활용하는 방법과 그 이유를 다시 한 번 되짚어 보자면..

 

class Accounting{
	
	 public static double valueOfSupply;
	 public static double vatRate = 0.1;
	 public static double getVAT() {
	        return valueOfSupply * vatRate;
	    }
	     
	    public static double getTotal() {
	        return valueOfSupply + getVAT();
	    }
}

public class AccountingApp {
    
    public static void main(String[] args) {
    	Accounting.valueOfSupply = 10000.0;
        System.out.println("Value of supply : " + Accounting.valueOfSupply);
        System.out.println("VAT : " + Accounting.getVAT());
        System.out.println("Total : " + Accounting.getTotal());
 
    }
 
}

이 지겹도록 쓴 예제 코드가 보이시나요...?

 

아무리 AccountingApp 이라지만 부가가치세를 포함한 상품가격을 지정해주는 코드들은 또 따로있다. 

그럼 그 연관된 코드들을 그냥 Accounting이라는 class로 묶어버리는거다. 

일종의 정리정돈 처럼. 

 

 

그러면 이제 main method 안에서 실행해야할 코드들에서 

Accounting.(블라블라) 이렇게 딱 그 class를 호출해올 수 있는것이다. 

 

또 쓰는 말이지만...

개같이도 많은 nct 유닛중에서 dream만 뽑아와... 하고 쓸려고 만든게 class다 이거다..

 

응응

 

 

근데 이제 어떨때 instance를 써야할지도 이해해야겠지?

 

똑같은 예제 코드를 보고 설명을 듣자

 

class Accounting{
	
	 public static double valueOfSupply;
	 public static double vatRate = 0.1;
	 public static double getVAT() {
	        return valueOfSupply * vatRate;
	    }
	     
	    public static double getTotal() {
	        return valueOfSupply + getVAT();
	    }
}

public class AccountingApp {
    
    public static void main(String[] args) {
    	Accounting.valueOfSupply = 10000.0;
        System.out.println("Value of supply : " + Accounting.valueOfSupply);
        System.out.println("VAT : " + Accounting.getVAT());
        System.out.println("Total : " + Accounting.getTotal());
        
        
 		Accounting.valueOfSupply = 20000.0;
        System.out.println("Value of supply : " + Accounting.valueOfSupply);
        System.out.println("VAT : " + Accounting.getVAT());
        System.out.println("Total : " + Accounting.getTotal());
    }
 
}

 

 

이것처럼 만약 같은 앱 안에서 가격이 다른 물건이 존재하고, 똑같은 기능을 사용해줘야 한다면

이럴 경우에 instance를 사용하는거다. 

 

왜냐면 instance는 class에서 변수만 바꿔서 같은 기능을 사용할때 쓰는 것이기 떄문에.

 

// 가 아니라 굳이 instance화 할 필요가 없단다.. 웁스..

 

 

그럼 진짜 언제???

 

아하 그니까 저 위에 코드는 10000원인 물건에 대한 모든 계산을 끝마친 후에 20000원에 대한 계산을 다시 하는거라서 굳이 instance화 할필요가 없는거였다. 

 

근데 만약 이런 경우가 있다고 생각해보자

 

10000원인 물건의 공급가액 구하기

20000원인 물건의 공급가액 구하기

10000원인 물건의 최종판매가격 구하기

20000원인 물건의 최종판매가격 구하기

 

이런식으로 class가 계속해서 바뀌어서 사용되야 한다면

 

 

public class AccountingApp {
    
    public static void main(String[] args) {
    	Accounting.valueOfSupply = 10000.0;
        System.out.println("Value of supply : " + Accounting.valueOfSupply);
        Accounting.valueOfSupply = 20000.0;
        System.out.println("Value of supply : " + Accounting.valueOfSupply);
        
        Accounting.valueOfSupply = 10000.0;
        System.out.println("VAT : " + Accounting.getVAT());
        Accounting.valueOfSupply = 20000.0;
        System.out.println("VAT : " + Accounting.getVAT());
        
        Accounting.valueOfSupply = 10000.0;
        System.out.println("Total : " + Accounting.getTotal());
        Accounting.valueOfSupply = 20000.0;
        System.out.println("Total : " + Accounting.getTotal());
 
    }

 

이렇게 계속해서 valueOfSupply 값을 바꿔줘야 한다는거다. 

지금은 만원 이만원 두개의 케이스만 가지고 만들었지만, 실전에서는 가격 제품만해도 몇 천개 이상의 데이터가 쌓일수도 있다. 그래서 이런 식으로 계속해서 Accounting class를 끌고 와야하는경우, 그리고 그 값이 지속적으로 바껴야 하는 경우에는 instance로 값을 복제해서 사용하는게 더 실용적이라는 그런 설명이다. 

 

 

public class AccountingApp {
    
    public static void main(String[] args) {
    	Accounting a1 = new Accounting();
    	a1.valueOfSupply = 10000.0;
    	
    	Accounting a2=new Accounting();
    	a1.valueOfSupply = 10000.0;
    }
 
}

그래서 우선 이렇게 새로운 instance 2개를 만들어주고, valueOfSupply라는 값을 다르게 설정해준다. 

 

class Accounting{
	
	 public double valueOfSupply;
	 public static double vatRate = 0.1;
	 public double getVAT() {
	        return valueOfSupply * vatRate;
	    }
	     
	    public double getTotal() {
	        return valueOfSupply + getVAT();
	    }
}

public class AccountingApp {
    
    public static void main(String[] args) {
    	Accounting a1 = new Accounting();
    	a1.valueOfSupply = 10000.0;
    	
    	Accounting a2=new Accounting();
    	a1.valueOfSupply = 10000.0;
    	
    
        System.out.println("Value of supply : " + a1.valueOfSupply);
        System.out.println("Value of supply : " + a2.valueOfSupply);
        
        
        System.out.println("VAT : " + a1.getVAT());
        System.out.println("VAT : " + a2.getVAT());

       
        System.out.println("Total : " + a1.getTotal());
        System.out.println("Total : " + a2.getTotal());
    }
 
}

 

와 이렇게 해주고 나서 왜 안되지? 하고 이해 못할뻔 한걸 짚고 넘어가주셨다. 

 

이전에 열심히 썼다시피 static이 붙으면 class에서 사용하는 method이고, static이 붙지 않아야 instance에서 사용가능해진다. 진짜 엄청 열심히 정리해서 기억에 확남았다. 

 

그러니까 당연히 저 위에 Accounting Class에 있는 method들 앞에 붙어있던 static을 다 떼준다. 

그래야만 instance에서 쓸 수 있는거다......

 

대박....

 

*) vatRate라는 0.1의 값은 어떤 instance에서도 동일하기 때문에 굳이 static 떼줄 필요가 없다. class의 소속으로 냅두는거 / 이러면 부가가치세율이 바뀌었을때 class단위에서 변경하면 링크로 연결되어 있는 instance들의 값까지 한 번에 바뀌기 때문에, 유지보수가 더 쉬워진다. 그래서 고정된 값은 굳이 instance 값으로 바꾸지 않아도 된다. 

 

 

 

그러니까 정리하면

a1, a2 이렇게 두 개의 독립된 instance를 생성해줬기 때문에, 얘네 둘은 안심하고 따로 돌아가게 될 수 있고

a1에서 문제가 생긴다 한들 a2에는 영향이 가지 않는 뭐 그런 상태라고 이해하면 된다. 

이렇게 됐을때 버그가 발생할 확률이 더 줄어든다고 한다. 

 

 

 

그리고!! 헷갈렸던 생성자와 this 개념 다시 정리

 

만약에 10000, 20000원 이라는 값들을 생성하는단계에서 무조건 먼저 설정하게 하고 싶다면

생성자를 만들어서, 그 안에서 꼭 정의를 먼저 해주고 시작하게 하면 된다. 

 

방법은 이런 식으로

class Accounting{
	public Accounting(double valueOfSupply) {
		this.valueOfSupply = valueOfSupply;
	}
	
	 public double valueOfSupply;
	 public double vatRate = 0.1;
	 public double getVAT() {
	        return valueOfSupply * vatRate;
	    }
	     
	    public double getTotal() {
	        return valueOfSupply + getVAT();
	    }
}

public class AccountingApp {
    
    public static void main(String[] args) {
    	Accounting a1 = new Accounting(10000.0);

    	
    	Accounting a2=new Accounting(20000.0);
    	
    
        System.out.println("Value of supply : " + a1.valueOfSupply);
        System.out.println("Value of supply : " + a2.valueOfSupply);
        
        
        System.out.println("VAT : " + a1.getVAT());
        System.out.println("VAT : " + a2.getVAT());

       
        System.out.println("Total : " + a1.getTotal());
        System.out.println("Total : " + a2.getTotal());
    }
 
}

 

 

Accounting Class 밑에다가 똑같은 이름의 생성자를 만들어주고, 매개변수로 valueOfSupply를 지정한다. 

그리고 this.valueOfSupply를 써줘서, instance의 valueOfSupply가 매개변수의 값을 받아온다고 명시를 딱 해준다

 

 

그러면 생성자와 this를 제대로 활용한것이다!!! 꺄악

 

 

 

 

 

728x90
반응형

'Java > Java 객체지향프로그래밍' 카테고리의 다른 글

정신 꽉붙잡아 this 생성자  (0) 2020.11.27
망했다 static  (0) 2020.11.26
Instance  (0) 2020.11.26
클래스 more deeply  (0) 2020.11.25
클래스 존재 이유와 기본 형식  (0) 2020.11.25