WEB/Java
[JAVA] 객체지향입문- static 변수
서연연연
2023. 1. 22. 18:11
static 변수
- 여러 인스턴스를 공통으로 사용하는 변수
- 인스턴스가 생성될 때 만들어지는 변수가 아닌, 처음 프로그램이 메모리에 로딩될 때 메모리를 할당 <- 데이터 영역
- 클래스 변수, 정적변수라고도 함
- 인스턴스 생성과 상관 없이 사용 가능하므로 클래스 이름으로 직접 참조
ex) Employee.serialNum 으로 바로 참조해서 사용O
Employee
package ch16;
public class Employee {
public static int serialNum=1000;
private int employeeId;
private String employeeName;
private String department;
public Employee() {
serialNum++;//한명이 증가할 때마다 하나씩 증가
employeeId=serialNum;//기준값에 대입
}
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
package ch16;
public class EmployeeTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee employeeLee = new Employee();
employeeLee.setEmployeeName("이순신");
System.out.println(employeeLee.serialNum);
Employee employeeKim= new Employee();
employeeKim.setEmployeeName("김유신");
employeeKim.serialNum++;
System.out.println(employeeLee.getEmployeeName()+employeeLee.getEmployeeId());
System.out.println(employeeKim.getEmployeeName()+employeeKim.getEmployeeId());
//두 개의 인스턴스가 하나의 메모리, 하나의 변수를 접근
}
}
static 메서드
package ch16;
public class Employee {
private static int serialNum=1000; //외부에서 변경 불가능하도록 private로
private int employeeId;
private String employeeName;
private String department;
public Employee() {
serialNum++;//한명이 증가할 때마다 하나씩 증가
employeeId=serialNum;//기준값에 대입
}
public static int getSerialNum() {
return serialNum;
}
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;
}
}
package ch16;
public class EmployeeTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee employeeLee = new Employee();
employeeLee.setEmployeeName("이순신");
System.out.println(employeeLee.getSerialNum());
Employee employeeKim= new Employee();
employeeKim.setEmployeeName("김유신");
System.out.println(employeeLee.getEmployeeName()+employeeLee.getEmployeeId());
System.out.println(employeeKim.getEmployeeName()+employeeKim.getEmployeeId());
//두 개의 인스턴스가 하나의 메모리, 하나의 변수를 접근
}
}
변수의 유효 범위와 메모리
- 변수의 유효범위(scope)와 생성과 소멸(life cycle)은 각 변수의 종류마다 다름
- static변수는 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리를 할당하는 것은 좋지 않음
- 클래스 내부의 여러 메서드에서 사용하는 변수는 멤버 변수로 선언하는 것이 좋음
- 멤버 변수가 너무 많으면 인스턴스 생성 시 쓸데없는 메모리가 할당됨
- 상황에 적절하게 변수 사용해야함
static 응용- 싱글톤패턴
Company
package ch17;
public class Company {
//생성자를 company를 생성
//컴파일러는 생성자를 마음대로 생성할 수 O
private static Company instance = new Company();
private Company() {
}
public static Company getInstance() {
if(instance==null) {
instance= new Company();
}
return instance;
//외부에서 접근 가능하도록
}
}
CompanyTest
package ch17;
import java.util.Calendar;
public class CompanyTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Company company = Company.getInstance();
//이미 인스턴스 만들어놨으니 바로 가져다 써서 사용
//여러개 생성해도 같은 인스턴스만 생성
System.out.println(company);
Calendar calendar = Calendar.getInstance();
}
}
과제(static과 싱글톤 패턴)
자동차 공장이 있습니다. 자동차 공장은 유일한 객체이고, 이 공장에서 생산되는 자동차는 제작될 때마다 고유한 번호가 부여됩니다. 자동차 번호가 1001부터 시작되어 자동차가 생산될 때마다 1002,1003 이렇게 번호가 붙도록 자동차 공장 클래스, 자동차 클래스를 구현하세요
package ch19;
public class Car {
private int carNum;
private String carName;
public static int serialNum=1001;
public Car() {
this.carNum=serialNum;
serialNum++;
}
public int getCarNum() {
return carNum;
}
}
package ch19;
public class CarFactory {
private String factoryName;
private String factoryAddress;
private static CarFactory instance = new CarFactory("순양","평택");
private CarFactory(String name, String address) {
this.factoryName=name;
this.factoryAddress=address;
}
public static CarFactory getInstance() {
return instance;
}
public Car createCar() {
Car car=new Car();
return car;
}
}
package ch19;
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());
System.out.println(yourSonata.getCarNum());
}
}