2. 변수와 자료형, 연산자

header


변수 선언 및 초기화

변수란?

변수는 데이터를 저장하는 메모리 공간입니다. 값을 담는 상자라고 생각하면 쉽습니다.

int age = 25;
//  ↑   ↑   ↑
// 자료형 변수명 값
  • 자료형: 변수에 저장될 데이터의 종류
  • 변수명: 변수를 식별하는 이름
  • : 변수에 저장되는 실제 데이터

변수명 규칙

필수 규칙 (지키지 않으면 오류):

  • 문자, 숫자, 언더바(_), 달러($)만 사용 가능
  • 숫자로 시작 불가
  • 키워드(예약어) 사용 불가
  • 대소문자 구분
  • 공백 사용 불가

권장 규칙 (관례):

  • 카멜 케이스(camelCase) 사용
  • 의미있는 이름 사용
// 올바른 변수명
int studentAge = 20;
double totalPrice = 15000.0;

// 잘못된 변수명
int 3number = 10;      // 숫자로 시작 (오류)
int my number = 5;     // 공백 포함 (오류)
int class = 100;       // 키워드 사용 (오류)

선언과 초기화

선언 (Declaration):

int number;           // 변수 선언만
double price;

초기화 (Initialization):

int number = 10;      // 선언과 동시에 초기화
double price = 5000.0;

선언 후 초기화:

int number;
number = 10;          // 나중에 초기화

여러 변수 선언:

int a, b, c;                    // 여러 변수 선언
int x = 10, y = 20, z = 30;     // 선언과 초기화
⚠️ 초기화하지 않은 지역 변수

Java에서는 초기화하지 않은 지역 변수를 사용하면 컴파일 오류가 발생합니다.


기본 자료형 (Primitive Types)

Java의 기본 자료형은 총 8가지입니다.

정수형

자료형 크기 값의 범위
byte 1바이트 -128 ~ 127
short 2바이트 -32,768 ~ 32,767
int 4바이트 약 -21억 ~ 21억
long 8바이트 약 -9경 ~ 9경
byte smallNumber = 100;
short temperature = -10;
int population = 50000000;
long distance = 384400000L;  // long은 L 붙이기

실수형

자료형 크기 정밀도
float 4바이트 소수점 7자리
double 8바이트 소수점 15자리
float pi = 3.14f;              // float은 f 붙이기
double e = 2.718281828;

문자형

자료형 크기 값의 범위
char 2바이트 유니코드 문자
char grade = 'A';              // 작은따옴표
char koreanChar = '가';

논리형

자료형 크기 값의 범위
boolean 1비트 true, false
boolean isStudent = true;
boolean hasLicense = false;

참조 자료형 (Reference Types)

String (문자열)

String은 문자열을 다루는 참조 자료형입니다.

String name = "홍길동";
String greeting = "Hello, Java!";
String empty = "";              // 빈 문자열

기본 자료형 vs 참조 자료형

구분 기본 자료형 참조 자료형
종류 byte, short, int, long, float, double, char, boolean String, Array, Class 등
저장 위치 스택(Stack) 힙(Heap)
기본값 0, 0.0, false 등 null
크기 고정 가변
// 기본 자료형
int num = 10;          // 값 자체를 저장

// 참조 자료형
String str = "Hello";  // 객체의 주소를 저장

String 연결

String firstName = "Gil-dong";
String lastName = "Hong";
String fullName = lastName + " " + firstName;

System.out.println(fullName);  // Hong Gil-dong

String과 숫자의 결합

int age = 25;
String message = "나이: " + age;  // "나이: 25"

String result = "10" + 20;        // "1020" (문자열 연결)

형변환 및 타입 캐스팅

자동 형변환 (Implicit Casting)

작은 타입에서 큰 타입으로 변환할 때는 자동으로 형변환됩니다.

byte → short → int → long → float → double
         char →
int intValue = 100;
long longValue = intValue;       // int → long (자동)
double doubleValue = intValue;   // int → double (자동)

강제 형변환 (Explicit Casting)

큰 타입에서 작은 타입으로 변환할 때는 명시적으로 형변환해야 합니다.

double pi = 3.14159;
int intPi = (int) pi;            // 3 (소수점 이하 버림)

long longValue = 1000L;
int intValue = (int) longValue;
⚠️ 데이터 손실 주의

강제 형변환 시 데이터 손실이 발생할 수 있습니다.
• 실수 → 정수: 소수점 이하 버림
• 큰 정수 → 작은 정수: 오버플로우 가능

연산 시 자동 형변환

