반응형
16. static 변수
공통으로 사용하는 변수가 필요한 경우
- 여러 인스턴스가 공유하는 기준 값이 필요한 경우
- 학생마다 새로운 학번 생성
- 카드회사에서 카드를 새로 발급할 때마다 새로운 카드 번호를 부여
- 회사에 사원이 입사할 때마다 새로운 사번이 필요함
static 변수 선언과 사용하기
- static int serialNum;
- 인스턴스가 생성될 때 만들어지는 변수가 아닌, 처음 프로그램이 메모리에 로딩될 때 메모리를 할당
- 클래스 변수, 정적변수라고도 함
- 인스턴스 생성과 상관 없이 사용이 가능하므로 클래스 이름으로 직접 참조
- Student.serialNum = 100;
static 변수 테스트 하기
Employee.java
public class Employee {
public static int serialNum = 1000;
private int employeeId;
private String employeeName;
private String department;
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
EmployeeTest.java
public class EmployeeTest {
public static void main(String[] args) {
Employee employeeLee = new Employee();
employeeLee.setEmployeeName("홍길동");
System.out.println(employeeLee.serialNum); // 1000
Employee employeeKim = new Employee();
employeeKim.setEmployeeName("강감찬");
employeeKim.serialNum++; // 두개의 인스턴스가 메모리를 공유하기 때문에
// serialNum이 같이 증가함
System.out.println(employeeLee.serialNum); // 1001
System.out.println(employeeKim.serialNum); // 1001
}
}
static 변수는 인스턴스에서 공통으로 사용하는 영역임을 알 수 있음
회사원이 입사할 때 마다 새로운 사번 부여하기
Employee.java 생성자 구현
인스턴스가 생성될 때마다 serialNum이 증가되고
employeeId는 serialNum으로 설정하는 코드를 추가한다
17. static메서드의 구현과 활용, 변수의 유효 범위
static 메서드 만들기
- serialNum 변수를 private으로 선언하고 getter/setter 구현
static 메서드(클래스 메서드)에서는 인스턴스 변수를 사용할 수 없다
- static 메서드는 인스턴스 생성과 무관하게 클래스 이름으로 호출 될 수 있음
- 인스턴스 생성 전에 호출될 수 있으므로 static 메서드 내부에서는 인스턴스 변수를 사용할 수 없음
변수의 유효 범위와 메모리
- 변수의 유효 범위(scope)와 생성과 소멸(life cycle)은 각 변수의 종류마다 다름
- 지역변수, 멤버 변수, 클래스 변수는 유효범위와 life cycle, 사용하는 메모리도 다름
- static 변수는 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리를 할당하는 것은 좋지 않음
- 클래스 내부의 여러 메서드에서 사용하는 변수는 멤버 변수로 선언하는것이 좋음
- 멤버 변수가 너무 많으면 인스턴스 생성시 쓸데 없는 메모리가 할당됨
- 상황에 적절하게 변수를 사용해야함
18. static 응용 - 싱글톤 패턴 ( singleton pattern )
싱글톤 패턴이란
- 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴
- static 변수, 메서드를 활용하여 구현할 수 있음
싱글톤 패턴으로 회사 객체 구현하기
19. static과 싱글톤 패턴 복습
설명에 따른 객체를 구현하여 테스트 코드가 실행되도록 하기
Car.java
public class Car {
private static int serialNum = 1000;
String carName;
int carNum;
public int getCarNum() {
return carNum;
}
public void setCarNum(int carNum) {
this.carNum = carNum;
}
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
public Car() {
serialNum++;
carNum = serialNum;
}
}
CarFactory.java
public class CarFactory {
private CarFactory() {}
private static CarFactory instance = new CarFactory();
public static CarFactory getInstance() {
if (instance == null) {
instance = new CarFactory();
}
return instance;
}
public Car createCar() {
Car createCar = new Car();
return createCar;
}
}
CarFactoryTest.java
public class CarFactoryTest {
public static void main(String[] args) {
CarFactory factory = CarFactory.getInstance();
Car mySonata = factory.createCar();
Car yourSonata = factory.createCar();
System.out.println(mySonata.getCarNum()); //10001 출력
System.out.println(yourSonata.getCarNum()); //10002 출력
}
}
정답 소스가 올라와 있지 않아서 이게 맞는지 잘 모르겠다 ..
반응형
'Java' 카테고리의 다른 글
Java 객체 지향 핵심 / 상속, 형 변환, 재정의(override), 다형성 (0) | 2022.11.17 |
---|---|
Java 객체지향 입문 / 배열, 객체 배열, 2차원 배열, ArrayList (0) | 2022.11.16 |
Java 객체 지향 입문 / 접근 제어 지시자, 정보은닉, this, 객체간의 협력 (0) | 2022.11.09 |
Java 객체 지향 입문 / 인스턴스 생성과 힙 메모리, 생성자, 오버로딩, 참조 자료형 변수 (0) | 2022.11.08 |
Java 객체 지향 입문 / 객체지향이란, 클래스 구현, 함수와 메서드 구현 (0) | 2022.11.07 |