변수(Variable) 필드(Field) 객체(Object)

2025. 4. 4. 11:19JAVA/JAVA 기초 문법

변수, 필드, 객체는 모두 데이터를 저장하고 사용하는 개념이지만, 각각의 역할과 사용 방식이 다르다.

📕 변수(Variable)란?

변수는 데이터를 저장하는 메모리공간

자바에서는 변수를 선언할 때 자료형(Data Type)을 지정해야 한다.

 

📑 변수의 특징

  • 변수를 사용하면 데이터를 저장하고 변경할 수 있음
  • 변수에는 기본 자료형과 참조 자료형이 있음
  • 변수를 선언하면 메모리에 공간이 할당됨
  • 변수의 유효 범위가 존재함

📑 변수의 종류

자바에서 변수는 선언 위치와 사용 방식에 따라 3가지로 구분된다.

 

1. 지역 변수 (Local Variable)

메서드, 생성자 또는 블록 내에서 선언된 변수로, 해당 메서드나 블록 내에서만 사용할 수 있다.

메서드나 블록이 종료되면 변수는 소멸한다.

 🔹 특징 🔹

  • 메서드나 블록 내에서만 사용되며, 선언된 위치를 벗어나면 접근할 수 없다.
  • 초기화를 반드시 해야 사용 가능. 자바에서는 지역 변수 값을 자동으로 초기화하지 않기 때문에, 변수를 사용하기 전에 반드시 값을 설정해야 한다.
  • 메서드 호출 시 생성되고, 종료시 소멸 된다.
  • 같은 이름의 지역 변수를 서로 다른 메서드에서 사용 가능 (독립적)
  • 스택 메모리에 저장. 메서드가 호출 시 메모리에 할당되고, 메서드 종료 시 소멸한다.

 🔸 지역 변수 종류 🔸

 1) 선언 위치에 따른 종류

선언 위치 설명
일반적인 지역 변수 메서드 내에서 선언된 변수이며, 해당 메서드 내에서만 유효
메서드 실행이 끝나면 자동으로 소멸됨
매개변수(Parameter) 메서드가 호출될 때 외부에서 전달된 값(아규먼트)을 저장
메서드가 실행되는 동안만 존재하며, 메서드가 종료되면 사라짐
반복문 변수 forwhiledo-while 루프 내부에서 선언된 변수
루프가 실행되는 동안만 존재하고, 루프가 끝나면 사라짐
조건문 변수 ifswitch 등의 조건문 내에서 선언된 변수는 해당 블록 내에서만 유효
 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