/**
* @return the jumin
*/
public String getJumin()
{
return jumin;
}
/**
* @param jumin the jumin to set
*/
public void setJumin(String jumin)
{
this.jumin = jumin;
}
/**
* @return the cellphone
*/
public String getCellphone()
{
return cellphone;
}
/**
* @return the name
*/
public String getName()
{
return name;
}
/**
* @return the post
*/
public String getPost()
{
return post;
}
/**
* @return the sabun
*/
public String getSabun()
{
return sabun;
}
/**
* @return the telephone
*/
public String getTelephone()
{
return telephone;
}
/**
* @param cellphone the cellphone to set
*/
public void setCellphone(String cellphone)
{
this.cellphone = cellphone;
}
/**
* @param name the name to set
*/
public void setName(String name)
{
this.name = name;
}
/**
* @param post the post to set
*/
public void setPost(String post)
{
this.post = post;
}
/**
* @param sabun the sabun to set
*/
public void setSabun(String sabun)
{
this.sabun = sabun;
}
/**
* @param telephone the telephone to set
*/
public void setTelephone(String telephone)
{
this.telephone = telephone;
}
/**
* @return the isAdmin
*/
public boolean isAdmin()
{
return isAdmin;
}
/**
* @param isAdmin the isAdmin to set
*/
public void setAdmin(boolean isAdmin)
{
this.isAdmin = isAdmin;
}
}
VO 부분은 회원 1명을 표현할때 필요한 여러 변수를 가지고 있으며 DAO는 그 회원들의 정보를 저장 불러오기 수정 등을 할수 있는 행위가 기술됨.
DAO에서 중요한 부분은 잘 생각해 보면 이 DAO는 몇번을 실행하더라도 내용이 바뀌지가 않음. DAO가 실행될때 마다 바뀌는건 VO고 이를 봤을 때 싱글톤 패턴을 사용하면 메모리를 조금 더 적게 사용할 수 있으며(매 호출시 인스턴스를 만들지 않기 때문) static영역에 미리 만들어진 인스턴스가 들어가 있기 때문에 그 주소를 참조해서 객체를 불러오기 때문에 객체를 생성하는것에 비해 속도가 빠름.
public class StaticTest { private static int SIZE= 10; private static int[] myStatic = new int[SIZE]; }
대부분 이렇게 사용할 것이다.
myStatic이라는 배열을 만들었다. 그렇다면 이 myStatic에 값을 할 당할때 어떻게들 사용하는가? myStatic은 배열이다. 배열에 값을 할당 할때 과연 어떻게 할 수 있을까?(반복문을 이용하는 방법중) 생성자를 만드는 방법도 있을것이고 메인메소드나 기타메소드에서 값을 할당 받는경우도 있다. 가장 쉽게 생각한 방법이 다음과 같은 두가지 방법일 것이다.
ex1)
more..
public class StaticTest { private static int SIZE= 10; private static int[] myStatic = new int[SIZE];
public static void main(String args[]) { new StaticTest(); printStatic(); } }
ex1같은 경우 main 메소드 같은 곳에서 처음 한번만 초기화 값을 넣는 방법과 ex2처럼 생성자를 만들어 객체를 생성하게 하여 사용하는 방법이 있을 것이다. (필자는 두가지 방법밖에 몰랐었다. 하긴 지금은 몇가지를 더 알고 있으니깐 이글을 쓰는거겠지만...;;)
ex1 같은 경우를 보자! 일반 Application에서는 main메소드를 호출 하기 때문에 단 1번만 호출되면서 값이 활당된다. 그렇다면 웹어플리케이션에서는 어떨까? 당연히 힘들다.(불가능 한것은 아니다. init가 있기 때문에) web.xml을 수정하여하고 이래저래 복잡하다. ex2 같은경우를 보자! 이와 같은 방법은 객체를 생성하여야 한다. 객체 생성으로 그만큼의 공간을 잡아 먹는 샘이다. 불필요한 공간을 계속 잡고 있을 테니 조금 문제가 될수있다.
두가지의 문제점을 해결 할 수 있는 방법이 필자가 소개할려고 하는 ex3 이다. 아는 사람도 많이 있겠지만 모르는 사람도 많을 것 같다.
바로 static block을 이용하는 방법이다. ex3을 보도록 하자! ex3)
more..
public class StaticTest { private static int SIZE= 10; private static int[] myStatic = new int[SIZE]; static { for(int i=0, size=SIZE; i<size; i++ ) { myStatic[i] = 100 + i; } }
같은 클래스, 하위클래스, 또는 같은 패키지 내에 있는 어떤 클래스에서도 접근할 수 있습니다. 이 접근 권한은 클래스 또는 객체의 외부 인터페이스를 제공해 줄 때 주로 사용합니다.
Private
같은 클래스 내에서만 접근가능 합니다. 다시 말해서, 이 접근 권한으로 지정된 변수 또는 메소드를 다른 객체에서 참조하거나 사용하는 것이 불가능하고, 자신의 클래스 내에 있는 메소드에서만 참조하거나 사용할 수 있습니다. 클래스가 제공하는 기능을 내부적으로 구현할 때 주로 사용하고, 이렇게 함으로써 완벽한 정보은닉이 가능합니다.
Protected
자바에서 정의된 클래스들은 기본적으로 하나의 그룹 단위 또는 묶음단위로써 유지되는데, 이를 패키지라 합니다. 다시 말해서 패키지는 클래스들의 그룹이라 볼 수 있습니다. protected 접근지정자를 이용하면 같은 클래스, 하위클래스, 또는 같은 패키지 내의 모든 클래스에서 접근가능 합니다.
생략(Default)
같은 클래스 또는 같은 패키지 내에 있는 모든 클래스 내에서 접근가능 합니다. protected 접근지정자와는 달리 하위클래스에서는 접근할 수 없습니다.
Static
객체를 new 연산자를 이용하여 생성했을 때 비로소 메서드니 멤버 변수들이 메모리를 확보하게 됩니다. 따라서 new 연산자로 객체를 생성하지 않고서는 객체의 메서드니 멤버 변수들을 사용할 수 없지만 이러한 절차를 거치지 않고 멤버변수나 메서드를 사용할 수 있게 해줍니다.
Final
final는 상수의 의미를 가지고 있는 키워드로서 클래스와 메서드, 변수에 사용될 수 있으나 각각 의미는 다릅니다.
객체지향 개념은 클래스를 이용하여 새로운 클래스를 생성 또는 정의할 수 있도록 하고 있습니다. 예를 들어, 자동차가 갖는 일반적인 상태와 행동들을 자동차 클래스로 정의해 놓고, 이 자동차 클래스를 확장하여 버스만이 갖는 상태와 행동을 추가하여 버스 클래스를 정의하고, 트럭이 갖는 상태와 행동을 추가하여 트럭 클래스를 정의하고, 그리고 자가용이 갖는 상태와 행동들을 추가하여 자가용 클래스를 정의 할 수 있겠지요. 이 때, 자동차 클래스를 상위클래스(superclass)라 하고 버스 클래스, 트럭 클래스, 자가용 클래스 등을 하위클래스(subclass)라 하며, 이들 간의 관계에 대해 얘기할 때 “하위클래스는 상위클래스를 상속한다(inherit)”라고 합니다. 다시 말해서, 하위클래스는 상위클래스가 갖고 있는 모든 특성들을 상속하여 사용할 수 있다는 것입니다. 이러한 상속 관계를 트리로 나타낼 수 있고, 이 상속관계 트리를 클래스 계층도(class hierarchy)라 합니다.
자바에서의 모든 클래스들은 반드시 어떤 클래스로부터 파생되어야 하는데, 클래스 계층 구조의 최상위 클래스는 바로 java.lang이라는 패키지에 있는 Object라는 클래스입니다. 따라서, 자바에서 정의된 모든 클래스는 기본적으로 Object클래스로부터 파생된 클래스가 되며, 자바 개발자가 만든 클래스가 그 어떤 클래스도 상속하지 않도록 정의하였다면, 자바는 내부적으로 이 사용자 클래스가 Object 클래스를 상속하도록 코드를 추가하여 줍니다. 그러므로, 자바에서 생성된 모든 클래스는 Object 클래스가 가지고 있는 변수와 메소드를 상속하여 그대로 사용할 수 있습니다.
상위클래스와 하위클래스
자바에서 “B 클래스가 A 클래스를 상속한다”고 할 때, 상속관계에 있는 두 클래스의 관계를 정의해 보면, A 클래스를 상위클래스(superclass)라 하고, B 클래스를 하위클래스(subclass)라 합니다. 이 때, 하위클래스는 다른 클래스로부터 파생된 클래스를 나타내며, 상위클래스의 모든 상태(변수)와 행동(메소드)을 상속하게 됩니다. 상위클래스란 클래스 계층구조에서 바로 한 단계 위 클래스를 나타냅니다. 하위클래스는 상위클래스의 외부 인터페이스 및 그 구현에 대해 재사용하므로, 상위클래스의 모든 변수와 메소드에 대해 하위클래스에서 접근 가능한 변수와 메소드는 하위클래스의 것으로 생각할 수 있는데, 하위클래스가 상속할 수 있거나 그렇지 못한 상위클래스의 멤버는 다음과 같습니다.
1. 임시로 데이터를 저장한다. for(int i=0; i<10; i++) { countArr[0] += 10; }
위와 같은 경우 반복문이 돌때마다 배열에 접근하게 된다. 이 경우 JVM이 배열 요소에 접근이 가능 Index인지 검사를 하므로 그 만큼 속도가 느려지게 된다. int temp = countArr[0]; for(int i=0; i<10; i++) { temp += 10; } countArr[0] = temp;
2. 비교값에 메소드를 사용하지 말라. for(int i=0; i<list.size(); i++) 위의 예제에서 보면 종료 조건이 i<list.size() 즉 리스트의 size를 가져오는 메소드를 호출 시킨다. 이 경우 반복 될때마다 size() 메소드를 호출 시키므로 그 만큼 속도가 느려질 수 있다. int cnt = list.size(); for(int i=0; i < cnt; i++)
3. 반복문 내에 객체와 객체를 비교 할 때는 캐논화 하여 사용한다. 반복문 안에서 If문을 쓰는 경우가 많다. 그 중 객체와 객체를 비교 할 때는 일반적으로 캐논화하여 사용하는것이 더 빠르다. if(object.getClass().getName().equals(java.lang.String"))
Application을 제작 하다 보면 위와 같이 비교를 많이 해야 될수도 있다. 그럴경우 static과 final을 이용하여 미리 한 객체에 선언해 두고 이것을 가져다 쓰는것이 훨씬 효율적이다.
public static final Class STRING_CLASSNAME = java.lang.String.class; if(object.getClass() == STRING_CLASSNAME)
사실 필자도 캐논화를 잘 하지는 않는다-.-;;
4. 반복문에서 배열에 접근할 때. for(int i=0; i<10; i++) { System.out.println(strArray[i]); } 가장 일반적인 예이다. 이것은 어떠한가? for(int i=0; i<10;) { System.out.println(strArray[i++]); } 사실 이 코드는 위에 것과 별 차이가 없다. 혹시나마 이걸 보고 "아 이러면 빠르겠구나~" 하고 생각한 사람이 있다면 다시 잘 생각해 보길 바란다.-_-