필드의 개념 정리 및 선언 방법
1. 필드란
- 필드는 클래스에 포함된 변수를 의미합니다. 즉, 객체의 속성을 정의하는 공간입니다.
- 어떠한 데이터를 저장하기 위한 역할을 담당하며 클래스 내부의 생성자와 메소드 밖에 정의가 됩니다.
- 여기서 어떤한 데이터는 객체의 고유 데이터, 객체가 가져야할 부품, 현재 상태 데이터 등을 의미합니다.
- 자동차 객체라고 한다면 제작회사, 모델, 색깔, 엔진 등을 필드라고 할 수 있습니다.
- 필드는 클래스 내 전체에서 사용합니다.
- 자바에서 변수는 크게 클래스 변수(CV : Class Variable), 인스턴스 변수(IV : Instance Variable), 지역 변수(LV : Local Variable)가 있습니다. 필드에서 다루는 변수는 클래스 변수(CV)와 인스턴스 변수(IV)입니다. 이 둘은 static 키워드를 통해 구분할 수 있습니다.
2. 필드 종류
- 클래스 변수 : 필드 내에서 static 키워드와 함께 선언된 변수입니다.
(static 변수 또는 공유 변수라고도 합니다.) - 인스턴스 변수 : 필드 내에서 선언된 변수입니다.
(static 키워드가 없습니다.) - 지역 변수 : 메소드 내에 포함된 모든 변수입니다.
-
class Variable { static int classVariable; // 클래스 변수(static 변수 또는 공유변수) int instanceVariable; // 인스턴스 변수 void variableMethod() { int localVariable; // 지역변수, 메서드 내에서만 사용 가능 } }
- 세 가지 유형의 변수들은 서로 다른 유효 범위(scope)를 가집니다.
3. 필드 선언 방법
- 필드 선언
- 필드를 선언할 때 접근제어자, 타입, 이름, 세가지를 정해주어야 합니다.
- 접근제어자는 public, private, protected, private가 있습니다.
- 필드명은 동일한 이름을 사용할 수 없습니다.
- 필드의 선언은 어디에서나 할 수 있습니다.
- 생성자, 메소드 앞이나 뒤 모두 가능합니다.
- 생성자나 메소드 블록 안에서 선언된 것은 필드 변수가 아니라 로컬 변수입니다.
- 로컬 변수 : 해당 블록 안에서만 사용할 수 있는 변수로 우리가 흔히 말하는 변수가 로컬 변수입니다.
- 필드 변수 : 클래스 블록 내에서 선언된 변수입니다.
- 필드를 선언할 때 접근제어자, 타입, 이름, 세가지를 정해주어야 합니다.
- 필드 사용
- 필드를 사용한다는 것은 필드 값을 읽고 변경하는 작업을 말합니다.
- 클래스 내부 생성자나 메소드에서 사용하는 경우에는 필드 이름으로 읽고 변경합니다.
- 클래스 외부에서 사용하는 경우에는 클래스로부터 객체를 생성한 뒤 객체명.필드명 형태로 필드를 사용해야 합니다.
- 필드는 객체에 소속된 데이터이므로 객체가 존재하지 않으면 필드도 존재하지 않기 때문입니다.
- Car car = new Car(); -> 인스턴스화
- car.필드명 이렇게 접근하여 사용해야 합니다.
- 도트 연산자는 객체 접근 연산자로 객체가 가지고 있는 필드나 메소드를 사용할 때 사용됩니다.
- 만약 메소드 안에 지역 변수와 필드 변수가 같다면 지역 변수가 우선시 되며, 필드를 사용하고 싶다면 변수명 앞에 this를 붙여 필드 변수를 사용할 수 있습니다.
4. 각 필드 특징
- 인스턴스 변수 (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 출력 } }
-
- 인스턴스(클래스를 통해 생성된 객체)가 가지는 속성을 저장하기 위한 변수입니다.
- 클래스 변수 (CV : Class Variable)
- 클래스 변수는 인스턴스 변수와 다르게 공통된 저장공간을 공유합니다.
즉, 한 클래스로부터 생성되는 모든 인스턴스들이 특정한 값을 공유해야 하는 경우 static 키워드를 사용하여 선언하게 됩니다.
클래스 변수는 인스턴스를 생성하지 않고도 클래스명.클래스변수명을 통해 사용이 가능합니다.-
class Variable { static int classVariable = 10; // 클래스 변수 초기화 public static void main(String[] args) { System.out.println(Variable.classVariable); // 10 출력 } }
-
- 클래스 변수는 인스턴스 변수와 다르게 공통된 저장공간을 공유합니다.
- 지역 변수 (LV : Local Variable)
- 지역 변수는 멤버 변수 (클래스 변수, 인스턴스 변수)와는 구분됩니다.
지역 변수는 메소드 내에 선언되며 메소드 안에서만 사용이 가능합니다. - 또한 멤버 변수와 다르게 지역 변수는 스택 메모리에 저장되어 메소드가 종료되는 동시에 소멸됩니다.
-
class Variable { public static void main(String[] args) { int localVariable = 10; System.out.println(localVariable); // 10 출력 } }
-
- 지역 변수는 멤버 변수 (클래스 변수, 인스턴스 변수)와는 구분됩니다.
- 스태틱 (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 |