
Java는 단순한 언어가 아니라 표준 스펙과 구현체로 나눌 수 있다.

변수에 대해 알아보자.

Java에서 연산자는 값을 계산하거나 비교하는 데 사용하는 기호다.

Java에서 조건문은 특정 조건에 따라 서로 다른 코드를 실행할 때 사용한다.예를 들어, 시험 점수가 60점 이상이면 "합격"을 출력하고, 그렇지 않으면 "불합격"을 출력할 수 있다.

프로그래밍에서는 같은 코드를 여러 번 실행해야 하는 경우가 많다.예를 들어, 시험 점수 1부터 5까지를 출력하려면 같은 코드를 5번 작성해야 한다.이런 불편함을 해결하기 위해 Java는 반복문(loop)을 제공한다.

스코프(Scope)는 변수의 생존 범위, 즉 변수를 선언한 블록({}) 안에서만 변수가 살아있고 사용할 수 있음을 의미한다. Java에서는 서로 다른 타입끼리 값을 대입하거나 계산할 때 **형변환(Casting)**이 일어난다.

사용자로부터 입력을 받아 처리하는 프로그램을 만들어보자.

프로그래밍에서 같은 종류의 데이터를 여러 개 다뤄야 할 때, 변수를 하나하나 선언하는 방식은 한계가 있다.

프로그램에서 같은 코드를 반복 작성하면 불편하고 유지보수도 어렵다.예를 들어, 두 수를 더하는 연산을 여러 번 반복해야 한다고 해보자. 같은 연산 로직이 중복되어 코드가 지저분해진다.이 문제를 해결하는 방법이 바로 메서드(Method)다.

자바의 세상은 클래스와 객체로 이루어져 있다.학생 정보를 다루는 예시를 통해 클래스를 왜 도입해야 하는지 살펴보자.

Java의 변수 타입은 크게 두 가지로 나눌 수 있다.

프로그래밍 방식은 크게 두 가지로 나눌 수 있다.

객체를 만들고 나면 보통은 곧바로 초기값을 넣어야 한다.

컴퓨터에서 파일을 관리할 때 폴더를 쓰듯, 자바에서도 비슷한 개념을 제공하는데, 그것이 바로 패키지(package)다.

자바는 public, private 같은 접근 제어자(access modifier)를 제공한다.이를 통해 클래스 외부에서 특정 필드나 메서드에 접근하는 것을 허용하거나 제한할 수 있다.

자바 프로그램은 실행될 때 JVM에 의해 메모리가 여러 영역으로 나뉜다.

final은 “끝”이라는 의미 그대로, 더 이상 변경할 수 없음을 뜻한다.

상속은 객체지향 프로그래밍(OOP)의 핵심 개념 중 하나다.

다형성(Polymorphism)은 객체지향 프로그래밍의 가장 중요한 개념 중 하나다.

좋은 객체지향 프로그래밍은 변경에 유연하고 확장에 강한 코드를 만드는 것을 목표로 한다.이를 위해서는 역할과 구현의 분리, 즉 다형성을 활용한 설계가 필수적이다.

자바에서 모든 클래스의 최상위 부모는 Object 클래스다.즉, 개발자가 어떤 클래스를 만들어도 암묵적으로 Object를 상속받는다.이로 인해 모든 객체는 공통된 기본 기능을 가지며, 다형성의 기반을 공유한다.

이 글은 자바에서 불변 객체(Immutable Object)의 개념과 필요성을 정리한 것이다. 기본형과 참조형의 차이, 공유 참조와 사이드 이펙트, 불변 객체의 설계와 값 변경 방식, 그리고 불변 객체가 사용되는 이유와 String 클래스와의 관계를 순서대로 설명한다.

자바에서 문자열을 다루는 핵심 타입은 String이다. 문자열은 프로그램 전반에서 매우 자주 사용되기 때문에 자바는 이를 위해 특별한 문법적 지원과 내부 최적화를 제공한다.

기본형은 값만 저장하는 단순한 타입이다. 가볍고 빠르지만 객체가 아니라서 메서드를 가질 수 없고 컬렉션에 바로 넣을 수도 없고 null로 상태를 표현할 수도 없다.자바는 이런 한계를 해결하기 위해 기본형을 객체로 감싼 래퍼 클래스를 제공한다.

자바에서 상태, 등급, 카테고리 같은 값을 표현할 때 가장 먼저 떠올리는 것은 문자열이다.하지만 문자열은 오타·유효성·일관성 문제를 피할 수 없기 때문에 자바는 열거형(Enum)이라는 강력한 대안을 제공한다.

자바에서는 클래스 안에 또 다른 클래스를 정의할 수 있다.이런 구조를 중첩 클래스라고 하며 클래스의 선언 위치와 바깥 클래스와의 관계에 따라 여러 종류로 나뉜다.중첩 클래스는 단순한 문법 기능이 아니라 캡슐화와 역할 분리를 강화하기 위한 설계 도구에 가깝다.

Java에서 예외 처리는 정상 흐름과 예외 흐름을 분리하고 자원을 안전하게 관리하며 코드의 의도를 명확하게 드러내기 위한 설계 도구다.예외 처리는 반환 값 기반 오류 처리의 한계를 인식하는 것에서 시작해 예외 계층 설계와 실무 전략으로 확장된다.