static메서드의 구현과 활용 & 변수의 유효 범위

일상 코딩·2022년 8월 5일

01.static 메서드 만들기

  • serialNum 변수를 private으로 선언하고 getter/setter 구현

Employee.java

package ch16;

public class Employee {
	
	private static int serialNum = 1000; // static 두개의 인스턴스가 하나의 메모리를 공유한다.
	
	private int employeeId;
	private String employeeName;
	private String department;
	
	public Employee() {
		serialNum++;
		employeeId = serialNum; // 모두가 공유하는 static 변수의 값을 인스턴스 객체의 메모리에 각각 할당 
	}
	
	public int getEmployeeId() {
		return employeeId;
	}
	public static int getSerialNum() {
		return serialNum;
	}
	
	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;
	}	
}
  • 정적 메서드를 사용하면 클래스 이름으로 호출 가능 (클래스 이름.정적 메서드 이름)
System.out.println(Employee.getSerialNum());

02.static 메서드(정적 메서드)에서는 인스턴스(맴버) 변수를 사용할 수 없다

  • static 메서드는 인스턴스 생성과 무관하게 클래스 이름으로 호출 될 수 있습니다.
  • 인스턴스 생성 전에 정적 메서드가 호출 될 수 있으므로 정적 메서드 내부에서는 인스턴스 변수를 사용할 수 없습니다.

Employee.java

public static void setSerialNum(int serialNum) {
		int i = 0;
		
		employeeName = "Lee";  // 정적 메서드에서 맴버 변수를 사용할 경우 오류발생
		Employee.serialNum = serialNum;
	}
  • 정적 메서드에서 인스턴스 객체를 생성하지 않은 상태에서는 사용할 수 없습니다.
public static int getSerialNum() {
		Employee employee = new Employee();
		employee.employeeId = 10;
		return employee.employeeId;
}
System.out.println(Employee.getSerialNum()); // 10
  • 정적 메서드에서 인스턴스 객체를 생성해야 사용가능 합니다.

EmployeeTest.java

public class EmployeeTest2 {

	public static void main(String[] args) {

		System.out.println(Employee.getSerialNum());
	}
}

Employee.java

public String getEmployeeName() {
		serialNum = 2000;
		return employeeName;
}
  • 하지만 일반 메서드 내부에서 정적 변수를 사용하는 것은 아무런 문제가 되지 않습니다.
  • 그 이유는 static변수는 프로그램이 처음 실행될 때 데이터 영역 메모리에 생성되어 이미 메모리상에 존재하는 변수이기 때문에 아무런 문제가 발생하지 않습니다.

03.변수의 유효 범위와 메모리

  • 변수의 유효 범위(scope)와 생성과 소멸(life cycle)은 각 변수의 종류마다 다르다.
  • 지역변수, 멤버 변수, 클래스 변수는 유효범위와 life cycle, 사용하는 메모리도 다르다.
  • static 변수는 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리를 할당하는 것은 좋지 않습니다.
  • 클래스 내부의 여러 메서드에서 사용하는 변수는 멤버 변수로 선언하는 것이 좋습니다.
  • 멤버 변수가 너무 많으면 인스턴스 생성 시 쓸데없는 메모리가 할당됩니다.
  • 상황에 맞게 변수를 사용해야 합니다.

04.Static의 장단점

장점
1.메모리 측면에서 효율적이다.

  • Static 메모리 영역에 저장되어 고정된 메모리 영역을 사용하기 때문에 매번 인스턴스를 생성하며 낭비되는 메모리를 줄일 수 있습니다.

2.객체를 생성하지 않고 사용가능 하기 때문에 속도가 빠르다.

  • 클래스가 메모리에 올라가는 시점에 생성되어 바로 사용이 가능하기에 속도면에서 이점을 가진다.

단점
1.프로그램 종료시까지 메모리에 할당된 채로 존재한다.

  • 만약 프로그램에서 많은 Static을 사용하게 되면 종료시까지 메모리가 할당된 채로 존재하므로 프로그램 퍼포먼스에 악영향을 주게 된다.

2.객체지향적이지 못하다.

  • Static은 따로 객체를 생성하지 않고 메모리의 Static영역에 할당된 곳에서 여러 클래스들이 데이터를 불러온다.

3.Static 메서드는 Interface를 구현하는데 사용될 수 없다.

  • Static 메서드는 코드의 재사용성을 높여주는 자바의 유용한 객체지향적 기능(Interface 등)을 사용하는 것을 방해한다.
profile
일취월장(日就月將) - 「날마다 달마다 성장하고 발전한다.」

0개의 댓글