자바 기초 (08). 인스턴스 멤버와 정적 멤버
이번 포스팅에선 인스턴스 멤버와 정적 멤버에 대해 알아본다,
0. 들어가기전에Permalink
클래스에 선언된 필드와 메소드가 모두 객체 내부에 포함되는 것은 아니다. 개체 내부에 것은 아니다. 객체가 있어야 사용 가능한 멤버가 있고, 그렇지 않고 사용되는 멤버도 있다. 이번장에서는 이러한 멤버들의 사용을 알아 보려 한다.
이번 장에서는 아례와 같은 순서대로 이번장을 다뤄 보려 한다
- 인스턴스 멤버와 this
- 정적 멤버와 static
- final 필드와 상수
1. 인스턴스 멤버와 thisPermalink
인스턴스 멤버 (instance member)
- 객체마다 가지고 있는 멤버
- 인스턴스 필드 : 힙영역의 객체 마다 가지고 있는 멤버, 객체마다, 다른 데이터를 저장한다.
- 인스턴스 메서드 :객체가 있어야 호출 가능한 메서드, 클래스 코드(메서드 영역)에 위치는 하지만, 이해하기 쉽도록 객체마다 가지고 있는 메서드라고 생각하면 된다.
public class Army {
//필드
String weapon;
// 메소드
void Attack(){...}
}
public class War {
public static void main(String [] args){
// 아래 맴버들이 인스턴스 멤버이다.
Army soldier1 = new Army();
soilder1.weapon = "빗자루";
soilder1.Attack();
Army soldier2 = new Army();
soilder1.weapon = "몽둥이";
soilder2.Attack();
}
}
이 Army의 각 객체 soldier1, soldier2 는 각각 힙 영역에 저장된다. 메소드는 객체마다 저장되는것이 아니라 메소드 영역이라는 곳에 따로 저장된다. 여기서 오해 할 수 있는게 그럼 이게 왜 인스턴스 메서드냐 할 수 있지만, 메소드 영역의 메소드는 객체가 없으면 호출이 불가하다. 그렇기에 객체 소속이라 생각해도 무방하다??
this (저번시간에 배웠지만 인스턴스 멤버에 중요한 역할을 하기 때문에, )
- 객체 내부에서 인스턴스 멤버에 접근하기 위해 사용
- 생성자와 메소드의 매게 변수 이름이 필드와 동일할 경우, 필드 임을 지정하기 위해 주로 사용
- 생성자 오버로딩 this()는 이전 포스팅 확인
2. 정적 멤버와 staticPermalink
정적 멤버
- 객체와 상관없이 클래스에 코정되어 사용되는 멤버(필드, 메서드), 클래스 코드(메소드 영역)에 위치
- 정적 필드 및 상수 : 객체 없이 클래스만으로도 사용 가능한 필드, 정적필드는 인스턴스필드와는 다르게 메소드 영역에 직접 저장된다.
- 정적 메서드 : 객체가 없이 클래스만으로도 호출 가능한 메서드
정적 멤버의 사용
public class Calculator{
static double pi = 3.141592;
static int plub(int x, int y){
return x+y;
}
static int minus(int x, int y){
return x-y;
}
}
public class CalExample{
public static void main(String[] args){
// 정적필드
double circle = 10 * 10 * Calculator.pi;
// 정적메서드
int plusResult = Calculator.plus(10,5);
int minusResult = Calculator.minus(10,5);
}
}
- 인스턴스 멤버와 정적 멤버 선택 기준
- 객체마다 다룰 수 있는 필드값 = 인스턴스 필드로 선언
- 객체마다 다를 필요가 없는(모두 같은) 필드값 = 정적 필드로 선언
- 메소드 블록(메소드 내)에 인스턴스 필드 또는 다른 인스턴스 메서드를 사용할 경우 = 인스턴스 메서드로 선언
- 그렇지 않을경우 정적 메서드를 선언 하면 된다.
- 정적메서드 선언시 주의점
- 정적 메서드 선언시 그 부에 인스턴스 필드 및 메서드 사용불가 ( 당연히 객체를 선언 안하고도 사용할 수 있어야 하는게 정적 멤버이기 때문)
- 정적 메서드 선언 시 그 객체 자신 참조인 this 키워드는 사용 불가.
public class Army{
int unit;
static void belonging(){
System.out.println("이 병사의 소속은" + unit + "부대 이다.");
// 위코드는 unit에서 에러를 발생한다. 이유는 정적 메서드에서 인스턴스 메서드인 unit을 사용하려 하였기 때문이다.
}
}
3. final 필드와 상수Permalink
-
final 필드 : 초기값이 저장되면 최종값이 되어 프로그램 실행 도중 수정 불가,
- final 필드의 초기값 주는 방법
- 단순 값일 경우 필드 선언시 초기화(주로 정적 필드(상수)일 경우)
- 객체 생성 시 외부 데이터로 초기화 필요한 경우에는 생성자에서 초기화 (주로 인스턴스 필드일때)
- 인스턴스 final 필드
- 객체에 한번 초기화된 데이터를 변경 불가로 만들 경우 : ex) 주민번호
- 정적 final 필드 (관례적으로 모두 대문자로 작성)
- 불변의 값인 상수를 만들경우 : ex) PI, 지구 둘례,