[혼공자] 2주차_조건문과 반복문, 참조 타입 학습후기

혼자 공부하는 자바 개정판

2주차 학습 진도 : Chapter 04~05 (조건문과 반복문, 참조 타입)




4장 조건문과 반복문

자바에서 조건문은 프로그램의 실행 흐름을 제어하는 중요한 역할을 합니다. if문과 switch문이 대표적인 조건문입니다. if문은 조건식의 결과에 따라 다른 코드 블록을 실행할 수 있으며, switch문은 변수의 값에 따라 실행할 코드 블록을 선택할 수 있습니다.

자바의 반복문은 특정 코드 블록을 반복적으로 실행할 수 있게 해줍니다. for문, while문, do-while문이 대표적인 반복문입니다. 이 외에도 break문과 continue문을 사용하여 반복문을 제어할 수 있습니다.


4.1 조건문
자바에서 조건문은 프로그램의 실행 흐름을 제어하는 중요한 역할을 합니다. 조건문에는 if문, switch문이 있습니다.

if문은 조건식의 결과에 따라 다른 코드 블록을 실행할 수 있습니다. if-else문은 조건식이 참이면 if 블록을, 거짓이면 else 블록을 실행합니다. if-else if-else문은 다중 조건을 처리할 수 있습니다.

switch문은 변수의 값에 따라 실행할 코드 블록을 선택할 수 있습니다. 각 case 문은 변수의 값과 비교되며, 일치하는 case 문의 코드 블록이 실행됩니다.


4.2 반복문
자바의 반복문은 특정 코드 블록을 반복적으로 실행할 수 있게 해줍니다. 대표적인 반복문으로는 for문, while문, do-while문이 있습니다.

for문은 초기화, 조건식, 증감식으로 구성되며, 조건식이 참인 동안 반복 실행됩니다. while문은 조건식이 참인 동안 반복 실행되며, do-while문은 최소 한 번은 실행되고 이후 조건식을 확인합니다.

break문은 반복문을 강제로 종료할 수 있으며, continue문은 현재 반복을 건너뛰고 다음 반복을 실행합니다.



https://samparkblog.com/%ec%9e%90%eb%b0%94-%eb%a1%9c%eb%98%90-%eb%b2%88%ed%98%b8-%ec%83%9d%ec%84%b1%ea%b8%b0-math-random-collections-shuffle/

161 페이지에 Math.random() 메소드에 대해서 무작위 난수를 뽑아서 출력하는 방법에 대해서 이해할수 있는 시간이었는데요, Math.random() 메소드를 그대로 사용하면 원하는 무작위 난수를 얻을수 없기 때문에, 추가적인 코드 작성을 해야 하는데, Collections.shuffle() 메소드는 그대로 사용하면 되기 때문에 편리할수 있습니다.

궁굼하신 분들은 위에 이전에 작성한 ‘Math.random() vs Collections.shuffle()‘ 포스팅글을 참고해 보세요.



package sec01.exam01;

import java.util.Scanner;

public class rndNumber {
    public static void main(String[] args) {
        System.out.print("원하는 숫자를 입력하세요: ");
        Scanner sc = new Scanner(System.in);

        int countNum = Integer.parseInt(sc.nextLine());
        int start = 1;  // 시작 번호
        int[] arrCount = new int[countNum];

        for(int i=0; i<countNum; i++) {
            arrCount[i]= (int)(Math.random() * countNum) + start;
        }

        for(int j=0; j<countNum; j++) {
            System.out.println(j + ": " + arrCount[j]);
        }
    }
}


학습한 부분에 대해서 응용해서 원하는 숫자 만큼 입력을 받아서 랜덤 숫자를 출력하는 예제 코드를 작성해 봤습니다.



package sec04.exam05;

public class RepeatExample {
    public static void main(String[] args) {
        // if-else 문
        int score = 85;
        if (score >= 90) {
            System.out.println("A 학점입니다.");
        } else if (score >= 80) {
            System.out.println("B 학점입니다.");
        } else {
            System.out.println("C 학점입니다.");
        }

        // switch 문
        int day = 3;
        String dayName;
        switch (day) {
            case 1:
                dayName = "월요일";
                break;
            case 2:
                dayName = "화요일";
                break;
            case 3:
                dayName = "수요일";
                break;
            default:
                dayName = "잘못된 요일";
                break;
        }
        System.out.println("오늘은 " + dayName + "입니다.");

        // for 문
        int sum = 0;
        for (int i = 1; i <= 10; i++) {
            sum += i;
        }
        System.out.println("1부터 10까지의 합: " + sum);

        // while 문
        int count = 0;
        while (count < 5) {
            System.out.println("while 문 실행 중 (" + count + ")");
            count++;
        }

        // do-while 문
        int number = 0;
        do {
            System.out.println("do-while 문 실행 중 (" + number + ")");
            number++;
        } while (number < 3);

        // break 문
        for (int i = 1; i <= 10; i++) {
            if (i == 6) {
                break;
            }
            System.out.println("break 문 실행 중 (" + i + ")");
        }

        // continue 문
        for (int i = 1; i <= 10; i++) {
            if (i % 2 == 0) {
                continue;
            }
            System.out.println("continue 문 실행 중 (" + i + ")");
        }
    }
}


