본문 바로가기
프로그래밍 언어/자바

2. 다시 공부하는 자바 - 자바 언어 기초 2 (이것이 자바다)

by amobu0 2024. 6. 12.

이것이 자바다 라는 책을 보고 정리한 글이다.

https://m.hanbit.co.kr/store/books/book_view.html?p_code=B4861113361

 

이것이 자바다(개정판)

2015년 초판이 출간된 이후부터 지금까지 기본 개념에 충실한 설명으로 독자들에게 큰 사랑을 받아온 『이것이 자바다』의 개정판. 기존 Java 8 버전에 최신 Java 17 LTS 버전까지 아우르는 내용으로

m.hanbit.co.kr

 

Part 1 자바 언어 기초


오버플로우와 언더플로우

오버플로우(overflow): 타입이 허용하는 최대값을 벗어나는 것을 말한다.
언더플로우(underflow): 타입이 허용하는 최소값을 벗어나는 것을 말한다. 

 

 

byte 타입일 경우 최대값 127에서 1을 더하면 128이 되어 오버플로우가 발생하고 연산결과는 최소값인 -128이 된다.

byte overflow = 127;
overflow++; //overflow 값에 + 1
System.out.println(overflow); //-128

코드 실행 흐름 제어

자바 프로그램은 main() 메소드의 시작 중괄호에서 끝 중괄호까지 위에서부터 아래로 실행하는 흐름을 가지고 있다. 이러한 실행 흐름을 개발자가 원하는 방향으로 바꿀 수 있도록 해주는것이 흐름 제어문이다. 제어문은 조건식과 중괄호 { } 블록으로 구성되는데, 조건식의 연산 결과에 따라 블록 내부의 실행 여부가 결정된다.

조건문 반복문
if 문, switch 문 for 문, while문,  do-while 문

if 문, if-else문

if 문은 조건식의 결과에 따라 블록 실행 여부가 결정된다. ( 조건식 ) 이 true이면 { } 블록을 실행하고 false이면  { } 블록을 실행하지 않는다. { }를 생략할 수 있지만 코드이 가독성(코드 해석)이 좋지 않고, 버그 발생의 원인이 될 수 있다.

int age = 10;

if (age >= 20) {
    System.out.println("성인");//조건문이 false이기 때문에 실행되지 않는다.
}

if (age < 20) {
    System.out.println("미성년자");// 미성년자
}

 

두 개의 if 문을 사용했지만 if-else문으로 코드를 간단히 처리할 수 있다. if ( ) 안의 조건문이 true일 경우 "성인"을 조건문이 false일 경우 "미성년자"를 출력한다.

int age = 10;

if (age >= 20) {
    System.out.println("성인"); //조건문이 true일 경우 실행
} else {
    System.out.println("미성년자"); //조건문이 false일 경우 실행
}

 

조건문이 여러 개인 if 문도 있다. else if는 상위 조건식이 false일 경우 평가되고, else if가 true이면 해당 블록이 실행된다. else if의 수는 제한이 없고, else if 블록만 실행하고 전체 if 문을 벗어나게 된다. 마지막에 else 블록을 추가할 수 있는데, 모든 조건식이 false일 경우 else 블록을 실행하고 if 문을 벗어난다. 

int grade = 37;

if (grade >= 50) {
    System.out.println("A등급");
} else if (grade >= 40) {
    System.out.println("B등급");
} else if (grade >= 30) {
    System.out.println("C등급"); //C등급
} else if (grade >= 20) {
    System.out.println("D등급");
} else {
    System.out.println("F등급");
}

switch 문

if 문은 조건식의 결과가 true, false 두 가지밖에 없기 때문에 경우의 수가 많아질수록 else if를 반복적으로 추가해야 하므로 코드가 복잡해진다. 그러나 switch 문은 변수의 값에 따라서 실행문이 결정되기 때문에 같은 기능의 if 문보다 코드가 간결해진다.

int num = (int) ((Math.random() * 6) + 1); //1~3까지 번호 뽑기

switch (num) {
    case 1:
        System.out.println("숫자: 1");
        break;
    case 2:
        System.out.println("숫자: 2");
        break;
    default:
        System.out.println("숫자: 3");
        break;
}

 

switch 문은 괄호 안의 변수값에 따라 해당 case로 가서 실행문을 실행한다. 만약 변수값과 동일한 값이 없다면 default로 가서 실행문을 실행한다. default가 없다면 생략 가능하다. case 끝에 있는 break는 다음 case를 실행하지 않고, switch 문을 빠져나가기 위해 필요하다. break가 없다면 case가 연달아 실행되고 이때는 case값과는 상관없이 실행한다. 예를 들어 모든 실행문에 break; 코드가 없다고 가정하고 num 값이 2가 나왔다면 "숫자: 2", "숫자: 3"이  출력된다.


for 문

실행문을 반복적으로 실행해야하는 경우가 많은데 이때 for 문을 활용할 수 있다. for 문이 처음 실행될 때 초기화식이 제일 먼저 실행되고, 그 다음 조건식을 평가해서 true이면 실행문을 실행시키고, 실행문이 모두 실행하면 증감식을 실행한다. 그리고 다시 조건식을 평가하고 실행문 -> 증감식 ->조건식 과정이 반복된다. 만약 조건식이 false이면 for 문을 종료하고 블록을 건너뛴다.

for (int i = 1; i <= 10; i++) {
        System.out.print(i + " ");
}// 1 2 3 4 5 6 7 8 9 10

 


while 문, do-while 문

for 문이 정해진 횟수만큼 반복한다면, while 문은 조건식이 true일 경우에 무한 반복하고 false가 되면 반복을 멈추고 while 문을 종료한다. while 문이 처음 실행되면 조건식을 평가하고, 평가 결과가 true이면 실행문을 실행한다. 실행문이 모두 실행되면 조건식으로 돌아가서 조건식을 다시 평가한다. 만약 조건식이 false라면 while 문을 종료한다.

int i = 1;
while (i <= 10) {
    System.out.print(i + " ");
    i++;
}// 1 2 3 4 5 6 7 8 9 10

 

do-while 문은 조건식에 블록 내부를 먼저 실행시키고, 실행 결과에 따라서 반복 실행을 계속할지 결정하는 경우 사용한다.

System.out.println("메시지를 입력하시오");
System.out.println("프로그램을 종료하려면 q를 입력하세요");

Scanner sc = new Scanner(System.in);

String input;

do {
    System.out.print(">");
    input = sc.nextLine();
}
while (!input.equals("q")); {
    System.out.println();
    System.out.println("프로그램을 종료합니다.");
}

break 문

break 문은 반복문 실행을 중지하거나 조건문인 switch 문을 종료할 때 사용한다. break 문은 대개 if문고 같이 사용되어 조건식에 따라 for 문과 while 문을 종료한다. 만약 반복문이 중첩되어 있을 경우 break 문은 가장 가까운 반복문만 종료하고 바깥쪽 반복문은 종료시키지 않는다.


continue 문

continue 문은 반복문에서만 사용되는데, 블록 내부에서 continue 문이 실행되면 for 문의 증강식 또는 while 문, do-while 문의 조건식으로 바로 이동한다. continue 문은 반복문을 종료하지 않고 계속 반복을 수행한다. break 문과 마찬가지로 대개 if 문과 같이 사용되는데, 특정 조건을 만족하는 경우에 continue 문을 실행해서 그 이후의 코드를 실행하지 않고 다음 반복으로 넘어간다.

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        continue; //2로 나눈 나머지가 0이면 증감식을 실행하고 조건식을 평가한다.
    }
    System.out.print(i + " "); //1 3 5 7 9 
}