Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 오버로딩
- SQL
- 변수명명규칙
- read()함수
- 자바if문
- 자바형식
- 겟셋함수
- 연산자우선순위
- 클래스배열
- 자바접근지정자
- 자바별찍기
- 자바실행방법
- 자바switch문
- 반복문라벨
- 자바함수
- 자바클래스
- 누승재귀
- 변수의 초기화
- 자바상수
- 자바연산자
- 자바자료형
- 자바제어문
- 기타제어자
- 자바기타제어자
- 프로그래머스
- 오라클
- 자바수우미양가
- 중첩for문
- 효율적인연산
- 팩토리얼재귀
Archives
- Today
- Total
h-i-s-t-o-r-y
[Java] 기타제어자 - static 본문
> 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
//하나의 클래스로부터 생성된
//모든 [인스턴스의 메서드]와 [클래스변수]는 서로 동일하기때문에
//인스턴스간의 차이는, 인스턴스마다 각기 다른 값을 가질 수 있는 [인스턴스 변수] 뿐이다
'Java' 카테고리의 다른 글
[Java] 오버라이딩(Overriding) / 패키지(package)와 import (0) | 2021.07.17 |
---|---|
[Java] 상속(Inheritance) - 클래스 간의 관계 (0) | 2021.07.17 |
[Java] 클래스, 인스턴스(변수/메서드) 용어 정리 / 변수의 초기화 (0) | 2021.07.17 |
[Java] 생성자(Constructor) / this의 의미 (0) | 2021.07.17 |
[Java] 가변인자(varargs)와 오버로딩 (0) | 2021.07.17 |