PROGRAMMING WORKSHOP

Android|
JAVA Basic_1

안드로이드앱을 만드는 것을 하다 보니..
JAVA언어에 대한 것을 좀 알고 가는 것이 순서일 것 같다
이미 안드로이드앱에 대한 맛을 보았으니..기초를 좀 더 다진후
다시 좀더 쎄련된것을 해보도록 하자, 그러러면 Java언어에 대하여 쫌 알아야 할것이다
새로운 언어는 재미있는 도전이다
그러니 한번 해보도록 마음을 먹어 보시기를..
이미 Java프렛폼을 설치하였고, Eclipe java개발도구를 설치하였다
Java프렛폼만 설치되고 Eclipse가 없다면 어떻게 할까..
우선 윈도우의 실행창(윈도우 화면 하단왼쪽텍스트박스)에
Command라고 입력후 엔터키를 치면 DOS창이 뜬다

그리고 시커먼 도스화면에 Prompt가 깜빡거릴것이다
이곳에 java라고 입력후 엔터키를 치면 java에 대한 사용법이 줄줄이 나타날것이다
이곳의 사용법을 보려고 하는 것이 아니고..
java프렛폼이 정상적으로 설치되었음을 알고자 한 것이다
이제 javac라고 입력하고 또 엔터키를 쳐보시면 또 줄줄이 머라..머라 떠드는 문장이
나타난다..
javac에서 마지막 c는 Compiler의 약자이다
쏘스원본이 어디있는지 알려주어야 컴파일 할 것 아니냐??!!
쏘스코드가 어디있는데???
라고 떠드는 소리다
그럼 java의 쏘스코드는 어떻게 작성할까??
Eclipse가 없다고 생각하고..어떻게 작성할까???
아무 텍스트문서에..보조프로그램의 메모장에 작성해도 되고
아래와 같이 작성한다

public class banana {
	public static void main(String args[]){
		System.out.println("Hello Java Programming!!");
	}
}

라고 작성하고 banana.java 라는 화일명과 확장자명으로
c:\test 폴더를 하나 만들고 저장한다
이것이 java프로그램의 쏘스원본인 것이다
도스창에서



참 원시적인 짓을 했다
하지만 자바의 쏘스가 컴파일되어 실행화일이 되는 것까지 해본것이다
이 강좌의 목적은 안드로이드앱도 앱이지만
uno_weekly에서 진행하는 VB.Net과 비교하여 보면 일타쌍피의 효과를
볼수 있을 것이라는 생각에서 하는 것이니 관심갖고 보시기를...
VB.Net의 NetFrameWork의 최상위 NameSpace가 System이듯이
Java에서도 System으로 시작하지 않는가?? 유사한 일들이 많다

귀신같은 코딩마스터들은 그냥 텍스트화일에 척척 작성할수도 있을 것이나
그런 미련한 사람은 없을 것이다
편집하기 편리한 개발도구라는 것들이 만들어지게 된다
쟈바의 개발도구의 대표적인 것이 앞전에서 하였던 Eclipse인 것이다
이제 위의 내용을 Eclipse에서 해보도록 하자

참...VB는 이렇게 Command 창에서 실행하는 것은 없나???
VB.Net을 열면 Console프로그램이라는 것이 있다..
이것을 위의 Java에서 하였던 것 같이 해보자
아래의 내용을 그냥 Text편집기에 복사하여 붙여 넣고

Module Module1
 
    Sub Main()
        Console.WriteLine("Hello, VB PROGRAMMING!")
    End Sub
 
End Module

c 드라이브의 test폴더내에(위의 Java만든 폴더를 그대로 사용해도 좋고..)
저장을 하는대 이때는 확장자를 vb로 넣는다(banana.vb 라고 저장해보자)

그리고 위의 것과 똑깥은 요령으로 이번에는 Java 콤파일러를 부르는 것이 아니고
VB컴파일러를 부른다..vbc 의 c가 Complier의 약자이다
도스창에서 아래의 그림과 같이 해보시면..아하..할 것이다



