곧 아기와 함께 비행기를 타고 여행을 갈 일이 생겨서, 기내반입이 가능한 유모차를 찾아보기 시작했어요. 
아기와의 첫 여행이다 보니 이것저것 준비할 게 많아서 유모차도 정말 신중하게 골라야겠다고 생각했죠.

처음에는 여러 브랜드를 두루 살펴보면서무게, 접히는 방식, 안정성, 가격까지 하나씩 비교했어요.
처음부터 리안 그램플러스를 정해두고 본 건 아니고, 다양한 제품을 보면서 어떤 기능이 꼭 필요한지 생각하다 보니
자연스럽게 이 모델로 마음이 기울게 되더라고요.

 

등받이 눞혔을 때
등받이 세웠을 때
통풍창

 


리안 그램플러스를 선택한 이유

여행을 위해서였기 때문에 휴대성과 편리함이 제일 중요했어요.
리안 그램플러스는 원터치로 간단하게 접을 수 있고,
접은 상태에서도 스스로 안정적으로 서 있을 수 있다는 점이 정말 마음에 들었습니다.
짐이 많을 때 한 손으로 접어서 세워둘 수 있다는 게 큰 장점이에요.

그리고 비행기 기내반입이 가능하다는 것도 결정적인 이유였어요.
아직 비행기를 타본 적은 없지만, 공항에서 큰 짐으로 부치지 않아도 되고
비행기 안에서도 바로 사용할 수 있으니 정말 편리할 것 같아요.

또 하나 마음에 들었던 부분은 4바퀴 서스펜션이에요.
아직 본격적인 여행은 안 해봤지만 집 주변을 산책할 때도 울퉁불퉁한 길이 많잖아요.
서스펜션 덕분인지 흔들림이 확실히 덜해서 아기가 편안하게 타는 게 느껴졌습니다.
엄마 아빠가 밀 때도 힘이 덜 들어가서 만족스럽더라고요.


아기도 만족하는 등받이 각도

유모차를 고를 때 제가 중요하게 본 또 하나의 기능은 바로 등받이 조절이었어요.
리안 그램플러스는 등받이가 거의 180도까지 젖혀져서 아기를 눕혀 재우기 좋고,
또 거의 90도 가까이 세워지기 때문에 아기가 앉아서 주변을 구경하기에도 딱 좋아요.

아기가 눕기도 하고 앉기도 하는 편이라
외출할 때 상황에 맞게 조절할 수 있는 게 정말 편리했어요.
특히 등받이를 세워주면 아기가 신기한 듯 주변을 구경하며 좋아하는 모습을 보니
이 부분은 정말 만족도가 높았습니다. 


직접 사용해본 느낌

처음 집에 도착해서 박스를 열어보니 생각보다 조립도 간단했고,
디자인도 깔끔하고 고급스러운 느낌이었어요.
무게가 가볍다고 해서 너무 약하지 않을까 걱정했는데
직접 보니 마감도 좋고 튼튼해서 안심이 됐습니다.

처음 접고 펴볼 때는 살짝 어색했는데,
몇 번 해보니 정말 원터치로 쉽게 접히고 펼쳐지더라고요.
접었을 때 스스로 서 있어서 한쪽 구석에 세워두면 되니
집안에서 보관하기도 너무 편했어요.


마무리 후기

아직 아기와 함께 비행기를 타보지는 않았지만,
집 근처 산책이나 짧은 외출만으로도 만족도가 높아요.
여행 갈 때는 더 빛을 발할 것 같아서 벌써부터 기대됩니다.

처음에는 어떤 유모차를 사야 할지 너무 고민됐지만,
결국 리안 그램플러스를 선택하길 정말 잘했다는 생각이 들어요.
휴대성과 안정성, 아기의 편안함까지 모두 만족시켜줘서
앞으로도 오래 잘 사용할 수 있을 것 같습니다. 

 

Java 클래스 필드 선언법 완전 가이드

 

Java 클래스의 필드는 객체의 상태(state)를 저장하고 관리하는 구성 요소입니다. 이 글에서는 자바 클래스 필드 선언 방법과 static, final, 접근제한자, 필드 초기화까지 실전 예제를 중심으로 완벽히 정리합니다. 클래스 필드는 클래스 내부에 정의되며, 프로그램 전반에서 데이터를 다루는 데 중요한 역할을 합니다. 이 문서를 통해 Java 필드 선언 문법을 완벽하게 익혀 보세요.

