본문 바로가기
개념

[JAVA의 정석] Chapter04 -05

by cook_code 2024. 9. 7.
반응형

 

교재 목차

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