자바 프로그래밍 입문 #9

자바 공부기록9일차


변수의 유효범위

변수의 유효범위

①지역변수
지역변수는 함수나 메서드 내부에 선언해 함수 밖에서 사용할 수 없다. 지역변수가 생성되는 메모리를 스택(stack)이라고 한다. 스택에 생성되는 지역 변수는 함수가 호출될 때 생성되었다가 함수가 반환되면 할당되었던 메모리 공간이 해제되면서 함께 없어진다.

②멤버변수
멤버변수는 인스턴스 변수라고도 한다. 클래스가 생성될 때 힙(heap)메모리에 생성되는 변수이다. 멤버변수는 클래스의 어느 메서드에서나 사용할 수 있다.

③static변수
사용자가 프로그램을 실행하면 메모리에 프로그램이 상주한다.이때 프로그램 영역 중에 데이터 영역이 있다. 이 영역에는 상수나 문자열, static변수가 생성된다. 인스턴스 변수는 객체가 생성되는 문장 즉 new가 있어야 하지만 static 변수는 클래스 생성과 상관없이 처음부터 데이터 영역 메모리에 생성된다.
이렇게 생성된 static변수는 private변수가 아니라면 클래스 외부에서도 객체 생성과 무관하게 사용가능하다. 프로그램 실행이 끝난 뒤 메모리에서 내려가면 (예를 들어 워드 프로그래에서 [닫기]를 한 경우) static변수도 소멸된다.

변수 유형에 따른 용도

앞에서 배운 세 가지 변수를 표로 정리해 보자.

ㅤ변수 ㅤ유형선언 위치사용 범위ㅤㅤㅤㅤ메모리ㅤㅤ생성과 소멸ㅤㅤㅤ
지역변수(로컬)함수 내부에 선언함수 내부에서만 사용스택함수가 호출될 때 생성되고 함수가 끝나면 소멸
멤버변수(인스턴스)클래스 멤버변수로 선언클래스 내부에서 사용하고 private이 아니면 참조변수로 다른 클래스에서 사용가능인스턴스가 생성될 때 힙에 생성되고,가비지 컬렉터가 메모리를 수거할 때 소멸됨
static변수(클래스 변수)static예약어를 사용하여 클래스 내부에 선언클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용가능데이터 영역프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸됨

static응용

싱글톤 패턴

객체지향프로그램에서 인스턴스를 단 하나만 생성하는 디자인패턴을 싱글톤 패턴(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( ) { }

단계 3:외부에서 참조할 수 있는 public메서드 만들기

이제 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( )메서드 구현

단계 4: 실제로 사용하는 코드 만들기

외부 클래스에서는 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을 사용하여 유일한 객체를 생성하는 싱글톤 패턴을 구현할 수 있다.


좋은 웹페이지 즐겨찾기