banana.exe 화일이 생성된 것이다
banana.exe화일을 도스창이 아닌 화일을 일반 exe화일 실행시키듯이
더블크릭하면 도스창이 나타났다가 빨리 사라져 버려서 눈에 보이지 않을 것이다
눈에 보이게 하려면 아래의 내용을 위와 같은 요령으로 다시 해보시기 바란다

Module Test
    Sub Main()
		Console.writeline("나이가 몇살이세요?")
		
		Try
			Dim iAge As Integer=Console.ReadLine()
			Dim sMsg As String
			Select Case iAge
				case <10 : sMsg = "너무 어려요"
				case <18 : sMsg = "부모님과 같이 오세요"
				case else : sMsg = "즐겁게 관람하세요"
			End Select
			Console.WriteLine(sMsg)
		Catch
			Console.writeline("banana.exe화일을 다시 실행하시고, 숫자를 입력하셔야 합니다")
		End TRy
	End Sub
End Module

값을 읽어 들이는 ReadLine 명령이 있을때는 창이 눈에 나타난다
아무튼..그렇다는 것을 아시고..아하..소스코드를 컴파일하는 것이 이런 원리로 하는 것이고
VisualBasic 편집기내에 이런 명령이 들어 있어서 컴파일이 되는구나..를 아시면 된다

쪼끔 서운하니까..VB쏘스화일 하나 더 exe화일로 만들어서 실행해보시기를..

Module Module1
    Sub Main()
        Dim sFileName As String = FileIO.FileSystem.GetTempFileName
        Using oX = New IO.StreamWriter(sFileName)
            oX.WriteLine("메모장에 주절주절 작성하고 메모장열기....//UNO21.COM--UNO_Weekly")
            oX.Close()
        End Using
        System.Diagnostics.Process.Start("notepad", sFileName)
    End Sub
End Module

위의 같은 요령으로 컴파일하고,exe화일 실행시켜보시기를..
도스창이 안열리고 메모장이 열릴 것이다
VB언어를 알던가..JAVA언어를 알던가..컴퓨터를 재미있게 자신의 것으로
만들수 있을 것이다


이제 개발도구 이크립스를 시작하자

새프로젝트를 시작하여야겠지..아래의 그림과 같이



새프로젝트를 하나 만들고
이제 빈탕의 프로젝트이니 크래스가 하나 이상은 들어가야
프로젝트로서 생명력을 갖게 된다
src 폴더를 선택하고 오른쪽마우스크릭 New/Class를 선택하여
하나의 class모듈을 삽입한다, 모든 것은 이름이 있어야 하니까
이것도 대화상자에 적당한 이름을 주도록 한다
그럼 크래스모듈에 뭐라..뭐라..작성하라고 활짝열린다
아래와 같이 기본 틀만 잡혀있다

public class banana {

}

크래스명을 banana라고 지어주어서 위와 같이 만들어진것이다
위에서 이야기했지만 시작을 하는 크래스에는 main() 메소드가 있어야 한다고 했다
그러니 아래와 같이 작성하자

public class banana {
	 public static void main(String args[]){
		 for(int iX=0;iX<5;iX++){
			System.out.print(iX+"  "); 
		 }
		 
		 for(int iX=0; iX<5;iX++){
			 System.out.println(iX);
		 }
		 
	 }
}

기본적으로 System.out 하면 출력을 하는 것이다..외부로 정보를 내보내는 것
System.out.print(정보) 라고 하면 줄바꿈없이 계속 값을 작성하고
System.out.println(정보) 라고 하면 줄바꿈을 하면서 외부에 작성하게 된다
println에서 ln은 Line의 약자가 붙어 있는 것이니..아하 줄바꿈이로구나!!
라고 센스있게 알아 차리면 좋은 것
위의 것을 실행 시키면(Run메뉴에서 Java Application)...Android Application이 아니다!!
Console창이 하단부에 열리고 아래와 같이 작성되느 것을 볼수 있다