int a = 10;
double b = 3.0;
double result = a / b;      // int가 double로 자동 변환
System.out.println(result);  // 3.3333...

// 정수 나눗셈 주의!
int c = 10;
int d = 3;
double result2 = c / d;      // 3.0 (정수 나눗셈)
double result3 = (double) c / d;  // 3.333... (실수 나눗셈)

실습: 형변환

public class CastingTest {
    public static void main(String[] args) {
        // 자동 형변환
        int num = 100;
        double dNum = num;
        System.out.println("자동 형변환: " + dNum);  // 100.0

        // 강제 형변환
        double pi = 3.14159;
        int intPi = (int) pi;
        System.out.println("강제 형변환: " + intPi);  // 3

        // 연산 시 형변환
        int a = 10, b = 3;
        System.out.println("정수 나눗셈: " + (a / b));        // 3
        System.out.println("실수 나눗셈: " + ((double)a / b));  // 3.333...
    }
}

산술 연산자

산술 연산자는 수학적 계산을 수행합니다.

연산자 의미 예시 결과
+ 덧셈 5 + 3 8
- 뺄셈 5 - 3 2
* 곱셈 5 * 3 15
/ 나눗셈 5 / 3 1 (정수 나눗셈)
% 나머지 5 % 3 2

기본 산술 연산

int a = 10, b = 3;

System.out.println(a + b);  // 13
System.out.println(a - b);  // 7
System.out.println(a * b);  // 30
System.out.println(a / b);  // 3 (정수 나눗셈)
System.out.println(a % b);  // 1 (나머지)

정수 나눗셈 vs 실수 나눗셈

int x = 10, y = 3;
System.out.println(x / y);           // 3 (정수 나눗셈)
System.out.println((double)x / y);   // 3.333... (실수 나눗셈)

증감 연산자

연산자 의미 설명
++ 증가 1 증가
-- 감소 1 감소
int num = 10;

// 후위 증감 (사용 후 증가)
System.out.println(num++);  // 10 출력, 그 후 11로 증가
System.out.println(num);    // 11

// 전위 증감 (증가 후 사용)
System.out.println(++num);  // 12로 증가, 그 후 12 출력
💡 증감 연산자 차이

num++: 현재 값 사용 후 증가
++num: 먼저 증가 후 사용

복합 대입 연산자

연산자 의미 예시 동일한 표현
+= 덧셈 후 대입 a += 3 a = a + 3
-= 뺄셈 후 대입 a -= 3 a = a - 3
*= 곱셈 후 대입 a *= 3 a = a * 3
/= 나눗셈 후 대입 a /= 3 a = a / 3
%= 나머지 후 대입 a %= 3 a = a % 3
int num = 10;
num += 5;   // num = num + 5;  → 15
num *= 2;   // num = num * 2;  → 30
num -= 8;   // num = num - 8;  → 22

비교 연산자

비교 연산자는 두 값을 비교하여 boolean 값(true/false)을 반환합니다.

연산자 의미 예시 결과
== 같다 5 == 5 true
!= 같지 않다 5 != 3 true
> 크다 5 > 3 true
< 작다 5 < 3 false
>= 크거나 같다 5 >= 5 true
<= 작거나 같다 5 <= 3 false

비교 연산 예제

int a = 10, b = 20;

System.out.println(a == b);  // false
System.out.println(a != b);  // true
System.out.println(a > b);   // false
System.out.println(a < b);   // true
System.out.println(a >= 10); // true
System.out.println(a <= 5);  // false

문자열 비교 주의

String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");

System.out.println(str1 == str2);        // true
System.out.println(str1 == str3);        // false (주소 비교)
System.out.println(str1.equals(str3));   // true (내용 비교)
⚠️ 문자열 비교

문자열은 == 대신 .equals() 메서드를 사용하세요!


논리 연산자

논리 연산자는 boolean 값을 연산합니다.

연산자 의미 설명
&& AND (그리고) 둘 다 true일 때 true
|| OR (또는) 하나라도 true면 true
! NOT (부정) true ↔ false 반전

AND 연산자 (&&)

int age = 25;
boolean hasLicense = true;

boolean canDrive = (age >= 18) && hasLicense;
System.out.println(canDrive);  // true

진리표:

A B A && B
true true true
true false false
false true false
false false false

OR 연산자 (||)

boolean isWeekend = true;
boolean isHoliday = false;

boolean canRest = isWeekend || isHoliday;
System.out.println(canRest);  // true

진리표:

A B A || B
true true true
true false true
false true true
false false false

NOT 연산자 (!)

