JAVA1 - 14.9. 나의 앱 만들기 - 메소드 (Method)
만약 아래의 변수에 들어가는 식이 엄청나게 복잡하다면… .?
이 복잡한 식들을 getVAT() 같은 이름으로 바꾸고 복잡한 식들을 숨겨놓은다면 이 앱이 더 심플해질 것
double valueOfSupply = Double.parseDouble(arg[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;
이클립스 Refactor - 메소드로 변경 기능
[ 바꾸기를 원하는 코드 선택 우클릭 Refactor ] - [Extract Method]
메소드 이름을 getVAT 로 이름 지었고 아래에 private static… return 문장이 새로생겼다
메소드 작동 메커니즘
1 번 변수 valueOfSupply 의 값인 10000.0 이 2 번 getVAT 의 valueOfSupply 로 넣어짐
2 번의 2 번을 거친 valueOfSupply 는 다시 메소드로 만들어진 3 번의 getVAT 의 valueOfSupply 값이 넣어지고
4 번은 메소드를 만드는 코드 . 이 메소드에서 최종 계산된 값이 return 코드를 통해 2 반 getVAT 로 들어간다 .
* 이 메소드를 통해 1 억줄의 코드도 간단하게 해결가능
코드를 더 깔끔하게 하고자 getVAT() 안에 값을 지운다면 ?
위의 valueOfSupply 있어서 될 것 같은데 에러가난다 why?
valueOfSupply 가 현재 main {} 안에서 선언됬기 때문
즉 , main 메소드 안에서만 작동하는 지역변수 (local variable)
- 해결 : 모든 매소드에서 접근할 수 있도록 , main 메소드 밖에서 선언 해줄 것
이클립스 Refactor - 지역변수→전역변수 변경 기능
[ 바꾸기를 원하는 코드 위에서 좌클릭하고 우클릭 Refactor] - [Convert Local Variable to Field]
각 변수의 식마다 메소드 설정 & 지역변수 to 전역변수로 변경
프린트코드는 한번에 지정해서 메소드설정
*자바에서는 전역변수 (Global Variable) 를 필드 (Field) 라고함
메소드(Method) 란?
서로 연관된 코드 를 모아서 다시말해서 그루핑 (grouping) 해서 이름을 붙인 정리정돈의 상자 다
JAVA1 - 14.10. 나의 앱 만들기 - 클래스 (Class)
많은 라이브러리들이 객체지향 방법으로 만들어졌기에 객체지향이 대강 뭔지는 알아둘 필요가 있다
객체는 클래스라는 표현을 쓰기도 함 ( 완전히 동일한건 x)
클래스(Class) 란?
서로 연관된 메소드와 변수를 그루핑 (grouping) 한 것 . 그리고 거기에 naming 한 것 .
정리정돈의 상자이다
앱에 여러가지 기능들이 많이 붙고 변수와 메소드가 앱에 너무 많으면 햇갈리고 생산성이 많이 떨어지게 된다 이런 상황에서 도움이 되는 것이 바로 클래스(class) 컴퓨터로 치면 디렉토리로 파일 정리하는 격
클래스 (Class) 를 써서 정리하기
1) 전역변수 세개를 Class Accounting 안으로 이동
(public static double valueOfSupply, vatRate, expenseRate;)
2) 밑에 모여있는 메소드들도 Class Accounting 안으로 이동
- 혹시 앞에 public 이 아니라 private 이라면 public 으로
3)public static void main(String[] args) { 아래 valueOfSupply,vatRate, expenseRate,print 4 개의 변수명 앞에
클래스명인 Accounting. 을 붙여주면 전과 같은 기능으로 작동
* 나중에 public 과 private 차이 점 알아보자
JAVA1 - 14.11. 나의 앱 만들기 - 인스턴스 (Instance)
인스턴스(Instance)는
하나의 클래스를 복제해서 서로 다른 데이터의 값과 서로 같은 메소드를 가진 복제본을 만드는 것 이다
메인메소드 안에
Accounting.valueOfSupply = 10000.0;
Accounting.vatRate = 0.1;
Accounting.expenseRate = 0.3;
Accounting.print();
이런 물건들이 몇천개 있다고 할 때 , 어쩌다가 새상품이 하나 들어왔다고 해보자
위의 4 개코드의 과정을 새상품이 들어올 때마다 다 세팅해줘야한다
ex)
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 class 의 이름을 Accounting1 으로 변경하고 카피해서 Accounting2,3,4 계속 만들고
아래와 같이 클래스별로 따로 값을 관리한다
# main{} 안에 있는
Accounting1.valueOfSupply = 10000.0;
Accounting1.vatRate = 0.1;
Accounting1.expenseRate = 0.3;
Accounting1.print();
Accounting2.valueOfSupply = 20000.0;
Accounting2.vatRate = 0.5;
Accounting2.expenseRate = 0.2;
Accounting2.print();
클래스를 복제해서 서로 다른 상태 , 서로 같은 메소드를 갖도록 한 것
하나의 클래스를 돌려막기한 것이 아니라 , 복제된 클래스를 이용해서 더 편리하고 더 버그가 적은
코딩을 할 수 있게 된 것
그런데 이것도 좋지만 클래스의 정보를 바꿀려면 만든 모든 클래스의 정보를 바꿔줘야하기에
많이 번거로워질 것 ( 클래스를 생성할 때마다 , 정보를 일일히 다 추가해줘야함… )
자바를 만든 사람들은 클래스라는 것을 복제할 수 있는 기능 을 만들었다
Accounting 앞에 new 를 붙여 복제
new Accounting();
Accounting a1 = new Accounting();
변수 a1 앞에 Accounting 을 붙여서 a1 변수값에는 반드시 Accounting 의 복제본만 들어올 수 있다라고 명시를 해줌
Accounting a1 = new Accounting();
a1.valueOfSupply = 10000.0;
a1.vatRate = 0.1;
a1.expenseRate = 0.3;
a1.print();
Accounting a2 = new Accounting();
a2.valueOfSupply = 50000.0;
a2.vatRate = 0.5;
a2.expenseRate = 0.5;
a2.print();
이렇게 복제가 가능하고 , 여기서 다시 a1.print(); 를 해도 정상적으로 잘 작동함
클래스를 복제하지 않아도 된다
인스턴스(Instance) 란?
class 앞에 new 를 붙여서 만들어진 무언가 가 인스턴스
*인스턴스를 썼으면 맨 위에 class Accounting 에서 public 다음 static 이 사용되면 안되기에 지워야함
※ 자바에서는 메소드로 구조를 잡고
메소드와 변수를 grouping 해서 클래스로 구조를 또 잡고
클래스를 복제한 인스턴스를 통해서 또 다른 구조를 만드는 구조가 자바와 다른 컴퓨터 언어들의 특징