h-i-s-t-o-r-y

[Java] 기타제어자 - static 본문

Java

[Java] 기타제어자 - static

H' 2021. 7. 17. 22:57

> static 키워드 설명

ㄱ. static 필드 사용하는 이유 ? - 필드, 메서드, [클래스-나중에..]
      ( static 필드 의미 )
클래스당 하나만 생성 (어떤static필드들도 클래스당 하나의 메모리만 잡힌다는 뜻)
클래스의 모든 인스턴스가 같은 값을 공유하는 공통된 변수


ㄴ. static 메서드를 사용하는 이유 2가지? 
1) static 필드 접근하기 위해 static getter/setter메서드
2) 메서드를 사용하려면 객체를 생성한 후 객체명.메서드명()으로 접근해야 하는데,

static으로 선언하면 객체를 생성하지 않아도 프로그램이 시작하면 바로 사용할 수 있기 때문에 자주 사용하는 메서드를 static으로 선언한다.


package days17;

// 저축 관련된 클래스 - static 키워드 설명
public class Save {
	
	// 필드
	// [접근지정자] [기타제어자] 자료형 변수명[=초기값];
	// 인스턴스 변수
	String name = null;	//예금주
	int money = 0;		//예금액
	
	// 언제 ? 모든 인스턴스가 공유하는 고정값 일 때만 [static]
	// 클래스 변수 == static 변수 == 정적 변수 == 공유(shared) 변수
	// 1. static 붙인 이유 ?
	// 2. private 붙인 이유 ?
	//		ㄱ. static 클래스 변수 이더라도 private이면 접근안되는거 보여주려고
	//		ㄴ. 접근하는 방법 배우려고 - getter, setter
	private static double rate = 0.03;	//이자율	명시적 초기화
	// 1. 인스턴스가 생성될때마다 필드가 생성되지 않음
	// 2. 클래스당 하나만 생성
	// 3. static 키워드 사용
	// 4. 객체 생성될 때 클래스 변수가 생성 되는게 아니고,
	//		프로그램 시작하면 객체 생성이 되지 않았더라도 클래스 변수 생성됨
	// 5. 객체명.클래스 변수 (X)
	//		클래스명.클래스변수 (O)
	
	// private static 변수 - getter, setter 자동 생성
	// static 메서드 == 정적 메서드 == 클래스 메서드 == 
	public static double getRate() {
		return rate;
	}
	public static void setRate(double rate) {
		Save.rate = rate;
	}
	// 생성자
	Save(){}
	Save(String name, int money){
		this.money = money;
		this.name = name;
	}
	Save(String name, int money, double rate){
		this.money = money;
		this.name = name;
		this.rate = rate;
	}
	
	//인스턴스 메서드
	//입금
	public void inputMoney(int money) {
		this.money += money;
	}
	//출금
	public void outputMoney(int money) {
		this.money -= money;
	}
	//출력
	public void printSave() {
		
//		int test;			//지역변수
//		private int test;	//이거아니야 필드에만 쓰는거야
		
		System.out.printf("> 예금주:%s, 예금액:%d, 이자율:%.2f\n"
				, this.name, this.money, this.rate );
	}
	
}//class



// p.298
// [메서드]와 [클래스변수]는 모든 인스턴스의 [공통]이기 때문에
// [인스턴스간의 차이]는 인스턴스 각자의 (각기다르게 초기화 해준)[인스턴스 변수]이다.
package days17;

/**
 * @author user
 * @date 2021. 3. 30 - 오전 11:43:45
 * @subject	* static 키워드 설명
 * @content	static 필드
 * 			static 메서드
 * 			static 클래스
 * 			static {초기화 블럭}
 * 
 */
public class Ex04 {

	public static void main(String[] args) {
		// 프로그램 시작 동시에 메모리 할당..된다 -> 그래서 객체명X 클래스명 접근(O)
		// static 메서드를 사용하는 이유 ?
		//				선언
		// ㄱ. static 변수 == 클래스 변수를 접근(사용)하기 위해서
		// ㄴ. 너무 자주 사용하는 기능(메서드)가 있다면
		//		매번 객체를 생성한 후 객체명.메서드명()으로 호출하지 않고
		//		프로그램 시작시 바로 사용할 수 있도록 하기 위해
		//		static 메서드로 선언한다.
		
		
		// The field Save.rate [is not visible]
		// 메모리에 있지만 접근지정자 private이라 접근 못해서 사용X
		// 예) 차가 있는데 면허가 없는 것. 차가 없어서 못하는 게 아님.
		//				클래스명.클래스 변수
		// System.out.println(Save.rate);
		// static getter, setter 생성
		//				클래스명.클래스 메서드()
		System.out.println(Save.getRate());
		
		/*
		// 우리반 학생들이 기업은행 [보통예금] - 저축
		Save s1 = new Save("강현구", 10000);
		Save s2 = new Save("권희준", 5000);
		Save s3 = new Save("김나린", 23000);
		Save s4 = new Save("김민희", 8000);
		Save s5 = new Save("김양수", 100);
		
		// 5명의 예금정보 출력
		s1.printSave();
		s2.printSave();
		s3.printSave();
		s4.printSave();
		s5.printSave();
		*/
		
		
		// 클래스 배열 선언 및 초기화 - 예금 정보 출력
		
		/*
		// 클래스 배열 선언
		Save[] s = new Save[5];
		// 클래스 배열 초기화
		s[0] = new Save("강현구", 10000);
		s[1] = new Save("권희준", 5000);
		s[2] = new Save("김나린", 23000);
		s[3] = new Save("김민희", 8000);
		s[4] = new Save("김양수", 100);
		for (int i = 0; i < s.length; i++) {
			s[i].printSave();
		}
		 */
		
		// 클래스 배열 초기화
		Save[] s = {
				new Save("강현구", 10000),
				new Save("권희준", 5000),
				new Save("김나린", 23000),
				new Save("김민희", 8000),
				new Save("김양수", 100)
		};
		
		// 한번만 변경해도 모두 변경됨
		// [ Save.rate = 0.05; ]
		// 생성된 객체명.클래스변수 로도 사용가능하지만 잘안함
		// s[1].rate = 0.04;
		Save.setRate(0.07);
		
		
		for (int i = 0; i < s.length; i++) {
			s[i].printSave();
		}
		
		
	}//main

}//class


//rate같은 static변수로 
//된 것을 
//s[1]만 0.07 주는 것같이 하나만 바꿀수도 있나요??  X
		

//289페이지 예제에서
//new String[0]처럼 길이가 0인 배열을
//C에서는 허용되지 않는다는데 자바에서는 생성할 수 있는 이유가 특별히 있나요?? 
//그리고 어디에 쓰이나요??
//String [] m = new String[0]; // 선언해 본 적 한 번도 없어요.. 

//p298
//하나의 클래스로부터 생성된 
//모든  [인스턴스의 메서드]와 [클래스변수]는  서로 동일하기때문에
//인스턴스간의 차이는, 인스턴스마다 각기 다른  값을 가질 수 있는 [인스턴스 변수] 뿐이다
Comments