boolean isRaining = false;
boolean isSunny = !isRaining;
System.out.println(isSunny);  // true

단축 평가 (Short-Circuit Evaluation)

int x = 0;

// && 연산: 왼쪽이 false면 오른쪽은 평가하지 않음
if (x != 0 && 10 / x > 1) {  // x != 0이 false이므로 10/x는 실행 안 됨
    System.out.println("조건 만족");
}

// || 연산: 왼쪽이 true면 오른쪽은 평가하지 않음
if (x == 0 || 10 / x > 1) {  // x == 0이 true이므로 10/x는 실행 안 됨
    System.out.println("조건 만족");  // 출력됨
}

비트 연산자

비트 연산자는 비트 단위로 연산을 수행합니다.

연산자 의미 설명
& AND 둘 다 1이면 1
| OR 하나라도 1이면 1
^ XOR 다르면 1, 같으면 0
~ NOT 비트 반전
<< 왼쪽 시프트 비트를 왼쪽으로 이동
>> 오른쪽 시프트 비트를 오른쪽으로 이동 (부호 유지)
>>> 부호 없는 오른쪽 시프트 비트를 오른쪽으로 이동 (0으로 채움)

비트 AND, OR, XOR

int a = 12;  // 1100 (2진수)
int b = 10;  // 1010 (2진수)

System.out.println(a & b);  // 8  (1000)
System.out.println(a | b);  // 14 (1110)
System.out.println(a ^ b);  // 6  (0110)

비트 NOT

int num = 5;        // 00000101
System.out.println(~num);  // -6 (11111010, 2의 보수)

비트 시프트

int num = 8;  // 1000 (2진수)

System.out.println(num << 1);  // 16  (10000) - 왼쪽으로 1비트
System.out.println(num >> 1);  // 4   (100) - 오른쪽으로 1비트
System.out.println(num << 2);  // 32  (100000) - 왼쪽으로 2비트
비트 시프트 활용

n << 1n * 2와 같음
n >> 1n / 2와 같음


연산자 우선순위

연산자는 실행 순서가 정해져 있습니다.

우선순위 연산자 설명
1 () 괄호
2 !, ~, ++, -- 단항 연산자
3 *, /, % 곱셈, 나눗셈, 나머지
4 +, - 덧셈, 뺄셈
5 <<, >>, >>> 시프트
6 <, <=, >, >= 비교
7 ==, != 같음, 다름
8 & 비트 AND
9 ^ 비트 XOR
10 | 비트 OR
11 && 논리 AND
12 || 논리 OR
13 ?: 삼항 연산자
14 =, +=, -=, *=, /=, %= 대입

우선순위 예제

int result1 = 5 + 3 * 2;        // 11 (곱셈 먼저)
int result2 = (5 + 3) * 2;      // 16 (괄호 먼저)

boolean result3 = 10 > 5 && 3 < 7;  // true
boolean result4 = 10 > 5 || 3 > 7;  // true

int result5 = 10 + 5 * 2 - 3;   // 17 (곱셈 → 덧셈 → 뺄셈)
💡 가독성을 위해 괄호 사용

복잡한 연산식에서는 우선순위에 의존하기보다 괄호를 사용하여 명확하게 표현하는 것이 좋습니다.


종합 실습

문제 1 - 산술 연산 (기초)

문제 1

다음 Java 프로그램의 실행 결과는 무엇입니까?

연산자
public class Test {
    public static void main(String[] args) {
        int a = 17;
        int b = 5;
        System.out.println(a % b);
    }
}

문제 2 - 증감 연산자 (기초)

문제 2

다음 Java 프로그램의 실행 결과는 무엇입니까?

연산자
public class Test {
    public static void main(String[] args) {
        int num = 10;
        System.out.println(num++);
        System.out.println(num);
    }
}

문제 3 - 비교 연산자 (기초)

문제 3

다음 Java 프로그램의 실행 결과는 무엇입니까?

연산자
public class Test {
    public static void main(String[] args) {
        int age = 18;
        System.out.println(age >= 18);
    }
}

문제 4 - 논리 연산자 (중급)

문제 4

다음 Java 프로그램의 실행 결과는 무엇입니까?

연산자
public class Test {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;
        System.out.println(a && b || !b);
    }
}

문제 5 - 형변환과 연산 (중급)

문제 5

다음 Java 프로그램의 실행 결과를 소수점 첫째 자리까지 작성하세요. (예: 3.3)

연산자
public class Test {
    public static void main(String[] args) {
        int total = 250;
        int count = 3;
        double average = (double) total / count;
        System.out.printf("%.1f", average);
    }
}