챕터 4에서 학습한 내용들을 정리해서 하나의 예제 자바 코드를 작성해 보았습니다.


실행한 결과 화면 입니다.

B 학점입니다.
오늘은 수요일입니다.
1부터 10까지의 합: 55
while  실행  (0)
while  실행  (1)
while  실행  (2)
while  실행  (3)
while  실행  (4)
do-while 문 실행 중 (0)
do-while 문 실행 중 (1)
do-while 문 실행 중 (2)
break 문 실행 중 (1)
break 문 실행 중 (2)
break 문 실행 중 (3)
break 문 실행 중 (4)
break 문 실행 중 (5)
continue 문 실행 중 (1)
continue 문 실행 중 (3)
continue 문 실행 중 (5)
continue 문 실행 중 (7)
continue 문 실행 중 (9)




5장 참조 타입

자바에는 기본 타입과 참조 타입이 있습니다. 참조 타입에는 클래스, 인터페이스, 배열 등이 포함됩니다. 참조 변수는 힙 메모리 영역에 저장된 객체를 가리키며, 참조 변수의 비교는 주소 비교가 아닌 equals() 메서드를 사용해야 합니다.

배열은 같은 타입의 데이터를 연속된 공간에 저장하는 자료 구조로, 1차원 배열부터 다차원 배열까지 다양하게 선언할 수 있습니다. 배열 요소로 객체 참조 변수를 가질 수도 있습니다.

열거 타입은 서로 관련된 상수를 정의할 때 사용하며, 열거 타입 변수는 해당 열거 타입의 상수 값만 가질 수 있습니다.


5-1 참조 타입과 참조 변수

  • 기본 타입과 참조 타입
    자바에는 기본 타입(primitive type)과 참조 타입(reference type)이 있습니다. 기본 타입에는 정수형(byte, short, int, long), 실수형(float, double), 문자형(char), 논리형(boolean)이 있습니다. 참조 타입에는 클래스, 인터페이스, 배열 등이 포함됩니다.
  • 메모리 사용 영역
    기본 타입 변수는 스택 메모리 영역에 저장되지만, 참조 타입 변수는 힙 메모리 영역에 객체가 저장되고 참조 변수는 스택 메모리 영역에 저장됩니다.
  • 참조 변수의 ==, != 연산
    참조 변수의 == 연산은 변수가 가리키는 객체의 주소가 동일한지 비교하고, != 연산은 주소가 다른지 비교합니다. 하지만 equals() 메서드를 사용하면 객체의 내용을 비교할 수 있습니다.
  • null과 NullPointerException
    참조 변수에 null을 할당하면 해당 변수는 어떤 객체도 참조하지 않습니다. null 참조 변수로 메서드를 호출하거나 필드에 접근하면 NullPointerException이 발생합니다.
  • String 타입
    String 타입은 참조 타입이지만 기본 타입처럼 다루어집니다. String 객체는 불변(immutable)이므로 한번 생성되면 내용을 변경할 수 없습니다. 문자열 연산 시 새로운 String 객체가 생성됩니다.


5-2 배열, 배열이란?

  • 배열 선언
    배열은 같은 타입의 데이터를 연속된 공간에 저장하는 자료 구조입니다.
    배열은 타입[] 변수명; 형식으로 선언합니다.
  • 배열 생성
    배열은 new 연산자를 사용하여 생성합니다. 배열의 길이는 생성 시 결정되며 변경할 수 없습니다.
  • 배열 길이
    배열 변수의 length 필드를 통해 배열의 길이를 알 수 있습니다.
  • 명령 라인 입력
    main() 메서드의 String[] args 매개변수를 통해 프로그램 실행 시 전달된 명령행 인수를 받을 수 있습니다.
  • 다차원 배열
    2차원 이상의 다차원 배열을 선언할 수 있습니다. 다차원 배열은 1차원 배열의 배열로 구성됩니다.
  • 객체를 참조하는 배열
    배열 요소로 객체 참조 변수를 가질 수 있습니다. 이 경우 배열은 객체 참조를 저장합니다.
  • 배열 복사
    배열은 얕은 복사(shallow copy)되므로 원본 배열과 복사본 배열이 같은 객체를 참조할 수 있습니다. 깊은 복사(deep copy)를 위해서는 for문이나 System.arraycopy() 메서드를 사용해야 합니다.
  • 향상된 for문
    배열을 순회할 때 향상된 for문을 사용할 수 있습니다.


5-3 열거 타입

  • 열거 타입 선언
    열거 타입(enum)은 서로 관련된 상수를 정의할 때 사용합니다. enum 키워드로 열거 타입을 선언합니다.
  • 열거 타입 변수
    열거 타입 변수는 해당 열거 타입의 상수 값만 가질 수 있습니다. 열거 타입 변수는 ==, != 연산자로 비교할 수 있습니다.


