[25.05.09 롤링 대비] 2장~4장

CHAPTER 02. 변수와 상수


1. 변수란?

  • What
    변수란 값을 저장할 수 있도록 이름을 붙인 메모리 공간이다.
    변수에 저장된 값은 프로그램 실행 중에 변경 가능하다.
  • Why
    자바 프로그램에서 데이터를 임시로 저장하거나,
    값을 반복해서 사용하고, 변경할 수 있도록 하려면 반드시 변수 개념이 필요하다.
  • How
  • int age; // 변수 선언 age = 20; // 값 할당(초기화) double pi = 3.14; // 선언과 동시에 초기화

(1) 변수의 선언과 초기화

  • 선언: 변수의 타입과 이름을 지정해서 메모리 공간을 준비한다.
  • 초기화: 변수에 처음으로 값을 저장하는 것.
  • 중요: 지역 변수는 반드시 초기화 후 사용해야 한다(컴파일 오류 방지).
  • int number; // 변수 선언 number = 10; // 변수 초기화 int score = 90; // 선언과 동시에 초기화

(2) 데이터 타입 (Data Type)

  • What
    변수에 저장할 수 있는 값의 종류와 크기를 결정하는 정보.
  • Why
    다양한 데이터(숫자, 문자, 논리 등)를 효율적으로 저장하고 정확하게 다루기 위해 필요하다.
  • How
    자바의 데이터 타입은 크게 기본형(Primitive Type)참조형(Reference Type)으로 나뉜다.

① 기본형(Primitive Type)

분류 타입 크기 기본값 표현범위/특징 리터럴 예시
정수형 byte 1byte 0 -128 ~ 127 127
  short 2byte 0 -32,768 ~ 32,767 32000
  int 4byte 0 -2,147,483,648 ~ 2,147,483,647 1000
  long 8byte 0L 아주 큰 정수, L 접미사 필요 100L
실수형 float 4byte 0.0f 소수점 약 7자리, f 접미사 필요 3.14f
  double 8byte 0.0 소수점 약 15자리(기본 실수형) 3.141592
문자형 char 2byte '\u0000' 한 글자(유니코드 지원) 'A', '가'
논리형 boolean 1byte* false true/false만 저장 true, false

 

*boolean의 실제 크기는 JVM 구현에 따라 다름

 