문제 6 - 비트 연산자 (중급)

문제 6

다음 Java 프로그램의 실행 결과는 무엇입니까?

연산자
public class Test {
    public static void main(String[] args) {
        int num = 4;
        System.out.println(num << 2);
    }
}

문제 7 - 연산자 우선순위 (고급)

문제 7

다음 Java 프로그램의 실행 결과는 무엇입니까?

연산자
public class Test {
    public static void main(String[] args) {
        int result = 10 + 5 * 2 - 8 / 4;
        System.out.println(result);
    }
}

문제 8 - 복합 문제 (고급)

문제 8

다음 Java 프로그램의 실행 결과는 무엇입니까?

연산자
public class Test {
    public static void main(String[] args) {
        int x = 10;
        int y = ++x + x++;
        System.out.println(y);
    }
}

실전 프로그래밍

과제 1: 온도 변환기

화씨 온도를 섭씨로 변환하는 프로그램을 작성하세요.

요구사항:

  • 화씨 온도를 변수에 저장 (예: 100.0)
  • 공식: 섭씨 = (화씨 - 32) * 5 / 9
  • 결과를 소수점 둘째 자리까지 출력
예시 답안 보기
public class TemperatureConverter {
    public static void main(String[] args) {
        double fahrenheit = 100.0;
        double celsius = (fahrenheit - 32) * 5 / 9;

        System.out.printf("화씨 %.1f도는 섭씨 %.2f도입니다.", fahrenheit, celsius);
    }
}

출력:

화씨 100.0도는 섭씨 37.78도입니다.

과제 2: 짝수/홀수 판별

주어진 숫자가 짝수인지 홀수인지 판별하는 프로그램을 작성하세요.

요구사항:

  • 정수를 변수에 저장 (예: 17)
  • 나머지 연산자(%)를 사용하여 짝수/홀수 판별
  • boolean 변수에 짝수 여부 저장
  • 결과 출력
예시 답안 보기
public class EvenOddChecker {
    public static void main(String[] args) {
        int number = 17;
        boolean isEven = (number % 2 == 0);

        System.out.println("숫자: " + number);
        System.out.println("짝수입니까? " + isEven);
        System.out.println(isEven ? "짝수입니다." : "홀수입니다.");
    }
}

출력:

숫자: 17
짝수입니까? false
홀수입니다.

핵심 요약

이번 챕터에서 배운 내용

  1. 변수 선언 및 초기화
    int number = 10;          // 선언과 초기화
    int a, b, c;              // 여러 변수 선언
    
  2. 기본 자료형 (8가지)
    분류 자료형 크기
    정수 byte, short, int, long 1, 2, 4, 8바이트
    실수 float, double 4, 8바이트
    문자 char 2바이트
    논리 boolean 1비트
  3. 참조 자료형
    • String: 문자열
    • 기본값: null
    • 힙(Heap) 메모리에 저장
  4. 형변환
    • 자동 형변환: 작은 타입 → 큰 타입
    • 강제 형변환: (타입)변수
  5. 산술 연산자
    +  -  *  /  %     // 기본 연산
    ++  --            // 증감
    +=  -=  *=  /=    // 복합 대입
    
  6. 비교 연산자
    ==  !=  >  <  >=  <=
    
  7. 논리 연산자
    &&  ||  !         // AND, OR, NOT
    
  8. 비트 연산자
    &  |  ^  ~        // AND, OR, XOR, NOT
    <<  >>  >>>       // 시프트
    
  9. 연산자 우선순위
    괄호 → 단항 → 산술 → 시프트 → 비교 → 논리 → 대입
    
  10. 주요 포인트
    // 정수 나눗셈 주의
    10 / 3              // 3 (정수)
    (double)10 / 3      // 3.333... (실수)
    
    // 증감 연산자
    num++               // 후위: 사용 후 증가
    ++num               // 전위: 증가 후 사용
    
    // 문자열 비교
    str1 == str2        // 주소 비교 (X)
    str1.equals(str2)   // 내용 비교 (O)
    
    // 비트 시프트
    n << 1              // n * 2
    n >> 1              // n / 2
    

다음 챕터 예고

다음 챕터에서는 조건문을 배웁니다.

  • if 문
  • if-else 문
  • if-else if-else 문
  • 중첩 if 문
  • switch 문
  • 삼항 연산자

🎯

변수, 자료형, 연산자 학습 완료!

Java의 기본 데이터 타입과 다양한 연산자를 배웠습니다.
이제 조건문을 배우면 프로그램의 흐름을 제어할 수 있습니다!