안녕하세요~ 두결입니다.
지난시간에는 배열이 무엇인지 알아보고 배열생성해서 화면에 표시해보는 것까지 해보았습니다.
이번시간에는 For문에 대해서 알아보겠습니다.
▣ For문이란? Log사용해보기
먼저, For문이 무엇인지 알아볼까요?
For문은 조건식이 참일동안 코드 블럭을 반복적으로 실행하는 제어문입니다.
for(초기값; 조건식; 증감식)
{
// 반복 실행할 코드
}
for문의 기본 구조는 위와같습니다.
for문의 처음은
초기값인데 for문이 시작될때 한번만 실행됩니다.
조건식은 for문이 얼마나 반복할지를 결정합니다. 조건식이 true일때만 반복합니다.
증감식은 조건식이 참일때 반복해서 실행합니다. 주로 변수값을 증가시키거나 감소시킬때 사용합니다.
간단한 예를 한번 보면
for(int i=0;i<10;i++)
{
// 반복 실행할 코드
Log.d("값 출력","i=" + i);
}
위의 코드는 0~9까지의 숫자를 10번 출력하는 코드입니다.
초기값은 i =0입니다. 0부터 시작한다는 의미이구요
조건식은 i<10입니다. i값이 10보다 작을동안 계속 반복한다는 의미입니다.
증감식은 i++입니다. i값을 for문이 반복할때마다 1씩 증가시킨다는 의미입니다.
결국, i=0부터 시작해서 계속 1씩 증가시키다가 i값이 10보다 작을때까지 반복하다가
i값이 10보다 크거나 같으면 for문은 종료합니다.
그럼, 이 값을 어디로 출력시킬것이냐..
여태까지 배운데로 TextView로 표시해도 되고
전에 배운 Toast.makeText()로 화면에 메세지 창으로 띄워도 되는데
이번시간에는 Log란것을 사용해보겠습니다.

Log는 전에 한번 에러났을때 확인해보는 용도로 보긴했었는데요
화면 좌측 아래에 고양이 모양(LogCat)을 클릭하면 위와같이 로그창을 볼수 있습니다.
Log.d()를 쓰면 바로 이 로그창에 표시가 됩니다.
Log.d()이외에도 Log.i(), Log.w(), Log.e()등 여러가지를 사용할수 있습니다.
Log.d()는 debug용 로그출력
Log.e()는 Error용 로그출력
Log.i()는 Information용 로그출력
Log.w()는 Warning용 로그출력으로 각각 색깔이 다르게 표시됩니다.
한번 볼까요?
Log.d("Debug용", "디버그 표시할때 사용해요~");
Log.e("Erro용", "에러 표시할때 사용해요");
Log.i("Information용", "정보 표시할때 사용해요");
Log.w("Warning용", "경고 표시할때 사용해요");
이렇게 코드를 입력하고
실행해보겠습니다.
여태까지는 실행한 후에 핸드폰 화면을 봤는데요..
이 Log는 핸드폰 앱화면으로 표시되는것이 아니고 위에서 애기한데로
프로젝트 화면 좌측 하단에 LogCat(고양이모양)을 눌렀을때 표시됩니다.

위와같이
Debug용은 민트색
Error용은 빨간색
Information용은 노란색
Warning용은 노란색으로 표시되네요..^^
Log.d()에서 첫번째 인자는 태그이고, 두번째인자는 메세지입니다.
첫번째 인자인 태그값은 위의 화면상에 좌측에 표시되는 값이고
두번째 인자인 메세지는 위의 화면상에 우측에 표시되는 값입니다.
for(int i=0;i<10;i++)
{
// 반복 실행할 코드
Log.d("값 출력","i=" + i);
}
자, 이제 다시 for문으로 돌아와서
for문 값출력을 해볼까요?

로그창을 보시면
i=0
i=1
...
i=9
까지 잘 표시가 되네요..^^
for문은 내부적으로 반복해서 돌아가는 코드이기때문에
중간에 어떻게 계산이 되고, 어떻게 변하는지를 알수가 없습니다.
그래서, 위와같이 로그를 찍어서 for문이 반복될때마다 어떻게 값이 변화되는지를 출력해서 확인해봐야 합니다.
▣ For문을 사용해서 1~10까지 더하기
For문에서 가장 많이 나오는 예제가 1~10까지 더하기가 아닐까 싶습니다.
int nSum = 0;
for (int i = 1; i <= 10; i++) {
// 반복 실행할 코드
nSum += i;
}
Log.d("합구하기", "1~10까지 합 =" + nSum);
네 위의 코드가 1에서 10까지 더하는 예제입니다.
nSum이란 변수를 0으로 초기화한후에
for문에서 i는 1부터 시작해서 10보다 작거나같을때까지 실행하고 1씩 증가시킵니다.
그리고 nSum값에 for문을 반복할때마다 i값을 더해줍니다.
좀더 풀어서 애기하면
i= 1일때 nSum = 1
i=2일때 nSum = 1+2
....
이런식으로 쭉 계산하는 것이죠
실행을 해볼까요?

