교재 목차
Chapter04. 조건문과 반복문
Chapter05. 배열(Array)
Chapter04. 조건문과 반복문
1. 자바 조건문
1-1. 조건문이란? https://wikidocs.net/211
조건을 판단하여 해당 조건에 맞는 상황을 수행하는 데 쓰이는 것.
1-2. 조건문 종류별 특징
if문
if (조건문) { <수행할 문장1>; <수행할 문장2>; ... }
if-else문
if (조건문) { <수행할 문장1>; <수행할 문장2>; ... } else { <수행할 문장A>; <수행할 문장B>; ... }
if-else if문
if (조건문) { <수행할 문장1> <수행할 문장2> ... }else if (조건문) { <수행할 문장1> <수행할 문장2> ... }else if (조건문) { <수행할 문장1> <수행할 문장2> ... ... } else { <수행할 문장1> <수행할 문장2> ... }
switch문
입력 변수의 값과 일치하는 case 입력값(입력값1, 입력값2, …)이 있다면 해당 case 문에 속한 문장들이 실행된다.
case 문마다 break라는 문장이 있는데 해당 case 문을 실행한 뒤 switch 문을 빠져나가기 위한 것이다.
만약 break 문이 빠져 있다면 그 다음의 case 문에 속한 문장들이 실행된다.
switch(입력변수) { case 입력값1: ... break; case 입력값2: ... break; ... default: ... break; }
1-2. if문과 switch문의 차이 https://velog.io/@ahsy92/JaveScript-Switch-If
차이
If-else 문은 원하는 조건이 나올 때까지 순차적으로 모든 경우의 수를 하나씩 비교한다.
하지만 switch 문은 jump-table을 사용하여 한번에 원하는 곳에 이동이 가능하다.
장점
if문의 예제와 switch문의 예제를 살펴보면 switch가 좀더 가독성이 좋다는 장점이 있다.
두 문장 모두 특정 조건에 따라 다르게 동작하는 코드를 만들 수 있지만
넓은 범위에서는 if, 좁은 범위(특정한 값)에서는 switch문을 사용하는게 가시적인 효과가 있는것으로 보인다.
속도
if문은 조건문의 개수만큼 O(n)의 시간복잡도를 갖게 되어 성능에 단점이 있고,
switch문은 case의 개수만큼 jump-table을 차지하므로 메모리에 단점이 있다는것이다.
때문에 성능면에서만 보면 switch문이 더 빨라 조건이 3개 이상일 경우에는
switch문을 사용하는 것이 더 좋다는 이야기가 나온다는듯하다.
하지만, 사실 이러한 차이는 컴파일러의 처리속도에 따라 차이가 생기는것이다.
2022년 기준으로 컴파일러들이 워낙 우수하기 때문에 차이가 크게 나지 않는다는 이야기가 많다.
위의 예제에서 조건을 추가한 후 console.time으로 시간을 체크해보면 아래와 같이 나오게 된다.
조건문
|
10,000번
|
1,000번
|
1번
|
Switch 문
|
평균 1ms
|
평균 0.1ms
|
평균 0.1ms 이하
|
If 문
|
평균 1ms
|
평균 0.1ms
|
평균 0.1ms 이하
|
1번과 100번에 큰 차이는 보이지 않았고 10,000번 부터 전체적인 시간이 소모 되었으나,
결과를 보았을때는 큰 차이가 없었음을 볼 수 있었다.
switch의 응용
switch문을 사용하면 코드가 좀더 깔끔해지는 것을 볼 수 있었다.
이러한 장점을 활용한다면, 조건부 판별시 or과 같은 조건이 많다면 switch로 깔끔하게 정리가 가능하다.
interface userInfo { age: number name: string class: string } // if일때의 조건문 const testIf = (user: userInfo) => { if((user.age > 50 && use.class === 'B') || (user.name ==='Kim' && user.age === 32)) return `Welcome ${user.name}` return "허가되지 않은 사용자입니다." } // switch일때 if와 같은 조건문 const testSwitch = (user: userInfo) => { switch(true) { case user.age > 50 && user.class === 'B': case user.name === 'Kim' && user.age === 32: return `Welcome ${user.name}` default: return "허가되지 않은 사용자입니다." } }
주의
switch/case 문은 if 문으로 변경이 가능하지만 if 문으로 작성된 모든 코드를 switch 문으로 변경할 수는 없다.
2. 자바 반복문
2-1. 반복문이란? https://wikidocs.net/212
조건문이 참인 동안 while 문이 수행할 문장들을 반복하여 수행한다.
2-2. 반복문 종류별 특징
while
while (조건문) { <수행할 문장1>; <수행할 문장2>; <수행할 문장3>; ... }
while 활용 → 무한루프
while (true) { <수행할 문장1>; <수행할 문장2>; ... } 터미널로 실행 시 ctrl+c를 눌러 빠져나갈 수 있음, ide 사용시 중지버튼 클릭하여 프로세스 종료
while 제어 → break, continue
//while문을 강제로 멈춰야 할 때 int coffee = 10; int money = 300; while (money > 0) { System.out.println("돈을 받았으니 커피를 줍니다."); coffee--; System.out.println("남은 커피의 양은 " + coffee + "입니다."); if (coffee == 0) { System.out.println("커피가 다 떨어졌습니다. 판매를 중지합니다."); break; } } //참이 아닌 경우 반복문 종료가 아니라 조건문으로 돌아가게 하고 싶을때 int a = 0; while (a < 10) { a++; if (a % 2 == 0) { continue; // 짝수인 경우 조건문으로 돌아간다. } System.out.println(a); // 홀수만 출력된다. }
for문
for (초기치; 조건문; 증가치) { ... }
for문 제어 → continue
for 문 안의 문장을 수행하는 도중에 continue 문을 만나면 for 문의 처음으로 돌아간다.
int[] marks = {90, 25, 67, 45, 80}; for(int i=0; i<marks.length; i++) { if (marks[i] < 60) { continue; // 조건문으로 돌아간다. } System.out.println((i+1)+"번 학생 축하합니다. 합격입니다."); }
이중 for문 (ex) 구구단
for(int i=2; i<10; i++) { for(int j=1; j<10; j++) { System.out.print(i*j+" "); } System.out.println(""); // 줄을 바꾸어 출력하는 역할을 한다. }
J2SE 5.0 이상 부터 for each로 반복
iterate는 루프를 돌릴 객체이고 iterate 객체에서 한 개씩 순차적으로 변수명에 대입되어 for 문이 수행된다.
iterate에 사용할 수 있는 자료형은 루프를 돌릴 수 있는 자료형(배열이나 ArrayList 등)만 가능하다.
그리고 변수명의 type(자료형)은 iterate 객체에 포함된 자료형과 일치해야 한다.
for each 문은 따로 반복 횟수를 명시적으로 주는 것이 불가능하고,
한 단계씩 순차적으로 반복할 때만 사용이 가능하다는 제약이 있다.
Chapter05. 배열(Array)
1. 배열이란?
1-1. 배열의 개념 https://wikidocs.net/206
배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
변수와 달리 배열은 각 저장공간이 연속적으로 배치되어 있다는 특징이 있다.
1-2. 배열의 선언과 생성
배열 선언 형식 1,2
형식 1 형식 2
타입[] 변수; 타입 변수[];
배열 생성 형식
변수이름 = new 타입 [길이];
배열 선언과 생성을 동시에 하는 형식
타입[] 변수이름 = new 타입[길이];
int[] scores = new int[30];
String[] names = new String[30];
참고, 각 타입별 배열의 초기값
분류
|
타입
|
초기화
|
기본 타입(정수)
|
byte[]
char[]
short[]
int[]
long[]
|
0
‘\u000’
0
0
0L
|
기본 타입(실수)
|
float[ ]
double[ ]
|
0.0F
0.0
|
기본 타입(논리)
|
boolean[]
|
false
|
참조 타입
|
클래스[ ]
|
null
|
인터페이스[ ]
|
null
|
1-3. 배열의 인덱스
- 인덱스의 범위는 0부터 배열길이 -1 까지
- 배열의 길이는 int범위의 양의 정수(0도 포함)이어야 한다.
1-4. ArrayIndexOutOfBoundsException
- 유효하지 않은 범위의 인덱스 사용 시 발생하는 에러
1-5. 배열의 길이 변경하기
- 더 큰 배열을 새로 생성한다.
- 기존의 배열의 내용을 새로운 배열에 복사한다.
1-6. 배열의 출력
// 방법 1. 반복문 활용
public class PrintArray { public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5 }; for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } }}
// 방법 2. Arrays 배열 활용
import java.util.Arrays; public class PrintArray { public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5 }; System.out.println(Arrays.toString(arr)); }}
예외) System.out.println으로 배열 출력 시
다른 타입의 배열은 타입@주소 형태의 참조값이 출력되지만,
char 배열은 구분자 없이 배열의 요소가 모두 출력된다.
2. 다차원 배열
2-1. 다차원 배열의 선언 https://www.tcpschool.com/c/c_array_twoDimensional
타입 배열이름[행의길이][열의길이];
int[][] arr = new int[2][3];
int k = 10;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = k; // 인덱스를 이용한 초기화
k += 10;
}
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
10 20 30
40 50 60
2-2. 다차원 배열의 선언과 초기화
- 기본 다차원 배열
타입 배열이름[행의길이][열의길이] = {
{배열요소[0][0], 배열요소[0][1], ...},
{배열요소[1][0], 배열요소[1][1], ...},
{배열요소[2][0], 배열요소[2][1], ...},
...
};
int[][] arr = {
{10, 20, 30},
{40, 50, 60}
};
10 20 30
40 50 60
- 가변 다차원 배열
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[4];
arr[2] = new int[1];
// 두 번째 첨자 생략
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[4];
arr[2] = new int[1];
10 20
10 20 30 40
10
'개념' 카테고리의 다른 글
[JAVA의 정석] Chapter07 (2) | 2024.09.08 |
---|---|
[JAVA의 정석] Chapter06 (2) | 2024.09.07 |
[JAVA의 정석] Chapter01 -03 (6) | 2024.09.06 |
동아리 '공간감각' 자바 스터디 (3) | 2024.09.06 |
[이것이 자바다] chapter.16 확인 문제 (0) | 2023.04.11 |