🔹 클래스 필드란?

클래스 필드는 클래스 내부에 선언되는 변수 선언(Variable Declaration)입니다. 다음 네 가지 요소를 포함할 수 있습니다:

  • 접근 제한자 (e.g., private, public)
  • 기타 수식어 (e.g., static, final, transient, volatile)
  • 타입 (e.g., int, String, 사용자 정의 클래스)
  • 이름 및 초기값 (선택적)
private int count = 0;
public static final String VERSION = "1.0";

✅ 기본 필드 선언 예제

public class Product {
    public String name;             // public 인스턴스 필드
    private double price = 0.0;     // 초기값을 가진 private 필드
    static int totalCount = 0;      // 클래스 전체에서 공유되는 static 필드
}

🔍 접근 제한자

필드는 다른 클래스에서의 접근을 제한하거나 허용할 수 있는 접근 제한자를 가질 수 있습니다:

  • public: 어디서든 접근 가능
  • protected: 같은 패키지 또는 하위 클래스에서 접근 가능
  • default(지정 안 함): 같은 패키지에서만 접근 가능
  • private: 해당 클래스 내에서만 접근 가능
class User {
    public String id;
    private String password;
}

⚙️ 필드 수식어 (Modifier)

🔸 static

  • 클래스 전체에서 공유되는 정적 필드
  • 인스턴스 없이 클래스 이름으로 접근 가능

🔸 final

  • 한 번만 값을 할당할 수 있는 상수 필드

🔸 transient

  • 직렬화(Serialization)에서 제외되는 필드
  • 예: 객체를 직렬화하여 파일에 저장하거나 네트워크로 전송할 때 해당 필드는 제외됨

🔸 volatile

  • 다중 스레드 환경에서 변수 일관성을 유지
  • JVM이 캐시하지 않고 항상 메인 메모리에서 읽고 씀
public class Config {
    public static final String SYSTEM_NAME = "MySystem";
    private transient String sessionToken;
    private volatile boolean running;
}

📌 static vs 인스턴스 필드

구분 static 필드 인스턴스 필드
소속 클래스 객체(인스턴스)
메모리 클래스 로딩 시 할당 객체 생성 시 할당
접근 방식 클래스명 또는 객체 반드시 객체를 통해 접근
예시 Product.totalCount product.price
public class Counter {
    public static int global = 0;
    public int local = 0;
}

🧪 필드 초기화 방법

  • 선언 시 초기화
  • 생성자에서 초기화
  • 초기화 블록에서 초기화
public class User {
    private String name = "Guest"; // 선언 시 초기화

    public User(String name) {
        this.name = name; // 생성자에서 초기화
    }

    // 인스턴스 초기화 블록
    {
        System.out.println("User 객체 초기화 중...");
    }
}

⚠️ 주의 사항

🔸 필드 초기화 시 주의사항

  • static 필드는 클래스가 로딩될 때 초기화되므로, 초기화 순서에 따라 다른 static 필드 참조 시 예상치 못한 결과가 발생할 수 있습니다.
  • 예: 아직 초기화되지 않은 static 필드를 다른 static 필드에서 참조하면 null 또는 초기값으로 처리될 수 있습니다.

🔸 필드 숨김(Hiding)

  • 하위 클래스에서 상위 클래스와 같은 이름의 필드를 선언하면, 상위 클래스의 필드는 하위 클래스 내부에서 숨겨집니다.
  • 이는 메서드 오버라이딩과는 다르게 작동하며, 의도하지 않은 동작을 유발할 수 있으므로 주의해야 합니다.

🔸 인터페이스의 필드 특성

  • 인터페이스에 선언된 모든 필드는 암묵적으로 public static final입니다.
  • 따라서 인터페이스에 필드를 정의할 때는 반드시 초기값을 제공해야 하며, 변경할 수 없습니다.

📚 마무리

Java에서 클래스 필드는 프로그램의 상태를 저장하는 핵심 요소입니다. 필드의 수식어, 접근 제한자, 초기화 방식 등을 잘 활용하면 유지보수가 쉬운 안정적인 객체를 설계할 수 있습니다.

