본문 바로가기
JAVA

JAVA (Static, 익명클래스)

by 글로리. 2020. 6. 11.

Static

  • 클래스 설계 시, 모든 객체에서 공통적으로 사용해야 하는 멤버변수 앞에 static을 붙인다.
  • 메모리를 효율적으로 사용이 가능하다(객체 1개당 4byte 생성)
  • 일반메서드 -> static메서드 호출가능, static메서드 -> 일반메서드 호출불가.
  • static은 프로그램 전체에서 사용 할 수 있는 전역변수 라 생각 해도 무방.

고정영역 : 프로그램이 작동하는 동안 할당되는 영역 (설치된파일, 프로그램)

  • 코드영역
    프로그램의 코드가 저장되는 영역
    CPU가 하나씩 가져가 실행한다.
  • 데이터영역
    전역변수static 으로 선언되는 변수
    이 영역에 할당되는 변수들은 프로그램 시작과 동시에 메모리 공간이 할당되어 종료될 때 까지 남아있는다.

동적영역 : 소스코드가 실행될 때 할당되는 영역 (소스코드 안에 있는 변수, dll파일)

  • 힙 영역
    프로그래머가 원하는 시점에 변수를 할당, 소멸시키는 영역
    객체가 생성되는 영역, 메모리 동적 할당시 사용됨
  • 스택(메서드 실행 순서)영역
    함수가 실행될 때 사용되는 파라미터와 지역변수에 대한 메모리 공간.
    함수의 종료와 함께 소멸.

GC(가비지 컬렉터) : 사용하지않는 메모리를 정리

  • 실행방법
    system.GC 입력

멤버변수와 static멤버변수

  • static변수 는 프로그램의 실행과 동시에 객체의 생성 여부와 상관없이 이미 존재하기 때문에 소스코드에서는
    특정 클래스 안에 명시하지만, 일반 객체나 멤버변수와는 다른존재.
  • 객체가 생성되지 않았더라도 이미 존재하고 있기 때문에 static변수는 클래스의 이름을 통해 접근해야 한다.
  • static변수가 선언된 클래스 안에서는 직접 접근이 가능하다.
// Article 클래스 및 다른 클래스에서 접근하는 경우
Article.count = 3;
Article.category = "공지사항";

// Article 클래스에서 접근하는 경우
count = 3;
category = "공지사항";

static 데이터에 접근하기 위한 메서드

  • 클래스에서 정의하는 일반메서드들은 객체의 생성과 동시에 동적 메모리영역에서 활성화 된다.
    • 동적 메모리 영역의 입장에서는 고정 메모리 영역의 자원들은 항상 존재한다.
    • 고정 메모리 영역의 자원들은 동적 메모리의 자원들이 항상 존재하는것이라는 보장을 받지 못한다.
  • 그러므로 객체의 생성과 상관없이 static 변수에 접근하기 위한 메서드를 만들 필요가 있는데, 메서드의 정의 과정에서
    static키워드를 사용하면 static자원에 접근하기 위한 메서드를 만들 수 있다.

SingleTon

  • 프로그램 내의 여러곳에서 반복적으로 사용되어야 하는 객체에 대해 전역적인 범위를 갇도록 객체를 생성, 공유하기 위한 클래스 작성 패턴.

SingleTon 객체의 이점

  • 프로그램 전역에서 활용할 재료로 사용되는 공유 기능을 하나만 생성하여 여러 곳에서 재사용함으로서 메모리를 효율적으로 가용 가능
  • 한번 객체를 생성하면 다시 생성할 필요가 없기때문에 일일이 생성해야 하는 번거로움을 피함.

SingleTon 객체 생성과정

  • static이 적용된 자원은 고정영역에 생성되기 때문에 클래스 자체의 객체, 멤버변수, 메서드와는 메모리상에서 구별된다.
public class Calc {
    // Calc클래스 이외의 곳에서 객체할당이 가능하다면 SingleTon이라는 개념이 성립되지 않기 때문에 은닉한다.
    private static Calc cuttent;
    // 객체가 할당되지 않았을때만 할당하도록 중복 할당 방지.
    public static Calc getInstance() {
        if (current == null) {
            current = new Calc();
        }
        return current;
    }
    // 객체에 null을 대입하면 메모리에서 삭제.
    public static void freeInstance() {
        currtent = null;
    }
    // 생성자 은닉으로 외부에서 객체할당 금지.
    private Calc() {
        super();
    }
}

SIngleTon 객체 사용

  • getInstance() 메서드를 사용하여 객체를 리턴.
// 1) 별도의 객체에 참조시키는 경우
Calc c = Calc.getInstance();
// 메서드 사용
c.foo();

// 2) 참조처리를 생략 후 직접 사용
Calc.getInstance().foo();

'JAVA' 카테고리의 다른 글

JAVA(fileIO, JSONObject)  (0) 2020.06.16
JAVA(예외처리, 날짜처리, 컬렉션)  (0) 2020.06.15
JAVA(추상화, 인터페이스)  (0) 2020.06.10
JAVA(객체형변환, 객체배열)  (0) 2020.06.10
JAVA(상속성, 다형성)  (0) 2020.06.09

댓글