Super Coding Addict
Ch05. 클래스와 객체(3) 본문
< static 변수, 메서드 >
* static 변수 (= 클래스 변수, 정적변수)
- 클래스 하나에 여러개의 인스턴스가 만들어질 때, 같은 멤버변수라도 각 인스턴스마다 멤버변수의 메모리가 잡힘
--> 이런 변수를 멤버변수, 인스턴스 변수라고 함
- 그러나 모든 인스턴스가 같은 값을 공유할 필요가 있는 경우가 있다! (공유메모리 필요)
(cf. c언어 - 글로벌 변수)
- 이처럼 여러 인스턴스가 공유하는 값 --> static 변수!
- 데이터 영역 (상수영역, static 영역) 메모리에 자리를 잡음
- new 될 때마다 새로 잡히는 인스턴스 변수와는 다르게, 단 한번만 메모리가 잡히고 모든 인스턴스가 공유
- 언제 생성? new할 때가 아니라, 처음 프로그램이 로드될 때 데이터 영역에 생성
- 인스턴스 생성과 상관 없이 사용할 수 있어 클래스 이름으로 참조
- 프로그램 로딩시 메모리에 자리를 잡으므로 메모리 크기가 너무 큰 것은 되도록 X
- 언제 소멸? 프로그램 끝나고 메모리 해제시
- 예제
Student 클래스
package staticex;
public class Student {
private static int serialNumber = 1000; //static변수도 private로 선언하는게 좋다
private int studentID;
public String studentName;
public String address;
public Student(String name) {
studentName = name;
serialNumber++;
studentID = serialNumber; //공유하는 static 변수이므로 ID에 저장
}
public Student(int id, String name) {
studentID = id;
studentName = name;
address = "주소 없음";
serialNumber++;
studentID = serialNumber;
}
public void showStudentInfo() {
System.out.println(studentName + ", " + address);
}
public String getStudentName() {
return studentName;
}
public int getStudentID() {
return studentID; //private 변수이므로 public인 getter메서드로 가져옴
}
public static int getSerialNumber() { //static 메서드
int i = 0; //이 함수 안에 선언된 지역변수
//studentName = "Lee"; //static 메서드 안에서 인스턴스 변수 쓸 수 없다
return serialNumber; //static 변수
}
public static void setSerialNumber(int serialNumber) {
Student.serialNumber = serialNumber;
}
}
--> static 메서드 안에서 인스턴스 변수 쓸 수 없음!!
--> why? 인스턴스 변수는 new를 해야지 쓸 수 있는 것이므로...
cf. 일반메서드에서 static 변수를 쓸 수 있음 (처음에 프로그램이 메모리에 로드될 때부터 static변수가 생성되어 있으므로)
StudentIDTest 클래스
package staticex;
public class studentIDTest {
public static void main(String[] args) {
Student studentLee = new Student("Lee");
System.out.println(Student.getSerialNumber()); //클래스이름으로 access!
//인스턴스를 생성 안해도 이 static 변수사용엔 아무문제X
Student studentSon = new Student("Son");
System.out.println(studentLee.getStudentID());
System.out.println(studentSon.getStudentID());
}
}
* static 메서드 (=클래스 메서드, 정적 메서드)
- static 변수를 위한 기능을 제공
- static 메서드 안에서 인스턴스 변수 사용 불가 (메모리에 로드되는 시점차이 때문)
- 클래스 이름으로 참조하여 사용 (클래스이름.static메서드이름();)
< static 응용 - singleton Pattern >
* singleton pattern
- 단 하나만 존재하는 인스턴스
- 생성자를 private으로 (외부에서 호출불가), 내부에서 static으로 유일한 객체 생성
- 외부에서 유일한 객체를 참조할 수 있는 public static get() 메서드를 구현한다
- 예제
[ Company 클래스 ]
package staticex;
public class Company {
private static Company instance = new Company();
private Company() {} //외부에서 쓸 수 없는 생성자
public static Company getInstance() { //외부에서 인스턴스 생성과 상관없이 호출하기 위해 static
if(instance == null) {
instance = new Company(); //null이어도 단 하나만 생성해서 그걸 계속 사용하게 됨
}
return instance;
}
}
[ CompanyTest 클래스 ]
package staticex;
import java.util.Calendar;
public class CompanyTest {
public static void main(String[] args) {
Company company1 = Company.getInstance();
Company company2 = Company.getInstance(); //백번을 불러도 똑같은 애 반환받음
System.out.println(company1); //동일 address
System.out.println(company2); //동일 address
/* 결과 :
staticex.Company@6a5fc7f7
staticex.Company@6a5fc7f7
*/
// Calendar calendar = new Calendar(); //에러남!
Calendar calendar = Calendar.getInstance(); //가져오는 애는 언제나 단 하나
}
}
< 코딩해 보세요 >
- static과 singleton pattern
* 내 코드
[ CardCompany 클래스 ]
package card;
public class CardCompany {
private static CardCompany instance = new CardCompany();
private static int CardNum = 10001;
private CardCompany() {}
public static CardCompany getInstance() {
if(instance == null) {
instance = new CardCompany();
}
return instance;
}
public void issueNewCard(Card card) {
card.cardNum = CardNum++;
}
public void getCardCount() {
System.out.println("발급된 총 카드 개수는 " + (CardNum - 10001) + "개 입니다.");
}
}
[ Card 클래스 ]
package card;
public class Card {
public int cardNum;
}
[ CardTest 클래스 ]
package card;
public class CardTest {
public static void main(String[] args) {
CardCompany cardcomp = CardCompany.getInstance();
cardcomp.issueNewCard(new Card());
cardcomp.issueNewCard(new Card());
cardcomp.issueNewCard(new Card());
cardcomp.getCardCount();
}
}
www.fastcampus.co.kr/dev_online_jvweb
'JAVA 문법' 카테고리의 다른 글
Ch07. 상속과 다형성 (1) (0) | 2021.01.22 |
---|---|
Ch06. 배열(2) (0) | 2021.01.20 |
Ch06. 배열(1) (0) | 2021.01.19 |
Ch05. 클래스와 객체(2) (0) | 2021.01.19 |
Ch05. 클래스와 객체(1) (0) | 2021.01.18 |