Java 클래스 멤버 완벽 가이드


Java에서 클래스 멤버(Class Members)는 클래스 내부에 정의된 필드, 메서드, 생성자, 중첩 클래스를 말합니다. 클래스 멤버는 다음 네 가지로 분류됩니다:


🔹 1. 필드 (Fields)

클래스의 상태를 저장하는 변수로, 객체마다 고유한 값을 가집니다. static 키워드를 사용하면 클래스 전체에서 공유됩니다.

public class Car {
    private String model;
    private int year;
}

🔹 2. 메서드 (Methods)

객체의 동작을 정의하는 함수입니다. 메서드는 객체의 데이터를 처리하거나 반환하는 역할을 하며, static 메서드는 클래스 수준에서 실행됩니다.

public class Car {
    public void startEngine() {
        System.out.println("Engine started.");
    }
}

🔹 3. 생성자 (Constructors)

객체가 생성될 때 호출되며, 클래스의 초기 상태를 설정하는 역할을 합니다. 반환 타입이 없고 클래스 이름과 동일합니다.

public class Car {
    public Car(String model, int year) {
        this.model = model;
        this.year = year;
    }
}

🔹 4. 중첩 클래스 (Nested Classes)

클래스 내부에 정의된 또 다른 클래스입니다. static이면 독립적인 정적 중첩 클래스(static nested class), 그렇지 않으면 내부 클래스(inner class)로 동작합니다.

public class Outer {
    static class StaticNested {}
    class Inner {}
}

💡 클래스 멤버의 상속과 접근 제한자

클래스 멤버는 접근 제한자(Access Modifiers)를 통해 외부 접근 범위를 설정할 수 있으며, 상속 가능 여부에도 영향을 미칩니다

📌 상속 관련 사항

  • 클래스의 서브클래스는 슈퍼클래스의 public, protected, (default) 접근 범위의 필드, 메서드, 중첩 클래스를 상속받습니다.
  • private 멤버는 서브클래스에서 상속되더라도 직접 접근하거나 사용할 수 없습니다.
  • 생성자는 클래스 멤버가 아니므로 서브클래스로 상속되지 않습니다. 그러나 서브클래스의 생성자에서 super()를 통해 명시적으로 호출할 수 있습니다.

📌 접근 제한자 정리

  • public: 모든 클래스에서 접근 가능
  • protected: 같은 패키지 또는 하위 클래스에서 접근 가능
  • default: 접근 제한자 생략 시, 같은 패키지 내에서만 접근 가능
  • private: 선언된 클래스 내에서만 접근 가능

🔧 static vs 인스턴스 멤버

  • static 멤버는 클래스 전체에서 공유되며, 객체 없이도 접근할 수 있습니다.
  • 인스턴스 멤버는 각 객체마다 고유하게 존재하며, 객체를 통해 접근해야 합니다.
public class Example {
    static int count = 0;     // 클래스 전체에서 공유됨
    int value;                // 인스턴스별로 독립적

    public Example(int value) {
        this.value = value;
        count++;
    }
}

🔹 보충: 초기화 블록 (Initializer Blocks)

클래스 본문에는 필드나 메서드 외에도 다음과 같은 초기화 블록이 존재할 수 있습니다:

  • 인스턴스 초기화 블록: 객체 생성 시 실행되는 코드
  • 정적 초기화 블록: 클래스가 처음 로딩될 때 한 번만 실행되는 코드
public class InitExample {
    static {
        System.out.println("Static initializer");
    }

    {
        System.out.println("Instance initializer");
    }
}

🔹 보충: 중첩 클래스의 유형

Java에서는 중첩 클래스가 네 가지 유형으로 나뉩니다:

  • 정적 중첩 클래스 (static nested class): 외부 클래스의 인스턴스 없이 독립적으로 존재 가능
  • 인스턴스 내부 클래스 (non-static inner class): 외부 클래스의 인스턴스에 종속됨
  • 지역 클래스 (local class): 메서드나 블록 내부에 선언되는 클래스
  • 익명 클래스 (anonymous class): 클래스 이름 없이 일시적으로 정의되는 클래스

Java 클래스 멤버는 객체지향 프로그래밍에서 클래스의 구조와 동작을 정의하는 핵심입니다. 각 멤버의 역할과 접근 범위를 잘 이해하면 더 견고하고 유지보수하기 쉬운 코드를 작성할 수 있습니다.

