JDK 다운로드
http://java.sun.com/javase/downloads/index.jsp

리눅스 버전의 .bin파일을
/usr/local/src 에 다운로드
jdk-6u17-linux-i586.bin

root 계정인데도 허가 거부
권한 변경후 설치

# chmod 700 jdk-6u17-linux-i586.bin
# ./jdk-6u17-linux-i586.bin


라이정책 관련된 내용이 출력되는데 엔터키 계속 클릭...
.....
라이선스 동의에 y 입력
설치는 완료
jdk1.6.0_17 디렉토리 생성됨

/usr/local/java 경로로 옮김

#mv jdk1.6.0_17 /usr/local/java


[환경 설정]


#vi /etc/profile

파일 마지막 부분에 JDK 설정 추가

.....

# JAVA SDK 6

JAVA_HOME=/usr/local/java
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$
CLASSPATH:$JAVA_HOME/lib/*:.


변경된 내용 적용후 설치버전 확인.

[root@local]# source /etc/profile
[root@local]# javac -version
javac 1.6.0_17


설치완료.







'Linux' 카테고리의 다른 글

[fedora] Sendmail, dovecot, pop3, sasl  (0) 2009.12.21
MySQL설치중 오류:error: No curses/termcap library found  (1) 2009.11.24
Posted by finewoo
,

프로그래밍에서 자주 변하지 않는 일정한 값이나 설정 정보 같은 공용자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽어들이는 것보다 일종의 '전역변수'와 같은 개념을 통해 접근하는 것이 비용도 줄이고, 효율도 높일 수 있다. 
자바에는 이런 전역변수 형태의 접근을 가능하게 만들어 주는 static(정적) 이라는 키워드가 있다.

클래스의 변수나 메소드를 static으로 선언하면 그 변수는 객체의 변수가 아니라 클래스 변수가 된다. 클래스 변수이므로 어떠한 객체라도 동일한 주소로 참조하게 된다.
일반적으로 클래스의 변수나 메소드는 해당 클래스가 인스턴스화 되기 전에는 사용할 수 없는데, static 으로 선언된 변수나 메소드는 해당 클래스의 인스턴스 여부와 상관없이 바로 접근이 가능하고, 사용이 가능하다.

그럼 실무에서 적용되는 static 사용의 예로 싱글톤(Singleton)이라는 것을 살펴 보자.

public class Example {  

     /* object 선언 */
    private static Example m_theInstance = null;

    private Example() {
    }
   
    /**
     * Create and Get Instance
     * applied Singleton Pattern.
     */
    public static Example getInstance() {
        if (m_theInstance == null)
            m_theInstance = new Example();
        return m_theInstance;       
    }
}


생성자를 private으로 선언하면 new 로 생성할 수 없게 되고, public static 으로 선언한 getInstance() 메소드를 통해서만 객체에 접근 가능하게 만들어 준다.  Singleton(싱글톤) 방식은 프로젝트에서 데이터베이스 연결등의 공용 자원 접근에 이런 방식의 static 적용하면 효율을 높일 수 있는 한 방법이 될 수 있다.

또다른 예로, 절대 변하지 않는 값을 final static으로 선언하면 GC(Gabage Collection)의 대상이 되지도 않고 클래스 로딩시 메모리에 적재되어 있으므로 효율을 높여 성능향상에 도움이 된다.

지금까지 설명한 static의 효율적인 측면과 함께 반드시 고려해야 할 면으로 static 키워드의 '전역변수'적인 성격때문에 적절하지 않게 사용하게 되면 오히려 시스템에 악영향이 되거나 심각한 오류의 원인이 될 수도 있다는 것을 고려해야 한다.
이말인 즉, 공용자원의 값은 누가 어떤때에 접근하든 일정한 값을 얻어야 하지만 해당 변수나 메소드를 의도하든 그렇지 않든 적절하지 않은 값이 저장될 수도 있다는 것이다.
애플리케이션의 디버깅 작업이나 테스트시 이런 '전역변수'적인 성격의 버그는 예상외로 찾아내기 힘들 수도 있다. 그 패턴이 일정하지 않기 때문이다.

정리하자면, 자주 변경되는 변수나 메소드에 static 키워드는 가능한한(?) 사용하지 않기를 권한다. --;
필요에 따라 static을 선언하게 되더라도 잘못된 값이 참조될 수 있는 부분은 차단하는 것이 바람직하다.

즉, 자주 변경되지 않는 부분이나 설정파일 정보인 경우 등 제한적인 용도로 사용한다면 애플리케이션 성능향상에 충분한 도움이 될 것이다.


Posted by finewoo
,

[Android] Data Storage

Android 2010. 2. 25. 01:08

애플리케이션에서 데이터를 저장, 가공, 표현하기 위해서 데이터 저장 메커니즘이 있다.
안드로이드 애플리케니션 또한 마찬가지로 Data Storage 메커니즘을 제공한다.