주의

  • 정수형은 오버플로우/언더플로우에 유의 (범위 넘으면 값이 원점으로 돌아감)
  • char는 한 글자만 저장, 작은따옴표(') 사용
  • boolean은 true/false만 저장, 0/1 불가

② 참조형(Reference Type)

  • 배열, 클래스, 인터페이스, String 등
  • 실제 데이터는 힙(Heap)에 저장, 변수에 저장되는 값은 "참조값(주소)"
  • String은 참조형이고, 불변(immutable) 객체
  • String name = "홍길동"; int[] arr = new int[3];

(3) 형 변환 (Type Casting)

  • 자동 형 변환 (작은 타입 → 큰 타입)
    컴파일러가 자동으로 변환한다.
  • int n = 10; double d = n; // int → double 자동 변환
  • 강제 형 변환 (큰 타입 → 작은 타입)
    데이터 손실 가능성, 반드시 명시적 변환 필요.
  • double pi = 3.14; int num = (int)pi; // double → int 강제 변환, 결과: 3
  • char ↔ int 변환
  • char ch = 'A'; int code = (int)ch; // 65 char ch2 = (char)66; // 'B'
  • 문자열 ↔ 숫자 변환
  • int i = Integer.parseInt("123"); String s = String.valueOf(123);

(4) 상수(Constant)의 선언

  • What
    한 번 저장하면 값을 바꿀 수 없는 공간/이름.
  • Why
    변하지 않는 값(예: 원주율, 국가코드 등)을 실수로 바꾸지 않도록 보호.
  • How
    final 키워드 사용, 이름은 대문자+언더바 관례
    • 상수는 선언과 동시에 반드시 값을 할당해야 함(예외: 생성자에서만 가능)
    • 값을 바꾸려고 하면 컴파일 오류
  • final double PI = 3.14159; final int MAX_USER = 100;

(5) 변수/상수의 범위(Scope)

  • 변수는 선언된 블록({}) 안에서만 사용 가능
  • 지역 변수(메서드 내 선언)는 반드시 초기화 후 사용,
    멤버 변수(클래스 필드)는 자동 초기화

(6) 변수와 상수의 네이밍 규칙

  • 변수: 의미 있는 영문 소문자, 카멜 표기법 (ex: studentScore)
  • 상수: 모두 대문자, 단어 사이는 언더바 (ex: MAX_LENGTH)
  • 숫자로 시작 불가, 예약어 사용 불가

(7) 핵심 포인트

  • 지역 변수는 반드시 초기화 후 사용!
  • 문자형(char)은 한 글자만 가능, String은 여러 글자
  • 기본형은 값 자체, 참조형은 주소(참조값) 저장
  • boolean은 true/false만 저장(0/1 불가)
  • 상수(final)는 반드시 선언과 동시에 값 할당
  • String 비교는 equals() 사용

 

CHAPTER 03. 연산자 (Operators)

 

1. 연산자란?

  • What
    연산자는 변수나 값에 대해 계산, 비교, 대입, 논리 판단, 조건 분기 등을 수행하는 기호(+, -, *, / 등) 또는 키워드(instanceof 등)이다.
  • Why
    실제 프로그램에서 데이터를 처리(계산, 비교, 저장)하거나
    흐름을 제어(조건/반복문에서 판단)하려면 꼭 필요하다.
    연산자 없이 값만 다루면 의미 있는 동작(판단, 처리, 결정)을 할 수 없다.
  • How
  • int sum = 10 + 20; // 산술 연산자 + boolean isBig = sum > 10; // 비교 연산자 > int x = 3; x++; // 증감 연산자 ++

2. 연산자의 종류와 우선순위

  • What
    자바에는 산술, 대입, 비교, 논리, 조건, 증감, 비트, instanceof 등 다양한 연산자가 있다.
    연산자마다 우선순위가 다르며, 먼저 계산되는 순서가 정해져 있다.
  • Why
    다양한 데이터 상황(계산, 조건판단, 반복, 대입 등)에 맞게
    적절한 연산자를 골라야 하고, 우선순위를 몰라서 결과가 다르게 나오는 실수를 방지해야 한다.
  • How
    • 산술: +, -, *, /, %
    • 비교: <, >, <=, >=, ==, !=
    • 논리: &&, ||, !
    • 대입: =, +=, -=, *=, /=, %=
    • 증감: ++, --
    • 조건(삼항): 조건식 ? 값1 : 값2
    • instanceof: 참조변수 instanceof 클래스명
    • 비트: &, |, ^, ~, <<, >>, >>>
    • 우선순위: () → 단항(++ -- !) → 산술(* / %) → 산술(+ -) → 비교 → 논리 → 대입
    int result = 3 + 4 * 2; // *가 +보다 우선: 3 + (4*2) = 11
    boolean check = (a > 5) && (b < 10); // 괄호로 우선순위 명확히!

3. 산술 연산자

  • What
    숫자 타입 데이터의 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산을 한다: +, -, *, /, %
  • Why
    점수 합계, 평균, 통계, 금액 계산 등
    거의 모든 프로그램에서 수치 연산이 필요하기 때문.
  • How
  • int a = 10, b = 3; int sum = a + b; // 13 int sub = a - b; // 7 int mul = a * b; // 30 int div = a / b; // 3 (정수/정수는 정수, 소수점 버림) int mod = a % b; // 1 (나머지) double avg = (a + b) / 2.0; // 실수 연산 결과 실수
  • 초보 주의
    • 정수/정수 나눗셈은 소수점 이하 버림, 실수 연산은 결과도 실수
    • 0으로 나누면 ArithmeticException(런타임 오류) 발생

4. 단항 연산자 (부호, 증감, 논리 부정)

(1) 부호 연산자(+, -)

  • What
    수의 부호를 바꾼다
  • Why
    음수/양수 변환, 입력값의 부호 제어에 필요
  • How
    int x = -7;
    int y = +x; // -7
    int z = -x; // 7

(2) 증감 연산자(++/--)

  • What
    변수의 값을 1 증가(++), 1 감소(--)시킨다
    전위(++a), 후위(a++) 구분
  • Why
    반복문(카운트), 배열 탐색 등에서 가장 많이 쓰임
  • How
    int a = 5;
    int b = ++a; // a=6, b=6 (전위: 증가 후 사용)
    int c = a++; // c=6, a=7 (후위: 사용 후 증가)

(3) 논리 부정 연산자(!)

  • What
    true/false 값을 반대로 바꿈
  • Why
    조건을 뒤집어 처리할 때 필요(예: “참이 아니면”)
  • How
    boolean flag = false;
    flag = !flag; // true

5. 비교 연산자

  • What
    두 값의 대소, 등가를 비교해 true/false 반환: <, >, <=, >=, ==, !=
  • Why
    조건문, 반복문, 필터링 등에서
    값의 관계를 판단해야 분기/반복이 가능하다.
  • How
  • int a = 10, b = 20; boolean isSmaller = a < b; // true boolean isEqual = a == b; // false
  • 주의
    • 참조형(문자열 등)은 ==이 주소(참조값) 비교,
      값 비교는 반드시 equals() 사용
    • 부동소수점(double, float) == 비교는 신중(정확도 문제)

6. 논리 연산자 (&&, ||, !)

  • What
    여러 조건을 논리적으로 결합(true/false 판단):
    • AND: && (모두 참)
    • OR: || (하나라도 참)
    • NOT: ! (반대)
  • Why
    복합 조건(“20대이면서 여성”, “합격이거나 특별전형”) 등
    현실 세계의 다양한 조건 구현에 필수
  • How
  • boolean adult = (age >= 20) && (age < 65); boolean special = (age < 10) || (age > 65); boolean notAdult = !adult;
  • 주의
    • &&, ||는 단락 평가(앞에서 결과 확정 시 뒤 조건 미평가)
    • &, |는 비트 연산(논리 연산에도 사용 가능, 단락 평가 X)

7. 대입 연산자

  • What
    값을 변수에 저장하거나, 연산 후 저장(복합 대입):
    =, +=, -=, *=, /=, %=
  • Why
    변수 값을 누적, 갱신, 반복적으로 처리할 때 편리하다.
  • How
  • int a = 10; a += 5; // a = a + 5; → 15 a *= 2; // a = a * 2; → 30

8. 조건(삼항) 연산자

  • What
    조건식 ? 값1 : 값2
    조건이 참이면 값1, 아니면 값2를 선택
  • Why
    간단한 if-else를 한 줄에 쓸 때
    가독성과 코드 간결성을 높인다.
  • How
  • int max = (a > b) ? a : b; String grade = (score >= 90) ? "A" : "B";

9. instanceof 연산자

  • What
    객체가 특정 클래스(또는 부모)의 인스턴스인지 검사
  • Why
    다형성/타입 변환/예외 처리 등에서
    안전하게 객체의 타입을 확인해야 할 때 필수
  • How
  • Object obj = "hello"; if (obj instanceof String) { String s = (String)obj; // 안전하게 사용 }

10. 비트 연산자

  • What
    정수 값을 2진수(비트) 단위로 직접 조작:
    ~, &, |, ^, <<, >>, >>>
  • Why
    하드웨어 제어, 효율적 데이터 관리,
    권한/상태 플래그 등 특수한 상황에서 꼭 필요하다.
  • How
  • int n = 5; // 0000 0101 int m = ~n; // 1111 1010 int l = n << 1; // 0000 1010 (왼쪽 쉬프트, 5*2=10)

11. 포인트

  • 연산자 종류별(산술, 비교, 논리, 대입, 증감, 조건, instanceof, 비트) What/Why/How 구분
  • 우선순위와 괄호의 중요성(실수 방지)
  • 문자열(참조형)은 ==이 아니라 equals()로 비교하는 이유
  • 전위/후위 증감 연산자 차이
  • 논리 연산자 단락 평가와 일반 &| 차이
  • 조건(삼항) 연산자와 if-else의 차이
  • instanceof, 비트 연산자는 실전에서 언제 필요한지

[예상 주관식 문제 예시]

  • 자바 연산자 종류별로 What/Why/How를 설명하시오.
  • ==와 equals의 차이(Why 포함), 예시와 함께 쓰시오.
  • 증감 연산자의 전위/후위 차이와 실제 예시(Why 포함)를 쓰시오.
  • 논리 연산자(&&, ||, !)가 실제로 왜 필요한지 예시로 설명하시오.
  • 우선순위 실수 방지법(Why 괄호가 필요한지 포함)을 설명하시오.

 

CHAPTER 04. 제어문 (Control Statements) 


1. 제어문이란?

  • What
    프로그램의 실행 순서(흐름)를 바꾸거나 반복하는 명령문.
    대표적으로 조건문(if, switch)과 반복문(for, while, do~while)이 있다.
  • Why
    단순히 위에서 아래로만 실행되면 복잡한 프로그램을 만들 수 없다.
    조건에 따라 실행을 분기하거나, 반복해서 처리해야 현실 세계를 효과적으로 모델링할 수 있다.

2. 조건문 (if, switch)

 

(1) if문

  • What
    주어진 조건이 true일 때만 특정 코드 블록을 실행한다.
  • Why
    상황에 따라 다르게 동작하는 프로그램(예: “점수가 60점 이상이면 합격”)을 만들 때 필수다.
  • How
  • if (score >= 60) { System.out.println("합격"); }

(2) if-else문

  • What
    조건이 true면 if 블록, false면 else 블록을 실행한다.
  • Why
    두 가지 경우(예: 합격/불합격, 참/거짓 등)를 나누어 처리할 때 필요하다.
  • How
  • if (score >= 80) { System.out.println("우수"); } else { System.out.println("노력"); }

(3) if-else if문

  • What
    여러 가지 조건을 차례대로 검사한다.
  • Why
    3가지 이상으로 분기(등급, 가격대 등)해야 할 때 사용한다.
  • How
  • if (score >= 90) { System.out.println("수"); } else if (score >= 80) { System.out.println("우"); } else { System.out.println("가"); }

(4) 중첩 if문

  • What
    if문 안에 또 if문이 들어가는 형태.
  • Why
    조건이 계층적(여러 단계로 나뉘는) 상황(예: 로그인했을 때만 관리자 검사)에 필요하다.
  • How
  • if (login) { if (admin) { System.out.println("관리자입니다"); } }

(5) switch문

  • What
    변수(정수, 문자, 문자열 등)의 값에 따라 여러 갈래로 분기하는 조건문.
  • Why
    조건이 많고, 값이 딱 떨어지는 경우(예: 학점, 메뉴 선택 등)에 if문보다 더 간결하고 가독성이 높다.
  • How
  • switch (grade) { case 'A': System.out.println("최우수"); break; case 'B': System.out.println("우수"); break; default: System.out.println("노력"); }
  • 초보 주의
    • break를 빼먹으면 아래 case도 계속 실행됨(fall-through)
    • 자바 7부터 문자열도 분기 가능
    • case에는 상수(리터럴, final 변수)만 사용 가능

3. 반복문 (for, while, do~while)


(1) for문

  • What
    반복 횟수가 정해진 반복문.
    초기식, 조건식, 증감식으로 구성되어 있다.
  • Why
    인덱스를 이용한 반복, 배열/리스트 전체 처리 등
    반복 횟수가 명확한 경우에 빠르고 간결하게 반복 처리가 가능하다.
  • How
  • for (int i = 0; i < 5; i++) { System.out.println(i); }

(2) while문

  • What
    조건식이 true인 동안 계속 반복하는 반복문.
  • Why
    반복 횟수를 미리 알 수 없고,
    조건이 만족될 때까지 무한히 반복하는 상황(사용자 입력 등)에 적합하다.
  • How
  • int i = 0; while (i < 5) { System.out.println(i); i++; }

(3) do~while문

  • What
    조건에 상관없이 최소 1번은 반드시 실행되고,
    그 다음부터 조건을 검사해 반복하는 반복문.
  • Why
    사용자 입력 등 반드시 1회 이상 실행해야 하는 상황에서 유용하다.
  • How
  • int i = 0; do { System.out.println(i); i++; } while (i < 5);

(4) break / continue문

  • break
    • What: 반복문(또는 switch문) 전체를 즉시 종료한다.
    • Why: 조건에 따라 반복을 즉시 멈추고 다음 코드로 넘어가야 할 때 필요하다.
    • How:
      for (int i = 0; i < 5; i++) {
          if (i == 2) break; // i가 2가 되면 반복 종료
          System.out.println(i);
      }
  • continue
    • What: 현재 반복을 건너뛰고, 다음 반복을 바로 시작한다.
    • Why: 불필요한 작업을 건너뛰고, 반복 조건만 유지하고 싶을 때 사용한다.
    • How:
      for (int i = 0; i < 5; i++) {
          if (i == 2) continue; // i==2일 때만 건너뜀
          System.out.println(i);
      }
  • 초보 주의
    • break와 continue는 가장 가까운 반복문(블록)만 영향을 준다.
    • 중첩 반복문에서는 한 단계만 탈출/건너뜀.

4. 포인트

  • if문, switch문, for/while/do~while문의 차이와 각각의 적합한 사용 상황(Why)
  • switch문의 break, case에는 상수만(Why)
  • for문은 반복 횟수 명확, while문은 조건만족 반복, do~while은 최소 1회 실행(Why)
  • break와 continue의 차이, 작동 범위(Why 반복문을 부분적으로/즉시 제어해야 하는지)
  • 중첩문에서 break/continue의 동작(한 단계만 영향, Why)
  • 조건문/반복문에서 변수의 유효 범위(scope, Why 변수 오염/오류 방지에 중요한지)