📚 참고 문서: Java Language Specification(https://docs.oracle.com/javase/specs/)

 

Java에서 클래스(Class) 선언 방식은 객체지향 프로그래밍의 기반을 이루는 문법 요소 중 하나입니다. 클래스 선언은 단순히 이름과 중괄호로 본문을 구성하는 것 이상의 의미를 가지며, 다양한 수식어(modifier), 상속 관계, 제네릭 타입, 인터페이스 구현 등을 조합해 유연하고 확장 가능한 구조를 설계할 수 있습니다. 이러한 선언 구조를 명확히 이해하면, 프로그램 구조를 설계할 때 더 나은 모듈화, 캡슐화, 재사용성을 확보할 수 있습니다.


📌 클래스 선언 구문

자바 클래스는 다음과 같은 형식으로 선언됩니다:

[ClassModifiers] class ClassName [TypeParameters]
    [extends Superclass]
    [implements InterfaceList] {
        ClassBody
}

클래스 선언은 여러 구성 요소로 이루어져 있으며, 그 구조는 다음과 같은 부분으로 나뉩니다:

🔹 1. ClassModifiers (선택적)

클래스 선언 앞에는 다양한 수식어(modifier)를 사용할 수 있으며, 이들을 조합하여 클래스의 특성과 제한을 정의할 수 있습니다. 다음은 사용 가능한 주요 수식어와 그 의미입니다:

🔸 주요 수식어 목록

  • public: 어디서든 접근 가능
  • abstract: 추상 클래스. 인스턴스 생성 불가, 추상 메서드 포함 가능
  • final: 상속 불가능한 클래스
  • strictfp: 부동소수점 계산의 일관성을 JVM 간에 보장 (※ Java 24부터는 obsolete 처리됨. 새로운 코드에서는 사용 권장되지 않음)
  • sealed: 해당 클래스를 상속할 수 있는 하위 클래스를 제한 (Java 17 이상)
  • non-sealed: sealed 클래스의 하위 클래스 중 상속 제한을 해제 (Java 17 이상)

📌 수식어 관련 참고 사항

  • sealed 클래스를 선언하면 반드시 permits 절을 통해 상속을 허용할 하위 클래스를 명시해야 합니다.
  • sealed 클래스의 하위 클래스는 반드시 final, sealed, non-sealed 중 하나로 선언되어야 하며, 동일한 모듈 또는 패키지에 속해야 합니다.
  • public을 생략하면 해당 클래스는 'default 접근 제한자'가 적용되어 같은 패키지 내에서만 접근 가능합니다.

🔸 Modifier 조합 규칙

  • abstractfinal은 함께 사용할 수 없습니다. (추상 클래스는 확장을 전제로 하지만 final 클래스는 상속을 금지하기 때문입니다.)
  • 같은 modifier를 중복해서 사용할 수 없습니다. 예: public public class A는 컴파일 오류 발생

✅ 클래스 선언 예시

public abstract class Shape {
    abstract double area();
}

final class Constants {
    public static final double PI = 3.1415;
}

strictfp class FloatCalculator {
    double calc(float a, float b) {
        return a * b / 3.14;
    }
}

public strictfp class DataProcessor {
    // 부동소수점 연산의 일관성 유지
}

🔹 2. class 키워드

자바에서 클래스를 정의할 때 반드시 사용하는 예약어로, 클래스 선언의 시작을 알립니다. 키워드는 소문자 class로 고정되어 있으며, 클래스 선언에서 가장 기본적인 구성 요소입니다.

🔹 3. ClassName (식별자)

클래스의 이름은 식별자로 지정되며, Java 명명 규칙에 따라 대문자로 시작하는 것이 관례입니다. 유니코드 문자도 사용할 수 있으며, 숫자로 시작해서는 안 됩니다.

🔹 4. TypeParameters (제네릭 타입 매개변수)

클래스가 제네릭 타입을 지원할 때 사용하는 매개변수입니다. 꺾쇠 괄호(< >)를 사용하며, 형식 매개변수를 명시하여 컴파일 타입 안정성과 유연한 재사용을 도와줍니다.

class Box<T> {
    T value;
}

🔹 5. extends 절

클래스가 다른 클래스를 상속받을 때 사용하는 구문입니다. Java는 단일 상속만 허용하므로 하나의 클래스만 상속 가능합니다. 명시하지 않으면 Object 클래스를 자동으로 상속합니다.

class Dog extends Animal {
    // Animal 클래스의 기능을 상속
}

🔹 6. implements 절

클래스가 하나 이상의 인터페이스를 구현할 때 사용하며, 쉼표로 구분하여 여러 인터페이스를 구현할 수 있습니다.

class Printer implements Printable, Loggable {
    // 두 개의 인터페이스 구현
}

🔹 7. ClassBody

클래스 본문으로, 중괄호 {}로 감싸며 클래스의 실제 동작을 정의합니다. 필드, 메서드, 생성자, 초기화 블록, 중첩 클래스 등이 이 안에 위치합니다.

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

💡 클래스 선언 시 주의사항

  • 클래스 선언 시 같은 이름을 동일한 스코프 안에서 중복 정의할 수 없습니다.
  • 스코프(scope)는 클래스, 메서드, 블록 등 코드의 유효 범위를 말하며, 동일 스코프에서 클래스 이름이 충돌하면 컴파일 오류가 발생합니다.
  • 클래스 선언은 정적(static) 또는 지역(local)으로 중첩될 수 있으며, 위치에 따라 접근성과 생명 주기가 달라집니다.

🧠 클래스 선언 요약

아래 표는 클래스 선언 구문의 각 요소를 요약한 것입니다:

요소설명

modifiers 클래스 특성을 정의 (public, abstract, final, sealed 등)
class 클래스 선언을 시작하는 예약어
ClassName 클래스 이름 (식별자)
TypeParameters 제네릭 클래스 정의 시 타입 매개변수
extends 부모 클래스 상속 (단일)
implements 인터페이스 구현 (다중)
ClassBody 클래스의 실제 구성 요소 정의 영역

🎯 마무리하며

이 글에서는 Java 클래스 선언 방식의 전체적인 구조와 각 구성 요소의 역할, 조합 규칙, 예외 사항 등을 설명했습니다. 클래스 선언에 대한 이해는 객체지향 설계의 시작점이자, 유지보수 가능한 코드의 기반이 됩니다.

Java 클래스는 다양한 수식어, 상속, 인터페이스 구현, 타입 매개변수 등을 통해 유연성과 확장성을 갖춘 구조를 정의할 수 있는 중요한 단위입니다.

📚 참고 문서

 

Java 프로그래밍에서 흐름을 제어하는 문법은 매우 중요해요. 어떤 조건일 때 어떤 코드가 실행될지, 반복적으로 작업을 수행할지 결정하는 역할을 하죠. 이 글에서는 자바의 대표적인 조건문(if, switch)반복문(for, while, do-while)에 대해 차근차근 설명해드릴게요 😊


✅ 조건문 (Conditional Statements)

조건문은 특정 조건이 참인지 거짓인지에 따라 코드의 흐름을 제어할 수 있게 해줘요.

1️⃣ if문

if (조건식) {
    // 조건이 참일 때 실행할 코드
} else {
    // 조건이 거짓일 때 실행할 코드
}

🔹 else if로 여러 조건 분기

if (score >= 90) {
    System.out.println("A학점");
} else if (score >= 80) {
    System.out.println("B학점");
} else {
    System.out.println("C학점 이하");
}

2️⃣ switch문

여러 조건 중에서 값 하나를 기준으로 분기 처리할 때 유용해요.

switch (변수) {
    case 값1:
        // 값1일 때 실행
        break;
    case 값2:
        // 값2일 때 실행
        break;
    default:
        // 일치하는 값이 없을 때 실행
}

💡 예제: 요일 출력

int day = 3;
switch (day) {
    case 1:
        System.out.println("월요일");
        break;
    case 2:
        System.out.println("화요일");
        break;
    case 3:
        System.out.println("수요일");
        break;
    default:
        System.out.println("잘못된 입력");
}

switchint, char, String, enum 타입을 지원해요 (Java 7 이후부터는 String도 가능!)


🔁 반복문 (Loop Statements)

반복문은 특정 조건이 만족될 때까지 같은 코드를 반복해서 실행할 수 있어요.

1️⃣ for문

반복 횟수가 명확할 때 주로 사용돼요.

for (int i = 0; i < 5; i++) {
    System.out.println("i: " + i);
}

2️⃣ while문

조건을 먼저 검사하고, 조건이 참인 동안 반복 실행해요.

int i = 0;
while (i < 5) {
    System.out.println("i: " + i);
    i++;
}

3️⃣ do-while문

조건을 나중에 검사하므로, 무조건 한 번은 실행돼요.

int i = 0;
do {
    System.out.println("i: " + i);
    i++;
} while (i < 5);

🔄 for-each 문 (향상된 for문)

배열이나 컬렉션을 쉽게 순회할 때 사용돼요.

String[] names = {"Alice", "Bob", "Charlie"};
for (String name : names) {
    System.out.println(name);
}

🛑 break와 continue

반복문 내에서 흐름을 제어하는 데 사용돼요.

🔹 break

  • 반복문을 완전히 종료시켜요.
for (int i = 0; i < 10; i++) {
    if (i == 5) break;
    System.out.println(i);
}

🔹 continue

  • 현재 반복을 건너뛰고 다음 반복으로 넘어가요.
for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) continue;
    System.out.println(i); // 홀수만 출력됨
}

