본문 바로가기
JAVA

[JAVA] - 필드란 (Field)

by nam_ji 2024. 1. 31.

필드의 개념 정리 및 선언 방법

1. 필드란

  • 필드는 클래스에 포함된 변수를 의미합니다. 즉, 객체의 속성을 정의하는 공간입니다.
  • 어떠한 데이터를 저장하기 위한 역할을 담당하며 클래스 내부의 생성자와 메소드 밖에 정의가 됩니다.
    • 여기서 어떤한 데이터는 객체의 고유 데이터, 객체가 가져야할 부품, 현재 상태 데이터 등을 의미합니다.
    • 자동차 객체라고 한다면 제작회사, 모델, 색깔, 엔진 등을 필드라고 할 수 있습니다.
  • 필드는 클래스 내 전체에서 사용합니다.
  • 자바에서 변수는 크게 클래스 변수(CV : Class Variable), 인스턴스 변수(IV : Instance Variable), 지역 변수(LV : Local Variable)가 있습니다. 필드에서 다루는 변수는 클래스 변수(CV)와 인스턴스 변수(IV)입니다. 이 둘은 static 키워드를 통해 구분할 수 있습니다.

2. 필드 종류

  1. 클래스 변수 : 필드 내에서 static 키워드와 함께 선언된 변수입니다.
    (static 변수 또는 공유 변수라고도 합니다.)
  2. 인스턴스 변수 : 필드 내에서 선언된 변수입니다.
    (static 키워드가 없습니다.)
  3. 지역 변수 : 메소드 내에 포함된 모든 변수입니다.
    • class Variable {
          static int classVariable; // 클래스 변수(static 변수 또는 공유변수)
          int instanceVariable;     // 인스턴스 변수
      
          void variableMethod() {
              int localVariable;      // 지역변수, 메서드 내에서만 사용 가능
          }
      }​
    • 세 가지 유형의 변수들은 서로 다른 유효 범위(scope)를 가집니다.

3. 필드 선언 방법

  1. 필드 선언
    • 필드를 선언할 때 접근제어자, 타입, 이름, 세가지를 정해주어야 합니다.
      • 접근제어자는 public, private, protected, private가 있습니다.
      • 필드명은 동일한 이름을 사용할 수 없습니다.
    • 필드의 선언은 어디에서나 할 수 있습니다.
      • 생성자, 메소드 앞이나 뒤 모두 가능합니다.
    • 생성자나 메소드 블록 안에서 선언된 것은 필드 변수가 아니라 로컬 변수입니다.
      • 로컬 변수 : 해당 블록 안에서만 사용할 수 있는 변수로 우리가 흔히 말하는 변수가 로컬 변수입니다.
      • 필드 변수 : 클래스 블록 내에서 선언된 변수입니다.
  2. 필드 사용
    • 필드를 사용한다는 것은 필드 값을 읽고 변경하는 작업을 말합니다.
    • 클래스 내부 생성자나 메소드에서 사용하는 경우에는 필드 이름으로 읽고 변경합니다.
    • 클래스 외부에서 사용하는 경우에는 클래스로부터 객체를 생성한 뒤 객체명.필드명 형태로 필드를 사용해야 합니다.
      • 필드는 객체에 소속된 데이터이므로 객체가 존재하지 않으면 필드도 존재하지 않기 때문입니다.
      • Car car = new Car(); -> 인스턴스화
      • car.필드명 이렇게 접근하여 사용해야 합니다.
      • 도트 연산자는 객체 접근 연산자로 객체가 가지고 있는 필드나 메소드를 사용할 때 사용됩니다.
    • 만약 메소드 안에 지역 변수와 필드 변수가 같다면 지역 변수가 우선시 되며, 필드를 사용하고 싶다면 변수명 앞에 this를 붙여 필드 변수를 사용할 수 있습니다.