package sec05.exam06;

public class Exam06 {
    public static void main(String[] args) {
        // String 비교
        String strVar1 = "신민철";
        String strVar2 = "신민철";
        if (strVar1 == strVar2) {
            System.out.println("strVar1과 strVar2는 참조가 같음");
        } else {
            System.out.println("strVar1과 strVar2는 참조가 다름");
        }
        if (strVar1.equals(strVar2)) {
            System.out.println("strVar1과 strVar2는 문자열이 같음");
        }

        String strVar3 = new String("신민철");
        String strVar4 = new String("신민철");
        if (strVar3 == strVar4) {
            System.out.println("strVar3과 strVar4는 참조가 같음");
        } else {
            System.out.println("strVar3과 strVar4는 참조가 다름");
        }
        if (strVar3.equals(strVar4)) {
            System.out.println("strVar3과 strVar4는 문자열이 같음");
        }

        // 배열 사용
        int[] scores = {83, 90, 87};
        int sum = add(scores);
        System.out.println("총합 : " + sum);

        int[] arr1 = new int[3];
        for (int i = 0; i < 3; i++) {
            System.out.println("arr1[" + i + "] : " + arr1[i]);
        }
        arr1[0] = 10;
        arr1[1] = 20;
        arr1[2] = 30;

        sum = 0;
        for (int score : scores) {
            sum += score;
        }
        double avg = (double) sum / scores.length;
        System.out.println("총합 : " + sum);
        System.out.println("평균 : " + avg);

        int[][] javaScores = {{95, 80}, {92, 96, 80}};

        int[] oldIntArray = {1, 2, 3};
        int[] newIntArray = new int[5];
        for (int i = 0; i < oldIntArray.length; i++) {
            newIntArray[i] = oldIntArray[i];
        }

        String[] oldStrArray = {"java", "array", "copy"};
        String[] newStrArray = new String[5];
        System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
    }

    public static int add(int[] scores) {
        int sum = 0;
        for (int score : scores) {
            sum += score;
        }
        return sum;
    }
}


챕터 5에서 학습한 내용들을 정리해서 하나의 예제 자바 코드를 작성해 보았습니다.



기본 숙제(필수) : p.164 직접 해보는 손코딩(switch문) 실행 후 결과 화면 캡쳐하기



package sec01.exam05;

public class SwitchExample {
    public static void main(String[] args) {
        int num = (int) (Math.random() * 6) + 1;

        switch(num) {
            case 1:
                System.out.println("1번이 나왔습니다.");
                break;
            case 2:
                System.out.println("2번이 나왔습니다.");
                break;
            case 3:
                System.out.println("3번이 나왔습니다.");
                break;
            case 4:
                System.out.println("4번이 나왔습니다.");
                break;
            case 5:
                System.out.println("5번이 나왔습니다.");
                break;
            default:
                System.out.println("6번이 나왔습니다.");
                break;
        }
    }
}




추가 숙제(선택) : p.223 하단 (05-2) 확인 문제 6번 풀고 정리하기


package sec02.verify.exam06;

import java.util.Scanner;

public class Exam06 {
    public static void main(String[] args) {
        boolean run = true;
        int studentNum = 0;
        int[] scores = null;
        Scanner scanner = new Scanner(System.in);

        while(run) {
            System.out.println("-----------------------------------------------------------------");
            System.out.println("1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료");
            System.out.println("-----------------------------------------------------------------");
            System.out.print("선택> ");

            int selectNo = Integer.parseInt(scanner.nextLine());

            if(selectNo == 1) {
                System.out.print("학생수> ");
                studentNum = Integer.parseInt(scanner.nextLine());
                scores = new int[studentNum];
            } else if(selectNo == 2) {
                for (int i=0; i< scores.length; i++) {
                    System.out.print("scores[" + i + "]> ");
                    scores[i] = Integer.parseInt(scanner.nextLine());
;                }
            } else if(selectNo == 3) {
                for (int i=0; i<scores.length; i++) {
                    System.out.println("scores[" + i + "]: " + scores[i]);
                }
            } else if(selectNo == 4) {
                int max = 0;
                int sum = 0;
                double avg = 0;
                for (int i=0; i<scores.length; i++) {
                    max = (max < scores[i]) ? scores[i] : max;
                    sum += scores[i];
                }
                avg = (double) sum / studentNum;
                System.out.println("최고 점수: " + max);
                System.out.println("평균 점수: " + avg);
            } else if(selectNo == 5) {
                run = false;
            }
        }

        System.out.println("프로그램 종료");
    }
}


참고로 교재의 222 ~ 223 페이지에 4, 5, 6번에 오타가 있는듯 합니다.

4번에 소스 코드 Exercise04.java 라고 되어 있는데, 실제 코드에는 Exam04 로 되어 있어서, 두 자바 클래스 명을 동일하게 맞춰줘야 오류가 없이 실행이 될듯 합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다