위와같이 로그창에
1~10까지 합 = 55로가 잘 나오네요..^^
이건 간단한 예제니까 아 55가 제대로 나왔구나 할수 있는데요..
for문안에 복잡한 로직이나 수식이 들어갈때는 어떻게 이렇게 값이 나왔지? 싶을때가 있습니다.
이럴때는 for문안에 Log를 넣어서 중간중간 값을 체크해볼수가 있습니다.
해볼까요?
int nSum = 0;
for (int i = 1; i <= 10; i++) {
// 반복 실행할 코드
nSum += i;
Log.d("합구하기 중간과정", "i =" + i +" : nSum(합) = " + nSum);
}
Log.d("합구하기", "1~10까지 합 =" + nSum);
위와같이 중간과정을 볼수있도록
for문안에 Log.d를 사용해봤습니다.
실행을 해보면

네 위와같이 i값이 변화함에 따라 nSum의 값이 어떻게 변화하는지
for문에서 반복할때마다의 값을 확인할 수 있습니다. ^^
마지막으로 한가지만 더해보겠습니다.
▣ For문을 사용해서 배열의 값 출력해보기
지난 시간에 배열에 들어있는 값을 화면에 출력해봤었는데요..
int[] nArrNo = new int[]{20,30,5,3,12,29,8,11,57,76};
TextView txt_ArrayNo = findViewById(R.id.txtvArrayNo);
txt_ArrayNo.setTextSize(40);
String sArrNo;
sArrNo = "배열[" + 0 + "] = " + nArrNo[0] + "\n";
sArrNo += "배열[" + 1 + "] = " + nArrNo[1] + "\n";
sArrNo += "배열[" + 2 + "] = " + nArrNo[2] + "\n";
sArrNo += "배열[" + 3 + "] = " + nArrNo[3] + "\n";
sArrNo += "배열[" + 4 + "] = " + nArrNo[4] + "\n";
sArrNo += "배열[" + 5 + "] = " + nArrNo[5] + "\n";
sArrNo += "배열[" + 6 + "] = " + nArrNo[6] + "\n";
sArrNo += "배열[" + 7 + "] = " + nArrNo[7] + "\n";
sArrNo += "배열[" + 8 + "] = " + nArrNo[8] + "\n";
sArrNo += "배열[" + 9 + "] = " + nArrNo[9] + "\n";
txt_ArrayNo.setText(sArrNo);
바로 이 코드입니다. 기억나시죠? ^^
여기에서는 배열의 값이 10개니까 저렇게 썼는데
만약 배열에 값이 100개 또는 1000개라고 하면 어떨까요?
100개만 해도 아~ 힘들어 할것 같은데 1000개면 아 안해! 라며 포기할지도 모르겠네요 ㅎㅎ
하지만, 저희는 for문을 배웠기때문에 100개이든 1000개이든 무섭지 않습니다.
단 한줄이면 됩니다.
해볼까요?
String sArrNo = "";
for (int i = 0; i < 10; i++) {
// 반복 실행할 코드
sArrNo += "배열[" + i + "] = " + nArrNo[i] + "\n";
}
txt_ArrayNo.setText(sArrNo);
,
네 위와같이
for문으로 10번 반복해서
긴 10줄의 문자열을 단 한줄로 줄였습니다.
어떻습니까? 간단하죠? ㅎㅎ
sArrNo += "배열[" + 1 + "] = " + nArrNo[1] + "\n"
sArrNo += "배열[" + 2+ "] = " + nArrNo[2] + "\n"
위코드를 보면
줄마다 동일한 문자열이 있고 줄마다 다른곳이 있습니다.
네.. 숫자가 들어가는 1, 2 이런부분은 줄마다 다르고 나머진 다 동일하죠?
그래서, for문안에 넣을때는
줄마다 동일한것은 그대로 넣어주고, 줄마다 다른 숫자 부분은 변수로 바꾸어주면 됩니다.
위에서는 숫자부분에 단순히 i값만 넣었습니다.
한번 잘되는지 실행해보겠습니다.

네, for문으로 한줄로만 했어도 잘 출력이 되네요..^^
전체 소스입니다. 참고하세요~
MainActivity.java입니다.
package com.example.arrayfortest;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
int[] nArrNo = new int[]{20,30,5,3,12,29,8,11,57,76};
TextView txt_ArrayNo = findViewById(R.id.txtvArrayNo);
txt_ArrayNo.setTextSize(40);
String sArrNo = "";
for (int i = 0; i < 10; i++) {
// 반복 실행할 코드
sArrNo += "배열[" + i + "] = " + nArrNo[i] + "\n";
}
txt_ArrayNo.setText(sArrNo);
int nSum = 0;
for (int i = 1; i <= 10; i++) {
// 반복 실행할 코드
nSum += i;
Log.d("합구하기 중간과정", "i =" + i +" : nSum(합) = " + nSum);
}
Log.d("합구하기", "1~10까지 합 =" + nSum);
//
// Log.d("Debug용", "디버그 표시할때 사용해요~");
// Log.e("Erro용", "에러 표시할때 사용해요");
// Log.i("Information용", "정보 표시할때 사용해요");
// Log.w("Warning용", "경고 표시할때 사용해요");
//
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
}
}
약간 짧은 감이 있지만 이번시간은 여기까지만 하도록 하구요~
다음시간에는
배열의 10개의 값중에 가장 큰값, 가장 작은값, 배열의 총합 등을 구해보고
시간이 되면 정렬까지 해보도록 하겠습니다.
그럼, 이만~
감사합니다. ^^