🎯 마무리하며…

제어문과 반복문은 자바 프로그래밍의 근간을 이루는 핵심 요소예요. 다양한 조건에 따라 실행 흐름을 조정하고, 동일한 작업을 반복할 수 있도록 도와주죠. 특히 if, switch, for, while, do-while 같은 제어 구조는 대부분의 자바 프로그램에서 빠지지 않고 사용돼요.

각 문법의 구조와 사용 목적을 정확히 이해해두면, 이후 복잡한 프로그램에서도 유연하게 활용할 수 있어요

 

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

 

Git이 전 세계 개발자들에게 사랑받는 가장 큰 이유 중 하나는 바로 브랜치(Branch) 기능이에요! 🌿

하나의 프로젝트를 여러 갈래로 나눠 개발하고, 실험하고, 나중에 하나로 합치는 이 유연한 흐름이 Git의 핵심이자 진짜 매력이죠. 이 글에서 Git 브랜치를 처음부터 끝까지 제대로 알아봐요! 💪


🧐 Git Branch란?

브랜치는 쉽게 말해 코드의 평행 세계예요. 기존 코드(main 브랜치)를 그대로 보존한 채, 다른 공간에서 실험을 해볼 수 있는 기능이죠.

예를 들어, main 브랜치에는 안정적인 코드가 있고, feature-login이라는 브랜치에서 로그인 기능만 따로 개발할 수 있어요. 이렇게 하면 기존 기능에 영향을 주지 않으면서도 개발을 병행할 수 있어요. 💡


