2025. 4. 4. 11:19ㆍJAVA/JAVA 기초 문법
변수, 필드, 객체는 모두 데이터를 저장하고 사용하는 개념이지만, 각각의 역할과 사용 방식이 다르다.
📕 변수(Variable)란?
변수는 데이터를 저장하는 메모리공간
자바에서는 변수를 선언할 때 자료형(Data Type)을 지정해야 한다.
📑 변수의 특징
- 변수를 사용하면 데이터를 저장하고 변경할 수 있음
- 변수에는 기본 자료형과 참조 자료형이 있음
- 변수를 선언하면 메모리에 공간이 할당됨
- 변수의 유효 범위가 존재함
📑 변수의 종류
자바에서 변수는 선언 위치와 사용 방식에 따라 3가지로 구분된다.
1. 지역 변수 (Local Variable)
메서드, 생성자 또는 블록 내에서 선언된 변수로, 해당 메서드나 블록 내에서만 사용할 수 있다.
메서드나 블록이 종료되면 변수는 소멸한다.
🔹 특징 🔹
- 메서드나 블록 내에서만 사용되며, 선언된 위치를 벗어나면 접근할 수 없다.
- 초기화를 반드시 해야 사용 가능. 자바에서는 지역 변수 값을 자동으로 초기화하지 않기 때문에, 변수를 사용하기 전에 반드시 값을 설정해야 한다.
- 메서드 호출 시 생성되고, 종료시 소멸 된다.
- 같은 이름의 지역 변수를 서로 다른 메서드에서 사용 가능 (독립적)
- 스택 메모리에 저장. 메서드가 호출 시 메모리에 할당되고, 메서드 종료 시 소멸한다.
🔸 지역 변수 종류 🔸
1) 선언 위치에 따른 종류
| 선언 위치 | 설명 |
| 일반적인 지역 변수 | 메서드 내에서 선언된 변수이며, 해당 메서드 내에서만 유효 메서드 실행이 끝나면 자동으로 소멸됨 |
| 매개변수(Parameter) | 메서드가 호출될 때 외부에서 전달된 값(아규먼트)을 저장 메서드가 실행되는 동안만 존재하며, 메서드가 종료되면 사라짐 |
| 반복문 변수 | for, while, do-while 루프 내부에서 선언된 변수 루프가 실행되는 동안만 존재하고, 루프가 끝나면 사라짐 |
| 조건문 변수 | if, switch 등의 조건문 내에서 선언된 변수는 해당 블록 내에서만 유효 |
| try-catch 블록 변수 (Exception Handling Variable) |
예외 처리를 위해 try, catch 블록 내에서 선언된 변수 해당 블록 내에서만 유효 |
2) 데이터 타입에 따른 종류
| 데이터 타입 | 설명 |
| 기본 데이터 타입(Primitive Type) 지역 변수 | 숫자, 문자, 논리형 데이터를 저장하는 지역 변수(int, double, boolea 등) 초기화되지 않으면 사용할 수 없음 |
| 참조 타입(Reference Type) 지역 변수 | 객체, 배열, 컬렉션 등의 데이터를 저장하는 지역 변수 초기화되지 않으면 null 값을 가짐 |
3) 람다 표현식에서 사용되는 지역 변수(Effectively Final)
| 자바의 람다 표현식 내부에서 사용되는 지역 변수는 "실질적으로 final(Effectively Final)"이어야 함 |
| 즉, 한 번 값이 할당되면 변경할 수 없음 |
2. 인스턴스 변수 (Instance Variable)
인스턴스 변수는 클래스 내에서 선언되며, 특정 객체(인스턴스)가 생성될 때마다 독립적으로 할당되는 변수다.
각 객체마다 개별적인 값을 가지는 변수라고 생각하면 된다.
🔹 특징 🔹
- 객체별로 고유한 값을 가진다. 즉, 동일한 클래스의 여러 객체가 각자 독립적인 값을 저장한다.
- 객체가 생성될 때 메모리에 할당되고, 객체가 소멸되면 변수도 소멸된다.
- 초기화하지 않아도 기본값(숫자형은 0, boolean은 false, 참조형은 null)이 자동으로 할당된다
- 힙 메모리에 저장. 객체가 생성될 때 힙 메모리에 할당되며, 소멸될 때 메모리에서 제거된다.
- static이 붙지 않은 필드(Field)가 인스턴스 변수다.
🔸 인스턴스 변수 종류 🔸
1) 접근 제어자(Access Modifier)에 따른 분류
| 접근 제어자는 인스턴스 변수의 접근 가능 범위를 결정 |
| 접근 제어자 | 설명 | 예제 |
| public | 어디서든 접근 가능 | public int age; |
| private | 같은 클래스 내에서만 접근 가능 | private int age; |
| protected | 같은 패키지+상속받은 클래스에서 접근 가능 | protected int age; |
| default(package-private) | 다른 패키지에서는 접근 불가능 | int age; |
✔️ private 변수는 setter와 getter를 통해 접근
✔️ public 변수는 어디서나 직접 접근 가능
2) 초기화 방식에 따른 분류
| 초기화 방식 | 설명 |
| 명시적 초기화(Explicit Initialization) | 변수를 선언하면서 기본값을 지정하는 방식 |
| 생성자 초기화(Constructor Initialization) | 객체가 생성될 때 값이 설정되는 방식 |
| 블록 초기화(Instance Initialization Block) | { } 블록을 사용하여 초기화하는 방식 |
3) 활용 방식에 따른 분류
| 활용 방식 | 설명 |
| 일반 인스턴스 변수 | 기본적인 값을 저장하는 변수 |
| 상수(final) 인스턴스 변수 | 한번 값이 설정되면 변경할 수 없는 변수(fianl 키워드 사용) |
| 참조형(Reference) 인스턴스 변수 | 객체 자체를 저장하는 변수 (클래스 타입 변수) |
3. 클래스 변수 (Class Variable)
클래스 변수는 클래스 내에서 static 키워드를 사용하여 선언된 변수다.
이 변수는 클래스에 속하고, 모든 객체가 공유하는 변수이다.
클래스 변수는 객체와 관계없이 클래스 자체에 속하며, 클래스가 메모리에 로드될 때 한 번만 초기화 된다.
🔹 특징 🔹
- static 키워드가 붙은 변수로, 모든 객체가 공유하는 변수다.
- 클래스 로딩 시 메모리에 할당되며, 객체를 생성하지 않아도 클래스명으로 접근할 수 있다.
- 객체와 관계없이 하나의 값만 존재한다. 따라서, 객체가 여러 개 생성되어도 클래스 변수는 하나만 존재한다.
- 메서드 영역(Method Area)에 저장된다
🔸 클래스 변수 종류 🔸
1) 접근 제어자(Access Modifier)에 따른 분류
| 접근 제어자 | 설명 | 예제 |
| public | 어디서든 접근 가능 | public static int age; |
| private | 같은 클래스 내에서만 접근 가능 | private static int age; |
| protected | 같은 패키지 또는 하의 클래스에서만 접근 가능 | protected static int age; |
| default(package-private) | 다른 패키지에서는 접근 불가능 | static int age; |
✔️ private 변수는 setter와 getter를 통해 접근
✔️ public 변수는 어디서나 직접 접근 가능
2) 초기화 방식에 따른 분류
| 초기화 방식 | 설명 |
| 명시적 초기화(Explicit Initialization) | 변수를 선언할 때 기본값을 직접 설정하는 방식 클래스가 로드될 때 한 번만 설정됨 |
| 정적 블록(static block)에서 초기화된 클래스 변수 | static { } 블록에서 초기화하는 방식(Java에서 사용) 복잡한 연산이 필요한 경우 사용됨 |
| 정적 메서드(static method)에서 초기화된 클래스 변수 | 클래스 변수는 정적 메서드를 사용해 초기화할 수도 있음 |
3) 활용 방식에 따른 분류
| 활용 방식 | 설명 |
| 상수형 클래스 변수 (변경 불가능한 클래스 변수) | 변경할 수 없는 값(final, const, @property 사용) |
| 카운터형 클래스 변수 (객체 수 카운트) | 생성된 객체 수를 추적하는 변수 |
| 설정 값 저장 클래스 변수(공통 설정 값 저장) | 모든 객체에서 공통으로 사용하느 설정 값을 저장 |
📕 필드(Field)란?
필드(Field)는 클래스(Class) 내부에서 선언된 변수다.
클래스를 통해 생성된 객체가 가지는 데이터를 저장하는 역할을 한다.
즉, "객체의 상태(속성,데이터)를 저장하는 변수"라고 할 수 있다
📌 예제
public class Animal {
int dog; // 필드
int cat; // 필드
}
📑 필드의 특징
- 객체가 가지는 속성(상태) → 필드는 클래스 내부에서 객체의 데이터를 저장하는 역할
- 객체마다 독립적인 값(인스턴스 필드) 또는 모든 객체가 공유하는 값(클래스, static 필드)을 가짐
- 젭근 제어도 가능 (public, private, protected, default 사용 가능)
- 필드는 기본적으로 null 또는 초기값을 가진다.
- 필드는 다양한 방식으로 초기화 가능
📑 필드의 종류
1. 저장 방식에 따른 분류
| 필드 종류 | 설명 |
| 인스턴스 필드 | 객체(인스턴스)마다 따로 존재하는 필드 |
| 클래스(static 필드) | 클래스에 속하며, 모든 객체가 공유하는 필드 |
Class Car {
Sring model ; // 인스턴스 필드
Static int key; // 클래스 필드 (static)
}
2. 접근 제어자(Access Modifier)에 따른 분류
| 접근 제어자 | 설명 | 예제 |
| public | 어디서든 접근 가능 | public int age; |
| private | 같은 클래스 내에서만 접근 가능 | private int age; |
| protected | 같은 패키지 또는 하의 클래스에서만 접근 가능 | protected int age; |
| default(package-private) | 다른 패키지에서는 접근 불가능 | int age; |
3. 초기화 방식에 따른 분류
| 초기화 방식 | 설명 |
| 명시적 초기화(Explicit Initialization) | 변수를 선언하면서 기본값을 지정하는 방식 |
| 생성자 초기화(Constructor Initialization) | 객체가 생성될 때 값이 설정되는 방식 |
| 블록 초기화(Instance Initialization Block) | static { } 블록에서 초기화 (static 필드만 가능) |
📕 객체(Object)란?
객체(Object)는 데이터(속성)와 메서드(동작)을 포함하는 실체
클래스를 기반으로 생성된다. → 클래스(Class)는 설계도, 객체(Object)는 실체
📑 객체의 특징
객체는 실제 세계의 사물이나 개념을 프로그래밍적으로 표현
| 종류 | 설명 |
| 상태 (State) | 객체가 가지는 속성(데이터, 필드) ex) 자동차 객체의 색상, 모델, 속도 등 |
| 행동 (Behavior) | 객체가 수행할 수 있는 동작(메서드 기능) ex) 자동차 객체의 달리기, 멈추기, 방향 전환 |
| 고유성 (Identity) | 메모리에서 각 객체는 고유한 주소를 가짐 같은 속성을 가진 객체라도 서로 다른 객체로 존재할 수 있음 |
| 캡슐화 (Encapsulation) | 객체의 내부 데이터를 숨기고, 외부에서 접근을 제한 private 키워드를 사용해 속성을 보호, getter/setter로 접근 |
| 상속 (Inheritance) | 기존 객체(부모 클래스)의 속성과 행동을 새로운 객체(자식 클래스) 가 물려 받을 수 있음 |
| 다형성 (Polymorphism) | 같은 행동(메서드)을 하더라도 객체마다 다르게 동작 가능 오버로딩(Overloading) & 오버라이딩(Overriding) 개념 포함 |
📑 객체의 종류
프로그래밍에서 객체는 생성 방식, 사용 목적, 메모리 할당 방식 등에 따라 여러 종류로 구분
1. 생성 방식에 따른 분류
| 종류 | 설명 | 특징 | 예제 |
| 인스턴스 객체 (Instance Object) |
new 키워드로 개별적으로 생성되는 객체 | 객체마다 독립적인 속성 유지 메모리의 Heap 영역에 저장 |
Car car = new Car(); |
| 정적 객체 (Static Object) |
static 키워드를 사용해 생성되는 객체 | 모든 인스턴스가 공유 Static 영역에 저장 |
Static int totalCars; |
| 내부(중첩) 객체 (Inner Object) |
클래스 내부에서 선언된 객체 | 외부 클래스에 종속됨 static 여부에 따라 다름 |
class Outer { class Inner{ } } |
| 익명 객체 (Anonymous Object) |
이름 없이 한번만 사용되는 객체 | 인터페이스 또는 추상 클래스 즉시 구현 재사용 불가능 |
new Interface() { ... } |
| 싱글톤 객체 (Singleton Object) |
프로그램 전체에서 단 하나만 존재하는 객체 | private생성자를 사용하여 외부 생성 제한 static메서드로 인스턴스 제공 |
Sing.getInstance() ; |
2. 사용 목적에 따른 분류
| 종류 | 설명 | 특징 | 예제 |
| DTO (Data Transfer Object) | 데이터를 전달하는 역할 | 필드만 존재, 로직 없음 getter / setter 사용 |
class UserDTO { String name; } |
| VO (Value Object) | 한 번 설정하면 변경되지 않는 객체 |
불변(Immutable) 객체 final 필드를 사용 |
final class Money { private final int amount; } |
| DAO (Data Access Object) | DB와 상호작용하는 객체 | SQL을 실행하여 데이터를 조회/저장 DB 연결을 관리 |
class UserDAO { void getUser(); } |
| Service 객체 | 비즈니스 로직을 담당하는 객체 | DTO, DAO를 조합하여 로직 수행 서비스 계층에서 사용 |
class UserService { void registerUser(); } |
| Controller 객체 | 요청을 받아 서비스와 연결하는 객체 | 클라이언트의 요청을 처리 MVC 패턴에서 사용됨 |
class UserController { } |
3. 메모리 할당 방식에 따른 분류
| 종류 | 설명 | 특징 | 예제 |
| Heap 객체 | new 키워드를 사용해 동적으로 생성되는 객체 | 프로그램 실행 중 할당됨 Garbage Collector가 관리 |
Car car = new Car(); |
| Stack 객체 | 메서드 실행 중 생성되고 종료 시 제거되는 객체 | 지역 변수로 할당됨 메서드 실행이 끝나면 삭제됨 |
void method() { int x = 10; } |
| Static 영역 객체 | static 키워드를 사용하여 프로그램 실행 중 유지되는 객체 | 프로그램이 종료될 때까지 유지 모든 인스턴스가 공유 |
static int count; |
| Constant Pool 객체 | 문자열과 같은 상수 데이터가 저장되는 객체 | 동일한 문자열은 메모리를 공유 String 상수는 interned됨 |
String str = "Hello"; |
🏷️ 결론
| 변수 | 데이터를 저장하는 메모리 공간 |
| 객체 | 클래스를 기반으로 생성된 실체 |
| 필드 | 객체가 가지는 속성 |
'JAVA > JAVA 기초 문법' 카테고리의 다른 글
| Constructor (생성자) (0) | 2025.04.14 |
|---|---|
| Access Modifier(접근 제어자) (0) | 2025.04.04 |
| Parameter와 Argument (0) | 2025.04.02 |
| Method (0) | 2025.04.01 |
| 데이터 캡슐화(Data Encapsulaton) (0) | 2025.03.28 |