본문 바로가기
Programming/JAVA(eclipse)

java 7일차 _02.static

by yoon9i 2024. 3. 18.

4. 메서드 호출시 파라미터에 전달하는 값(인자값,argument)
   인 기본형 vs 참조형

=> call by value vs call by Reference

1) call by value
==> 메서드 호출시 파라미터에 인자값으로 기본형 데이터를
       전달 할 수 있다. 이때, 전달받은 메서드에서 값을 수정
       할수있음. 원본은 변경 안됨.

2) call by Reference
==> 메서드 호출시 파라미터에 인자값으로 참조형 데이터를
       ( 클래스, 배열 ) 를 전달 할 수 있다. 이때, 전달받은 메서드
       에서 값을 수정할 수 있다. 원본이 변경됨.
       이유는 전달되는 인자값이 주소값이기 때문이다.

 

///////////////////////////////////////////////////////////////////////////////////////////////////////

 

5. static 키워드 ( 정적 키워드 )
1) 개념: 프로그램 실행과 관련된 키워드임.
           ( 객체생성인 new 와 무관, 객체생성 전에 결정된다. )
          static 으로 지정된 변수 및 메서드, 클래스는 프로그램
          실행시 생성이 된다. ( * )

2) 로컬변수 vs 인스턴스 변수 vs static 변수
로컬변수: 메서드 안에서 선언. 
             메서드 호출 ~ 메서드 종료

인스턴스변수: 메서드 밖에서 선언. 
             객체생성(new) ~ 객체소멸.
             객체소멸시점? heap 에 생성된 인스턴스를 참조못할때
사용방법?
Cat c = new Cat( );
c.변수명;
 생성횟수? new 할때 마다 매번 생성된다.(공유안됨)
 용도: 객체의 속성 저장 (ex) 고양이 이름,나이

static변수: 메서드 밖에서 선언하고 static 으로 지정.
              프로그램실행 ~ 프로그램종료
  method area 메모리
              프로그램실행시점? run > main 시작
              프로그램종료시점? main 종료
  ==> 객체생성(new) 과 무관하다.( * )
                      객체생성(new)전에 생성된다.
    사용방법? 클래스명.static메서드( );
  생성횟수? 한번만 생성된다
  용도: 한번만 생성되고 가장 lifecycle 길다.
  ==> 데이터를 공유할 목적
  * 주의할점
  - 인스턴스 변수 및 this 키워드 사용불가
  ==> 아직 인스턴스가 생성 안됨.
  - 상속관련에서는 오버라이딩(Overriding) 불가


3) 메서드(인스턴스 메서드, 멤버 메서드) vs static 메서드

메서드(인스턴스 메서드, 멤버 메서드)
- 생성시점? new 할때(객체생성) 생성
- 소멸시점? 객체소멸시 제거
- 사용방법? Cat c = new Cat( );
                c.메서드명( );
- 생성횟수? new 할때 마다 매번 생성된다.
   (실제로는 공유한다.)

static 메서드
- 생성시점? 프로그램 실행시 생성
- 소멸시점? 프로그램 종료시 제거
==> 객체생성(new) 과 무관하다.( * )
       객체생성(new)전에 생성된다.
- 사용방법? 클래스명.static메서드( );
- 사용횟수? 한번만 생성된다.
- 용도: new 없이 사용할 목적이다.
ex) Integer.parseInt("10");

4) 일반 클래스 vs static 클래스
==> static 클래스는 반드시 중첩 클래스에서만 사용이 가능하다.
* 중첩클래스

public class A { // 외부클래스, outer class 
   // 변수
   // 생성자
   // 메서드

   // 클래스(중첩클래스, nested class, inner class)
   static class B {

   }// end B

}// end A

==> A 클래스는 반드시 new 해야 된다.
       하지만 B 클래스는 프로그램 실행시 자동으로 생성된다.


5) static 블럭 ( * )
==> 문법:
static {
  실행문;



       특징: 프로그램 시작할 때 자동으로 실행된다.
  초기화 작업 (ex) DB 및 파일 연동시 )

 

package exam10_static;


// .java 로 만들어야하지만 여기서도 가능하다는걸 보여주기위해서 작성
class Counter {
	
