※ 클래스의 구성
클래스 선언부 {
멤버변수
생성자
메서드
}
※ public class 클래스이름{ // - 클래스 선언부
※ 변수 : variable이라고도 하고 field라고도 함
▷ 멤버필드(멤버변수)
class에서 선언한 변수. class 내부 어디에서든지 사용 가능
- 종류
: non-static variable(=instance variable)
: static variable
▷ 지역변수
자동 초기화되지 않기 때문에 개발자가 반드시 초기화 작업 진행해줘야 한다.
static 변수 : 메모리를 너무 오래차지하기 때문에 왠만하면 안쓰는게 좋다. 객체 사이의 공유변수라고도 한다.
인스턴스변수 : non-stati c변수, 객체가 생성될 때 자동 초기화
변수 종류 | 자동초기화 | 초기화시점 | 메모리영역 | 소멸시점 |
static 변수 (=class 변수) |
○ | 클래스 로드 시 | method 영역에 탑재 | 클래스 언로드 시 (프로그램이 끝나는 시점) |
인스턴스 변수 (=non-static 변수) |
○ | 객체 생성 시 | heap 영역에 탑재 | 객체 소멸 시 |
매개변수 지역변수 |
X | - | stack 영역에 탑재 | 메서드 종료 시 |
※ 클래스 실행하기 : d:\kosa202307\myjava\oop> java -cp bin First → first class를 bin 경로에서 찾아서 실행하라
※ 실행순서
1. First.class 파일(바이트코드 파일) 찾기
2. JVM으로 로딩(올림/보냄)
3. 바이트코드검증(깨졌는지 아니면 중간에 잘못들어갔는지)
4. 바이트코드 내용을 0.1로 해석 후 Method 영역*에 기억시킴
5. static 변수 자동초기화
6. main() 메서드 호출됨
public class First {
static int smf; //static member field, 자동초기화되어 현재 값 0
int mf; //non-static member field, 객체가 생성될 때 힙 영역에 할당되고 자동초기화됨
//인스턴스변수라고도 한다. 객체가 만들어질 때 객체 내 변수로 만들어짐.
public static void main(String[] args) {
int lv; // local variable 지역변수
// System.out.println(lv); // 자동초기화 안되서 에러발생
// System.out.println(smf); // 자동 초기화 됨, 0
// System.out.println(mf); // static 메서드 내부에서는 non-static 변수 사용불가
// Cannot make a static reference to the non-static field mf 에러남
First one; // 참조형 지역변수
one = new First(); // 인스턴스화(객체 만들기)
System.out.println(one.mf); // 0, 접근은 객체참조변수. 인스턴스변수
}
}
new부터 시작하고 First 클래스 힙영역 할당받음
First 클래스 내용 중에 초기화된 static 필드 빼고 non-static 필드가 힙영역에 만들어짐 first 클래스로 채워짐
만들어진 객체가 자동초기화
메서드에 대한 선언부, 인스턴스 객체만 힙영역 들어감
one 변수는 참조형으로서 지금 만들어진 객체에 대한 정보값만 가지고 있음
JVM 메모리 영역 중 메서드 영역, 힙 영역, 스택 영역 있음
JVM이 메인메서드가 끝나면 스택영역에 있던 지역변수들, 메모리 수거해감
연결되어있던 heap 영역에 있던 객체 메모리도 수거해감
가장 빨리 사라지는 변수 STACK 영역에 생성된 지역변수들 매개변수들
가장 오래 살아있는 변수 : static 변수, 메서드와 무관하게 프로그램이 끝날 때 로드된 클래스가 jvm에서 언로드될 때 사라짐
메모리를 너무 오래차지해서 권장되지는 않음, 메모리의 효율성이 떨어진다.
※ 메서드
메서드 내부에도 매개변수와 지역변수가 있다
메서드에서 선언한 변수는 메서드 안에서만 사용 가능
- parameter(매개변수) ex) public static void main(String[] args)에서 args
- local variable(지역변수) ex) int[] arr;
- 메시지 패싱을 해줄 수 있는 방법
사람이 계산기 객체의 더한다 기능 호출
계산기 객체가 인자값을 이용해서 결과값을 반환
▷ 종류
- static 메서드
- non-static 메서드(=인스턴스 메서드) : non-static 변수처럼 객체가 생성된 후에만 메서드 사용 가능
▷ 구성
public 반환형타입 메서드이름(필요 시 매개변수타입 매개변수명1, 매개변수타입 매개변수명2...) { // 메서드의 선언부
기능완성 // 메서드의 구현부
return 반환값; // return은 예약어, 반환값이 필요할 때가 있음
}
인자(Argument)가 전달이 되면 메서드의 매개변수에 자동 대입
class A{
static int si;
int i;
static void sm() {
// System.out.println(this.i); 객체가 생성될 수도 안될 수 도 있으니 this 예약어 쓸 수 없음, 인스턴스 변수 사용불가
System.out.println(si);
}
void m() {
System.out.println(this.i);
}
}
public class StaticTest {
public static void main(String[] args) {
System.out.println(A.si); //0
// System.out.println(A.i); //인스턴스변수는 객체를 생성한 후에만 초기화해서 사용가능해서 사용불가
A a1, a2;
a1 = new A();
a2 = new A();
System.out.println(a1.i); //0
System.out.println(a2.i); //0
System.out.println(a1.si); //0
System.out.println(a2.si); //0
a1.i++;
a1.si++;
System.out.println(a1.i); //1
System.out.println(a1.si); //1
System.out.println(A.si); //1
System.out.println(a2.i); //0
System.out.println(a2.si); //1
a1.m();
// A.m(); 불가능
A.sm();
a1.sm(); // 객체 생성해도 안해도 static 메소드 호출 가능
}
}
※ 이클립스 우클릭 run as = oop>java -cp bin StaticTest 과 같은 효과
: -cp bin은 실행에 필요한 클래스들을 bin에서 찾아라
① staticTest.class 파일 찾기
② JVM으로 로딩
③ 바이트코드 검증
④ 바이트코드를 0,1로 재해석 후 Method영역에 기억시킴
⑤ static 변수 자동초기화
⑥ main() 호출
※ null값 넣으면 연결고리 끊어짐, 그 즉시 쓰레기 수집되는건 아님. 일단 쓰레기봉투에 넣고 jvm이 시간날 때 수집해감.
인스턴스변수는 객체가 끊어지면 쓸모없어짐
'언어 > Java' 카테고리의 다른 글
문서용 주석 document comment (0) | 2023.07.28 |
---|---|
클래스 예제 (0) | 2023.07.28 |
이클립스 새 프로젝트 만들기 (0) | 2023.07.27 |
절차지향 VS 객체 지향 (0) | 2023.07.27 |
2차원 배열 예제 (0) | 2023.07.26 |