목차
접기
728x90
반응형
클래스 변수
앞서 이야기한 것처럼 static 변수는 인스턴스를 생성할 때마다 만들어지는 것이 아니고 클래스를 선언할 때
특정 메모리에 저장
되어모든 인스턴스가 공유
하는 변수이다.static 변수는 인스턴스 생성과는 별개이므로 인스턴스보다 먼저 생성된다.
그러므로 인스턴스가 아닌 클래스 이름으로도 참조하여 사용할 수 있다.
예시) 클래스이름.static 변수명
- static 변수를 인스턴스 참조 변수로 사용한다면 아래쪽에 노란색 줄이 보인다.
- 이것은 오류가 아니고 이 변수가 static 변수이므로 인스턴스 참조 변수가 아닌 클래스 이름으로 직접 참조하라는 뜻이다.
- 이클립스에서 static 변수와 static 메서드는 이탤릭체로 나타난다.
static 변수 공통된 이름 3가지
- static 변수
- 정적 변수
- 클래스 변수
자바에서 static 변수를 클래스 변수라고 하는 이유
- 인스턴스마다 생성되는 변수가 아니라 클래스에 속해 한 번만 생성되는 변수이고 이를 여러 인스턴스가 공유하기 때문이다.
클래스 메서드
- 일반 멤버 변수를 위한 메서드가 존재하듯이 static 변수를 위한 메서드도 존재한다.
- 이런 메서드를 static 메서드 또는 클래스 메서드(class method)라고 한다.
- static 메서드 또한 static 변수처럼 인스턴스 참조 변수가 아닌 클래스 이름으로 직접 호출할 수 있다.
- 클래스 메서드 내부에서는 인스턴스 변수를 사용할 수 없다.
지역 변수
- 메서드 내부에서 선언한 변수를 그 지역에서만 사용한다고 해서 지역 변수(local variable)라고 한다.
- 지역 변수는 메서드가 호출될 때 메모리에 생성되어 메서드가 끝나면 사라지는 변수이다.
- (위와 같은 말 : studentName처럼 인스턴스가 생성되어야 메모리에 할당되는 인스턴스 변수는 클래스 메서드에서 사용할 수 없다.)
클래스 메서드 안에서 멤머 변수를 선언하면 오류 발생
- 클래스의 멤버 변수는 인스턴스가 생성될 때 만들어지는 인스턴스 변수이기 때문에
- 인스턴스 생성과 상관없는 static 메서드(클래스 메서드) 안에서는 사용할 수 없다.
클래스 메서드 정리하기
- 클래스 메서드 내부에서 지역 변수와 클래스 변수는 사용할 수 있지만, 인스턴스 변수는 사용할 수 없다.
- 또한 클래스 메서드에서 인스턴스 변수를 사용할 수는 없지만 반대로 일반 메서드에서 클래스 변수를 사용하는 것은 전혀 문제가 되지 않는다.
- 왜냐하면 일반 메서드는 인스턴스가 생성될 때 호출되는 메서드이고, 클래스 변수는 이미 만들어진 변수이기 때문에
일반 메서드에서도 클래스 변수를 호출할 수 있기 때문이다.
package algo2;
public class Student3 {
private int studentCardNum;
private int studentID;
private String name;
private static int serialNum = 0;
public Student3() {
serialNum++;
studentID = serialNum;
studentCardNum = studentID + 100;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static int getSerialNum() {
return serialNum;
}
public static void setSerialNum(int serialNum) {
Student3.serialNum = serialNum;
}
public int getStudentID() {
return studentID;
}
public int getStudentCardNum() {
return studentCardNum;
}
}
package algo2;
public class Main {
public static void main(String[] args) {
Student3 studentA = new Student3();
studentA.setName("홍길동");
System.out.println("serialNum : " + Student3.getSerialNum());
System.out.println(studentA.getName() + "의 학번은 " + studentA.getStudentID() + "이고, 카드번호는 "
+ studentA.getStudentCardNum() + " 입니다.");
Student3 studentB = new Student3();
studentB.setName("개똥이");
System.out.println("serialNum : " + Student3.getSerialNum());
System.out.println(studentB.getName() + "의 학번은 " + studentB.getStudentID() + "이고, 카드번호는 "
+ studentB.getStudentCardNum() + " 입니다.");
Student3 studentC = new Student3();
studentC.setName("임꺽정");
System.out.println("serialNum : " + Student3.getSerialNum());
System.out.println(studentC.getName() + "의 학번은 " + studentC.getStudentID() + "이고, 카드번호는 "
+ studentC.getStudentCardNum() + " 입니다.");
}
}
static 메서드 내부에서는 멤버 변수를 사용할 수 없지만, 일반 메서드 내부에서는 static 변수를 사용할 수 있다.
728x90
반응형
LIST
'Java' 카테고리의 다른 글
[ java ] 배열 응용 프로그램(ArrayList 배열 객체) 만들기 (0) | 2020.12.18 |
---|---|
[ java ] 변수 유효 범위란? (0) | 2020.12.17 |
[ java ] static 변수 (0) | 2020.12.17 |
[ java ] 객체. this (0) | 2020.12.17 |
[ java ] 정보 은닉, 접근 제어자 (0) | 2020.12.17 |