위에서 도스창에 작성이 된 것이 이크립스개발도구내에서는 console창이 활용된다

아하..별것 아니네...
VBA와 VB.Net을 같이 생각하시면서 보면 정말로 일타쌍피가 됨을
잊지 말고..언어는 하나를 공략하는 것 보다는 두어개 같이 공략하는 것이
씨너지 효과가 있다
여기에 영어까지 같이 챙기려는 노력을 한다면 상승효과는 더더욱 높아지겠지..

그런데 윈도우 같이 창이 열리고 뭐 ..그런 것은 없나???
궁금하실 것이다!!
VB.Net도 마찬가지이지만
필요한 작업을 할때마다 별도의 라이브러리를 끌어 들여와야 한다
한마디로..VB.Net이나 Java나 필요한 도구만 불러서 사용하는 것이다
엑셀프로그래밍은 이미 엑셀이라는 항공모함을 띄우고
이미 갖추어진 개체들을 어루만지는 것이지만..
VB.Net이나 Java는 완전 빈껍데기에서 부터 필요한 것만
이렇게 저렇게 끌고 들어와서 조합을 하여 사용하는 것이다
그러니 아주 가볍게 프로그램을 만들수 있는 것이다
예를 들면 엑셀은 피벗테이블개체는 사용하지도 않는 사람이
훨씬 많은데(대개의 정보개념이 없는 사용자들)이들에게는
공연히 피봇개체라는 커다란 도구상자를 이고,지고 다니는 셈이다

그래서 엑셀이 효율적이기도 하고, 개발자의 입장에서는
좀 가볍게 할수 없나??!!라는 생각을 하게 하는 녀석이기도 하다
가볍게 할수 없다..떼어 놓을수가 없다..팔자려니 하고 끼고 다녀야 한다

무슨 소린지..이해해보도록 하자
우선 값을 System.out 을 시키는데 그럼 사용자로 부터
정보를 받고 싶으면 어떻게 하나???
이런 가벼운 작업에서도 도구를 끌고 들어와야 한다
VB.Net에서도 사용하는 키워드 Import 를 사용하게 된다
아래와 같이 작성해 보자


import java.util.Scanner;

public class banana {
	 public static void main(String args[]){
	 
		 Scanner bag = new Scanner(System.in);
		 System.out.println("순환회수를 입력하세요");
	
		 int iLoop= bag.nextInt();
		 
		 for(int iX=0;iX<iLoop;iX++){
			System.out.print(iX+"  "); 
		 }
		 
		 for(int iX=0; iX<iLoop;iX++){
			 System.out.println(iX);
		 }
		 
	 }
}

import java.util.Scanner;

라이브러리에서 Scanner라는 개체를 갖여다가 사용하겠다는 것이다
아마도 지금 uno-weekly를 통하여 VB.Net에 열중하시는 분들은
아하..똑같네..개념이..맞다..똑같다
C++이 있고..이것이 복잡하다고 간단하게 해본다고 한 것이 JAVA이고
VB는 VB대고 개체지향적인 것에서 좀 빠진다고해서 다시 JAVA와 같은
형식을 쫓아가고..결국은 언어의 벽은 점점 허물어지고 있다고 보는 것이 좋을 것이다
아무튼..
Scanner라고 하는 것은 사용자가 자판을 두들겨서 입력하는 내용을
담아두고 있는 개체이다
이렇게 Import시킨후 아래와 같이 사용하게 된다
VB.Net에서 하던 것을 잘 생각하시면 된다
당연히 사용하겠다는 개체를 생성하여야 한다..이것이 순서인것이다
아래와 같이 New하여 생성한 것이다
Scanner bag = new Scanner(System.in);
이 말은 Scanner를 생성하는데 어떤 정보를 사용하겠냐 하면
System.in 즉 in은 자판을 통하여 들어오는 정보를 잡아서 보관하겠다는 것이다
VB같으면 아래와 같이 선언하겠지만
Dim bag As Scanner = New Scanner(System.in)
Java는 뭔가 삐딱하여 개체타입을 항상 앞에 놓는다는 것!! 잊지 마시고
그래서..

