static 이해하기
- static이란?
- static 예시
- static 활용방법
static이란
변수 혹은 메서드를 선언할 때 사용하는 예약어입니다. static이 붙지 않은 변수 혹은 메서드는 객체를 생성하여야만 인스턴스 메모리에 저장이 되어 사용할 수 있었습니다. 하지만 static을 이용하면 객체를 생성하지 않아도 사용할 수 있습니다. 단 static은 인스턴스 메모리에 저장되는 값이 아니고 데이터 메모리에 저장이 되기 때문에 어떠한 인스턴스에서 불러오더라도 같은 값을 가지게 되는 즉 공유의 개념이 있습니다.
static 예시
class Book {
static int bookNum=1;
String bookKind;
}
public class bookStore{
public static void main(String[] args){
Book book1 = new Book(); //book1 인스턴스 생성.
book1.bookKind="소설"; //book1의 bookKind설정.
book1.bookNum=1; //book1의 bookNum설정?
Book book2 = new Book(); //book2 인스턴스 생성.
book2.bookKind="만화"; //book2의 bookKind설정.
book2.bookNum=2; //book2의 bookNum설정?
System.out.println("book1의 종류 "+book1.bookKind); //출력은 book1의 종류 소설
System.out.println("book1의 번호 "+book1.bookNum); //출력은 book1의 번호 2
System.out.println("book2의 종류 "+book1.bookKind); //출력은 book2의 종류 만화
System.out.println("book2의 번호 "+book1.bookNum); //출력은 book2의 번호 2
}
}
위의 예시를 보면 Book이란 클래스 안에 bookNum은 static변수로 bookKind는 인스턴스 변수로 작성하였습니다. 따라서 인스턴스 변수는 book1과 book2를 생성할 때 각각 다른 주소 값을 가지기 때문에 책의 종류를 저장할 때 각각 다른 주소를 가지기에 소설과 만화로 각각 저장됩니다. 하지만 static변수의 경우 데이터 메모리에 bookNum이라는 변수가 저장되기 때문에 book1.bookNum과 book2.bookNum이 같은 주소 값을 가집니다. 따라서 book1.bookNum과 book2.bookNum은 같은 값을 가지게 되므로 출력 시 번호가 2로 나오게 됩니다.
static의 활용
위의 예시에서 book의 번호를 설정하고 싶은 경우 어떻게 하여야 하는지 알아봅시다.
class Book {
static int bookSerial=1;
int bookNum;
String bookKind;
public Book(){
bookNum = bookSerial;
bookSerial++;
}
}
public class bookStore{
public static void main(String[] args){
Book book1 = new Book(); //book1 인스턴스 생성.
book1.bookKind="소설"; //book1의 bookKind설정.
Book book2 = new Book(); //book2 인스턴스 생성.
book2.bookKind="만화"; //book2의 bookKind설정.
System.out.println("book1의 종류 "+book1.bookKind); //출력은 book1의 종류 소설
System.out.println("book1의 번호 "+book1.bookNum); //출력은 book1의 번호 1
System.out.println("book2의 종류 "+book1.bookKind); //출력은 book2의 종류 만화
System.out.println("book2의 번호 "+book1.bookNum); //출력은 book2의 번호 2
}
}
기본 생성자를 만들어주고 내용을 입력하였습니다. 생성자가 호출되는 경우 bookNum이라는 인스턴스 변수에 static변수인 bookSerial의 값을 넣어주고 bookSerial을 증감 연산자를 통하여 값을 높여줍니다. 이제 book1을 생성하기 위하여 생성자를 호출하면 book1.bookNum에는 static변수의 값인 1이 들어가게 되고 bookSerial의 값이 2로 변합니다. 그리고 book1.bookNum을 호출 시 인스턴스 변수를 호출하기에 1의 값이 나오게 됩니다. book2를 생성하기 위하여 또 생성자를 호출하면 book2.bookNum에는 static변수의 값인 2가 들어가게 되고 bookSerial의 값은 3이 됩니다. 그리고 book2.bookNum의 값을 호출하면 2가 나오게 됩니다. 이러한 방식으로 객체의 전반적으로 영향을 미치는 변수 같은 경우 static을 이용하여 선언하여 줍니다.