'자바'에 해당되는 글 15건

  1. 2010.06.29 [String 비교하기] .equals()와 ==은 다른가요?
  2. 2010.06.11 Java 컴파일과 실행
  3. 2010.05.31 iBATIS
  4. 2010.05.19 Java 룩앤필 설정
  5. 2010.04.12 Java에서 저장 프로시저 사용하기
  6. 2010.04.08 C# CurrentTimeMills
  7. 2010.03.24 Java Anonymous Class
2010.06.29 15:41

[String 비교하기] .equals()와 ==은 다른가요?

우리는 코딩을 하면서 String을 비교할 때 무의식적으로 아래와 같이 코딩을 합니다.
aString.equals(bString)

하지만 왜 String을 비교할 때만 이렇게 비교하는지 우리는 알고 코딩을 하고 있는 것일까? int, boolean, long 등은 == 로 비교를 하면서 String은 왜 다를까?

지금부터  String을 비교할 때 .equals()와 == 이 어떻게 다른지 알아보자.

일단 코드를 실행해보고 결과를 보면서 진행하겠습니다. 저는 백문이불여일견이라는 말을 좋아하거든요.^^

public class Test {
    /**     * @param args     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Test().testString();
    }

    public void testString() {
        String a = "TEST";
        String b = "TEST";
        String c = new String("TEST");
        String d = new String("TEST");

        System.out.println("1:"+System.identityHashCode(a));
        System.out.println("2:"+System.identityHashCode(b));
        System.out.println("3:"+System.identityHashCode(c));
        System.out.println("4:"+System.identityHashCode(d));
        System.out.println("5:"+(a == b));
        System.out.println("6:"+a.equals(b));
        System.out.println("7:"+(c == d));
        System.out.println("8:"+c.equals(d));
    }
}

위 코드를 실행해 보면 결과는 다음과 같이 나옵니다.

사용자 삽입 이미지

결과를 보면 a,b는 hashcode값이 같지만 c,d는 값이 다른 것이 보입니다.
그럼 이번엔 비교한 결과를 볼까요? a,b는 equals()로 비교를 하거나 ==로 비교를 해도 결과는 항상 true 입니다. 하지만 c,d는 equals() 비교를 하면 트루지만 ==로 비교를 하면 false죠.

왜 이런 결과가 나올까요?

이런 결과가 나오는 이유는 equals()는 비교대상의 문자열 리터럴(값)을 비교하고 ==는 대상 객체를 비교하기 때문입니다. 또한 자바에서는 a,b처럼 같은 값을 가지면 하나의 메모리 주소를 참조하게 됩니다. 즉, a,b의 "TEST"라는 문자열 리터럴은 컴파일되면 String 객체가 되는데 a,b는 같은 메모리 주소를 가지게 됩니다. 하지만 c,d는 처음부터 별도의 String 객체로 생성되었기 때문에 동일한 "TEST"라는 문자열 리터럴을 가지지만 서로 다른 객체가 됩니다.

무슨말인지 모르시겠다구요? 그럼 그림으로 한번 볼까요?
사용자 삽입 이미지
간단하게 정리하자면 a,b는 문자열 리터럴이 컴파일시에 자동으로 하나의 String 객체가 되고 b,c는 별도의 객체가되어서 문자열 리터럴(값)으로 비교를 하면 a,b,c,d 모두 같지만 객체로 비교를 하게 되면 (a,b),c,d의 3개의 객체가 되는 것입니다.

[출처] [String 비교하기] .equals()와 ==은 다른가요?
Trackback 0 Comment 0
2010.06.11 13:22

Java 컴파일과 실행

1. Compile
java compile은 javac 명령을 이용해 가능하다.

javac source_file.java

.class 파일이 source_file의 디렉토리에 생성
예) javac MyFirstJava.java


javac -d target_directory source_file.java

.class 파일이 target_directory에 생성
예) javac -d ./lib MyFirstJava.java


2. Run
java 실행은 java 명령을 이용해 가능하다

java class_file

현재 디렉토리의 MyFirstJava 파일을 실행
예) java MyFirstJava


java -classpath target_directory class_file

현재 디렉토리의 lib 디렉토리 안의 MyFirstJava 파일을 실행
예) java -classpath ./lib MyFirstJava


3. Package
3.1 Package Compile
java에서 package 컴파일을 -d 옵션을 이용해 가능하다

javac -d target_directory source_file.java

target_directory에 패키지 형태로 class 파일이 생성된다.
예) javac -d ./lib MyFirstJava.java


3.2 Package Run
패키지를 실행하기 위해서는 -classpath 옵션을 지정해야 한다.

java -classpath target_directory package.class_file

만약 실행하고자 하는 class 파일의 package가 com.company.test이고
lib 디렉토리에 저장이 되어 있다면
예)java -classpath ./lib com.company.test.MyFirstJava
와 같이 실행을 해야 한다.


4. 외부 library를 이용한 Compile
외부 library를 이용해 컴파일을 하기 위해서는 -classpath 옵션을 사용한다.

javac -classpath lib_file.jar source_file.java

예)javac -classpath ./MyLib.jar MyFirstJava.java



[참조] Java compile과 실행

Trackback 0 Comment 0
2010.05.31 11:58

iBATIS

iBATIS의 개념
iBATIS는 간단한 XML서술자를 사용해서 간단하게 자바빈즈를 SQL statement에 맵핑시킨다. 간단함(Simplicity)이란 다른 프레임워크와 객체관계맵핑툴에 비해 iBATIS의 가장 큰 장점이다. iBATIS Data Mapper를 사용하기 위해서 당신은 자바빈즈와 XML 그리고 SQL에 친숙할 필요가 있다. 여기엔 배워야 할것도 거의 없고 테이블을 조인하거나 복잡한 쿼리문을 수행하기 위해 필요한 복잡한 스키마도 없다. Data Mapper를 사용하면 당신은 실제 SQL문의 모든 기능을 가질수 있다. JDBC 로만 프로그래밍 할 때의 번거로움을 줄여주기 위해 재사용 모듈로 개발된 것인데 그 주요한 어려움을 ibatis 개발자 가이드에서 다음과 같이 정리하고 있다.

iBATIS의 역사와 사용
  • SQL 문장과 프로그래밍 코드의 분리
  • JDBC 라이브러리를 통해 매개변수를 전달하고 결과를 추출하는 일
  • 데이터베이스 접근 클래스와 비즈니스 로직을 담은 클래스의 분리
  • 자주 쓰이는 데이터를 변경되지 않는 동안에 임시 보관(Cache)
  • 트랜젝션과 쓰레드 관리

이러한 사항들에 대해서 한번쯤 생각해볼 필요가 있다.

SQL 문장과 프로그래밍 코드의 분리
SQL문과 프로그램 코드는 꼭 분리해야 할까? 우선 프로그램이 작은 경우는 굳이 분리할 필요가 없어 보인다. 파일만 두개로 분리되기 때문에 관리에 불편함이 가중될 수 있다. 프로그램이 커져도 분리하는 것이 꼭 유리한 것만은 아니다. SQL을 사용하는 클래스가 1000개라면 분리했을 때 2000개가 되어서 더 복잡해질 수도 있다. 그럼에도 불구하고 ibatis에서는 SQL을 분리하는 이유는 무엇일까?

Separation of Concern!! 할 일의 명확한 분리. 아마도 이것이라 짐작된다. 자바 코드에서 SQL을 없애서 순수 OO로 만들어놓기. 이것은 결벽증이나 지나친 원리집착이 아니라 체계가 다른 것을 나누어 보관하는 것이다. 논리적으로 정연한 흐름을 만들어 둘 수 있고, 객체지향 입장에서 데이터에 해당하는 도메인 모델(Domain model) 혹은 도메인 객체(Domain object)와 관계형 데이터베이스의 테이블(Table)을 느슨한 관계(loosely coupled)로 만들어서 변화에 대한 유연성을 확보할 수도 있다. 즉, 정규화를 위해서 혹은 데이터 접근의 효율성을 위해서 테이블 구조를 바꾸어도 프로그램 코드 안에 있는 SQL을 수정할 필요가 없어진다.

JDBC 라이브러리를 통해 매개변수를 전달하고 결과를 추출하는 일
select 등를 할 때 조건에 해당하는 매개변수를 설정하거나, insert 문에서 값을 할당하기 위해 매개변수를 설정하는 일은 무척 번거로운 일이다. 단순한 일이면서도 오류가 잦은 부분이다. 때문에 프로젝트를 몇 차례 겪고 나면 자신만의 라이브러리를 만들거나 공통팀에서 유틸리티를 제공하는 일을 흔하게 볼 수 있다. Apache Commons의 DB Utils 나 Spring의 JDBC Template 등은 이러한 작업을 용이하게 하려고 등장했고, ibatis 역시 이러한 작업을 훨씬 부드럽게 해준다.

데이터베이스 접근 클래스와 비즈니스 로직을 담은 클래스의 분리
이른바 DAO(Data Access Object) 패턴이 이러한 일을 담당한다. ibatis는 DAO 계층 구현을 위한 유틸리티 성격이면서 동시에 best practice 역할도 수행한다.

자주 쓰이는 데이터를 변경되지 않는 동안에 임시 보관(Cache)
ibatis 에선 XML 설정만으로 캐시를 할 수 있다.

트랜젝션과 쓰레드 관리
트랜젝션 처리 역시 용이하다.


iBATIS의 주요기능 

Data Mapper (com.ibatis.sqlmap.*)
개념
iBATIS Data Mapper API는 프로그래머에게 자바빈즈 객체를 PreparedStatement파라미터와 ResultSets으로 쉽게 맵핑할 수 있도록 한다. Data Mapper의 기본적인 생각은 간단함(simple)이다. 이는 자바코드의 20%를 사용하여 JDBC기능의 80%를 제공하는 간단한 프레임워크라는 뜻이다.

작동원리
Data Mapper는 자바빈즈, Map구현, 원시래퍼타입(String, Integer…) 그리고 SQL문을 위한 XML문서를 맵핑하기 위한 XML서술자를 사용하는 매우 간단한 프레임워크를 제공한다.

다음은 생명주기에 대한 높은 레벨의 서술이다.
1) 파라미터(자바빈즈, Map 또는 원시래퍼)로써 객체를 제공한다. 파라미터 객체는 update문내에 입력값을 셋팅하기 위해 사용되거나 쿼리문의 where절을 셋팅하기 위해서 사용된다.

2) 맵핑된 statement을 실행한다. 이 단계는 마법이 일어나는곳이다. Data Mapper프레임워크는
PreparedStatement 인스턴스를 생성할것이고 제공된 파라미터객체를 사용해서 파라미터를 셋팅한다. 그리고 statement를 실행하고 ResultSet으로부터 결과 객체를 생성한다.

3) update의 경우에 영향을 미친 rows의 숫자를 반환한다. 조회문일경우에 한 개(single)의 객체 또는 컬렉션 객체를 반환한다. 파라미터처럼 결과 객체는 자바빈즈, Map 원시타입래퍼또는 XML이 될수 있다.

[출처] iBATIS 란?

Trackback 0 Comment 0
2010.05.19 11:12

Java 룩앤필 설정

0. 룩앤필(look and feel)이란?
소프트웨어 디자인에서 룩앤필은 GUI(Graphical User Interface)측면과 디자인의 형태 구성에서 사용되는 용어로 색상, 모양, 레이아웃, 서체(look)와 같은 요소와 버튼, 박스, 메뉴(feel)와 같은 동적 요소의 행위를 포함한다.

1. 소개
별도로 룩앤필을 지정하지 않으면 자바 룩앤필이 기본으로 지정된다.
룩앤필을 지정할 때에는 다음과 같이 UIManager 클래스를 사용하면 된다

try {
    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) { 
    System.err.println("Cannot set look and feel:" + e.getMessage ()); 
}


UIManager 클래스의 getCrossPlatformLookAndFeelClassName() 메소드는 자바 룩앤필 클래스 이름을 리턴한다. getSystemLookAndFeelClassName() 메소드는 현재 자바 스윙 컴포넌트가 실행되고 있는 환경에 따라 다른 클래스 이름을 리턴한다. 즉, 마이크로소프트 윈도우 시스템에서 실행되고 있다면 윈도우 룩앤필 클래스 이름을 리턴하고, 유닉스의 X 윈도우 시스템에서 실행되고 있다면 모티프 룩앤필 클래스 이름을 리턴할 것이다.

2. 룩엔필 지정하기
메탈 룩앤필 설정 예)
try {
    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch(Exception e) { 
}


시스템에서 사용하는 룩 앤 필을 사용하는 예)
try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch(Exception e) { 
}


윈도우 룩앤필 설정 예)
try {
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch(Exception e) { 
}


3. LookAndFeel 바꾸기
프로그램의 GUI 가 보인후에도 Look & Feel을 setLookAndFeel() 을 이용하여 변경이 가능하다.
새로운 l&f 을 컴포넌트에 적용하기 위해서는 SwingUtilities.updateComponentTreeUI() 을 최상위 컨테이너에서 호출해야 한다.

UIManager.setLookAndFeel ( Look&Feel_Name );
SwingUtilities.updateComponentTreeUI ( frame );
frame.pack ( );
...


4. 클래스/메소드
UIManager.setLookAndFeel()
- 프로그램의 룩앤필을 변경한다.
- 지원하는 룩앤필이 아니면 UnsupportedLookAndFeelException을 발생

UIManager.getCrossPlatformLookAndFeelClassName()
- 자바의 플랫폼 중립적인 메탈 룩 앤 필을 나타내는 객체 반환

UIManager.getSystemLookAndFeelClassName ()
- 현재 시스템에 맞는 Look & Feel 을 제공한다.

플랫폼별 L&F 이름
Windows L&F -  "com.sun.java.swing.plaf.windows.WindowsLookAndFeel" (윈도우 전용)
CDE/Motif L&F - "com.sun.java.swing.plaf.motif.MotifLookAndFeel" (모든 OS 가능)
Mac OS L&F - "javax.swing.plaf.mac.MacLookAndFeel" (Mac OS 전용)

Trackback 0 Comment 0
2010.04.12 12:51

Java에서 저장 프로시저 사용하기

자바에서 저장 프로시저를 사용하기 위한 코드는 다음과 같다.

Connection con=null;
ResultSet rs=null;
CallableStatement cs=null;

try{
    String url="jdbc:oracle:thin:@00.0.0.000:1521:orcl";
    String id="id";
    String pass="password";

    Class.forName("oracle.jdbc.driver.OracleDriver");
    con = DriverManager.getConnection(url, id, pass);
    //프로시저 불러내고
    cs=con.prepareCall("{call TEST_PR(?,?,?)}");
    //인자값 넣고
    cs.setString(1,"2006");
    cs.setString(2,"1");
    //출력값
    cs.registerOutParameter(3,java.sql.Types.VARCHAR);
    //실행
    cs.executeQuery();
    //출력값 출력
    out.println(cs.getString(3)); 
}catch(Exception e){
    out.println("error");
    e.printStackTrace();
}
finally{
    if(rs!=null)
        rs.close();
    if(cs!=null)
        cs.close();
    if(con!=null)
        con.close();
}

[출처] 구네구네의 블로그

Trackback 0 Comment 0
2010.04.08 13:50

C# CurrentTimeMills

Java의 System.currentTimeMillis() 와 동일한 효과를 내는 C# code

public long CurrentTimeMillis()
{
    DateTime Epoch = new DateTime(1970, 1, 1);
    return (long)(DateTime.UtcNow - Epoch).TotalMilliseconds;
}


C#에서는 기준점이 0001-01-01이지만 Java에서는 1970-01-01이다.
또한 C#은 local date를 사용하지만 Java는 UTC date를 사용한다.

따라서 기준일을 1970 년 1월 1일로 설정하고 시간도 UTC로 얻어와 계산하면 된다.

[출처] Java System.currentTimeMillis() equivalent
Trackback 0 Comment 0
2010.03.24 18:12

Java Anonymous Class

A type of inner class that has no name that you define right in the middle of a method (where static init blocks and instance init blocks count as methods). You define it, and create an object of that type as a parameter all in one line. An anonymous class is defined and instantiated in a single succinct expression using the new operator.Used for creating simple delegate callback objects.These anonymous inner classes can access the static and instance variables of the enclosing outer class.
Instead of passing arguments to a constructor, your inner class methods can reach out and grab what they need directly from local variables in the enclosing method. The other technique is to use an instance initialiser block. You are only allowed one per anonymous inner class.

Syntax for Anonymous Classes

new class-name ( [ argument-list ] ) { class-body }

package Vinay;
public class VinayMain
{
    public static void main(String[] args)
    {
        // Here is where the anonymous class is defined and instantiated //
        Runnable vinayrun = new Runnable()
        {
            int Total = 0;
            public void run()
            {
                for (int i=0; i<10000000; i++)
                {
                    Total++;
                }
                System.out.println(Integer.toString(Total));
            }
        };

        vinayrun.run();
    }
}


create an instance, named vinayrun , of a nameless (anonymous) class which implements the java.lang.Runnable interface.And we are calling the run mehtod of anonymous class through vinayrun object.

Drawback– The big drawback with anonymous classes is they can’t have explicit constructors. You can’t pass them any parameters when they are instantiated.

Benefits of Anonymous Classes
The key benefit of an anonymous class is encapsulation (or clutter reduction). An anonymous class is, in a sense, the ultimate in private object oriented encapsulation. It is defined exactly where it is needed, it can never be used anywhere else, and it has totally local scope.One final key benefit of anonymous classes is that they have access to all data and methods of their containing classes, including private members; meaning that for small highly localized tasks, they may require less initialization.

References -
http://ssmela.googlepages.com/AnonymousClassesinJava.pdf
http://mindprod.com/jgloss/anonymousclasses.html

[출처] techartifact.com

Trackback 0 Comment 0