생활코딩 JAVA1

생활코딩 JAVA1 (4)나의 앱 만들기 --두개 함수 값 공유

finepiz 2021. 7. 31. 20:31

=====================

[4]나의 앱 만들기

=====================

14-1 나의 앱 만들기 - OT

(1)최소한으로 배워서 최대한으로 사용하는 사례를 보여드리고 싶어요

모든 것을 알지 못해도 아는것만으로 많은 것을 할 수 있다는 걸

(2)지식이 문제 해결에 부족하여 불편한 시간이 올때 지식을 공부하고 프로젝트에 반영하는 방법

각각의 지식은 그것만으로도 할 수 있는게 정말 많은 목적지이면서 더 많은 일을 할 수 있는 지식을 배울 수 있는 경유지

(3)지식은 톨게이트 고속도로가 아니라 오래된 도심을 중심으로 뻗어나간 골목길이다.

수많은 경로가 존재. 지식의 실제 모습을 파악할 수 있다면 공부를 하는 전략도 훨씬 좋아질 것.(이 실전 수업의목적)

최소한으로 공부하고 최대한으로 일하는 것을 반복하며 공부와 일의 경계는 점점 사라지고 일하면서 공부하고 공부하면서 일하는 중급자가 되어 있을 것입니다.

 

상상력을 발휘(침대에서 일어나는 느낌의 힘이 필요함, 뭔가 한번 해줘야해)해서 내 일이라고 생각하기, 남의 일이라고 생각하는 순간에 잘못되기 시작함.

 

어떤 상황을 제시해줌

물건팔고 세금제하고 비용도 발생하고 동업자한테 나눠주고... 이게 다 끝나고 난 이익을 물건을 팔 때마다 계산해야해.

해야 하는데 계산기를 하려니 손이 너무 많이 가고 전문적인 프로그램을 사용하려고 했더니 다 대기업을 위한 프로그램이라 1억이고 불필요한 기능들 때문에 프로그램이 너무 복잡해. 그렇게 허우적 거리다가 내가 오늘 자바를 배웠어 나의 이 현실을 자바를 사용해서 문제를 해결해보자 결심함!! 궁리하기

 

=====================

14-2 나의 앱 만들기 - 기본 기능 구현

프로그램은 시간의 순서에 따라 작업을 실행한다는 것. : 가장 본질적이면서도 쉬운

+화면에 뭔가를 출력한다

+기본연산

우리가 만들려는 app의 본질적인 기능을 이것만갖고 문제해결하기

-> 애착이 생기고

-> 자연스럽게 불만족이 생기고

-> 그 불만족을 해결할 수 있는 여러 가지 지식들을 통해서 자연스럽게 여러분이 주인공이 됨.

 

이 복잡한 자바라는 생태계를 다 활용하는게 아니라 내 문제 갖고 최대한 빨리 해결하는 모습을 구경시켜드림.

 

내가 팔고 싶은 물건이 있을 때 그 물건의 10%에 해당하는 부가가치세가 얼만지 알아내는걸 하고 싶다.

이클립스에서 클래스를 만들곤, 앱(프로그램)을 통해 나의 문제를 해보도록 하겠습니다(▽그게 클래스인거니까 클래스가 프로그램이라고 했나봐)

 

10000.0은 더블형이죠

계산을 한번 할 땐 계산기가 편하지만 자바는 계산을 한번 더하는 등, 두 개의 계산을 토탈하거나 복붙.. 등 계산기로 하나하나 두드리는거보다 훨씬 편하고 replace all 해서 한번에 같은값 바꿔줄수도있어서 필요한 값이 탁하고 나오는 등 계산기로 할 수 없는 일들이 가능.

 

12345.0은 공급가 10000을 에디터 Find/Replace 한 것

공부잘하는사람

일잘하는 사람 :

완벽한 배움 없이도 가진 것을 활용해서 일을 하는 사람,

배운것만으로 문제를 해결하는 사람.

(배운것만으로 문제를 해결하다보면 그 다음 공부를 할 수 있는 준비가 자연스럽게 주체적으로 생기게 될 것입니다.)

 

