Java는 오랜 시간 동안 전 세계적으로 널리 사용되어 온 안정적인 객체지향 언어예요. 이 글에서는 Java의 기초를 탄탄하게 익히기 위해 꼭 알아야 할 문법 구조, 변수와 자료형, 그리고 연산자의 개념과 활용법까지 자세히 소개해드릴게요.
기초 문법은 단순한 시작이 아니라, 이후 모든 프로그래밍 실력을 키워나가는 데 중요한 기반이에요. 이 내용을 통해 Java에 대한 이해를 깊이 있게 다져보세요! 💡
✏️ Java의 기본 구조
Java는 클래스 기반 언어로, 모든 코드는 클래스 안에 작성돼야 해요.
public class Main {
public static void main(String[] args) {
// 실행 코드
System.out.println("Hello, Java!");
}
}
- public class Main: Main이라는 이름의 클래스 선언
- public static void main(String[] args): 자바 프로그램의 진입점 (메인 메서드)
- System.out.println(...): 출력 명령어
public 클래스가 하나라도 존재한다면, Java 파일 이름은 반드시 그 클래스명과 같아야 해요. 또한 Java는 대소문자를 구분하므로 클래스 이름을 정확히 작성하는 것이 중요해요!
🔡 변수(Variable)란?
변수는 데이터를 저장할 수 있는 공간이에요. 변수를 선언하면 이름을 붙여 값을 저장하고, 필요할 때 꺼내서 쓸 수 있어요.
✅ 변수 선언 예시
int age = 25;
String name = "홍길동";
double height = 175.5;
- int: 정수형
- String: 문자열형 (객체 타입)
- double: 실수형 (소수점)
자바는 정적 타입 언어이기 때문에, 변수를 선언할 때 **자료형(Data Type)**을 반드시 함께 지정해야 해요.
🧱 Java의 기본 자료형 (Primitive Types)
Java에는 총 8가지 기본 자료형이 있어요. 객체가 아닌 값 자체를 저장합니다.
자료형 설명 크기 예시
byte | 정수형 (작음) | 1 byte | -128 ~ 127 |
short | 정수형 | 2 bytes | -32,768 ~ 32,767 |
int | 정수형 (기본) | 4 bytes | -2^31 ~ 2^31-1 |
long | 정수형 (큰 수) | 8 bytes | -2^63 ~ 2^63-1 |
float | 실수형 | 4 bytes | 3.14f |
double | 실수형 (기본) | 8 bytes | 3.14159 |
char | 문자형 | 2 bytes | 'A' |
boolean | 논리형 | JVM에 따라 다름 | true / false |
※ 문자열은 String이라는 클래스로 처리되며, 기본형이 아닌 **참조형(reference type)**입니다.
🎯 상수(Constant)
한 번 저장한 값을 절대 바꾸지 않게 하려면 final 키워드를 사용해요.
final int MAX_USERS = 100;
- 관례적으로 대문자 + 언더바로 이름을 작성해요.
- 값 변경이 불가능하므로 보안성과 안정성이 높아져요.
➕ 연산자(Operator)
자바는 다양한 연산자를 제공해서 수학 계산부터 논리 처리까지 가능하게 해줘요.
📌 산술 연산자
자바에서 산술 연산자는 숫자 계산을 할 때 사용돼요.
- + : 덧셈 → 예: a + b
- - : 뺄셈 → 예: a - b
- * : 곱셈 → 예: a * b
- / : 나눗셈 → 예: a / b (정수 나눗셈 주의)
- % : 나머지 → 예: a % b
🔗 대입 연산자
대입 연산자는 변수에 값을 저장하거나 기존 값에 연산 결과를 다시 저장할 때 사용해요.
- = : 값을 대입 → x = 5
- += : 더한 후 대입 → x += 2 (x = x + 2)
- -= : 뺀 후 대입 → x -= 2
- *= : 곱한 후 대입 → x *= 3
- /= : 나눈 후 대입 → x /= 2
- %= : 나머지 대입 → x %= 3
자바에서는 비트 연산자와 시프트 연산자에도 복합 대입 연산자가 있어요:
- &= : 비트 AND 후 대입 → a &= b (a = a & b)
- |= : 비트 OR 후 대입 → a |= b (a = a | b)
- ^= : 비트 XOR 후 대입 → a ^= b (a = a ^ b)
- <<= : 왼쪽 시프트 후 대입 → a <<= 2 (a = a << 2)
- >>= : 오른쪽 시프트 후 대입 → a >>= 2 (a = a >> 2)
- >>>= : 부호 없는 오른쪽 시프트 후 대입 → a >>>= 2 (a = a >>> 2)
이런 복합 연산자는 계산과 대입을 한 줄로 줄여 코드 가독성을 높여줄 수 있어요.
🧮 증감 연산자
증감 연산자는 변수의 값을 1씩 증가시키거나 감소시킬 때 사용해요. 전위(pre)와 후위(post) 위치에 따라 실행 순서가 달라집니다.
int x = 5;
int y = ++x; // 전위 증가: x를 먼저 1 증가시킨 후 y에 대입 → x=6, y=6
int a = 5;
int b = a++; // 후위 증가: a를 먼저 b에 대입한 후 1 증가 → a=6, b=5
- ++x / --x : 값을 먼저 변경하고 표현식에 사용 (전위)
- x++ / x-- : 값을 먼저 사용하고 나중에 변경 (후위)
실행 순서 차이를 잘 이해하고 써야 버그를 줄일 수 있어요!
🔍 비교 연산자
비교 연산자는 두 값을 비교해서 true 또는 false를 반환해요.
- == : 값이 같은지 비교 → a == b
- != : 값이 다른지 비교 → a != b
- > : 왼쪽이 더 큰지 비교 → a > b
- < : 왼쪽이 더 작은지 비교 → a < b
- >= : 왼쪽이 크거나 같은지 → a >= b
- <= : 왼쪽이 작거나 같은지 → a <= b
💡 논리 연산자
자바의 논리 연산자는 조건식에 true/false 값을 판단할 때 사용돼요.
- && (AND): 두 조건이 모두 참일 때만 참
true && false // false
- || (OR): 둘 중 하나라도 참이면 참
true || false // true
- ! (NOT): 논리값을 반전시킴
!true // false
🧠 비트 연산자
비트 연산자는 정수형 데이터를 2진수 비트 단위로 조작할 수 있는 연산자예요. 각 비트를 직접 제어할 수 있어, 메모리 최적화나 성능이 중요한 분야에서 자주 사용돼요.
비트 연산자는 다음과 같은 연산을 제공해요:
- & (AND): 두 비트가 모두 1일 때 1
- | (OR): 둘 중 하나라도 1이면 1
- ^ (XOR): 서로 다르면 1
- ~ (NOT): 비트 반전
- << (왼쪽 시프트): 비트를 왼쪽으로 이동 (값이 2배씩 증가)
- >> (오른쪽 시프트): 비트를 오른쪽으로 이동 (2로 나눈 효과)
- >>> (부호 없는 오른쪽 시프트): 왼쪽 빈 자리를 0으로 채움
int a = 5; // 0101
int b = 3; // 0011
System.out.println(a & b); // 1 (AND)
System.out.println(a | b); // 7 (OR)
System.out.println(a ^ b); // 6 (XOR)
System.out.println(~a); // -6 (NOT, 비트 반전)
System.out.println(a << 1); // 10 (왼쪽 시프트: 5 * 2)
System.out.println(a >> 1); // 2 (오른쪽 시프트: 5 / 2)
System.out.println(a >>> 1); // 2 (부호 없는 오른쪽 시프트)
☁️ 람다 연산자 (->)
람다 표현식에서 사용하는 ->는 Java 8부터 도입된 특별한 연산자예요. 값이 아닌 함수 형태의 로직을 전달할 수 있게 해주며, Java 공식 명세에서도 연산자로 분류돼요.
기본 구조와 예시는 아래에 정리해두었어요 👇 자바에는 기본 연산자 중에 ->는 없지만, **Java 8부터 도입된 람다 표현식(lambda expression)**에서 ->는 중요한 문법 요소로 사용돼요. 함수형 프로그래밍 스타일을 지원하기 위한 표현이에요.
Java 언어 명세(JLS)에서도 ->는 연산자로 분류되는데, 그 이유는 이 기호가 람다식이라는 표현식을 구성하고 평가해 값을 반환하는 기능을 수행하기 때문이에요. 즉, 입력과 결과를 연결해 하나의 연산처럼 작동하기 때문에 ->는 자바에서 **람다 연산자(lambda operator)**로 불려요.
✅ 기본 구조:
(매개변수) -> { 실행 코드 }
✅ 예제:
Runnable task = () -> System.out.println("Hello, Lambda!");
task.run();
Comparator<Integer> comp = (a, b) -> a - b;
- ->는 매개변수를 전달하고 실행할 코드를 간단하게 표현하는 방식이에요.
- 익명 함수처럼 동작하며, 주로 함수형 인터페이스와 함께 사용돼요.
💡 함수형 인터페이스: 추상 메서드가 하나만 선언된 인터페이스
❓ 삼항 연산자
삼항 연산자(ternary operator)는 if-else 문을 간단하게 한 줄로 표현할 수 있게 해주는 연산자예요.
형식은 다음과 같아요:
조건식 ? 참일 때 값 : 거짓일 때 값;
예를 들어:
int a = 10;
int b = 20;
int max = (a > b) ? a : b; // max는 20
- 조건식이 true면 ? 뒤의 첫 번째 값이 실행되고,
- false면 : 뒤의 두 번째 값이 실행돼요.
복잡한 조건에도 중첩해서 사용할 수 있지만, 너무 많이 쓰면 가독성이 떨어지기 때문에 적절히 사용하는 것이 좋아요!
🔍 instanceof 연산자
instanceof는 자바에서 객체가 특정 클래스의 인스턴스인지 여부를 비교하는 비교 연산자(comparison operator)예요. 다른 비교 연산자처럼 true 또는 false를 반환하며, Java Language Specification에서도 연산자의 한 종류로 분류돼요.
이 연산자는 주로 형변환 전에 타입을 안전하게 확인할 때 사용돼요.
객체가 특정 클래스의 인스턴스인지 확인할 수 있어요. 형변환 전에 instanceof를 활용하면 오류 없이 안전하게 타입 확인을 할 수 있답니다!
Object obj = "Hello";
if (obj instanceof String) {
String str = (String) obj; // 안전한 형변환
System.out.println("문자열 길이: " + str.length());
}
📚 보너스! 타입 변환 (형 변환)
자동 형 변환 (묵시적)
작은 크기의 타입 → 큰 크기의 타입으로 자동 변환
int i = 10;
double d = i; // 자동으로 int → double
강제 형 변환 (명시적)
큰 타입을 작은 타입으로 바꿀 때는 명시적으로 캐스팅해야 해요. 이때 데이터 손실이 생길 수 있어 주의해야 해요.
double d = 10.5;
int i = (int) d; // 10 (소수점 버려짐)
char ch = 'A';
int code = (int) ch; // 65
int num = 66;
char c = (char) num; // 'B'
🎯 마무리하며…
자바의 변수, 자료형, 연산자 개념은 앞으로 객체지향 프로그래밍을 배울 때 기초가 되는 핵심이에요! 🧱
처음엔 낯설 수 있지만, 코드를 직접 작성해보고 연산을 바꿔보며 연습해보세요.
이제 변수 선언부터 연산자까지, Java 기본기를 탄탄하게 익히셨으니 다음 단계로 넘어갈 준비가 되셨습니다! 🚀
'IT 개발 > Java 언어 학습' 카테고리의 다른 글
☕ Java 클래스 선언 방식 완벽 해설 (1) | 2025.03.29 |
---|---|
🔄 Java 제어문과 반복문 – if, switch, for, while, do-while 완전 정복! (1) | 2025.03.26 |
Visual Studio Code로 Java 개발 환경 구축하기 (1) | 2025.03.17 |
Windows에서 Eclipse를 사용한 Java 개발 환경 설정 가이드 (1) | 2025.03.16 |
IntelliJ IDEA를 사용한 Java 개발 환경 설정 가이드 (1) | 2025.03.14 |