ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바기초] 클래스와 객체 | static 변수와 메서드
    º Language º/Java 2023. 3. 4. 16:51

    # static 변수가 뭐야?

     

    - 여러 개의 인스턴스(instance)들이 같은 메모리의 값을 공유하기 위해 사용하는 클래스 변수야

    - static 변수는 데이터영역(=상수영역, 정적영역) 메모리에 따로 저장돼

    - static 변수는 class 변수라고도 해

     

    인스턴스(instance)란?

    - 하나의 클래스에서 생성된 각각의 객체

    - 즉 클래스가 구체화되어 클래스에서 정의된 속성과 성질을 가진 실제적인 객체

    - 멤버변수는 인스턴스변수라고도 함

     

     

    코드 예시

    여러 instance들이 같은 메모리 값을 사용하도록 static변수 선언

    > serialNumber를 static으로 선언하면 모든 student instance 에 대해 하나의 변수로 유지 되고 이러한 변수를 class변수(=static변수)라한다.

     

     

     

    # 프로그램에서 쓰는 메모리 (3가지)

     

    1. 데이터 영역

    - static 변수(여러 instance들을 하나의 메모리로 공유하여 사용하는 변수)

    - literal (데이터 그 자체, 변수에 넣는 변하지 않는 데이터를 의미)

     

    코드예시

    int a = 1;

    >  여기서 literal은1이고, int 앞에 final을 붙일 시 a 는 상수(constant)가 된다. 

     

    * 상수(constant)와 리터럴(literal)의 차이는?

    - 상수 : 변하지 않는 변수를 의미하며 메모리 주소값을 변경할 수 없다.

      ( but 상수는 숫자 말고도 객체 데이터를 넣을 수도 있는데, 참조 변수를 상수로 사용한 경우 메모리 주소 값만 고정인 것이지 인스턴스 안에 있는 데이터들은 수정이 가능하다.)

    - 리터럴 : 변수에 넣는, 값이 변하지 않는 데이터를 의미한다.

     

    2. 스택 메모리

    - 지역변수(메소드가 호출될 때 메소드 안에 있는 변수)가 쓰는 메모리

    - 함수 내부에서만 사용

    - 함수가 호출될 때 생성되고 함수가 끝나면 소멸

     

    3. 힙 메모리

    - 멤버 변수(인스턴스 변수)가 쓰는 메모리

    - 클래스 내부에서 사용 private이 아니면 참조 변수로 다른 클래스에서 사용 가능

    - 인스턴스가 생성될 때 힙 메모리에 생성됨. (new할 때 생성됨)

     

     

     

    # static 메서드가 뭐야?

     

    - 클래스(class) 메서드라고도 해.

    - 메서드에 static 키워드를 사용하여 구현해.

    - 주로 static 변수를 위한 기능을 제공해.

     

    + static 메서드에서  instance 변수를 사용할 수 없음.

    ( 인스턴스 변수의 경우 꼭 인스턴스가 먼저 생성 되어야 하므로, static 메서드에서는 생성이 불확실한 인스턴스 변수를 사용할 수 없기 때문)

    + static 메서드도 인스턴스 생성과 관계 없이 클래스 이름으로 직접 메서드 호출함.

     

    변수의 유효 범위

     

     

     

    # static 응용 :  싱글톤(singleton) 패턴이 뭘까?

     

    - 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미

    - 즉 클래스의 객체를 하나로 제한하는 것

    - 동일한 자원이나 데이터를 처리하는 객체가 불필요하게  여러 개 만들어질 필요가 없는 경우 사용

     

    장점

    - 최초 한번의 new 연산자를 통해 고정된 메모리 영역을 사용하여 추후 해당 객체에 접근할 때 메모리 낭비를 방지함

    - 이미 생성된 인스턴스를 활용하여 속도 측면에서도 이점이 있음

    - 싱글콘 인스턴스가 전역으로 사용되는 인스턴스라서 다른 클래스의 인스턴스들이 접근하여 사용할 수 있음

     

    단점

    - 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하면 동시성 문제가 발생할 수 있어 유의해야 함

    - 싱글톤 패턴을 구현하는 코드 자체가 많이 필요함

    - 싱글톤 인스턴스는 자원을 공유하고 있기 때문에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화해주어야 하여 테스트 하기 어려움

    - 자식클래스를 만들 수 없고, 내부 상태를 변경하기 어려움.

     

    -> 단독으로 사용할 경우 객체 지향에 위반이 되는 사례가 많아 스프링 컨테이너 같은 프레임워크 도움을 받아 문제점을 보완할 수 있음.

     

    코드예시

    public class singleton {

         private static Singleton instance = new Singleton();

         private singleton() {
                // 생성자는 외부에서 호출못하게 private 으로 지정해야 한다.
         }

         public static Singleton getInstance() {
              return instance;
        }

         public void say() {
              System.out.println("hi, there");
        }
    }

     

     

     

     

Coder yein