=====================

14-3 나의 앱 만들기 - 변수 도입


일 잘하는 사람으로 오래 있다보면 내가 알고있는 것만으론 한계가 온다
. = 한계를 스스로 느낄 수 있다는게 중요 = 그때가 공부할 때

 

기존의

12345.0

0.1

0.5

이런것 인수인계 받은 사람은 이게 뭔지 절대 모른다 변수화를 시키는 이유중 하나

 

이클립스의 이 기능

12345.0들이 한번에 지정한 변수로 바뀌면서 필드에도 변수가 생김 Extract Local Variable이잖아

다른것들도 다 바꿈,

 

변수 입력하는 창의

얘는 어떻게 바뀔지 미리 볼 수 있음. 일괄적으로 바꿔버리면 굉장히 위험한 일이 생길 수 있기 때문에. 0.3의 의미가 2개 일수도 있는데 모든 0.3을 바꿔버리니까

생코는 cancel하고 손으로 입력함

IDE기능

 

- 변수 연산 변수 도 변수로 바꿀 수 있다, 중복이란 중복 바꾸기와 변수로 의미줄 수 있는거 다 주는중

 

결론 :

이제 변수를 도입하니까 필드에서 valueOfSupply 값 하나만 바꿔도 나머지가 다 잘 돌아감

 

=====================

14-4 나의 앱 만들기 - 입력값 도입

 데이터가 바뀌었다고 코드를, 로직을 바꾼다?? 프로그래머들은 부끄러워 한다

물건의 가격이 바뀌면? 코드를 열고 = 이클립스를 켜고 거기를 수정해야한다 이게 부끄러워

이제 우리 애플리케이션은 입력값을 주면 그에 맞는 출력값을 만들어내게 해야한다

어떻게? 이전에 했었어 복습차원에서 보자

여기 그 String[] args 로 할거야실행을 한번 시켜야지 저기 Java Application 목록에 뜬대

Name 설정하고 값을 넣고 Apply하면 항목이 업데이트가 됨

실험을 할 땐 Duplicate로

여러개 만들어 Name바꾸고 Apply해서 저장 후 Run누르면 실험 됨

 

받아온건 문자열넣을건 double어떻게해결? 당연히 검색

parse 분석하다

들어온 문자열을 Double형으로 바꾼다

 

실행할때마다 이클립스 켜는것도 별로다

아주 간편하게 자바 어플리케이션을 실행하고싶다

 

경로 찾기 : 프로젝트 우클릭 > Properties 하면 바로 보임

 

터미널 또는 콘솔이라고 불리는 프로그램을 켜서(윈도우는 cmd)

cd 붙여넣기, 띄어쓰기 때문에 경로에 문제가 있으면 " " 로 묶어주면 됨

AccountingApp.class 라는 파일이 있다파일이 없으면 javac AccountingApp.java 하면 됨

 

class 파일 실행하기 : 자바야 AccountingApp이라고 하는 클래스 실행해

: java AccountingApp 하면 실행함

에러, 값을 입력하지 않았기 때문

값은 한칸 띄우고 입력하면 됨

 

이걸 다른 컴퓨터에서 실행하고 싶으면?

소스코드까지 가져가고 싶으면 AccountingApp.java까지 가져가면 됨

이미 컴파일된 AccountingApp.class만 갖고 있으면 이게 실행파일이라 usb나 이메일에 잘 담았다가 다른 컴퓨터에 가서 쟤를 실행시켜면 됨

그 컴퓨터에 자바 런타임 환경 또는 자바 버추얼 머신

java

치면 나오는 그 프로그램이 설치가 돼 있어야 실행시킬 수 있다

 

그것조차 설치가 안돼있는 컴퓨터라면?

launch4j 와 같은 솔루션들을 찾아서, 소프트웨어를 찾아서 사용을 하시면 얘를 이용하면 여러분이 짠 그 파일을 감싸, 그 안에다 자바 버추얼 머신까지 넣어놓음

 

