[Java] 정적(static) 변수와 메소드

이용준·2022년 11월 7일
0

Java

목록 보기
25/29

1.정적(static) 변수

1-1.static 변수

  • 항상 값이 일정할 때 static을 통해 메모리의 이점을 얻을 수 있다.

  • static을 사용하면 변수의 값을 공유한다.
    (static 사용시 같은 곳의 메모리 주소만 바라보기에 static 변수값 공유)

    * "이"씨 집안을 나타내는 HouseLee 클래스의 성 공유하기(static)
    class HouseLee{
      static String lastname = "이"; // static통해 lastname 변수 공유
    }
    
    public class Sample{
      public static void main(String[] args){
        HouseLee lee1 = new HouseLee();
        HouseLee lee2 = new HouseLee();
      }
    }  

    이처럼 lastname 변수에 static 키워드 붙이면 자바는 메모리 할당을 한번만 하게되어 메모리 사용에 이점이 있다.

    만약 lastname의 값이 고정되기를 원한다면 static 키워드 앞에 final 키워드를 붙이면 된다.

    • 예제
    * 웹사이트 방문마다 조회수 증가시키는 Counter 클래스 생성
    class Counter{
      static int count=0;
      counter(){
        count++;
        System.out.println(count);
      }
    }
    
    public class Sample{
      public sttaic void main(String[] args){
        Counter c1 = new Counter();
        Counter c2 = new Counter();
      }
    }  

1-2.static 메소드

static 키워드가 메소드 앞에 붙으면 스태틱 메소드가 된다.

  • class Couter{
      static int count = 0;
      Counter(){
        count++;
        System.out.println(count);;
      }
      public static int getCount(){ // static 메소드 추가
        return count;
      }  
    }
    
    public class Sample{
      public static void main(String[] args){
        Counter c1 = new Counter();
        Counter c2 = new Counter();
        
        System.out.println(Counter.getCount()); // 스태틱 메서드는 클래스를 이용해 호출
      }
    } 

getCount() 메소드에 static 키워드 생성을 통해 Counter.getCount()처럼 객체 생성 없이 클래스를 통해 메서드를 직접 호출할 수 있다.

스태틱 메소드내에서 객체변수 접근이 불가능하다. 그러나 위 예에서는 count 변수가 static 변수이므로 스태틱 메소드에서 접근이 가능하다.

왜 count가 스태틱 변수인가?
class Counter에서 static int count로 선언했기 때문.

스태틱 메소드는 유티리성 메소드 작성시 많이 사용된다.
예를 들어 "오늘의 날짜 구하기", "숫자에 콤마 추가하기"등 메소드 작성 시 클래스 메소드를 사용하는 것이 유리하다.

  • 예제
* "날짜"를 구하는 Util 클래스의 예이다.

import java.text.SimpleDateFormat;
import java.util.Date;

class Util{
  public static String getCurrentDate(String fmt){ // 스태틱 메소드
    SimpleDateFormat sdf = new SimpleDateForamt(fmt);
    return sdf.format(new Date());
  }
}

public class Sample{
  public static void main(String[] args){
    System.out.println(Util.getCurrentDate("yyyyMMdd"));  // 오늘 날짜 출력
  }
}  

1-3.싱글톤패턴(singleton pattern)

  • 단 하나의 객체만을 생성하게 강제하는 패턴이다.
  • 클래스를 통해 생성할 수 있는 객체는 오직 한 개만 되도록 만드는 것.
  • class Singleton{
      private Singleton(){  // private 생성자
      }
    }
    
    public class Sample{
      public static void main(String[] args){
        Singleton singleton = new Singleton(); // 컴파일 오류 발생

    위 클래스는 Singleton 클래스의 생성자에 private 키워드로 다른 클래스에서 Singleton 클래스로 생성자 접근을 막았으므로 컴파일 에러 발생. (new로 생성 불가)

    Singletone 클래스의 객체 생성

    class Singleton{
      private static Singleton one;
      private Singleton();
      }
      
      public static Singleton getInstance(){
        if(one==null){
          one = new Singleton();
        }
        return one;
      }
    }
    
    public class Sample{
      public static void main(String[] args){
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.geInstance();
        System.out.println(singleton1 == singleton2); // true 출력
      }
    }  
  1. Singleton 클래스에 static one 변수 생성
  2. getInstance 메소드에서 one 값이 null인 경우 객체 생성
    => one 객체 한 번 생성
profile
뚝딱뚝딱

0개의 댓글