필드

이용만·2023년 2월 23일
0

학습 목표

  • 객체의 속성을 정의하는 필드를 이해하고, 세 가지 종류의 변수를 구분할 수 있다.
  • 각각의 변수가 저장되는 위치를 설명하고, 그 차이를 설명할 수 있다.
  • static 키워드가 무엇이며, 언제 사용되는 지 설명할 수 있다.
  • 객체의 기능을 정의하는 메서드를 이해하고, 메서드의 구성요소와 호출에 대해 설명할 수 있다.
  • 메서드 오버로딩을 이해하고 그 장점을 설명할 수 있다.

필드

필드 : 클래스에 포함된 변수이며 객체의 속성을 정의할 때 사용된다. 자바에서 변수는 클래스 변수, 인스턴스 변수, 지역변수 3가지가 있는데 필드라 부르는 것은 클래스 변수와 인스턴스 변수이며 둘은
static 키워드의 유무로 구분한다.
클래스 변수는 static 키워드가 함께 선언되고 인스턴스 변수는 없다.
메서드 내에 포함된 모든 변수를 지역변수라고 한다.

class Example { // => 클래스 영역
	int instanceVariable; // 인스턴스 변수
	static int classVariable; // 클래스 변수(static 변수, 공유변수)

	void method() { // => 메서드 영역
		int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
	}
}

인스턴스 변수는 인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수로
new 생성자()를 통해 인스턴스가 생성될 때 만들어진다. -> -> 힙 메모리에 저장이되고 직접적으로 초기화를 실행하지 않아도 강제로 초기화 이루어짐
ex) 사람마다 성별, 이름, 나이, MBTI가 다르듯 인스턴스 변수는 고유한 특성을 정의하기 위한 용도이다.

static 키워드를 통해 선언하는 클래스 변수는 독립적인 저장 공간을 가지는 인스턴스 변수와 다르게 공통된 저장공간을 공유한다. 한 클래스로부터 생성되는 모든 인스턴스들이 특정한 값을 공유해야하는 경우에 주로 static 키워드를 사용해 클래스 변수를 선언 -> -> 힙 메모리에 저장이되고 직접적으로 초기화를 실행하지 않아도 강제로 초기화 이루어짐
ex) 손가락 발가락 개수는 모든 사람이 공유하는 특성이다.

지역변수는 메서드 내에서만 선언되고 사용가능한 변수이다. -> 스택 메모리에 저장이 되고 강제로 초기화되지 않는다.

static 키워드(정적, 모든 객체와 메모리를 공유)

public class StaticTest {
    public static void main(String[] args) {
        StaticExample staticExample = new StaticExample();
        System.out.println("인스턴스 변수: " + staticExample.num1); // static 키워드가 없는 인스턴스 변수
        System.out.println("클래스 변수: " + StaticExample.num2); //static 키워드가 있는 클래스 변수
    }
}

class StaticExample {
    int num1 = 10;
    static int num2 = -10;
}

//출력값
인스턴스 변수: 10
클래스 변수: -10

static은 클래스의 멤버(필드, 메서드, 이너 클래스)에 사용하는 키워드이다.
static 키워드가 붙어있는 멤버를 '정적 멤버' 라고 하는데, 인스턴스 멤버의 경우 객체 생성 후 변수와 메서드에 접근하여 해당 멤버를 사용가능한 반면, static 키워드로 정의되어 있는 클래스 멤버들은 인스턴스의 생성 없이도 클래스명.멤버명 사용 가능

public class StaticFieldTest {
    public static void main(String[] args) {
        StaticField staticField1 = new StaticField(); // 객체 생성
        StaticField staticField2 = new StaticField();

        staticField1.num1 = 100; 
        staticField2.num1 = 1000;

        System.out.println(staticField1.num1);
        System.out.println(staticField2.num1);

        staticField1.num2 = 150;
        staticField2.num2 = 1500;
        System.out.println(staticField1.num2);
        System.out.println(staticField2.num2);

    }
}

class StaticField {
    int num1 = 10;
    static int num2 = 15;
}

//출력값
100
1000
1500
1500

정적 필드는 객체 간 공유 변수의 성질이 있다 메서드에도 동일하게 적용이 된다.
일반적인 메서드 앞에 static을 사용하면 해당 메서드는 정적 메서드가 된다. 정적 메서드도 정적 필드와 마찬가지로 클래스명만으로 바로 접근이 가능하다.
주의할 것은 정적 메서드의 경우 인스턴스 변수 또는 인스턴스 메서드를 사용할 수 없다.
왜? 정적 메서드는 인스턴스 생성없이 호출이 가능하기 때문이다.
static 키워드를 사용하면 모든 인스턴스에 공통적으로 적용되는 값을 공유할 수 있다.


public class Car {
    public String instanceVariable = "나는 인스턴스 변수";
    public static String classVariable = "나는 클래스 변수";

    public static void classMethod(){
        System.out.println("인스턴스변수");
        System.out.println("클래스 변수");
    }
    public void instanceMethod(){
        System.out.println("인스턴스변수");
        System.out.println("클래스 변수");
    }
    
public static void main(String[] args) {


//        System.out.println(Car.instanceVariable); // 

        Car car1 = new Car();
        Car car2 = new Car();
        car2.classVariable = "저는 클래스 변수에용 ";
        System.out.println(Car.classVariable);
        System.out.println(car2.instanceVariable);
        System.out.println(car1.instanceVariable);
        System.out.println(car2.classVariable);
        System.out.println(car1.classVariable);

결론
static키워드는 클래스의 멤버 앞에 붙일 수 있다.
정적 멤버의 가장 큰 특징은 인스턴스를 따로 생성하지 않아도 클래스 명만으로도 변수나 메서드 호출이 가능하다.
이는 메모리의 저장위치와 관련이 있다.(인스턴스 - 힙메모리, 클래스,static - 클래스영역)
객체를 몇개를 만들건 static 달려있는 변수는 딱 하나만 만들어놓고 모든 객체가 공유를 한다. static이 있는 변수는 메모리에 딱 하나만 만들어놓고 모든 객체가 공유가 된다는 사실을 잊지 말자.
static은 모든 객체에 영향을 주지만 instance 해당 객체에만 영향을 준다.

※참조한다는 것은 주소값을 찾아가 객체에 접근하는 것이다.
참조할 수 없다는 것은 참조를 하려면 메모리 어딘가에 인스턴스가 있어야 하는데 없다는 것.

profile
성장하는 개발자가 되고자 합니다.

0개의 댓글