런치4j를 통해서 만들어진 실행파일은 JVM이 설치가 안돼있어도 여러분의 프로그램에다 내장을 함, 실행할 수 있는 상태가 됨

 

입력값을 통해 서로 다른 결과를 만들어내는 프로그램을 만드는걸 살펴봄

 

=====================

14-5 나의 앱 만들기 - OT2

지금까지 배운 건 프로그래밍에서 가장 본질적이고 공통적으로 필요한 지식들

 

여기서부턴 구경하면서 수강하기

 

애플리케이션을 사용하다 보면 어떤 불편을 겪을지 예견해보고

그런 불편함을 극복해주는 도구가 무엇인지 소개

개념은 어떤 불편함을 극복하기 위해서 등장했는지 이해하기

지금까지 했던 Program수업이 가장 중요하다고 생각하게 하려고 수업을 이렇게 짰대

 

=====================

14-6 나의 앱 만들기 - 조건문

 제어문을 도입해서 프로젝트를 개선시켜봅시다

 

 지금 이상태거든

 

어떤 문제가 있을 수 있을까?

자바의 제어문은 크게 두가진데 조건문/반복문

(1)조건문

어떤 이유로 인해서 income이 만원보다 작을 때는 dividend1이 돈을 다 가져가고

만원보다 클 때는 5:3:2로 나누고 싶다 라는 어떤 필요성이 생겼다!

->일잘하는사람(갖고있는걸로해결하는사람)은 under10000이라는 별도의 프로그램을 하나 더 생성할 것

내가

10000 이하로 돈을 받으면 이 앱을 실행시키고

더 크면 기존 앱을 실행

일잘하는 사람은 이렇게 문제를 해결하고, 이건 정말 잘한 것

그렇지만 사용하는 사람이 동작하는 프로그램을 충분히 이해해야 하고 만드는 사람도 관리하는 것이 대단히 힘들어짐

 

사람의 욕심 끝없 : 사용하는 사람이 내부적인 사정을 전혀 몰라도 프로그램이 알아서 해주면 좋겠어

조건문을 사용하면 프로그램이 상황을 판단해서 어떻게 동작할지를 결정하기 때문에 하나의 프로그램으로 여러가지 일을 할 수 있다.

 

=====================

14-7 나의 앱 만들기 - 배열

배열은 하나에 여러개를 담을 수 있다

 

배열은 조건문을 배워야 할 수 있는게 아니기 때문에

아까의 이 상태부터 시작 여기서부터 개선할 것

0.5 0.3 0.2 이런거 이름을 붙이면 의미가 더 분명해질 것

훨씬 더 보기 좋은 코드지만

(1)

//... 이게 1억줄이라고 치면

rate1, rate2, rate3 이런건 흔하게 쓸 수 있는 변수 이기 때문에 1억줄 중에서 한번 썼을 수도 있다

 : 프로그램에 변수가 많아질수록 겹치는 오류를 낼 가능성이 커진다

(2)

또, 세개는 같은 성격의 데이터 인데 지금은 이름이 비슷해서 대충 넘어갈 순 있겠지만 분명하진 않다

=>이때 사용할 수 있는 도구가 배열!

 

STEP

dividendRates : 변수double dividendRates : 형을 정해줌, 더블형 변수라는 뜻이다

double[] dividendRates : 더블형 데이터로 이뤄져 있는 배열이다

double[] dividendRates = new double[3];

 : 더블형의 데이터를 세개를 담을 수 있는 수납상자가 만들어진것

 : 수납상자부터 만든거야! 프리미티브로 따지면 선언을 먼저 한거야

 

이러면 double데이터로 이뤄져 있는 배열에 서로 연관된 값들을 그루핑하고 거기다 이름을 붙인 것!

 

이제 이러면

(1)배열로 묶인 값들은 서로 연관돼 있다는 걸 분명히 알 수 있다

(2)변수가 3개에서 1개로 돼서 오류를 낼 가능성이 적어짐.

=>정리정돈했다

 

공사장 같은데 가보면 정리정돈을 엄청나게 강조한다 정리정돈 안돼있으면 복잡해서 일을 할 수가 없기 때문, 안전사고도 그렇고