🧠 브랜치가 왜 필요할까?

  • ✅ 실험적인 코드 테스트
  • ✅ 팀원들과 기능 분담 개발
  • ✅ 코드 리뷰 및 병합 전 단계 분리
  • ✅ 기존 코드 안전하게 유지

즉, 브랜치를 잘 쓰면 개발이 더 안전하고 유연해져요! 🧩


📂 브랜치 기본 명령어 정리

아래는 Git 명령어 버전이지만, VS Code에서도 Git Graph를 활용하면 GUI로 쉽게 관리할 수 있어요! 😊

🌱 브랜치 생성 관련 명령어

# 새 브랜치 만들기
git branch 브랜치이름

# 브랜치 만들고 바로 이동
git checkout -b 브랜치이름

🚀 브랜치 이동 관련 명령어

# 브랜치 이동
git checkout 브랜치이름

# 로컬 브랜치 목록 보기
git branch

# 로컬 + 원격 브랜치 전체 목록 보기
git branch -a

🧹 브랜치 삭제 관련 명령어

# 브랜치 삭제
git branch -d 브랜치이름

# 강제 삭제 (주의!)
git branch -D 브랜치이름

🔀 브랜치 병합 관련 명령어

# main 브랜치로 이동
git checkout main

# 작업 브랜치를 병합
git merge 브랜치이름

💡 git branch -a를 사용하면 로컬뿐만 아니라 origin/브랜치명 같은 원격 브랜치도 함께 확인할 수 있어요.

