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

jini·2025년 7월 13일
0

혼자공부하는자바

목록 보기
2/6

한빛미디어의 <혼자 공부하는 자바>를 요약 정리했습니다.

 

🧊 2주차 미션

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

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

다음은 키보드로부터 학생 수와 각 학생들의 점수를 입력받아서, 최고 점수 및 평균 점수를 구하는 프로그램입니다. 실행결과를 보고 알맞게 작성해보세요.

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) {
                // 학생 수를 입력받고 배열 scores를 생성
                System.out.print("학생수 > ");
                studentNum = Integer.parseInt(scanner.nextLine());
                scores = new int[studentNum];
            } else if (selectNo == 2) {
                // scores 배열의 길이만큼 반복하여 점수 입력
                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;
                for (int score : scores) {
                    if (score > max) {
                        max = score;
                    }
                    sum += score;
                }

                double avg = (double) sum / scores.length;
                System.out.println("최고 점수: " + max);
                System.out.println("평균 점수: " + avg);
            } else if (selectNo == 5) {
                run = false;
            }
        }
        
        System.out.println("프로그램 종료");
    }
}

 

🧊 조건문: if문, switch문

조건식에 따라 다른 실행문을 실행하기 위해 사용

[1] if문

조건식의 결과에 따라 블록 실행 여부가 결정

  • 조건식 : true 또는 false 값을 산출할 수 있는 연산식, boolean 타입 변수
    • true : 블록 실행
    • false : 블록을 실행하지 않음
if (조건식) {
	실행문A
}
실행문B
  • 조건식이 true이면, 실행문A -> 실행문B 실행
  • 조건식이 false이면, 실행문B 실행

 

[2] if-else문

if문은 else 블록과 함께 사용되어 조건식의 결과에 따라 실행 블록을 선택

  • 조건식이 true이면, if문의 블록이 실행
  • 조건식이 false이면, else 블록이 실행
if (조건식) {
	실행문A
} else {
	실행문B
} 
실행문C
  • 조건식이 true이면, 실행문A -> 실행문B -> 실행문C 실행
  • 조건식이 false이면, 실행문B -> 실행문C 실행

 

[3] if-else if-else문

조건문이 여러 개인 if문

  • 처음 if문의 조건식이 false일 경우 다른 조건식의 결과에 따라 실행 블록을 선택
  • 여러 개의 조건식 중 true가 되는 블록만 실행하고, 전체 if문을 벗어나게 됨
  • 마지막에는 else 블록을 추가할 수 있는데, 모든 조건식이 false일 경우 else 블록을 실행하고 if문을 벗어나게 됨
if (조건식1) {
	실행문A
} else if (조건식2) {
	실행문B
} else {
	실행문C
} 
실행문 D
  • 조건식1이 true이면, 실행문A -> 실행문D 실행
  • 조건식1이 false이면, 조건식 2로 이동
  • 조건식2가 true이면, 실행문B -> 실행문D 실행
  • 조건식2가 false이면, 실행문C -> 실행문D 실행

 

[4] switch문

변수가 어떤 값을 갖느냐에 따라 실행문이 결정

  • case 끝에 break를 붙여야 다음 case를 실행하지 않고 switch문을 빠져나감
  • break가 없다면, 값과는 상관없이 다음 case가 연달아 실행
switch (변수) {
	case1:
    	실행문A
        break;
    case2:
    	실행문B
        break;
    default:
    	실행문C
}
  • 변수 값이 1인 경우, 실행문A -> break 실행
  • 변수 값이 2인 경우, 실행문B -> break 실행
  • 변수 값이 1, 2 모두 아닌 경우, 실행문C 실행

 

🧊 반복문: for문, while문, do-while문

어떤 작업이 반복적으로 실행되도록 할 때 사용

  • for문은 반복 횟수를 알고 있을 때 주로 사용
  • while문은 조건에 따라 반복할 때 주로 사용

[1] for문

똑같은 실행문을 반복적으로 실행해야 하는 경우 사용

for (초기화식; 조건식; 증감식) {
	실행문
}

// 초기화식이 필요 없을 경우
int i = 1;
for (; i <= 100; i++) { ... }

// 초기화식, 증감식이 둘 이상
for (int i = 0, j = 100; i <= 50 && j >= 50; i++, j--) { ... }
  • for문이 처음 실행될 때, 초기화식이 제일 먼저 실행
  • 조건식을 평가해서 true이면, for문 블록 내부의 실행문을 실행
  • 조건식을 평가해서 false이면, for문 블록을 실행하지 않고 종료
  • 실행문이 모두 실행되면, 증감식을 실행하고 다시 조건식을 평가