코드도 마찬가지 처음엔 동작하는 프로그램을 만드는데 모든걸 걸겠지만 만들면서 뒤로 갈수록 복잡해지면 좋은 프로그램을 만드는게 어려워짐

 -> 연관된 데이터를 정리정돈하는 수단인 배열!

 

String[] args 도 사실 배열이었다

 

=====================

14-8 나의 앱 만들기 - 반복문

배열과 반복문은 선행 후행 관계가 아니지만, 서로 같이쓸 때 엄청난 시너지 효과를 낸다.

그래서 위의 배열로 수정한 상태에서 시작

지금 투자자가 3명인데, 만명이라고 생각해보면? 배당 계산 코드가 1억줄이면?

어찌저찌 만들었는데 그 코드에 문제가 생기면?

이때 구원해주는 도구가 반복문

이 코드는 똑같은 일을 한다. 다만 데이터가 다를 뿐

이 n가지의 작업을 반복문을 통해 하나의 코드로 표현할 수 있다.

 

1억개일 수도 있는걸 이렇게 하나로 표현할 수 있다.

버그가 있을 때 이 한줄만 수정하면 1억개의 로직이 동시에 수정됨

배열과 단짝

 

=====================

14-9 나의 앱 만들기 - 메소드

 

정리정돈하기

(1)배열 --변수만 정리정돈 할 수 있음

(2)메소드 --코드를 모아서 정리정돈

(3)클래스 --연관된 변수와, 메소드를 그루핑한 것

 

메소드 : 서로 연관된 코드를 모아서(그루핑)해서 이름을 붙인 정리정돈의 상자다

이게 +-*/가 엄청나게 복잡하게 여러개가 결합된 수식이라고 상상하기

이걸

내용은 다른 곳에 숨기고 이렇게 생기게 바꿔버릴 수 있다면 얼마나 좋을까?

그럼 내 어플리케이션이 훨씬 더 단순해질 것

double vat = valueOfSupply * vatRate;

에서

함수 ( 입력값1, 입력값2 ) {

   return valueOfSupply * vatRate; 가 됐다

}

식을 메소드로 바꾸는데, 식에 변수가 들어갔으니 입력값으로 변수가 왔다.

*두개의 다른 함수에서 값을 공유하는 방법

저렇게 식을 함수로 만드려면, 식이 있던 함수의 밖에 또 다른 함수로 만들어지는 것이고,

다른 함수에서 같은 값을 쓰려면 인자로 넘겨줘야 하니까 ( ) 안으로 변수가 왔다

 : 인자로 넘겨주는 건 입력값! 그 함수 안에서 마음 것 쓸 수 있어

그게 아니면??

쓰는 값을 필드로 만들어놓고 바로 접근하든지

그 값을 내놓는 메소드를 쓰든지  --이 강의에선 static으로 했는데, 보통 객체 생성을 하니까 모든 메소드를 쓸 수 있어 ▽this는 생략해서 쓸 수 있겠네

 

메소드를 만드는 코드와 만들어진 메소드를 호출, 실행하는 코드가 따로 있다

( ) 안에 들어가는 값은 입력값

 

인자

매개변수

리턴에 대해 설명함 : getVAT(~~); 이 만큼이 return값으로 바뀐다

 

메소드 안의 내용이 1억줄이었다면 우리는 한줄로 숨긴것이다. 어디에다? 저~기 어딘가에다가

훨씬 더 단정한 코드가 됐다.

지역 변수 : valueOfSupply는 main메소드의 중괄호 안에서 선언됐기 때문에 저기서만 쓸 수 있다.

클래스의 전역 변수 : 모든 메소드에서 접근할 수 있게, public static은 몰라도 돼요~

이클립스에 바꿔주는 기능이 있다.

선언은 저기서

변수에 대한 세팅은 안에서, 왜 인지는 설명안함

 

나머지 변수들도 메소드화 시킴

 

main메소드가 사용하는 쪽이다.

훨씬 더 단정한 코드가 됐음.

 

=====================

14-10 나의 앱 만들기 - 클래스

