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 기본기를 탄탄하게 익히셨으니 다음 단계로 넘어갈 준비가 되셨습니다! 🚀

 

+ Recent posts