Scanner bag = new Scanner(System.in);

그래서 console에서 사용자가 숫자를 입력하면
이것을 받아서 순환의 갯수로 활용하겠다는 것이다
Scanner개체(bag)의 메소드 nextInt()로 사용자가 입력한 값을
int iLoop= bag.nextInt();
얻어서 integer타입 변수 iLoop에 담아서
이것을 순환문의 변수로 활용한것..이런 것은 설명안드려도 아시겠지만..



사용자정보를 받을 일이 없다면
해당 작업을 수행하는 Scanner 개체를 사용하지 않겠다는 것이다
import 잔뜩 시켜놓고 개체를 생성하지 않는다면
import 문에 노랑색의 물결밑줄이 나타난다
이것은 사용하지 않는 것이니 지우는 것이 좋다는 메시지인것이니
그렇게 되면 삭제해버리면 되고, 안해도 별문제는 없이 돌아간다

하나 더 해보자
VBA에서 난수를 발생하는 것은 그냥 Rnd함수로 처리한다
VB.Net이나 JAVA는 Random개체라는 것을 또 만들어서 사용한다
물론 VB.Net은 VB의 확장판이니까..VBA의 함수를 사용해도 되지만
좀더 좋은 기능을 활용하려면 새로만들어서 주는 RANDOM개체를 사용하는 것이 좋다
아무튼 JAVA에서 Random개체를 불러서 사용하는 것을 보자
아래와 같이 Random개체를 사용하겠다고 라이브러리를 import해야한다


import java.util.Random;

public class banana {
	 public static void main(String args[]){
		Random random = new Random();
		for(int i=0;i<10;i++){
			System.out.println(random.nextInt(6)+1);
		}
	}
}

무슨일을 하던 개체의 메소드를 찾아서 일을 시킨다
VB에서는 대소문자를 전혀 구분하지 않지만
Java에서는 대소문자가 반드시 구분되게 작성하여야 한다
그래서 위에서
Random random = new Random();
이라고 같은 이름으로 해도 구분한다 random이라는 변수에 Random개체를 담는다
단어는 같아도 전혀 다르게 구분한다는 점
그래서 편리하기도 하고 불편하기도 하다
VB에서는 대소문자의 구분없이 코딩을 할때 알아서 대소문자가
바뀌어 정리가 되지만 (그래서 스펠체크가 되어 편리하였다)
Java에서는 대소문자를 알아서 입력하여야 한다(습관되면 괞찮다)

주사위를 던져서 각각 몇개씩 나타나는지 하나 만들면서 특징을 또 보도록 하자
여기에서 Java의 특징은 거의가 VB.Net에서 같은 특징으로 개선되었다는 점을
잊지 마시기 바란다
즉..여기에서 Java문법을 살펴는 것은 VB가 VB.Net의 문법을
살펴보는 것이나 거의 마찬가지로 보시면 된다
그러니..딴나라 문법이라고 등한시 하지 않고 보시는 것이 좋을 것이다

import java.util.Random; public class banana { public static void main(String args[]){ Random random = new Random(); System.out.println("Dice Number\tFrequency"); int dice[]= new int[7]; for(int i=0 ;i<1000;i++){ ++dice[random.nextInt(6)+1]; } for(int i=1; i<dice.length;i++){ System.out.println(i + "\t\t" + dice[i]); } } }

위의 실행결과는 아래그림과 같다



주사위를 정해진 회수를 던져서
각각 몇개씩이나 나오는지 빈도수를 만들어 본 것이다
문자열 처리에서 편리한 것이 있다

System.out.println("Dice Number\tFrequency");

위의 빨강색 표시는 Tab문자를 중간에 넣으라는 것
만약 \n 라고 한다면 VBA에서 vbNewLine과 같은 것이고
만약 위의 것을 VBA로 하자면
"Dice Number" & vbTab & "Frequency"
로 처리하여야 할 것이지만 위와 같이 편리한 점이 있다

