Static이란 정적이란 뜻이다. Class 내에서 static을 이용해 정적 변수를 선언하면 그 변수는 모든 인스턴스에 대해 하나의 메모리 공간만을 차지한다.
위의 사진을 보자. 여러개의 인스턴스 A, B, C에 대해 static 변수는 한 공간만을 차지하기 때문에 모두 같은 값을 공유한다.
Static은 인스턴스와 상관없이 클래스의 이름으로 접근하며 인스턴스를 생성하지 않아도 처음 프로그램이 로드될 때 생성된다.
예를 들어 Student stuA = new Student()로 생성을 해도 정적변수는 stuA.stuID로 접근하는 것이 아닌 Student.stuID로 접근을 해야 하는 것이다.
인스턴스가 힙영역에 저장되는거에 비해 static 변수는 데이터 영역에 저장됨을 주의하자.
정적 변수는 왜 필요한 것일까. 아래 코드를 보며 생각해보자. Card라는 클래스에 멤버변수로 cardId가 있다. 이 id는 변해선 안되고 card 인스턴스마다 고유한 값을 가져야한다. 이 때 static 변수로 Number = 10001이라고 선언을 하면, Card를 생성할 때 마다 이 정적 변수로 id를 부여할 수 있게되고, 결과적으로 인스턴스마다 고유한 id값을 가질 수 있게 된다.
package card;
public class Card {
private static int Number = 10001;
private int cardId;
public Card() {
this.cardId = Number++;
}
public int getCardNumber() {
return this.cardId;
}
}
Static 변수에 대한 예시
static 메소드란 static 변수를 위한 기능을 제공하는 메소드이다. 위의 예시인 static 변수인 Number를 반환받기 위해선 get함수를 static 메소드로 선언해야한다. 그리고 마찬가지로 static 메소드를 사용하기 위해서도 클래스 이름으로 호출해야한다. mycard.getNumber()가 아닌 Card.getNumber()로 호출해야한다는 소리다.
Singleton Pattern에 대해서 알아보자. Singleton 패턴은 Class의 인스턴스를 단 하나만 생성하는 패턴을 말한다. 예를들어 어떤 학교에 학생은 늘어나고 줄 수 있지만 학교자체는 하나여야만 한다. 이런 경우 한개의 인스턴스만을 생성하기위해 클래스 내에서 Static을 이용해 객체를 생성한다. 아래 코드를 보면 private static CardCompany instance = new CardCompany()로 인스턴스를 생성하는걸 볼 수 있다. 문제는 인스턴스를 static으로 생성하면 접근을 어떻게 하는가 인데 getInstance()라는 접근용 메소드를 생성해준다. 이 메소드 또한 static이므로 클래스 이름으로 호출한다. CardCompany.getInstance()와 같은 방식으로 말이다.
package card;
public class CardCompany {
private static CardCompany instance = new CardCompany();
public static CardCompany getInstance() {
return instance;
}
public Card createCard() {
Card card = new Card();
return card;
}
}
Static과 Singleton Pattern 둘 다 Java에서 중요한 개념이라고 했기 때문에 정리해둔다. 아래 코드는 정적변수와 singleton 패턴을 사용한 예시 코드이다.
package card;
public class CardCompanyTest {
public static void main(String[] args) {
CardCompany company = CardCompany.getInstance();
Card myCard = company.createCard();
Card yourCard = company.createCard();
System.out.println(myCard.getCardNumber());
System.out.println(yourCard.getCardNumber());
}
}
'프로그래밍 > Java' 카테고리의 다른 글
[Java] final 예약어 (0) | 2020.02.03 |
---|---|
[Java] 추상 클래스 (0) | 2020.02.03 |
[Java] 상속과 다형성 (0) | 2020.02.01 |
[Java] 배열과 ArrayList (0) | 2020.02.01 |
[Java] 공부하며 느낀 점 메모 (0) | 2020.01.29 |