View

Static이란?

jaeeH 2022. 3. 17. 14:31

 

 

 

Static

: 변수/메소드에 키워드로 사용됨

 

Static 키워드를 사용한 변수는 클래스가 메모리에 올라갈 때 자동으로 생성됨

≫ 인스턴스(객체) 생성 없이 바로 생성 O

 

 

 

Static 키워드의 사용

  • 자주 변하지 않는 일정한 값 / 설정 정보 같은 공용 자원에 대한 접근에 있어 일종의 '전역 변수'와 같은 개념을 통해 접근하는 것이 효율적
  • 인스턴스 생성 없이 바로 사용 가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 사용

예시) 공통으로 사용되는 변수

public class FavoriteCoffee {
    static String coffee = "americano";
    
    public static void main(String[] args) {
        //인스턴스 객체 생성
        FavoriteCoffee mira = new FavoriteCoffee();
        FavoriteCoffee flora = new FavoriteCoffee();
        
        System.out.println("1) Mira가 좋아하는 커피 :" + Mira.coffee();
        System.out.println("2) Flora가 좋아하는 커피 :" + Flora.coffee();
        
        //Mira가 좋아하는 커피 변경하기
        mira.coffee = "latte";
        
        System.out.println("3) Mira가 좋아하는 커피 :" + Mira.coffee();
        System.out.println("4) Flora가 좋아하는 커피 :" + Flora.coffee();
    }
}

//---------------------------------------[결과]------------------------------------------//

1) Mira가 좋아하는 커피 : americano
2) Flora가 좋아하는 커피 : americano
3) Mira가 좋아하는 커피 : latte
4) Flora가 좋아하는 커피 : latte

Mira가 좋아하는 커피만 latte로 변경하였는데 Flora가 좋아하는 커피까지 변경됨

≫ coffee 변수를 static으로 정의했기 때문에 Mira와 Flora는 같은 coffee 변수를 공유

 

 

 

Instance 변수와 Static 변수

  Instance 변수   인스턴스가 생성될 때 마다 새로 생성되어 각각 다른 변수로 존재
  Static 변수   인스턴스 생성과 상관 X, 먼저 생성되어 그 값을 모든 인스턴스가 공유
  → 인스턴스가 아닌 클래스 이름으로 참조하여 사용 O

예시) Instance 변수와 Static 변수의 Count 증가

1. Instance 변수

class Counter {
    int count = 0;
    Counter() {
        this.count++;
        System.out.println(this.count);
    }
}

public class Sample {
    public static void main(String[] args) {
    	Counter c1 = new Counter();		//1
        Counter c2 = new Counter();		//1
    }
}

c1과 c2의 count는 서로 다른 메모리를 가리키고 있기 때문에 count가 증가되지 않음

객체변수는 항상 독립적인 값을 가짐

 

2. Static 변수

class Counter {
    static int count = 0;
    Counter() {
    	count++;	//count는 더 이상 객체변수가 아니므로 this 제거
        System.out.println(count);	//this 제거
    }
}

public class Sample {
    public static void main(String[] args) {
        Counter c1 = new Counter();		//1
        Counter c2 = new Counter();		//2
    }
}

c1과 c2의 count는 같은 메모리를 가리키고 있기 때문에 count 증가됨

 

 

 

Static 메소드

메소드 앞에 static 키워드 사용하기

 

예시) static 메소드와 변수 사용

class Counter {
    static int count = 0;
    Counter() {
    	count++;
        System.out.println(count);
    }
    public static int getCount() {
    	return count;
    }
}

public class Sample {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
        
        System.out.println(Counter.getCount());		//static 메소드는 클래스를 이용해 호출
    }
}

위의 예에서는 count 변수가 static이기 때문에 static 메소드에서 접근 O

 

static 함수에서 static 변수가 아닌 것을 사용하면 에러가 발생

인스턴스가 생성되기 전에 아직 생성되지 않은 변수를 참조하기 때문

