2 minute read

Updated:

06-5 인스턴스 멤버와 정적 멤버

핵심 키워드

  • 클래스에 선언된 필드와 메소드가 모두 객체 내부에 포함되는 것은 아니다. 포함되지 않고 클래스에 그대로 남아 있는 것도 있다.
  • 인스턴스 멤버는 객체마다 가지고 있는 멤버, 정적 멤버는 클래스에 고정된 객체들이 공유하는 멤버

인스턴스 멤버와 this

  • 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드를 말한다. 각각 인스턴트 필드인스턴드 메소드라고 부른다.

인스턴스 멤버 선언

public class Car{
  //필드
  int gas;
  
  //메소드
  void setSpeed(int speed) { ... }
  }

this

  • 객체 내부에서도 인스턴스 멤버에 접근하기 위해 this를 사용 가능. 객체는 자신을 this라고 함.
  • 생성자와 메소드의 매개 변수 이름이 필드와 동일한 경우, 필드임을 명시하고자 할 때 사용.
Car(String model) {
  this.model = model;
  }
  
void setModel(String model) {
  this.model = model;
}

정적 멤버와 static

  • 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드

정적 멤버 선언

*필드와 메소드 선언 시 static 키워드를 추가적으로 붙인다.

public class 클래스 {
  //정적 필드
  static 타입 필드 [ = 초기값 ];
  
  //정적 메소드
  static 리턴 타입 메소드( 매개변수선언, ... ) { ... }
}
public class Calculator {
  //정적 필드
  static double pi = 3.14159;
  
  //정적 메소드
  static int plus(int x, int y) { ... }
  static int minus(int x, int y) { ... }
}

정적 멤버 사용

  • 클래스 이름과 함께 도트(.) 연산자로 접근
double result1 = 10 * 10 * Calculator.pi;
int result2 = Calculator.plus(10, 5);
int result3 = Calculator.minus(10, 5);

정적 메소드 선언 시 주의할 점

  • 이들 내부에 인스턴스 필드나 인스턴스 메소드 사용 불가
  • 객체 자신의 참조인 this 키워드도 사용 불가
//컴파일 에러 예시

public class ClassName {
  //인스턴스 필드와 메소드
  int field1;
  void method1() { ... }
  //정적 필드와 메소드
  static int field2;
  static void method2() { ... }
  
  //정적 메소드
  static void Method3 {
    this.field1 = 10; //(x)
    this.method1();   //(x)
    field2 = 10;      //(o)
    method2();        //(o)
  }
}
  • 정적 메소드에서 인스턴스 멤버를 사용하려면 객체를 먼저 생성하고 참조 변수로 접근해야 함.
  static void Method3() {
    ClassName obj = new ClassName;
    obj.field1 = 10;
    obj.method1();
  }

인스턴스 멤버와 정적 멤버 선언 판단 기준

필드 선언

  • 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드
  • 객체마다 가지고 있을 필요가 없는 공용 데이터라면 정적 필드
  • (예시) Calculator 클래스에서 원의 넓이나 둘레를 구할 때 필요한 파이는 변하지 않는 공용 데이터이므로 정적 필드로 선언, Calculator별로 색깔이 다르다면 color는 인스턴스 필드로 선언
public class Calculator {
  String color;             //계산기별로 색깔이 다를 수 있다.
  static double pi = 3.14;  //계산기에서 사용하는 파이 값은 동일하다.
} 

메소드 선언

  • (예시) Calculator 클래스의 덧셈, 뺄셈 기능은 외부에서 주어진 매개값을 가지고 수행하므로 정적 메소드로 선언, 인스턴스 필드인 색깔을 변경하는 메소드는 인스턴스 메소드로 선언
public class Calculator {
  String color;                                           //인스턴스 필드
  void setColor(String color) { this.color = color; }     //인스턴스 메소드
  static int plus(int x, int y) { return x + y ; }        //정적 필드
  static int minus(inx x, int y) { return x - y ; :       //정적 필드

Categories:

Updated: