View
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
2) https://ifcontinue.tistory.com/2
'Basics' 카테고리의 다른 글
CI/CD란? (0) | 2022.04.13 |
---|---|
Virtual & Abstract & Interface (0) | 2022.03.03 |
프로그래밍 용어 01 (0) | 2022.01.07 |