브랜치 이름은 보통 feature/기능명, bugfix/버그명, hotfix/긴급패치처럼 작성해요.


🧭 HEAD와 현재 브랜치란?

Git에서 HEAD현재 작업 중인 브랜치를 가리키는 포인터예요. Git은 브랜치를 커밋의 연결된 선(line)으로 관리하고 있는데, HEAD는 그 중 가장 마지막 커밋을 가리키는 참조(Reference) 역할을 해요.

예를 들어, main 브랜치에서 작업 중이면 HEAD -> main이라고 표시되고, 다른 브랜치로 이동하면 HEAD도 그 브랜치를 가리키게 돼요. 즉, HEAD는 지금 어떤 브랜치에서 어떤 시점의 커밋을 기준으로 작업하는지를 알려주는 지시자예요.

또한, HEAD는 임시로 특정 커밋을 가리킬 수도 있어요. 이 경우를 detached HEAD 상태라고 부르며, 이 상태에서는 새로운 브랜치를 생성하지 않으면 커밋이 분실될 수 있으니 주의가 필요해요! ⚠️

💡 git branch 명령어로 브랜치 목록을 볼 때 * 표시가 되어 있는 브랜치가 현재 HEAD가 가리키는 브랜치랍니다!


⚠️ 브랜치 병합 시 주의할 점

  • 충돌(conflict)이 생길 수 있어요! 파일을 수정한 뒤 수동으로 해결해야 해요 🧨
  • 꼭 최신 브랜치 내용을 병합 전에 받아주세요 

🖼️ Git Graph로 브랜치 시각화

VS Code의 Git Graph 확장 프로그램을 쓰면 브랜치 흐름이 선으로 그려져서 한눈에 보여요 👀

  • 브랜치 생성, 병합, 삭제까지 모두 마우스 클릭으로 가능!
  • 브랜치별 커밋 히스토리를 따라가며 확인할 수 있어요 🔍

🎯 정리하며…

Git 브랜치는 개발의 핵심이에요. 협업에도 좋고, 안전한 실험에도 필수예요!

처음에는 헷갈릴 수 있지만, 직접 브랜치를 만들어보고 커밋하고 병합해보면 금방 익숙해질 거예요 😎

Git Graph를 함께 사용하면 훨씬 더 직관적이니 꼭 활용해보세요!

 

 

Git 사용자를 위한 VS Code 필수 확장 프로그램 추천

VS Code는 기본적으로 Git을 지원하지만, 더 효율적인 Git 사용을 위해 여러 확장 프로그램을 설치하면 작업 속도가 훨씬 빨라집니다.특히 커밋 히스토리 시각화, 충돌 해결, GitHub PR 관리 같은 기능

huneylife.tistory.com

 

처음 만든 GitHub 저장소, VS Code로 연결해서 업로드하는 전체 과정

처음 만든 GitHub 저장소를 어떻게 VS Code와 연결하고, 내 코드를 Github에 올릴 수 있는지 차근차근 안내해드릴게요 😊

Git 명령어가 어려운 분들을 위해 VS Code의 Git Graph 확장 프로그램을 사용해 클릭 몇 번으로 모든 과정을 쉽게 따라할 수 있도록 준비했답니다!

📌 Git과 원격 저장소란 무엇인가요?

Git은 우리가 코드를 수정하고 관리할 수 있게 도와주는 버전 관리 시스템이에요. 변경 이력을 기록해주고, 실수하더라도 이전 상태로 되돌릴 수 있는 아주 든든한 도구죠! 🛠️🕒

그리고 원격 저장소(Remote Repository)는 로컬 저장소가 아닌 다른 컴퓨터나 서버에 위치한 Git 저장소를 의미해요. 주로 GitHub, GitLab, Bitbucket 같은 클라우드 서비스를 많이 사용하지만, 내부 네트워크나 자체 서버에 있는 저장소도 원격 저장소로 사용할 수 있답니다. ☁️ 집, 회사, 카페 어디서든 내 코드를 불러올 수 있고, 팀원이랑 협업도 가능하답니다! 👯

🧰 GitHub 원격 저장소 연결을 위한 준비물

✅ Visual Studio Code (VS Code) 설치

✅ Git 설치

✅ GitHub 계정 만들기

