static은 메모리에 한번 올려지면 어느 곳에서나 공통으로 사용이 가능하고, static메소드는 객체를 생성할 필요없이 클래스명.메소드명으로 사용가능하다고 알고 있었는데, JDBC를 공부하면서 나와서 확실히 공부해두고 싶어서 복습차 공부해보았다. 점프투자바 페이지에서 static을 설명한 걸 봤는데 첨 공부할때 보다 이해도도 높고 또 '아 맞다 이런 것도 있었지'하고 다시 생각나는 것들도 있어서 정리해두려 한다! (지금 셤공부도 해야하고 세미플젝도 해야하고 sqld시험준비도 해야하는데 넘 바쁘지만 static을 내가 쓴 게 아닌 다른 사람이 쓴 코드로 보면서 이해하니 너무 좋아서 정리하고싶어졌다...차근차근 해야지...쥬륵)
Static 변수
public class HousePark {
static String lastname = "박"; //String lastname = "박"
public static void main(String[] args) {
HousePark pey = new HousePark();
HousePark pes = new HousePark();
}
}
static 키워드를 붙이면 자바는 메모리 할당을 딱 한 번만 하게 되어 메모리 사용에서 이점을 볼 수 있다.
또한 static으로 설정하면 같은 곳의 메모리 주소만 참조하게 되기 때문에 staitc 변수의 값을 공유도 할 수 있다.
만약 위의 코드에서 lastname변수가 static 변수가 아니라면,
객체를 생성할 때마다 변수인 lastname을 메모리에 별도로 할당해주어야 할 것이다. 똑같은 값이 저장될 텐데도 말이다.
그래서 이렇게 변하지 않는 값의 경우 static을 사용하여 메모리의 이점을 얻을 수 있는 것이다.
보통 변수의 static키워드는 프로그래밍 시 메모리의 효율보다는 공유하기 위한 용도로 훨씬 더 많이 사용하게 된다고 한다.
예전에 미니프로젝트를 할 때는 자바로만 gui를 이용해서 음식주문프로그램을 만들었는데 그때 로그인한 유저에 따라 주문목록을 만들어내기 위해서 지금 로그인된 유저의 id를 가져와야 했다. 그때 mainFrame에서 static변수인 loginUserId를 만들고, 로그인 시 사용자가 입력한 id를 loginUserId에 저장을 해서 주문하기, 주문목록보기, 리뷰 등에서 모두 같은 유저임을 확인할 수 있도록 했었다. 같은 팀이었던 실력자 분이 알려주셔서 유용하게 썼던 기억이 있어서 다시 찾아보았다. 아래에서 확인할 수 있다.
//MainFrame 클래스
public static String loginUserId; //공유목적으로 static변수로 생성
//MemberSignInView클래스
MainFrame.loginUserId = id; //로그인 성공시 사용자가 입력한id를 static변수에 저장
Static 메소드
static 메소드는 인스턴스 변수를 사용할 수 없다. 또한 인스턴스 메소드도 호출할 수 없다.
인스턴스 메소드는 static변수, 인스턴스 변수 모두 사용이 가능하다. 그리고 static메소드, 인스턴스 메소드 모두 호출할 수 있다.
class TestClass2 {
int iv;
static int cv;
void instanceMethod() { //인스턴스 메소드
System.out.println(iv); // 인스턴스 변수를 사용할 수 있다.
System.out.println(cv); //클래스 변수를 사용 할 수 있다.
static void staticMethod() { //스태틱 메소드
System.out.println(iv); // Error!! : 인스턴스 변수를 사용할 수 없다.
System.out.println(cv); //클래스 변수를 사용 할 수 있다.
}
}
Singleton pattern(싱글톤 패턴)
싱글톤 패턴은 단 하나의 객체만을 생성하게 강제하는 패턴이다.
아래 코드는 new를 이용하여 무수히 많은 객체를 생성한다면 싱글톤의 정의에 어긋나게 되므로 일단 외부클래스에서 new로 객체를 생성할 수 없도록 private키워드를 이용해서 막은 것이다.
class Singleton {
private Singleton() {
}
}
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton = new Singleton();
}
}
아래와 같이 one이라는 static변수를 두고, getInstance메소드에서 one값이 null인 경우에만 객체를 생성하도록 하면 one객체는 단 한번만 만들어지게 된다.
getInstance 메소드가 최초로 호출되면 one이 null이므로 new에 의해 객체가 생성이 된다.
이렇게 처음 생성된 one은 static변수이므로(메모리에 할당되어서 공유할 수 있으니까) 그 이후로 getInstance 메소드가 호출될 때 null이 아니게 된다. 따라서 이미 만들어진 싱글톤 객체인 one을 항상 리턴하게 된다!
class Singleton {
private static Singleton one;
private Singleton() {
}
public static Singleton getInstance() {
if(one==null) {
one = new Singleton();
}
return one;
}
}
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2);
}
}
출처 및 참고
'Java > 정리' 카테고리의 다른 글
[Java] 매개변수 전달방식(Call-by-value, Call-by-reference) (0) | 2021.12.22 |
---|---|
[java] String의 메모리 저장 방식 (0) | 2021.10.14 |
[Java] 컬렉션프레임워크_Map (0) | 2021.07.19 |
[Java] 반복문_아쉬운 점 (0) | 2021.06.26 |
[Java] double 계산오차 (0) | 2021.06.23 |