오늘은 자바의 기초에서 가장 어렵게 느겨진 루프문이다. array문 자체도 원리를 이해하는데에 상당한 어려움이 있었지만 루프문의 사용범위가 너무 넓다보니 더욱 시간이 걸린것같다.
본 내용에 들어가기전에 별찍기를 드디어 이해한것 같아서 이것부터 정리해 보려고한다.
length = 5;
st = 1;
sp = length - st * 2;
for (int i = 0; i < length; i++) {
for (int j = 0; j < st; j++) {
System.out.print(star);
}
for (int j = 0; j < sp; j++) {
System.out.print(space);
}for( int j = 0; j < st && j + st < length; j++) {
System.out.print(star);
}
System.out.println();
if(i < length / 2) {
sp -= 2;
st += 1;
}else {
sp +=2;
st -=1;
}
위 코드를 실행하면 아래처럼 나온다. 마름모나 직사각형도 있었지만 쉬운관계로 생략하도록 하겠다.
위 코드에서 length는 세로의 열을 나타낸다.
* | * | |||
* | * | * | * | |
* | * | * | * | * |
* | * | * | * | |
* | * |
이렇게 되어있다면 별과 띄어쓰기의 배치는 위에서부터
st sp st
1 3 1
2 1 2
5
2 1 2
1 3 1
이렇게 되니까 코드로는
length로 5줄을 만들고
st(star) = 1;
sp(space) = length - st * 2; (1회째 = i가 0일때) 5 - 1 * 2 = 3 (2회째 = i가 1일때) 5 - 2 * 2 = 1
j < st(1) 즉 0하나이므로 별 1개만 찍는다
다음으로 j < sp 0 ~ 3 3개의 space를 두고 for( int j = 0; j < st && j + st < length; j++)
j가 0 < st(1) && 1 < length(5) and조건이므로 0하나만 있는 왼쪽의 1개만 조건에 들어가므로 별1개가 들어간다.
그 다음 if(i(0) < length(5) / 2) 0 < 5 / 2 = 2 즉 이 조건은 0,1일때는 참 2~4까지는 거짓인것이다.
지금은 참이니까 sp -= 2; st += 1; space는 줄이고 star는 1개씩 늘린다.
이렇게 두번째둘도 출력하고
중간에서 st는 3이다.
for (int j = 0; j < st(3); j++) { 0~2 3개의 별을 출력
}for( int j = 0; j < st && j + st < length; j++) { 0<3 && 3 < 5 이 조건을 보면 0,1,2 3,4 이렇게 보면 왼쪽의 0,1이 찍히는 동시에 조건을 초과해버리니 조건이 끝나버린다. 즉 0,1만이 출력되는것이다.
그래서 별을 2개 출력한다.
아래는 sp += 2;
st -= 1;로 역순으로 출력한다.
* *
* * * *
* * * * *
* * * *
* *
일단 for문을 이해하려면 이중for문이 각각 어떤 원리로 움직이는지를 알아야한다.
이중for문에서 만약 이런 코드가 있다고 한다면
for(int i = 0; i < 6; i++){
for(int j = 0; j < 5; j++){
}
i가 0일때 j가 4바퀴를 돌고 위로 올라가서 i를 1로 증가시키고 다시 j를 4바퀴 증가시키는 원리로 움직인다.
이것을 가장 잘 보여주고 있는것이 구구단 코드이다.
for(int i = 1; i < 10; i++) {
for(int j = 3; j < 6; j++) {
System.out.printf("%d X %d = %2d ", j, i, j * i);
}
System.out.println();
}
System.out.println();
이렇게 코드가 배치되어있다면
i가 1<10 즉 1부터 9까지를 세로로 출력한다. 그리고 j(2) < 6 2~5 가로로 2단부터 5단까지를 출력한다.
2 X 1 = 2 3 X 1 = 3 4 X 1 = 4 5 X 1 = 5
2 X 2 = 4 3 X 2 = 6 4 X 2 = 8 5 X 2 = 10
2 X 3 = 6 3 X 3 = 9 4 X 3 = 12 5 X 3 = 15
2 X 4 = 8 3 X 4 = 12 4 X 4 = 16 5 X 4 = 20
2 X 5 = 10 3 X 5 = 15 4 X 5 = 20 5 X 5 = 25
2 X 6 = 12 3 X 6 = 18 4 X 6 = 24 5 X 6 = 30
2 X 7 = 14 3 X 7 = 21 4 X 7 = 28 5 X 7 = 35
2 X 8 = 16 3 X 8 = 24 4 X 8 = 32 5 X 8 = 40
2 X 9 = 18 3 X 9 = 27 4 X 9 = 36 5 X 9 = 45
즉 i는 세로 j는 가로를 배치하게 되는것이다.
다음으로 처음이라 가장 어렵게 느껴진 array파트이다.
array의 가장 기초는 int a1 = 15, a2 = 48, a3 = 50, a4 = 30;
이런식으로 변수가 있다면 그것을 한 배열변수에 넣을수 있는것이다.
int [] arr = {15,48,50,30};
이런식으로 배열을 넣을수 있는것이다.
이것을
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
이렇게 arr의 값들을 하나씩 출력할수 있는것이다.
나중에 DB파트에서 사용될수 있는 자료추가는 array를 이용해서 사용하는것이 기본이다.
int length = 6;
String[] name = new int[length];
int[] age = new int[length];
Scanner sc = new Scanner(System.in);
for(int i = 0; i < name.length; i++){
System.out.println("이름 입력 : ");
name[i] = nextLine();
System.out.println("나이 입력 : ");
age[i] = Integer.parseInt(sc.nextLine());
}
System.out.println();
for(int i = 0; i < ages.length; i++){
System.out.printf("%s는 %d살입니다\n", names[i], ages[i]);
}
System.out.println("끝");
sc.close();
System.out.printf("%s는 %d살입니다\n", names[i], ages[i]);
}
System.out.println("끝");
sc.close();
Scanner로 입력을 하고 그 입력한 값을 각각의 변수에 하나씩 넣어주는 간단한 코드이다.
마지막으로 퀴즈문제가 있다.
정수형 배열 arr1을 생성하고 12, 91, 52, 34, 76, 29, 82 를 넣어라.
int[] arr = {12, 91, 52, 34, 76, 29, 82 };
arr1의 홀수번째 index에 들어간 숫자의 합을 구하여 출력하라
int total = 0;
for(int i = 0; i < arr.length; i++){
if(i%2 != 0){
total += arr[i];
}
}
i가 0~ arr의 갯수만큼 반복
만약 홀수번째 1,3,5번째에 들어간 값을 더한다 (처음에 홀수의 값을 더해라라고 착각한것 같다;;;;)
그 값들을 더해서 누적시켜준다.
arr1의 짝수번째 index에 들어간 숫자에 10을 더하세요
이 코드는 짝수번째를 구하기위해
if(i%2 == 0){
arr[i] += 10;
으로 가능하다.
arr1에 담긴 값들을 역순으로 arr2에 담아주세요
각각의 값들을 역순으로 출력하는 것이다.
일단 int[] arr2 = new int[arr.length];으로 객체를 생성해주고
for(int i = 0; i < arr.length; i++){
int j = arr.length - i - 1;
arr2[i] = arr[i]
length가 7이니까 i 가 0일때는 7 - 0 - 1 = 6 1일때는 7 - 1- 1= 5 이런식으로 1씩 빼가며 역순으로 저장한다.
그것을
System.out.print(i == arr1.length - 1 ? "]\n" : ", ");
i가 6일때까지 옆에 ", "를 찍고 끝나면 한줄을 뛰어준다.
그다음 System.out.println("arr2 : " + Arrays.toString(arr2));
Arrays.toString으로 arr2를 불러와 출력해준다.
아직까지는 전체적으로 내용이 어렵다기 보다는 이해할 시간이 부족해서 못따라가는것 같은 느낌이 든다.
하나를 가르켜주면 3을 알아야 하는 학원의 분위기는 나를 힘들게도 하지만 이 시스템이 강제로라도 등을 밀어주는 효과도 있기에 나쁘다고는 생각하지 않는다.
학원에서 매 파트가 끝날때마다 있는 시험이나 여러가지 학원의 빠른 속도감은 쉽지않지만 확실히 나의 실력이 늘고 있다는 느낌도 확실히 들고 있기에 더욱 분발해 보려고한다.
그럼 금요일에 공부했던 내용이지만 오늘은 여기에서 끝내보겠다.
'JAVA 공부' 카테고리의 다른 글
블로그 복붙방지 코드(개인용) (0) | 2023.03.24 |
---|---|
자바의 기초 - 객체지향파트 중 생성자(Constructor) (0) | 2023.03.23 |
자바의 기초 - for문 (0) | 2023.03.17 |
자바의 기초 - String(문자열) (0) | 2023.03.15 |
자바 기초 - Operator (4) | 2023.03.13 |