4. 각 필드 특징

  1. 인스턴스 변수 (IV : Instance Variable)
    • 인스턴스(클래스를 통해 생성된 객체)가 가지는 속성을 저장하기 위한 변수입니다.
      따라서 new 생성자()를 통해 인스턴스가 생성될 때 만들어집니다.
      따라서 인스턴스를 생성한 뒤, 인스턴스명.인스턴스변수명을 통해 사용할 수 있습니다.
    • 인스턴스는 힙 메모리의 독립적인 공간에 저장되고, 동일한 클래스로부터 생성 되었지만 객체의 고유한 개별성을 가집니다.
      • class Variable {
            int instanceVariable = 10; // 클래스 변수 초기화
        
            public static void main(String[] args) {
                Variable instance = new Variable();
                System.out.println(instance.instanceVariable); // 10 출력
            }
        }
  2. 클래스 변수 (CV : Class Variable)
    • 클래스 변수는 인스턴스 변수와 다르게 공통된 저장공간을 공유합니다.
      즉, 한 클래스로부터 생성되는 모든 인스턴스들이 특정한 값을 공유해야 하는 경우 static 키워드를 사용하여 선언하게 됩니다.
      클래스 변수는 인스턴스를 생성하지 않고도 클래스명.클래스변수명을 통해 사용이 가능합니다.
      • class Variable {
            static int classVariable = 10; // 클래스 변수 초기화
        
            public static void main(String[] args) {
                System.out.println(Variable.classVariable); // 10 출력
            }
        }
  3. 지역 변수 (LV : Local Variable)
    • 지역 변수는 멤버 변수 (클래스 변수, 인스턴스 변수)와는 구분됩니다.
      지역 변수는 메소드 내에 선언되며 메소드 안에서만 사용이 가능합니다.
    • 또한 멤버 변수와 다르게 지역 변수는 스택 메모리에 저장되어 메소드가 종료되는 동시에 소멸됩니다.
      • class Variable {
            public static void main(String[] args) {
                int localVariable = 10;
                System.out.println(localVariable); // 10 출력
        	}
        }
  4. 스태틱 (static)
    • 자바 프로그래밍에서 모든 객체와 메모리를 공유할 때 static 키워드를 사용합니다.
    • static은 클래스 변수와 인스턴스 변수를 구분하기 위해 사용하며 static 키워드가 붙은 변수는 클래스 변수입니다
    • 즉, static은 클래스의 구성 요소인 필드, 메소드, 이너 클래스에서 사용하기 위한 변수입니다.
    • 이를 클래스 멤버(필드, 메소드, 이너 클래스)에서 사용한다고 하여 정적 멤버라 부릅니다.
      클래스 변수는 접근 제어자에 따라 다른 클래스에서도 바로 사용이 가능합니다.
      • class Variable {
            public static void main(String[] args) {
                // 다른 클래스
                System.out.println(StaticMember.num);
                System.out.println(StaticMember.str);
                System.out.println(StaticMember.pi);
        	}
        }
        class StaticMember {
            static int num = 10;
            static String str = "안녕하세요";
            static double pi = 3.14;
        }
    • 정적 필드는 객체 간의 공유 변수 성질이 있습니다. 이는 메소드에서도 동일하게 적용됩니다. 일반적으로 메소드 앞에 static 키워드를 사용하면 이는 정적 메소드입니다.
    • 즉, 정적 메소드에서 여러 인스턴스들을 통해 클래스 변수를 사용하며 서로 공유합니다.
      • public class StaticInstanceTest {
            public static void main(String[] args) {
                StaticInstance object1 = new StaticInstance();
                StaticInstance object2 = new StaticInstance();
        
                // 객체의 인스턴스 변수 접근
                object1.number1 = 10;
                object2.number1 = 50;
                System.out.println(object1.number1); // 10 출력
                System.out.println(object2.number1); // 50 출력
        
                // 객체의 클래스 변수 접근
                object1.number2 = 10;
                object2.number2 = 50;
                System.out.println(object1.number2); // 50 출력
                System.out.println(object2.number2); // 50 출력
            }
        }
        
        class StaticInstance {
        	int number1 = 0;
        	int static number2 = 0;
        }
    • 클래스 메소드 (정적 메소드)의 경우 인스턴스 변수 또는 인스턴스 메소드를 사용할 수 없습니다.
    • 또한, 클래스 메소드(정적 메소드)는 인스턴스 생성 없이 호출이 가능합니다.
    • 반대로, 인스턴스 메소드에서 인스턴스 변수를 사용할 수 있습니다.
      • public class CarTest2 {
            public static void main(String[] args) {
            	System.out.println(Car.str1); // 클래스 변수 바로 사용 가능
            	// System.out.println(Car.str2); // 인스턴스 변수 바로 사용 불가능
        
            Car.ClassMethod(); // 클래스 메서드 바로 사용 가능
            // Car.InstanceMethod(); // 인스턴스 메서드 바로 사용 불가능
        
                // 객체는 클래스 변수와 클래스 메서드를 공유한다.
                Car car1 = new Car();
                Car car2 = new Car();
        
                // 클래스 변수는 모든 메모리를 공유한다.
                // 따라서 객체를 통해 수정해도 다른 객체나 직접 접근해도 수정된 결과를 출력한다.
                car.str1 = "클래스 변수입니다."; // 객체를 통해 클래스 변수 변경
                System.out.println(car1.str1); // 클래스 변수입니다. 출력
                System.out.println(car2.str1); // 클래스 변수입니다. 출력
                System.out.println(car.str1);  // 클래스 변수입니다. 출력
        
                // 반면, 인스턴스 변수는 독립적인 메모리를 가지고 있다.
                // 변경한 인스턴스만 수정된 상태로 출력
                car1.str1 = "인스턴스 변수입니다.";
                System.out.println(car1.str2); // 인스턴스 변수입니다. 출력
                System.out.println(car2.str2); // 인스턴스 변수 출력
        
            }
        }
        
        class Car {
            public static String str1 = "클래스 변수";
            public String str2 = "인스턴스 변수";
        
            public static void ClassMethod() { // 정적 메서드(클래스 메서드)
            	System.out.println(str1); // 클래스 변수 사용 가능
            	// System.out.println(str2); 인스턴스 변수 사용 불가능
            }
        
            public void InstanceMethod() { // 인스턴스 메서드
            	System.out.println(str1); // 클래스 변수 사용 가능
            	System.out.println(str2); // 인스턴스 변수 사용 가능
            }
        }

'JAVA' 카테고리의 다른 글

[JAVA] - 인스턴스 멤버와 정적 멤버  (0) 2024.01.31
[JAVA] - 메서드란 (method)  (0) 2024.01.31
[JAVA] - 추상화 / 캡슐화 / 상속 / 다형성  (0) 2024.01.30
[JAVA] - super와 super()  (0) 2024.01.29
[JAVA] - this와 this()  (0) 2024.01.27