기본적으로 안드로이드 상에서, 모든 애플리케이션의 데이터는 그 애플리케이션에게 private하다.
그래서, Content Provider를 통해서 private한 데이터를 다른 애플리케이션에게 보여준다.
Content Provider는 애플리케이션 데이터에 읽기/쓰기 접근을 제공하는 컴포넌트이다. 
읽기/쓰기 접근은 그 Content Provider가 부과할 수도 있는 제약의 조건에 따른다. 그 Content Provider는 데이터를 요청하고 수정하는 것에 대한 표준 문법과, 그리고 리턴된 데이터를 읽는 것에 대한 표준 메커니즘을 구현한다. 

안드로이드는 데이터를 저장하고 가져오기 위해 다음의 네 가지 메커니즘을 제공한다.

1. Preferences
2. 파일(Local File)
3. 데이터베이스(SQLite)
4. 네트워크


Preferences 

Preference는 기본적인 데이터 타입에 대한 키와 값의 조합으로 데이터를 가져오는 가벼운 메커니즘이다. 
이는 애플리케이션이 시작될때 로드되어야 하는 기본적인 환경설정 사항들에 대한 정의로 자료형으로는 Boolean, float, int, long, String이 있다. 
이곳에 값을 읽고 쓰기 위해서는 Context.getSharedPreferences()를 호출한다. 만약 같은 애플리케이션 내의 다른 컴포넌트들에게 이것을 공유하고자 한다면, 프레퍼런스 집합에 이름을 할당하면 된다. 또한 호출하는 Activity의 private 영역에 그것을 유지하기 위해서는, 이름없이 Activity.getPreferences()를 사용한다. Content Provider를 사용하는 것에 의하지 않고서는 Preference를 공유할 수 없다.

    @Override
    protected void onCreate(Bundle state){         
       super.onCreate(state);
    
    . . .
    
       // Restore preferences
       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
       boolean silent = settings.getBoolean("silentMode", false);
       setSilent(silent);
    }


Files

Mobile Device 상에 또는 분리될 수 있는 저장 매체 상에 직접적으로 파일들을 저장할 수 있다. 
기본적으로 다른 애플리케이션들은 이러한 파일들에 접근할 수 없다.
만약 컴파일 시점에 애플리케이션과 함께 패키지할 정적(static) 파일을 가지고 있다면, 프로젝트의 res/raw/myDataFile로 
그 파일을 저장할 수 있으며, 그리고 나서 Resources.openRawResource(R.raw.myDataFile)를 사용해서 그것을 열수 있다. 그것은 파일로로부터 읽기 위해 사용할 수 있는 InputStream 오브젝트를 리턴한다.


Databases

안드로이드 API는 SQLite 데이터베이스를 지원한다. 각각의 데이터베이스는 그것을 생성한 애플리케이션에게 private하다.
SQLiteDatabase 오브젝트는 데이터베이스를 나타내고, 그것과 상호작용하는 메소드들을 가지고 있다. 데이터베이스를 생성하기 위해서는 SQLiteDatabase.create()를 호출하고, 또한 서브클래스 SQLiteOpenHelper를 호출한다.
SQLite 데이터베이스 시스템을 위한 지원의 일부로써, 안드로이드는 데이터베이스 관리 기능을 제공한다. 그것은 유용한 오브젝트들로 감싸진 복잡한 데이터 집합들을 저장하게 한다. 예를 들어 안드로이드는 contact 정보에 대한 데이터 타입을 정의한다. 그것은 성과 이름(문자열), 주소와 전화번호(또한 문자열), 사진(비트맵 이미지), 그리고 사람을 설명하는 다른 많은 정보를 포함하는 많은 필드들로 구성되어 있다.
안드로이드는 테이블 컨텐츠를 브라우즈하고, SQL 명령어를 실행하고, 그리고 SQL 데이터베이스의 다른 유용한 기능을 수행하는 것을 가능하게 하는 sqlite3 데이터베이스 도구를 함께 배포하고 있다.
모든 데이터베이스(SQLite와 그 밖의 것들)는 디바이스 상의 /data/data/package_name/databases 안에 저장된다.
그리고, 레코드에 대한 고유한 ID로 사용될 수 있는 자동증가 키값 필드(autoincrement value key field)를 포함할 것을 권장한다. 이것은 정적(private) 데이터를 위해서는 요구되지 않지만, 만약 컨텐트 프로바이더를 구현한다면, 그러한 고유한 ID 필드를 포함해야 한다. 


Network 

데이터를 저장하고 가져오기 위해 네트워크를 사용할 수 있다. 
네트워크 오퍼레이션을 하기 위해서는, 다음의 패키지에 있는 클래스를 사용한다.

java.net.*
android.net.*



Posted by finewoo
,