인스턴스 변수/ 로컬 변수/ 클래스 변수
자바에서 중요한 역할을 하는 변수들은
꼭 알고 넘어가자!!!!!
구분 | 선언위치 | 변수 종류 | 특징 |
멤버변수 | 클래스 영역 | 클래스 멤버변수 | static키워드 사용 |
인스턴스 멤버 변수 | static키워드 없음 | ||
로컬변수 | 함수 등 내부 | 로컬변수 | |
파라미터변수(매개변수) | 메서드 파라미터 |
1) 클래스 영역에 static키워드 없이 선언된 변수
2) 객체가 만들어질 때, 즉new생성될 때 객체별로 생성된다
3) 생성시점에서 타입별로 자동으로 초기화가 이뤄진다
자료형 | 기본값 | 비고 |
boolean | false | |
char | ‘\u0000’ | 공백문자 |
byte, short, int | 0 | |
long | 0L | |
float | 0.0f | |
double | 0.0 | |
참조형 변수 | null | 아무것도 참조하지 않음 |
1) 인스턴스 멤버 변수는 객체 내부에 생성되기 때문에 객체 소속이다
그래서 이 변수를 사용하기 위해서는 먼저 객체를 생성해서 객체 이름을 통해서 접근해야 한다
2) 인스턴스 멤버 변수의 값은 객체마다 생성되기 때문에 객체별로 고유값을 가질 수 있다
인스턴스 new 객체 생성하지 않으면 사용할 수 없다
<로컬 변수(지역변수)의 특징>
1) 로컬변수는 클래스 영역 이외의 모든 중괄호 안에 선언되는 변수
2) 로컬변수는 멤버변수와 달리 자동으로 초기화가 이뤄지지 않는다
그래서 로컬변수를 사용하기 전에 반드시 명시적인 초기화가 필요하다
<초기화가 되어 있지 않다는 경고문>
The local variable localVariable may not have been initialized
1. static키워드는 변수와 메서드에 사용 가능
2. 클래스 멤버 변수는 인스턴스 멤버 변수와 마찬가지로 클래스의 영역에 선언되는 변수 중
static키워드가 선언된 변수
3. 변수의 데이터 타입 앞에 static 키워드 사용
1) 인스턴스 생성 없이 클래스가 메모리에 로딩될 때 변수도 함께 로딩된다
즉, 개별 객체 생성과는 무관. 즉 인스턴스가 생성 전에 생긴다.
왜냐하면 클래스 변수의 소속이 객체가 아니라 클래스이기 때문
2) 클래스는
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대신 클래스 명을 쓰면 된다
ㅣ읽느라 수고 많으셨어요~ㅣ
부족한 글을 읽어주셔서 감사드립니다
아직 부족한 게 많으니
틀린 곳이 있다면
조언의 말씀 꼭 부탁드립니다!!!!
자바에서 보이는 final 제어자 도대체 왜 쓰는 거지? (0) | 2020.06.12 |
---|---|
자바이해하기_java Singleton 디자인 패턴이 뭐지? (0) | 2020.06.04 |
[JAVA ] 쉬운 자바 문법_조건문(if, else if)은 어떻게 공부해야 할까? (0) | 2020.06.03 |
[JAVA] 쉬운 자바 문법_산술연산자, 복합(확장) 대입 연산자 (0) | 2020.06.02 |
[java 기본] 이해하기 쉬운 자바_클래스(class), 인스턴스란? (0) | 2020.06.01 |