또 순환하면서

++dice[random.nextInt(6)+1];

++dice[i]
++표시는 dice[i] 에 1씩 추가하는것
VBA에서 표현하자면
dice[i]=dice[i]+1 과 같은 표현

그런데 순환문을 돌 때

for(int iX=0;iX<10;iX++){
...
}

iX++라고 뒤에서 붙여 주었다
앞에서 붙여주는 것은 뭐고..뒤에서 붙여주는 것은 뭔가??
앞에 붙여주는 것은 Pre-Increment Operator
뒤에 붙여주는 것은 Post-Increment Operator

아래와 같이 두개를 비교해서 실행 해보시면 이해가 된다

public class banana {
	 public static void main(String args[]){
		int iX = 0;
		System.out.println("Pre-Increment");
		System.out.println(++iX);
		System.out.println(iX);
		 
		int iY = 0;
		System.out.println("Post-Increment");
		System.out.println(iY++);
		System.out.println(iY);
	}
}

하나는 변수를 사용하기전에 값이 추가 된것이고
다른 하나는 변수를 사용한후에 값이 추가 된것..
미묘한 차이를 알고 사용하면 된다

아래 코드를 또 보자

public class banana {
	 public static void main(String args[]){
		 int x[]={1,2,3,4,5,6};
		 int total = 0 ;
		 for(int v:x){ 
			 total+=v;
			 System.out.println(total);
		 }
	 }
}

VBA에서 배열을 순환할때

Dim varX As Variant
Dim x=Array(1,2,3,4,5,6)
Dim iTotal As Integer For Each varX in x
    iTotal=iTotal+varX
    Debug.Print iTotal
Next

와 똑같은 효과로 보시면 좋겠다
아무튼 나중에 나온 언어라서 어떻게 해서라도 자판숫자를
줄이려고 노력한 흔적이 있는 것

이번에는 배열을 다른 프로시져(메소드)에 전달하여 작업을 시키면
해당 배열의 값은 어떻게 되는지..

public static void main(String args[]){ int x[]={1,2,3,4,5,6,7}; <b style='color:red;>changeValue(x);</b> for(int z:x){ System.out.println(z); } } public static void changeValue(int q[]){ for(int z=0;z<q.length;z++){ q[z]+=3; } }

위의 내용은 VBA의 아래와 같은 효과이다

Sub passArray()
Dim arrX As Variant
Dim varX As Variant
arrX = Array(1, 2, 3, 4, 5, 6, 7)
changeValue arrX
For Each varX In arrX
    Debug.Print varX
Next
End Sub

Sub changeValue(ByRef Q As Variant)
Dim iX As Integer
For iX = 0 To UBound(Q)
    Q(iX) = Q(iX) + 3
Next
End Sub

위의 두 내용을 아래와 같이 다시 해보시기 바란다
전달한 매개변수의 값의 변화가 호출한쪽에서 영향을 받지 않는 경우와
영향을 받아야 하는 경우가 있다
VBA에서는 ByRef와 ByVal키워드로 매개변수를 선언하기에 따라서 달라진다

public static void main(String args[]){ int x[]={1,2,3,4,5,6,7}; changeValue1(x); for(int z:x){ System.out.println(z); } } public static void changeValue1(int q[]){ for(int i:q){ i+=3; } }

위의 내용을 VBA로 풀어 보면 아래와 같다

Sub passArray1()
Dim arrX As Variant
Dim varX As Variant
arrX = Array(1, 2, 3, 4, 5, 6, 7)
changeValue1 arrX
For Each varX In arrX
    Debug.Print varX
Next
End Sub

Sub changeValue1(ByVal Q As Variant)
Dim iX As Integer
For iX = 0 To UBound(Q)
    Q(iX) = Q(iX) + 3
Next
End Sub

사소한 것 같지만 지켜야할 기본들이니 자꾸 작성해 보셔야 한다