상세 컨텐츠

본문 제목

인스턴스 멤버와 정적멤버

JAVA

by young1403 2022. 5. 12. 14:28

본문

  • instance static 차이
  • 인스턴스 멤버 this
  • 정적 멤버와 static
  • final 필드와 상수

 

자바는 대표적인 객체지향적 언어이다. 클래스를 사용해여러 개의객체를 만드는데 하나의 클래스에 여러개의 객체가 만들어 질 있다. 그런데 클래스 멤버마다 같은 모양의 객체를 모두 가지고 있을 필요성에 대해 생각해 필요가 있다.

객체마다 필드값이 달라야 한다면 해당 클래스의 필드는 객체를 가지고 있는것이 맞다. 하지만객체의 필드 값이모두 같은경우인데 클래스 객체마다  해당필드를 가지고 있을 필요가 있을까.?

자바는 이런경우를 위해 클래스 멤버를 인스턴스멤버와 정적 멤버로구분해서 선언할 있도록 하고있다. 인스턴스 멤버 객체마다 가지고 있는 멤버를 말하고 정적멤버클래스에 위치시켜 객체들이 공유하는 멤버를 말한다.

 

 

1. 우선인스턴스 멤버와 this 대해 알아보자면 인스턴스 필드와 메소드는 객체에 소속된 멤버이기 때문에 객체 없이는 사용이 불가능하다. 그렇기에 외부클래스에서 인스턴스 멤버에 접근하기 위해선 해당 객체를 생성하고참조 변수를통해 접근하여야 한다.

 

객체 외부에서 인스턴스 멤버에 접근하기 위해 참조변수를사용하는 것과 마찬가지로 객체 내부에서도 인스턴스 멤버에 접근하기 위한 방법으로 this 사용할 있다. this.young이라고 하면이라고하면 내가 선언한 young이라는 필드라는 뜻이다. this 생성자(필드) 이름과 매개변수로 사용한 이름이 동일한 경우에 this뒤에 선언한 변수명은 인스턴스 멤버 필드임을 가르키고자 할 사용된다.

//필드
String model;
int speed;

//생성자로
Car(String model){
    this.model = model; // 매개변수 model의 값을 field model에 저장합니다.
}
//메서드
void setSpeed(int speed){
    this.speed = speed; // 매개변수 speed의 값을 field speed에 저장합니다
}

 

2. 정적 멤버(static)

정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않아도 사용할 수 있는 필드와 메서드를 말한다. static키워드를 추가로 붙여 선언하여 사용한다. 필드나 메서드를 선언할 때에 instance 혹은 static 둘 중 어느 것을 사용할지 판단을 하고 선언을 하여야 한다. 필드는 객체마다 가지고 있어야 할 데이터라면 인스턴스로 선언을 하고 고정된 공용 데이터라면 static으로 선언을 하는 것이 바람직하다. 메서드의 경우에는 인스턴스 멤버를 포함하고 있는지의 유무에 따라서 인스턴스나 정적 메서드를 선언을 하면 되겠다.

 

정적 멤버의 경우에는 객체를 생성하지 않고 도트(.) 연산자를 통해 해당 정적 멤버에 접근할 수 있다.  원칙적으로는 클래스 이름으로 접근을 해야 하지만 객체를 생성하여 변수로도 접근이 가능하다. 그렇기에 메서드 선언 시에 인스턴스 필드나 인스턴스 메서드는 사용이 불가하다. 만약 내가 정적 메서드에서 인스턴스 멤버를 사용하고 싶을 때에 객체를 생성한 후 참조 변수로 접근 가능하다.

public class ClassName {
    int field_value;
    void method1(){}

    static int field_value2;
    static void method2(){};

    static void method3(){          //정적메소드가 인스턴스 필드 or 메소드에 접근할시
        //this.field_value = 10;    //컴파일에러
        //method1();                //컴파일에러
        field_value2 = 10;
        method2();
    }
    static void method4(){          //정적메소드가 객체를 생성하여 인스턴스 필드 or 메소드에 접근할시
        ClassName obj = new ClassName();
        obj.field_value = 10;
        obj.method1();
    }
}

3. final 필드와 상수

'최종' 혹은 '마지막'이라는 의미를 지닌 final은 문자그대로 final필드에는 최종적인 값이 되어 프로그램 실행 도중에 수정할 수 없다.

아래와같이 선언을 한다.

final 타입 필드 = 초기값;

위의 예처럼 필드에 선언시에 final 의 초기값을 줄 수도있고 생성자의 매개값을 통해 초기값을 설정 할 수 있다.

 

상수는 불변의 값이다. 원주율같이 수학에서 사용되는 불변의 값들을 자바에서는 상수(constant)라고 표현한다.

한가지 조심해야 할 것은 final필드는 상수가 아니라는 점이다. 상수는 불변의 값이기 때문에  final필드와 같이 객체마다 필드를 선언 하거나 생성자의 매개값을 통해서 값이 변동되는 경우는 상수라고 부를 수가 없다.

관련글 더보기

댓글 영역