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());
	}
}