Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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 31
Archives
Today
Total
관리 메뉴

Super Coding Addict

Ch05. 클래스와 객체(3) 본문

JAVA 문법

Ch05. 클래스와 객체(3)

밍응애 2021. 1. 19. 12:48

< 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