메소드를 배웠으니 객체로 넘어갈 수 있다

 

객체는 클래스라는 표현을 쓰기도 하지만 같은건 아님

클래스는 서로 연관된 변수와 메소드를 그루핑하고 이름을 붙인 것

 

메소드, 클래스는 소프트웨어를 만들어가는데 구조를 결정하기 때문에 중요하다.

신체에서 뼈대와 같은 역할

 

뭐가 불편해서 클래스 라는게 도입될 필요가 있었을까?

Outline

이건

클래스 소속의 변수와 메소드를 멤버라고 하는데

클래스 안에 소속돼있는 여러가지 멤버들의 리스트를 보여줌

 

여기엔 회계와 상관있는 변수와 메소드만 있지만

상관 없는 다른 변수와 메소드가 있다면?

 

그럼 하나의 클래스 안에 서로 상관이 없는 변수와 메소드가 1억개씩 있으면 엉망진창 생산성을 떨어뜨리는 방해요소가 될 수 있다

이런 상황에서 우리를 구원해주는 도구가 클래스

 

파일로 치면 디렉토리와 같은 역할

 

Accounting이라는 클래스를 만들어서 모든 변수와 메소드를 이사시킨 후

기존의 클래스 에선 저기 이사시킨 애들을 어떻게 쓰면 되냐

앞에 클래스이름. 이렇게 붙여주면 이전과 똑같이 동작한다

저렇게 Accounting을 앞에 붙여줘서, Accounting에 속해있는걸 명확히 할 수 있다. -> 다른 취지의 코드들과 뒤섞여도 상관이 없고, print()와 같이 흔한 이름의 메소드를 사용해도, 같은 이름의 메소드들이 공존할 수 있게된다.

 

=====================

14-11 나의 앱 만들기 - 인스턴스

객체지향의 양대산맥은 클래스와 인스턴스 라는 개념

 

인스턴스는

하나의 클래스를 복제해서

서로 다른 데이터의 값과, 서로 같은 메소드를 가진 복제본을 만드는 것이다.

이걸 보면 Accounting의 내부적인 상태(=변수의값)가 수십개고 메소드도 수십갠데 

근데 어쩌다가 한번 다른 제품이 들어와서 그 값으로 세팅하고(제품이 팔린 값도 다르고 나라마다 세율이 다르고..)

그걸 print()한번 하고

다시 이전의 상태로 세팅해서 돌아오게 하고

 

이런게 자꾸 반복되면?

클래스의 내부적인 상태를 바꾸는 행위가 버그를 유발할 가능성이 굉장히 높다

 

이런 상황에서 일 잘하는 사람은

Accounting1

Accounting2

3

4...

이렇게 만들고

각각의 세팅을 1과 2에게 주게 할 것

 

이러면 Accounting1의 내부적인 상태가 변경되지 않아서 다시 부를 때 또 세팅 안해도 돼

 => 클래스를 복제해서 서로 다른 상태, 서로 같은 메소드를 갖도록 한 것.

▽데이터만 다른거군

 

하나의 클래스로 돌려막기 하는게 아니라, 복제된 클래스를 이용해서 더 편리하고 더 버그가 적은 코딩을 할 수 있게 된다

 

근데 1, 2 로 나누면 만약 메소드를 바꾸려면 나눴던 모든 애들의 메소드를 바꿔줘야 하고..

애초에 클래스를 추가할 때마다 2붙여서 저렇게 만드는건 좀... 그렇잖아요

 

그래서 자바를 만든 사람들은 클래스를 복제할 수 있는 기능을 만듦

 : 아니 이제 좀 어디서 나왔는지 알겠다 뿅 하고 나온게 아니라 클래스를 만들고, 이걸 또 이렇게 저렇게 쓰다가 불편을 만나고 그럼 이렇게 개선하면 좋곘다 해서 나온거겠구나

 

어떻게하냐

Accounting 앞에다 new를 붙임

 

new Accounting

: Accounting 클래스를 복제하는 명령, (); 도 해주셔야 합니다(설명안함)

 

