PROGRAMMING WORKSHOP

Android|
Java 순환문..

안드로이드를 하면서 당연히 Java언어를 습득하게 된다
언어의 기본..순환문을 이용하여 버튼을 여러개를 런타임으로 생성하게
해보자
이크립스란 Java개발도구를 사용하면서 참 편리하구나 하는 부분이..
여러개의 프로젝트(패키지)를 창을 하나 열어 놓고 같이 관리할수 있다는 부분이였다
그림과 같이 다른 앱을 만들때도 그냥 같은 창을 열어놓은 상태에서 새작업을
추가하면 된다



이 페이지에서는 순환문, 조건문,난수 발생 등을 해보도록 하자
앱이 실행될때 난수로 LinearLayout의 배치방법을 행방향, 열방향두가지로 바꿔주어 보고
버튼을 몇개 순환하면서 만들고
버튼을 크릭할때마다 버튼 색상이 난수로 지정된 색상으로 바뀌는 것을 해보면서
Java언어를 조금씩 익혀 보자
VBA에서는 IIF함수가 있었다
두개의 조건을 따질때 간단하게 사용하기 좋은 함수이다
Java에서도 이런 형식이 있다
(i==1)?x="xx":x="yy";
라고 하는 것이 IIF함수와 같은 역할이다
조건을 비교할때 A=B 라고 묻는 것은 VBA에서 하는 방식이고
Java에서는 A==B 라고 등호를 두개 사용한다, 그래서 위의 표현은
i값이 1이면 x변수에 "xx"를 전달하고 그렇지 않으면 "yy"를 전달한다

난수를 발생하는 것은 VBA에서는

Dim iX As Integer
iX=Int(Rnd()*3)
이라고 하면 iX에는 0,1,2 라는 난수가 교대로 얻어지게 된다
위와 같은 것을 똑같이 Java에서 구현하려면

Random q = new Random();
Int iX = q.nextInt(3);

이라고 하면 된다
VBA에서는 Rnd라는 함수가 있었지만..
Java는 항상 무엇을 하던 개체부터 만든다
Random개체라는 것이 있어서 이것을 우선 생성한후 이 개체로 부터
난수를 얻어내는 것이다
q라는 변수에 Random개체를 만든후
Int iX=q.nextInt(3)
random개체..즉 q의 nextInt메소드에 매개변수 3을 주면 0,1,2의 숫자중에서
하나를 얻어낼수 있는 것

package com.example.buttonswithloopblock;

import java.util.Random;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout layout= new LinearLayout(this);
        Random random = new Random();
        int q = random.nextInt(2);
        layout.setOrientation((q==1)?LinearLayout.VERTICAL:LinearLayout.HORIZONTAL);
        
        for (int i = 1; i < 20; i++) { 
        	Button b = new Button(this); 
            b.setText(""+ i); 
            b.setId(100+i); 
            b.setOnClickListener(this);
           layout.addView(b);
        } 
        setContentView(layout);
    }

	public void onClick(View v) {
		Random random = new Random();
		int iColor = 0;
		switch(random.nextInt(5)){
			case 0:
				iColor=Color.RED;
				break;
			case 1:
				iColor=Color.BLUE;
				break;
			case 2:
				iColor=Color.YELLOW;
				break;
			case 3:
				iColor=Color.GREEN;
				break;
			case 4:
				iColor=Color.MAGENTA;
				break;
		
		}
		v.setBackgroundColor(iColor);
		Toast.makeText(getApplicationContext(),v.getId()+" Button Clicked", Toast.LENGTH_SHORT).show();
	}
}

아래의 구문을 따져 보자

LinearLayout layout= new LinearLayout(this);
layout이라는 변수에 LinearLayout개체를 만들었다
이것은 화면의 바탕을 구성하는 최상위 개체가 된다
난수를 0이나 1을 발생시키고 싶다..아래와 같이

Random random = new Random();
int q = random.nextInt(2);

q변수가 0 이 되기도 하고 1이 되기도 할 것이다
바탕개체들의 배열방법을 1일때는 수직방향(행방향) 0일때는 수평방향(열방향)

layout.setOrientation((q==1)?LinearLayout.VERTICAL:LinearLayout.HORIZONTAL);

layout개체의 setOrientation을 두가지중 한가지로 주도록 한 것이다

이제 버튼을 만든다
VBA애서의 For ~ Next문과 같은 것이

for(int iX=0;iX<10;iX++){
   이곳에 작업내용..
}

변수 iX를 외부에 별도로 선언하지 않고 위와 같이 (int iX=0;iX<10;iX++)
이것은 iX값이 0에서 부터 iX값이 10보다 작을때까지 1씩 증가하면서(iX++)
순환한다라는 것..이것을 VBA에서 한다면

Dim iX As Integer
For iX=0 To 9
   이곳에 작업내용..
Next

와 같이 하면 똑같은 순환방법인 것이다

표현하는 방법만 다를뿐 프로그래밍컨셉은 똑같은 것이다

매번 순환할때마다 버튼을 하나씩 생성한다
아래와 같이 버튼 개채를 하나 생성한다

Button b = new Button(this);

버튼의 캡션속성을 준다..이때 ""+i 에서 앞의 빈따옴표는 뭔가?

b.setText(""+ i);

