자바 공부기록9일차
①지역변수
지역변수는 함수나 메서드 내부에 선언해 함수 밖에서 사용할 수 없다. 지역변수가 생성되는 메모리를 스택(stack)이라고 한다. 스택에 생성되는 지역 변수는 함수가 호출될 때 생성되었다가 함수가 반환되면 할당되었던 메모리 공간이 해제되면서 함께 없어진다.
②멤버변수
멤버변수는 인스턴스 변수라고도 한다. 클래스가 생성될 때 힙(heap)메모리에 생성되는 변수이다. 멤버변수는 클래스의 어느 메서드에서나 사용할 수 있다.
③static변수
사용자가 프로그램을 실행하면 메모리에 프로그램이 상주한다.이때 프로그램 영역 중에 데이터 영역이 있다. 이 영역에는 상수나 문자열, static변수가 생성된다. 인스턴스 변수는 객체가 생성되는 문장 즉 new가 있어야 하지만 static 변수는 클래스 생성과 상관없이 처음부터 데이터 영역 메모리에 생성된다.
이렇게 생성된 static변수는 private변수가 아니라면 클래스 외부에서도 객체 생성과 무관하게 사용가능하다. 프로그램 실행이 끝난 뒤 메모리에서 내려가면 (예를 들어 워드 프로그래에서 [닫기]를 한 경우) static변수도 소멸된다.
앞에서 배운 세 가지 변수를 표로 정리해 보자.
ㅤ변수 ㅤ유형 | 선언 위치 | 사용 범위ㅤㅤ | ㅤㅤ메모리ㅤㅤ | 생성과 소멸ㅤㅤㅤ |
---|---|---|---|---|
지역변수(로컬) | 함수 내부에 선언 | 함수 내부에서만 사용 | 스택 | 함수가 호출될 때 생성되고 함수가 끝나면 소멸 |
멤버변수(인스턴스) | 클래스 멤버변수로 선언 | 클래스 내부에서 사용하고 private이 아니면 참조변수로 다른 클래스에서 사용가능 | 힙 | 인스턴스가 생성될 때 힙에 생성되고,가비지 컬렉터가 메모리를 수거할 때 소멸됨 |
static변수(클래스 변수) | static예약어를 사용하여 클래스 내부에 선언 | 클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용가능 | 데이터 영역 | 프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸됨 |
ㅤ
ㅤ
객체지향프로그램에서 인스턴스를 단 하나만 생성하는 디자인패턴을 싱글톤 패턴(singleton pattern)이라고 한다. 싱글톤 패턴은 static을 응용하여 프로그램 전반에서 사용하는 인스턴스를 하나만 구현하는 방식이다.
✍잠깐 메모
프레임워크(framework)
프로그램을 쉽게 개발하기 위해 기능 설계와 구현을 미리 만들어 놓은 도구
디자인 패턴(design pattern)
객체 지향프로그램을 어떻게 구현해야 좀 더 유연하고 재활용성이 높은 프로그램을 만들 수 있는지 정리한 내용이 디자인패턴이다. 프로그램 특성에 따른 설계 유형을 이론화한 내용이며 객체지향으로 설계하는 방법을 설명한 것.
**
단계 1: 생성자를 private로 만들기
싱글톤 패턴에서는 생성자를 항상 명시적으로 만들고 그 접근제어자를 private로 지정해야 한다.그러면 conpany클래스 내부에서만 이 클래스의 생성을 제어할 수 있다.
package Singleton
public class Company {
private Company( ) { }//생성자
}
단계 2: 클래스 내부에 static으로 유일한 인스턴스 생성하기
단계 1에서 외부 인스턴스를 생성할 수 없도록 만들었다. 하지만 우리가 프로그램에서 사용할 인스턴스 하나 정도는 필요하다. 따라서 company클래스 내부에서 하나의 인스턴스를 생성한다. 이 인스턴스가 프로그램 전체에서 사용할 유일한 인스턴스가 된다.
또한 private으로 선언하여 외부에서 이 인스턴스에 접근하지 못하도록 제한해야 인스턴스 오류를 방지할 수 있다.
package singleton
public class Company {
private static void main(String[ ]args); //유일하게 생성한 인스턴스
private Company( ) { }
ㅤ
이제 private으로 선언한 유일한 인스턴스를 외부에서도 사용할 수 있도록 설정해야 한다. 이를 위해 public메서드를 생성한다. 그리고 유일하게 생성한 인스턴스를 반환해 준다. 이때 인스턴스를 반환하는 메서드는 반드시 static으로 선언해야 한다. 왜냐하면 getInstance( )메서드는 인스턴스 생성과 상관없이 호출할 수 있어야 하기 때문이다.
package singleton
public class Company {
private static void main(String[ ]args);
private Company( ) { }
**public static Company getInstance( ) {
if(instance == null) {
instance = new Company( );
}
return instance;** //유일하게 생성한 인스턴스 반환
//인스턴스를 외부에서 참조할 수 있도록 public get( )메서드 구현
외부 클래스에서는 Company를 생성할 수 없으므로 static으로 제공되는 getInstance( )메서드를 호출한다. Company.getInstance( );와 같이 호출하면 반환 값으로 유일한 인스턴스를 받아온다. 다음 예제에서 유일한 인스턴스를 대입한 두 변수의 주소 값이 같은지 확인해 봅시다.
public class CompanyTest {
public static void main(String[]args) {
Company myCompany1 = Company.getInstance();
Company myCompany2 = Company.getInstance();
//클래스 이름으로 getInstance( )호출하여 참조 변수에 대입
system.out.println(myCompany1 == myCompany2);
} //두 변수가 같은 주소인지 확인
}
myCompany1과 myCompany2를 비교해 보면 같은 참조 값을 가지는 동일한 인스턴스임을 알 수 있다. 여러 번 호출해 보아도 같은 주소의 인스턴스가 반환될 것이다. 또 Company클래스는 내부에 생성된 유일한 인스턴스 외에는 더 이상 인스턴스를 생성할 수 없다.
이처럼 static을 사용하여 유일한 객체를 생성하는 싱글톤 패턴을 구현할 수 있다.