복제된 무엇이 만들어지는데 그것에 a1이라는 이름을 붙인다

a1 = new Accounting();

 

Accounting a1 - new Accounting();

  : a1이라는 변수의 값으로는 반드시 Accounting의 복제본만 들어올 수 있다라는 표시

 

이런 다음

이렇게하면

a1.print(); 의 내용이 달라지지 않고

클래스를 내가 복사해서 Accounting2 이렇게 만들지 않아도 된다 --인스턴스를 만드는게 이렇게 복사하는 작업이었다니

 

이렇게 클래스 이름 앞에 new를 붙여서 만들어진 걸 인스턴스 라고 부른다

인스턴스의 코드가 동작하기 위해선 static이라는게 사용되면 안된다는 설명을 하심 --왜?

---

https://devlog-wjdrbs96.tistory.com/34

---

그렇대 실험하기 귀찮아서 검색함

 

자바에서는 메소드로 구조를 잡고,

메소드와 변수를 그루핑해서 클래스로 구조를 또 잡고

클래스를 복제한 인스턴스를 통해서 또다른 구조를 만드는 방식으로

코드의 성을 쌓아가는 것이 자바라고 하는 컴퓨터 언어의 독특한 특징이라고 할 수 있고, 이런 특징은 현대의 많은 컴퓨터언어들이 따르고 있는 특징이기도 합니다

 

여기까지만 하고, 위에처럼 스스로 불편함을 느끼고 그 불편함을 극복하는 방법을 스스로 찾아서 해결하기! 그래도 된다

 

=====================

15. 수업을 마치며

제가 어렸을 때는 윈도우나 macOS같이 그래피컬한 운영체제가 없었거든요

그냥 껌껌한 화면에서 dos라는 시스템에 명령어를 입력해서 컴퓨터를 제어해야 했다.

가장 중요한 이유는 게임이었다

게임을 하기 위해서는 여러작업을 해야했다

각각의 작업은 끝나는 시간이 불규칙하고 시간이 꽤 오래걸렸기 때문에 하나의 작업이 끝나면 그 다음의 작업 명령을 할 때까지 기다려야 했다

그러다 이걸 알게됐는데 실행돼야 하는 명령어를 순서대로 적어놓으면 운영체제가 구동될 때 exec.bat파일의 내용을 순서대로 실행을 시켜줌. 컴퓨터를 키면 게임을 할 수 있는 완벽한 환경이 준비돼 있는 것. 이걸 해냈을 때 해커가 된 기분 이었다. 이것만 할 수 있었는데 저희반에서 CTO의 대접을 받았습니다.

그땐 몰랐는데 지금 생각해보니 이게 완벽한 프로그램이었다.

 

시간의 순서에 따라서 명령을 실행시켜주는 기능에 불과하다

근데 이것만으로도 엄청나게 많은일을 해낼 수 있어

 

입문자건 중급자건 시간의 순서에 따라 실행을 시킨다는 것으로 대부분의 작업을 함

이것만으로 많은 것을 할 수 있고 그렇게 내 삶에 적용하다보면 지금까지 배운것만으로 해결이 되지 않는 불편한 문제를 만나게 됨. 그 문제를 해결하지 않으면 견딜 수 없는 때가 오게 됨. 그때가 바로 공부할 때

 

자신만의 프로그램을 만들어 쓰는 사람들이 많다. 오로지 내 편의를 위해서

더이상 혼자서 그 프로그램을 개선하는게 한계가 왔을 때

선택할 수 있다

이정도에서 개발을 그만두고 나 혼자 불편하게 사용할건지

과감하게 투자해서 동료를 모아서 더 많은 사람을 위한 보편적인 프로그램을 만들지 결정할 수 있는 능력을 언젠간 갖게 될 것

 

그래서 나의 프로젝트를 시작해보라고, 나의 프로젝트와 애착관계를 갖게 되면 우리는 노력하지 않아도 노력하게 될 것

이때 일중독을 조심하세요

이렇게 되면 조만간 공부하고 싶은 주제들이 생겨날 것 그때 저를 다시 찾아오세요