int sum = 0;
sum = sum + 1;
sum = sum + 2;
sum = sum + 3;
sum = sum + 4;
sum = sum + 5;
System.out.println("1~5의 합: " + sum);

// for문 사용
int sum = 0
for (int i = 1; i <= 100; i++) {
	sum = sum + i;
}
System.out.println("1~100의 합: " + sum);

중첩 for문

for문은 또 다른 for문을 내포 가능

public class ForMultiplicationTableExample {
	public static void main(String[] args) {
    	for (int m = 2; m <= 9; m++) {
        	System.out.println("*** " + m + "단 ***");
            for (int n = 1; n <= 9; n++) {
            	System.out.println(m + " x " + n + " = " + (m * n));
                }
            }
        }
    }
}

 

[2] while문

조건식이 true일 경우에 계속해서 반복

  • 조건식에는 boolean 타입 변수나 true/false 값을 산출하는 어떠한 연산식이든 가능
  • 조건식에 true를 사용하면 무한 루프를 돌게 됨
  • while문을 종료시키기 위해서는 변수의 값을 false로 만들거나, break문을 이용
while (조건식) {
	실행문
}
  • while문이 처음 실행될 때, 조건식을 평가
  • 조건식이 true이면, 실행문을 실행
  • 실행문이 모두 실행되면 다시 조건식을 평가
  • 조건식이 false이면, while문을 종료

 

[3] do-while문

블록 내부의 실행문을 우선 실행하고 실행결과에 따라 반복 실행을 계속할지 결정

do {
	실행문;
} while (조건식)
  • do-while문이 처음 실행될 때, 실행문을 우선 실행
  • 실행문이 모두 실행되면, 조건식을 평가
  • 조건식이 true이면, 실행문 -> 조건식을 반복 실행
  • 조건식이 false이면, do-while문을 종료

 

[4] break문

반복문인 for문, while문, do-while문의 실행을 중지할 때 사용

for ( ... ) {
	실행문1;
	break;
	실행문2
}
  • 실행문1만 실행하고, 실행문2는 실행하지 않음

반복문이 중첩되어 있을 경우, break문은 가장 가까운 반복문만 종료하고 바깥쪽 반복문은 종료하지 않음

for ( ... ) {
	실행문1;
    
    for ( ... ) {
    	실행문2;
        break;
        실행문3;
    }
    
    실행문4;
}
  • 실행문1 -> 실행문2 -> break -> 실행문4 실행

중첩 반복문에서 바깥쪽 반복문까지 종료시키려면 바깥쪽 반복문에 라벨을 붙이고 break 이름;을 사용

Label: for ( ... ) {
	실행문1;
    
    for ( ... ) {
    	실행문2;
        break Label;
        실행문3;
    }
    
    실행문4;
}
  • 실행문1 -> 실행문2 -> break Label 실행

 

[5] continue문

반복문이 for문, while문, do-while문에서만 사용

  • 블록 내부에서 continue문이 실행되면 for문의 증감식, while/do-while문의 조건식으로 이동
  • 반복문을 종료하지 않고 계속 반복을 수행
for (int i = 1; i <= 10; i++) {
	if (i % 2 != 0) {
    	continue;
    }
    System.out.println(i);
}
  • 1에서 10 사이의 수 중에서 짝수만 출력

 

🧊 참조 타입(reference type)

객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스

  • 기본 타입(primitive type) : 정수, 실수, 문자, 논리 리터럴을 저장하는 타입

[1] 메모리 영역(Runtime Data Area)

  • 메소드 영역 : JVM이 시작할 때 생성되고, 모든 스레드가 공유하는 영역
  • 힙 영역 : 객체와 배열이 생성되는 영역
  • 스택 영역 : 메소드를 호출할 때마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작 수행

 

[2] 참조 변수의 ==, != 연산

  • 기본타입 : 변수의 값이 같은지 아닌지를 조사
  • 참조타입 : 동일한 객체(번지 값)를 참조하는지 다른 객체를 참조하는지 알아볼 때 사용
// refVar1 -> 객체1
// refVar2, refVar3 -> 객체2
refVar1 == refVar2  // false
refVar1 != refVar2  // true
refVar2 == refVar3  // true

null과 NullPointerException
참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있음

  • NullPointerException : null 상태에서 객체의 데이터나 메소드를 사용하려 할 경우 발생

 