내부에 있는 변수는 사용 X, 인수로 데이터 넘겨받아야 함

public class Rectangle {
    String name;
    int width = 10;
    int height = 20;
    
    public int Area() {
        return width*height;
    }
    
    //오류!
    public static int Area2() {
    	return width*height;
    }
    
    //인수로 받기
    public static int Area3(int width, int height) {
    	return width*height;
    }
}

 

보통 static 메소드는 유틸리티성 메소드를 작성할 떄 많이 사용됨

ex. 오늘의 날짜 구하기, 숫자에 콤마 추가하기...

 

+ ) Util 인스턴스 생성 없이 오늘 날짜 구하기

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

class Util {
    public static String getCurrentDate(String fmt) {
        SimpleDateFormat sdf = new SimpleDateFormat(fmt);
        return sdf.format(new Date());
    }
}

public class Sample {
    public static void main(String[] args) {
        System.out.println(Util.getCurrentDate("yyyyMMdd"));
    }
}

 

 

 

Singleton pattern

: 단 하나의 객체만을 생성하게 강제하는 패턴

클래스를 통해 생성할 수 있는 객체가 한 개만 되도록 만드는 것

 

예시 1 ) Singleton 객체 생성하기 - 컴파일 오류

class Singleton {
    private Singleton() {
    }
}

public class Sample {
    public static void main(String[] args) {
    	Singleton singleton = new Singleton();	//컴파일 오류 발생
    }
}

오류 발생 : Singleton 클래스의 생성자에 private 키워드로 생성자로의 접근 막았기 때문

생성자를 private으로 만들면 다른 클래스에서 Singleton 클래스를 new를 이용하여 생성할 수 X

 

예시 2 ) Singleton 객체 생성하기 - 객체 생성 가능하지만 싱글톤이 아닌 경우

class Singleton {
    private Singleton() {
    }
    
    public static Singleton getInstance() {
        return new Singleton();	//같은 클래스이므로 생성자 호출 O
    }
}

public class Sample {
    public static void main(String[] args) {
    	Singleton singleton = Singleton.getInstance();
    }
}

getInstance라는 static 메소드를 이용하여 Singleton 클래스의 객체 생성 가능하지만 getInstance를 호출할 때마다 새로운 객체가 생성됨 => 싱글톤이 아님!

 

예시 3 ) Singleton 객체 생성하기 - 올바른 예

class Singleton {
    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.getInstance();
        System.out.println(singleton1 == singleton2);	//true
    }
}

Singleton 클래스에 one이라는 static 변수를 두고 getInstance 메소드에서 one 값이 null인 경우에만 객체를 생성하도록 하여 one 객체가 한 번만 만들어지도록 함

 

 

 

 

 

 

 

 

※ 출처

 

1) charamee.log

 

static 개념정리

2021년 2회 정보처리기사 실기 문제 중 접근제한자에 관련된 문제가 있었다. 깊게 생각 안하고 같은 클래스에서 사용가능..? 그러면 public private protected 모두 가능한거 아닌가? 하다가 그냥 private

velog.io

 

2) https://ifcontinue.tistory.com/2

 

static 개념 정리

프로그래밍을 공부하면 할 수록 기본이 얼마나 중요한지 느낀다. 스태틱 팩토리 메소드(Static Factory Method)를 공부하다가 순간 static이 정확히 뭐였지? 라는 생각이 들어 정리해보고자 한다.. (매일

ifcontinue.tistory.com

 

3) https://wikidocs.net/228

 

07-03 정적(static) 변수와 메소드

이번에는 스태틱(static)에 대해서 알아보자. [TOC] ## static 변수 예를 들어 다음과 같은 HouseLee 클래스가 있다고 하자. *Sample. ...

wikidocs.net

 

 

 

 

 

'Basics' 카테고리의 다른 글

CI/CD란?  (0) 2022.04.13
Virtual & Abstract & Interface  (0) 2022.03.03
프로그래밍 용어 01  (0) 2022.01.07
Share Link
reply
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31