Java는 정보의 타입에 대단히 민감하다
실은 위의 것은 b.setText(String.ValueOf(i))
라고 해주어야 하는 것인다..즉 Integer타입을 String타입으로 변환해주어야 한다
이것을 약식으로 ""+i 라고 해주면 에러가 나지 않고 간단한 표현방법인것이다

다음은 Id값을 주기 위한 것..충분히 번호를 확보하기 위하여 100에서 부터 시작하여
1씩 추가 시킨 번호를 개체의 ID값으로 사용하도록 한다

b.setId(100+i);

ID값이 있어야 해당개체에 쉽게 접근한다
다음은 이벤트프로시져를 사용하겠다는 등록

b.setOnClickListener(this);

앞페이지에서 이야기 하였던 버튼마다 이벤트프로시져를 각각 만들 것인가..
아니면 하나를 만들어 놓고 여러 버튼이 사용할 것인가의 문제에서
여기에서는 하나의 프로시져(메소드)를 여러 버튼이 공동으로 사용한다
사용방법은 맨위의 implements OnClickListener 의 선언을 통하여
만들어진 OnClick() 메소드를 사용하는 것..

만들어진 버튼을 이제 최초에 만들어진 Layout개체에 추가등록하여 준다

layout.addView(b);

이렇게 하여 화면에 버튼이 줄줄이 나타나는 것을 해보게 된 것이다
그런데 의아한 것이 있을 것이다
어라...나머지 버튼을 죄다 어디루 갔지???!!!!
수평이던 수직이던 방향대로 주욱 나타나다가 화면이 부족한 부분은
눈에 보이지 않는다



LinearLayout에서 Linear다는 단어의 의미대로 그렇게 된것이다
그냥 개체가 추가되면 추가되는대로 일직선상으로 주욱 나타나다가
화면이 부족하면 숨어 버리는 것이 LinearLayout의 성질머리인 것이다
그럼 어떻게 표현하지...라고 하는 의문을 갖고 있으면 된다

에이..엑셀만한 프로그램이 없어...
그냥 셀과 셀사이를 요리조리 정리하면 못하는 것이 없는데..
LinearLayout의 성질머리를 또 알아 보고 하면 되는 것..
외통수 정해진 방향으로 한방향으로만 개체들이 만들어진다
멍청한 짜식..그래도 성질머리를 알면 아무튼 된다

한쪽으로만 간다면 LinearLayout개체를 행방향으로 LinearLayout속에
만들어주고 만들진 내부의 LinearLayout개체에서는 열방향으로
보내도록 하면서 그 속에 버튼을 만들어 내면 되잖아!!가 답이 된다
물론 LinearLayout이 아닌 다른 형식의 Layout개체로 하여도 되지만
LinearLayout에서 뿌리를 뽑고 가야지!!! 오기가 있지...,



이렇게 되면 Java언어를 요리조리 잘 사용하여야 하는 셈이다
순환을 하면서 몇번 순환을 하였을때 LinearLayout개체를 또 생성하여
최상위 LinearLayout에 추가시켜주고...
VBA에서..아래와 같은 짓을 했던 것이 기억나실 것이다

For iX =1 To 21
   If iX Mod 5 =1 Then
         ....
    End if
   ...
   ...
Next

Mod연산자에 해당하는 부호는 Java에서 무엇을 사용할까??
% 퍼센트표시를 사용한다
아무래도 VB.Net에 대한 이야기를 uno-weekly에서 해야 할 것같다
그래야 Java, VB.Net, VBA 같이 비교하면서 학습을 하면 좀더 씨너지효과가
날 것 같다..

아무튼 아래와 같이 만들어졌다



의도한 대로 된 것이다
아래와 같이 수정하여..좀 복잡해 보이지만 잘 보면 별 것아니다

//아래 한줄만 여러분의 패키지이름으로 바꿔주고 실행하시면 된다
package com.example.buttonswithloopblock;
/////////////////////////////////////////////////////////
import java.util.Random;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout layout= new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        
        LinearLayout.LayoutParams p = new LinearLayout.LayoutParams( 
        		 LinearLayout.LayoutParams.WRAP_CONTENT, 
        		 LinearLayout.LayoutParams.WRAP_CONTENT 
        ); 
        LinearLayout rowLayout =null;
        
        for (int i = 1; i < 21; i++)  
        { 
             if( (i % 5) == 1 )  
             { 
                  rowLayout = new LinearLayout( this ); 
                  layout.addView( rowLayout, p ); 
             }
             Button b = new Button(this); 
             b.setText(""+ i); 
             b.setId(100+i); 
             b.setWidth(50); 
             b.setHeight(20); 
             b.setOnClickListener(this);
             rowLayout.addView(b, p);
        } 
        setContentView(layout);
    }

	public void onClick(View v) {
		Random random = new Random();
		int iColor = 0;
		switch(random.nextInt(5)){
			case 0:
				iColor=Color.RED;
				break;
			case 1:
				iColor=Color.BLUE;
				break;
			case 2:
				iColor=Color.YELLOW;
				break;
			case 3:
				iColor=Color.GREEN;
				break;
			case 4:
				iColor=Color.MAGENTA;
				break;
		
		}
		v.setBackgroundColor(iColor);
		Toast.makeText(getApplicationContext(),v.getId()+" Button Clicked", Toast.LENGTH_SHORT).show();
	}
}


***[LOG-IN]***