✅ GitHub에 새 저장소(repository) 만들기

✅ VS Code 확장 프로그램 Git Graph 설치

 

 

Windows에서 Git 설치하기: 옵션 상세 설명

Git은 개발자라면 꼭 필요한 버전 관리 시스템이에요! 🛠️설치 과정은 매우 간단해요. 특별한 상황이 없는 이상, Next만 눌러서 설치하면 끝! 🎯그래도 옵션이 궁금하신 분은 아래 내용을 확인

huneylife.tistory.com

 

 

Git 사용자를 위한 VS Code 필수 확장 프로그램 추천

VS Code는 기본적으로 Git을 지원하지만, 더 효율적인 Git 사용을 위해 여러 확장 프로그램을 설치하면 작업 속도가 훨씬 빨라집니다.특히 커밋 히스토리 시각화, 충돌 해결, GitHub PR 관리 같은 기능

huneylife.tistory.com

 


💫 1단계: GitHub에 저장소 만들기

1️⃣ GitHub 에 접속해서 로그인한 뒤, 오른쪽 상단 ➕ 버튼을 눌러 New repository 클릭!

Github 에 처음 저장소 생성하기

2️⃣ 저장소 이름(예: my-first-repo) 입력하고 Public 또는 Private 설정을 선택해요.

3️⃣ README는 선택사항이에요. 저장소 설명을 위한 파일로, 필요할 때만 선택하면 돼요. 😊

4️⃣ Create repository 버튼 클릭하면 저장소 생성 완료! 🎉

Github 저장소 생성 화면


🧙‍♀️ 2단계: VS Code에서 로컬 프로젝트 폴더 열기

  • VS Code를 실행하고, 왼쪽 상단 메뉴 → [파일] → [폴더 열기]로 원하는 프로젝트 폴더를 선택해 주세요. 처음 프로젝트를 만들 때는 빈 폴더여도 괜찮아요! 📁

🔧 3단계: Git Graph로 원격 저장소 연결하기 (명령어 없이!)

1️⃣ VS Code 왼쪽 사이드바 하단의 Git 아이콘을 클릭해요.

2️⃣ "Initialize Repository" 버튼을 눌러 Git 저장소로 초기화해요.

Git 저장소 초기화

3️⃣ 초기 커밋을 만들기 위해 상단 메뉴에서 [+] 아이콘 클릭해 변경 파일을 스테이징하고 , 커밋 메시지를 입력한 후 Commit 버튼을 눌러 커밋해요.

Git에 추가할 파일 staging
커밋 메시지 작성하고 커밋
git graph 아이콘 클릭하고 커밋 확인

4️⃣ GitHub에서 저장소 주소 확인 ➤ VS Code source control 탭에서 우측 상단의 " " 버튼 클릭 ➤ Remote ➤ Add Remote ➤ GitHub 저장소 주소 입력 ➤ 원격 저장소 이름 입력 ➤ Github 인증 하면 끝나요.

github 원격 저장소 주소 복사
로컬 저장소에 원격 저장소 연결

 

원격 저장소 주소 입력
원격 저장소 이름 입력(보통 origin으로 해요)
github 인증

 

인증을 완료

5️⃣ 원격 저장소 연결이 완료 되면 VS Code에서 Push를 할수 있어요! 🚀

원격 저장소에 push 하기
원격 저장소에 신규 branch 추가

 


✅ 연결 성공 확인 방법

  • VS Code 하단 상태표시줄에 main 브랜치가 보이고
  • Git Graph에 커밋 히스토리가 표시되며
  • GitHub 웹사이트에서 코드가 올라간 것을 확인하면 성공! 🎉

main 브랜치 옆에 origin이 추가 되며 원격 저장소 연결됨 확인
Github 에서도 추가된 commit 확인

 


🎯 마무리하며…

이제 여러분도 Git Graph를 활용해 Git 명령어 없이도 GitHub에 내 코드를 쉽게 업로드할 수 있어요! 🙌

처음에는 조금 낯설 수 있지만, GUI 툴을 활용하면 버전 관리도 훨씬 편리하고 눈에 보이게 작업할 수 있어서 초보자에게 정말 큰 도움이 된답니다 💡

더 자세한 내용은 Git 공식 문서GitHub Docs도 참고해보세요! 🧭

+ Recent posts