제주 탈출 일지

패스트캠퍼스 챌린지 13일차 본문

패스트캠퍼스 챌린지!

패스트캠퍼스 챌린지 13일차

귀건 2021. 9. 18. 23:31
728x90
반응형

13일차. 어제는 백신맞고 몸이 좀 안좋았는데 오늘도 그냥 메롱메롱 하다.. 내일은 좋아지겠지..?

 

16. 여러 인스턴스에서 공통으로 사용하는 변수를 선언하자 - static 변수

여러 인스턴스가 공통으로 사용하는 변수가 필요할 때 static 변수를 사용.

일반 멤버 변수로 하면 각 인스턴스 별로 다른 값을 가지게 됨.

static 변수를 사용하면 메모리의 특정 영역의 변수를 인스턴스들이 공유하게 된다.

 

하드디스크(프로그램) -> 메모리에 적재(프로세스 -> 스레드) 

 

메모리영역은 데이터 영역, 코드 영역으로 나눠짐

코드 영역은 명령어들이 상주 -> 라인 별로 수행됨

데이터 영역은 상수, 리터럴들이 constant영역에 잡히고, static 변수도 여기에 올라간다.

인스턴스가 올라가는 영역은 힙영역

 

static 변수가 사라지는 순간은 프로그램이 다 끝나고 영역이 해제될때이다.

 

인스턴스 생성과 상관없이 사용 가능하므로 클래스 이름으로 직접 참조해서 사용한다.

 

이 예제에서 employeeKim의 serialNum을 증가 시켜도, employeeLee의 serialNum이 employeeKim의 serialNum과 동일한 것을 알수 있다(공유된다)

그래서 이를 통해 각자의 사번을 결정하려고 하면 다음과 같이 할 수 있다.

 

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) {
		
		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());
		
		//System.out.println(employeeKim.serialNum);
		
		
	}

}

employee  생성자에 serialNum을 각 멤버변수의 ID에 부여하고 serialNum을 증가시키면 모든 인스턴스의 ID가 달라지게 할 수 있다.

 

데이터 영역, 힙 영역, 스택 영역, 코드 영역에 대한 메모리 영역들은 잘 알아두어야 하는데 다음 강의에서 진행할 것.

 

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

static 메서드에서는 인스턴스 변수를 사용할 수 없다.

static 메서드에서 인스턴스와 무관하게 클래스 이름으로 호출 될 수 있기 때문.

-> 멤버 변수가 아예 생성 되어 있지 않을수도 있다.

-> 다른말로 말하면 클래스의 인스턴스가 생성되지 않아도 static 메소드는 호출 할 수 있다.

하지만 일반 메서드에서 static 변수를 사용하는 것은 문제가 없다.

 

변수의 유효 범위와 메모리

변수 유형 : 지역변수, 멤버 변수, 클래스 변수(static 변수)

 

static변수는 프로그램이 메모리에 있는 동안 영역을 계속 차지하기 때문에 너무 큰 메모리 할당은 좋지 않다.

싱글톤 패턴이란 디자인 패턴에서 static 변수를 활용하기도 한다.

 

18. static 응용 - 싱글톤 패턴(singleton pattern)

디자인 패턴 -> 23가지 정도 됨.

객체지향에서 유지보수를 위한 패턴들을 만들었음.

확장성 유지보수에 용이하다.

그 중 하나인 싱글톤 패턴을 공부할 것.

 

싱글톤 패턴 : 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴.

 

package ch18;

public class Company {
	
	private static Company instance = new Company(); // 내부에서 인스턴스를 하나 생성.
	
	private Company() {
		
	} // 마음대로 new 할 수 없도록 private
	
	public static Company getInstance() {
		if ( instance == null)
			instance = new Company();
		
		return instance;
	}

}
package ch18;

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);
		System.out.println(company2);
		
		Calendar calendar = Calendar.getInstance();
		
	}

}

Company  클래스 내부의 생성자는 private로 제공되기 때문에, 외부에서 호출할 수 없다. -> new() 할 수 없음.

따라서 내부에서 인스턴스가 생성되고 그 인스턴스르 퍼블릭 메소드로 제공하는 형식으로 인스턴스가 하나만 있도록 유지할 수 있게 된다.

+ java.util의 캘린더 클래스도 싱글톤 패턴으로 사용된다.

 

오늘 내용은 쉽지만은 않았던것 같다. 그래도 오히려 재미있었다. ^^b

 

 

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

728x90
반응형
Comments