변수는 데이터를 저장하는 공간인데,
무슨 변수의 종류가 이렇게도 많담...
종류가 많은 거 보니 그만큼 중요하다는 뜻이니
꼭 알고 가자!!
1) 클래스 영역에 static 키워드 없이 선언된 변수
2) 객체가 만들어질 때, 즉 new 생성될 때 객체별로 생성된다
3) 생성시점에서 타입별로 자동으로 초기화가 이뤄진다
1) 인스턴스 멤버 변수는 객체 내부에 생성되기 때문에 객체 소속이다
그래서 이 변수를 사용하기 위해서는 먼저 객체를 생성해서 객체 이름을 통해서 접근해야 한다
2) 인스턴스 멤버 변수의 값은 객체마다 생성되기 때문에 객체별로 고윳값을 가질 수 있다
인스턴스 new 객체 생성하지 않으면 사용할 수 없다
1) 로컬 변수는 클래스 영역 이외의 모든 중괄호 안에 선언되는 변수
2) 로컬변수는 멤버 변수와 달리 자동으로 초기화가 이뤄지지 않는다
그래서 로컬 변수를 사용하기 전에 반드시 명시적인 초기화가 필요하다
<초기화가 되어 있지 않다는 경고문>
The local variable localVariable may not have been initialized
1. static 키워드는 변수와 메서드에 사용 가능
2. 클래스 멤버 변수는 인스턴스 멤버 변수와 마찬가지로 클래스의 영역에 선언되는 변수 중
static 키워드가 선언된 변수
3. 변수의 데이터 타입 앞에 static 키워드 사용
1) 인스턴스 생성 없이 클래스가 메모리에 로딩될 때 변수도 함께 로딩된다
즉, 개별 객체 생성과는 무관. 즉 인스턴스가 생성 전에 생긴다.
왜냐하면 클래스 변수의 소속이 객체가 아니라 클래스이기 때문
2) 클래스는 1개만 생성, 클래스 멤버 변수도 클래스 소속이므로 1개만 생성
3) 공유 변수: 모든 인스턴스에 하나의 변수를 공유함
비유> 강의실은 여러 군데 있지만 인포 데스크는 1개밖에 없다. 모두 공유하는 곳
4) 클래스 멤버 변수도 변수이기 때문에 기본 초기화 이뤄짐
5) 개별 객체와 무관하기 때문에 객체가 아닌 클래스 이름으로 접근해야 한다
인스턴스 주소를 갖는 참조 변수 대신 클래스명만으로 접근 가능
선언 : [접근 제한자] static 데이터 타입 변수명;
사용 : 클래스명. 변수명
1) 로컬 변수 메서드가 호출되면 메서드가 생성, 메서드가 끝나면 끝난다
2) 인스턴스 멤버 변수는 new 했을 때, 객체를 만들었을 때, 소멸은 객체가 제거될 때
3) 클래스가 생성될 때 클래스 멤버 변수도 생기고, 프로그램이 끝날 때 이 변수도 끝난다
< 자바 프로그램 실행 과정 및 변수 생성 시점 >
1. 소스 코드(. java) 작성 후 실행
2. 클래스 파일(. class) 생성
3. 클래스 파일 실행
4. 클래스 로딩 => static 키워드 사용된 변수 및 메서드 로딩됨
5. main() 메서드 호출(실행)
6. 인스턴스 생성 => 인스턴스 변수 및 메서드 로딩됨
7. 메서드 호출 => 로컬 변수 로딩됨
8. 메서드 종료 => 로컬 변수 제거됨
9. 인스턴스 제거됨 => 인스턴스 변수 제거됨
10. 프로그램 종료됨 => static 변수 제거됨
1) static 메서드 내에서는 인스턴스 변수 사용 불가!!!!!
static 메서드 로딩 시점은 인스턴스 변수가 생성되기 전이므로
static 메서드 내에서는 인스턴스 변수 접근이 불가능하다
그러므로 static 변수를 사용할 때 쓸 수 없는 인스턴스 변수들이 있다는 것에 주의
2. static 메서드 내에서는 레퍼런스 this 사용 불가
왜냐하면 레퍼런스 this도 인스턴스 생성 시점에 메모리에 로딩되기 때문에
static 메서드 로딩 시 존재하지 않는다
<해결 방법>
this 대신 클래스 명을 쓰면 된다
ㅣ읽느라 수고 많으셨어요~ㅣ
부족한 글을 읽어주셔서 감사드립니다
아직 부족한 게 많으니
틀린 곳이 있다면
조언의 말씀 꼭 부탁드립니다!!!!
자바_java.lang.Object 클래스 (0) | 2020.07.07 |
---|---|
[JAVA] 자바 개발프로그램 _JDK 설치 /이클립스 잘 설치해보기 (0) | 2020.07.06 |
[JAVA] 자바_상속의 골치덩이 super, this 뽀개기 (0) | 2020.07.01 |
[JAVA] 자바 _상속(inheritance)제대로 파고들기!! (0) | 2020.06.28 |
도대체 자바에서 상속_메서드 오버라이딩(method overriding)이란? (0) | 2020.06.26 |