[3] String 타입

문자열은 String 객체로 생성되고 변수는 String 객체를 참조

  • 문자열 리터럴이 동일하다면 String 객체를 공유
String 변수;
변수 = "문자열";

// 선언과 동시에 저장
String 변수 = "문자열";

new 연산자(객체 생성 연산자)를 사용해서 String 객체를 직접 생성 가능

String name1 = "신용권";
String name2 = "신용권";
String name3 = new String("신용권");

name1 == name2  // true
name1 == name3  // false

equals() 메소드
동일한 String 객체이건 다른 String 객체이든 내부 문자열을 비교하고 싶은 경우

boolean result = str1.equals(str2);

 

🧊 배열

같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해놓은 자료구조

  • score[인덱스] : 인덱스는 0부터 시작
8390879378...75
01234...29

 

[1] 배열 선언

타입[] 변수;
타입 변수[];

// example
int [] intArray;
double doubleArray[];

 

[2] 배열 생성

값 목록으로 배열 생성

값의 목록을 이미 가지고 있는 경우

타입[] 변수 = {0,1,2, ... };
String[] names = {"신용권", "홍길동", "감자바" };
names[1] = "홍삼원";

배열 변수를 이미 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열 생성이 허용되지 않기 때문에, new 연산자를 사용해서 값 목록을 지정

String[] names;
names = { "신용권", "홍길동", ... }; // error
names = new String[] { "신용권", "홍길동", "감자바" };

new 연산자로 배열 생성

값의 목록을 가지고 있지 않지만, 값들을 저장할 배열을 미리 만들고 싶은 경우

  • 배열을 처음 생성할 경우, 배열은 자동적으로 기본값으로 초기화
타입[] 변수 = new 타입[길이];
int[] intArray = new int[5];

// 배열이 생성되고 나서 특정 인덱스 위치에 새로운 값을 저장
변수[인덱스] =;

 

[3] 배열 길이

배열에 저장할 수 있는 전체 항목의 개수

배열변수.length;

// example
int[] intArray = { 10, 20, 30 };
int num = intArray.length;  // 3

 

[4] 다차원 배열

값들이 행과 열로서 구성된 배열

int[][] scores = new int[2][3];

scores.length     // 2
scores[0].length  // 3
scores[1].length  // 3

배열 생성

int[][] scores = new int[2][];
scores[0] = new int[2];
scores[1] = new int[3];

// 중괄호 사용
int[][] scores = { {95, 80}, {92, 96} };
int score = scores[0][0];  // 95
int score = scores[1][1];  // 96

 

[5] 객체를 참조하는 배열

String[] 배열은 String 객체를 참조

String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "C++";
strArray[2] = "C#";

 

[6] 배열 복사

배열은 한 번 생성하면 크기를 변경할 수 없기 때문에 더 많은 저장 공간이 필요하다면 더 큰 배열을 새로 만들고 이전 배열로부터 항목 값들을 복사

for문으로 배열 복사

int[] oldIntArray = { 1, 2, 3 };
int[] newIntArray= new int[5];

for (int i = 0; i < 0ldIntArray.length; i++) {
	newIntArray[i] = oldIntArray[i];
}

System.arraycopy() 메소드

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
  • src : 원본 배열
  • srcPos : 원본 배열에서 복사할 항목의 시작 인덱스
  • dest : 새 배열
  • destPost : 새 배열에서 붙여넣을 시작 인덱스
  • length : 복사할 개수

향상된 for문
자바는 배열이나 컬렉션을 좀 더 쉽게 처리하기 위해 향상된 for문 제공

for (타입 변수 : 배열) {
	실행문;
}

 

🧊 열거 타입

한정된 값인 열거 상수 중에서 하나의 상수를 저장하는 타입

public enum Week {
	MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

today = Week.FRIDAY;
  • today 변수에는 Week에 선언된 7개의 열거 상수 중 하나

[1] 열거 타입 선언

열거 타입
열거 타입을 선언하기 위해서는 열거 타입의 이름을 정하고 해당 이름으로 소스 파일을 생성

  • 첫 글자를 대문자로 하고 나머지는 소문자로 구성
  • 여러 단어로 구성된 이름이라면 각 단어의 첫 글자는 대문자

열거 상수

  • 열거 상수는 모두 대문자로 작성
  • 여러 단어로 구성된 경우에는 단어 사이를 밑줄로 연결

 

[2] 열거 타입 변수

Week today;
Week today = Week.SUNDAY;

Week birthday = null;

0개의 댓글