오늘은 static & private의 용도에 대해서 다루겠다.
static이란...?
static을 쓰지 않으면 생성을 하기 전까지는 힙영역에 할당이 되지 않는다. 그게 무슨말이냐면 static을 쓰게되면 생성자를 굳이 new를 하지않아도, 직접 할당을 하지 않아도 알아서 힙영역에 할당이 된다는 것이다.
잔말말고 코드로 알아보자.
StaticTest.java
class MyStatic{
String a = "instance변수";
static String b = "Static변수";
{
System.out.println("instance block");
}
static {
System.out.println("static block");
}
void f1() {
System.out.println("f1 method는 instance method입니다.");
}
static void f2() {
System.out.println("f2 method는 class method입니다.");
//System.out.println(a); //static메서드내에서 instance변수 접근불가
System.out.println(b); //static메서드에서 static변수 접근가능
}
}
public class StaticTest {
public static void main(String[] args) {
System.out.println(MyStatic.b);
MyStatic.f2();
MyStatic m = new MyStatic();
System.out.println(m.a);
m.f1();
int result = Math.max(10, 20);
System.out.println(result);
}
}
결과와 함께보자
보면 main에서 아무것도 하지 않아도 첫줄에 static block이 할당된것을 볼 수있다. 심지어 new로 생성을 하지않아도 MyStatic.b로 출력을 할 수 있는것을 볼 수 있다. 하지만 String a와 f1()은 MyStatic m = new MyStatic();으로 할당을 하고 난 후에 쓸수 있는것을 볼 수있다. 이처럼 static의 용도에 맞게 먼저 할당을 하고 쓰고 싶으면 static을 유용하게 이용하자!
private란 ?
private는 일상에서도 많이 쓰는 잠금이라는 뜻을 가지고 있다. 자바에서도 똑같은 의미이다. 변수, 메소드 등 앞에 붙혀 다른곳에서 쓰지 못하게 하는것이다.
BookTest.java
public class BookTest {
public static void main(String[] args) {
Book[] b = new Book[5];
b[0] = new Book("Java Program",30000);
b[1] = new Book("JSP Program",25000);
b[2] = new Book("SQL Fundamentals",20000);
b[3] = new Book("JDBC Program",32000);
b[4] = new Book("EJB Program",25000);
BookMgr bm = new BookMgr(b);
bm.printBookList();
bm.printTotalPrice();
}
}
Book.java
public class Book {
private String title;
private int price;
public Book() { }
public Book(String title, int price) {
super();
this.title = title;
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
나중에 개발을 하면 배우겠지만 이미 알고있음 하지만 중요함!! 위와 같은 소스는 일단 DTO(Data Transfer Object)로 Data를 전송하기 위한 목적으로 사용하는 개발기술이다.
위에 소스를 보면알겠지만 전과 달리 지역변수가 private로 되어있는것을 볼 수 있다. 이렇게 값을 저장하고 할당하는데에만 쓰는 클래스를 따로 만드는 것이다. 이렇게 되면 기본 생성자와, getter, setter를 쓰게 되는것이다.
보통이면 예를 들어 b[0].title = "Java Program"; 이런식으로 넣었겠지만 private로 인해 직접참조가 불가능 하고, 나중에 배울 MVC패턴을 이용하여 체계적인 로직을 짜기위해선 이런식으로 private를 하여 getter/setter를 해주는것이 좋다.
사실 private를 배운게 아니라 getter/setter 를 배운거 같은느낌은 기분 탓입니다.