본문 바로가기

언어/Java

클래스

※ 클래스의 구성

    클래스 선언부 {

       멤버변수

       생성자

       메서드

        }

 

※ 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은 예약어, 반환값이 필요할 때가 있음
}

1. 인자값만 전달해서 기능 완성하는 함수, 반환값이 없을 때는 void 선언 2. 인자값, 반환값 받아야하는 함수 3. 반환값 필요한 함수(return) 반환값에 필요한 자료형 적으면됨. public 반환형타입 4. 둘다 필요없는 함수

     인자(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 메소드 호출 가능
	
	}

}

결과
옆의 많은 압축파일에서 String[] 라이브러리 class를 찾아내서 JVM으로 로드하고 바이트코드검증하고 재해석해서 메소드영역에 기억

 

※ 이클립스 우클릭 run as = oop>java -cp bin StaticTest 과 같은 효과
     : -cp bin은 실행에 필요한 클래스들을 bin에서 찾아라
    ① staticTest.class 파일 찾기
    ② JVM으로 로딩
    ③ 바이트코드 검증
    ④ 바이트코드를 0,1로 재해석 후 Method영역에 기억시킴
    ⑤ static 변수 자동초기화
    ⑥ main() 호출

 

garbage collection의 대상이 됨

※  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