	int num; // 인스턴스 변수. 매번 생성되기 때문에 누적용으로 사용 불가.
	// static 변수. 프로그램 실행시 단 한번만 생성 + lifecycle 가장 길다.
	// ==> 공유목적의 누적용
	static int count; 
	
	public Counter() {
//		num++;
		count++;
	}
	
	public int getNum() { // 인스턴스 메서드, 객체생성(new)시 생성.
//		return num;
		return count;
	}
	
}// end Counter 


public class StaticTest {
	public static void main(String[] args) {
		// Counter 클래스를 몇번 객체생성했는지 숫자 세기
		// static 변수 접근 가능: 클래스명.변수
		// new 하기 전에도 접근가능 - Counter.count
		System.out.println(Counter.count); // 0, static 변수는 자동초기화됨.
		
		// new 한 후에도 접근가능 - Counter.count
		Counter c = new Counter();
		System.out.println(c.getNum()); // 1(num) / 1(count)
		System.out.println(Counter.count); // 1, static 변수는 자동초기화됨.
		Counter c2 = new Counter();
		System.out.println(c2.getNum()); // 1(num) / 2(count)
		System.out.println(Counter.count); // 2, static 변수는 자동초기화됨.
	}

}

 

package exam10_static2;


// .java 로 만들어야하지만 여기서도 가능하다는걸 보여주기위해서 작성
class Counter {
	
	int num; // 인스턴스 변수. 매번 생성되기 때문에 누적용으로 사용 불가.
	
	static int count; 
	// static 변수. 프로그램 실행시 단 한번만 생성 + lifecycle 가장 길다.
	// ==> 공유목적의 누적용
	
	public Counter() {
//		num++;
		count++;
	}
	
	public int getNum() { // 인스턴스 메서드, 객체생성(new)시 생성.
		System.out.println(this); // this 사용가능
		return num; // 인스턴스 변수 접근 가능
//		return count; // static 변수 접근 가능
	}
	
	/*
	 * stati 메서드 사용시 주의할점
	 * - 인스턴스 변수 및 this 키워드 사용불가 ==> 아직 인스턴스가 생성 안됨.
	 */
	
	
	public static int getCount() { // static 메서드, 객체생성과 무관, 프로그램 실행시 생성.
		// heap 메모리에 생성된 자신의 인스턴스를 참조하는 this 사용불가
//		System.out.println(this); // this 사용불가능;
		
		return count; // static 변수 접근 가능
//		return num; // 인스턴스 변수 접근 불가능 ==> num 인스턴스 변수는 아직 생성안됨.(new 할떄 생성)
	}
	
}// end Counter 


public class StaticTest {
	public static void main(String[] args) {
		// Counter 클래스를 몇번 객체생성했는지 숫자 세기
		// new 전에 static 메서드 호출가능.
		// static 메서드 용도: new 없이 메서드 사용하기 위해서.
		// 대표적: Integer.parseInt("10");
		System.out.println(Counter.getCount()); // 0
		
		Counter c = new Counter();
		System.out.println(Counter.getCount()); // 1 ; c.getCount() 가능 (권장안함)
		Counter c2 = new Counter();
		System.out.println(Counter.getCount()); // 2
	}

}

 

package exam10_static3;


public class Static블럭Test {
	
	// static 블럭
	// : 반드시 필요한 선처리 작업을 주로 구현한다.
	static {
		System.out.println("static 블럭");
	}
	
	// instance 블럭
	// : 거의 사용 안됨.
	{
		System.out.println("instance 블럭");
	}
	
	
	public Static블럭Test() {
		System.out.println("Static블럭Test 생성자");
	}
	
	public static void main(String[] args) {
		// 인스턴스 생성 및 new 할때 instance 블럭 이 실행
		Static블럭Test t = new Static블럭Test(); 
	}
}

/*
 * >>>
1. static 블럭
2. instance 블럭
3. Static블럭Test 생성자

순서대로 실행됨.
 */

'Programming > JAVA(eclipse)' 카테고리의 다른 글

java 8일차 _ 7일차 리뷰  (0) 2024.03.19
java 7일차_ 03. import & package (+ UML )  (0) 2024.03.18
java 7일차 _01.메서드  (0) 2024.03.18
java 7일차 _ 6일차정리  (0) 2024.03.18
java 6일차_ 02. 메서드  (0) 2024.03.15