관리 메뉴

드럼치는 프로그래머

[JAVA] 자바에서의 예약어와 Utility API 본문

★─Programing/☆─JAVA

[JAVA] 자바에서의 예약어와 Utility API

드럼치는한동이 2007. 10. 29. 11:38

1. super 키워드

  어떠한 클래스가 어떠한 부모로부터 상속받은 클래스라고 할 때, 부모 클래스를 지칭하는 키워드이다. this 키워드와 보통 비교해 설명하는데, this는 자신이 소속된 메서드를 호출하는 객체를 지칭하게 되지만, super는 자신이 소속되어 있는 클래스의 부모 클래스를 지칭하게 되는 것이다.



2. final 키워드

  final은 클래스명, 메서드명, 변수명 앞에 각각 올 수 있다. 이것은 어느 곳에 위치하느냐에 따라 의미가 달라진다.

1. 클래스명 앞에 붙는 경우

    final class A{ ... }

2. 메서드명 앞에 붙는 경우

    class A{

        final void add(){...}

        ...

    }

3. 변수명 앞에 붙는 경우

    class A{

        final float PI=3.14;

        ...

    }

  1번처럼 클래스명 앞에 final이 오게되면 A라는 클래스는 더 이상 상속될 수 없음을 의미한다. 2번 같은 경우 메서드명 앞에 오게되었는데 이럴경우는 add()메서드는 더 이상 오버라이딩 될 수 없음을 의미한다. 추상 메서드는 반드시 오버라이딩이 되어야 하기 때문에 추상 메서드 앞에는 final이 올 수 없다.

  3번의 경우를 보자. 3번은 변수명 앞에 왔는데 이럴 경우에는 앞에서 얘기했던 상수화가 이루어진다. 다시 얘기하자면, 상수는 변수와 다르게 값이 변경되지 않는 수를 의미한다. 상수명은 관례상 대문자로 기술하며, 선언 후에 변경될 수 없기 때문에 선언과 동시에 반드시 초기화가 이루어져야 한다.



3. 접근제한자

  우선 이 얘기를 하기 전에 먼저 클래스와 패키지에 대한 개념부터 정립하자. 자바에서 클래스는 하나의 파일로 가정한다. 예를 들어 지금까지 클래스명과 파일명을 같게 했고, 소스 파일을 컴파일한 후에 보면 파일명과 같은 이름으로 class파일이 생성되었음을 알고 있을 것이다. 즉, 하나의 클래스는 하나의 파일로 간주하게 되는 것이고, 이 클래스들의 집합을 패키지라고 하며, 윈도우로 따지자면 파일의 집합. 즉, 폴더(디렉토리)가 되는 것이다. 이 클래스와 패키지에 대해서는 뒤에 더 따질테니 현재는 이 정도만 잡고 넘어가자.

  접근제한자의 접근 허용 범위는 public->protected->생략->private 순이다.

  public - 모든 접근에 대해 허용하며, 멤버 메서드는 대부분 public으로 선언한다.

  protected - 같은 패키지/클래스에 대해 허용.

              외부패키지라도 상속받은 자식에 대해 허용

  생략 - 같은 패키지/클래스에서만 접근 가능

  private - 같은 클래스에서만 접근 가능.

            멤버 변수를 대부분 private으로 선언한다.

            또한 뒤에서 배울 내부 클래스도 접근가능하다.



4. static 키워드

class A{

    int garo;

    int sero;

    public static void main(String args[]){

        A ob1 = new A();

        A ob2 = new A();

    }

}

  위에서 ob1과 ob2는 각각 리턴 받는 주소가 다르다. 이것은 A의 공간이 서로 다른 주소에 생성되었기 때문이다. ob1.garo=20 했을 경우 ob2.garo의 값이 동시에 20으로 바뀌지 않는 것도 위와 같은 이유 때문이다.

  그러나 static으로 선언된 정적 멤버 변수/메서드는 그렇지가 않다. 이것들은 각각의 객체들이 값을 공유해서 사용하게 되며, 객체명으로 접근하기보다는 대부분 클래스명으로 접근하게 된다.

public class StaticEx {

    private static int number=0;

    private int number1=0;

    public StaticEx() {

        ++number;

    }

    public static void main(String args[]){

        StaticEx ob1 = new StaticEx();

        System.out.println(ob1.number+"번 객체 생성");

        System.out.println(ob1.number1+"번 객체 생성");

        StaticEx ob2 = new StaticEx();

        System.out.println(ob2.number+"번 객체 생성");

        System.out.println(ob2.number1+"번 객체 생성");

        StaticEx ob3 = new StaticEx();

        System.out.println(ob3.number+"번 객체 생성");

        System.out.println(ob3.number1+"번 객체 생성");

    }

}


5. Utility API

  유틸리티 API는 유틸리티를 모아놓은 패키지를 의미하는 것이다. java.util 패키지가 바로 그것인데, 이 패키지는 유틸리티를 모아놓다보니 클래스간의 연관성을 별로 없다. 그러나 이 클래스는 JDK1.1.x부터 지원되어왔던 것이고, 대부분의 자바 플랫폼에서도 별 무리 없이 사용할 수 있을 뿐더러, 상당히 유용한 기능들을 지원하므로 한번쯤 살펴보고 진행하자.


java.util 패키지의 주요 클래스들

 

컬렉션 프레임워크

Vector, Stack, HashTable

HashSet, TreeSet, ArrayList, LinkedList, HashMap, TreeMap

자원 관련

Locale, Proprties, ResoutceBundle, PropertyResourceBundle

시간, 날짜 관련

Date, GregorianCalendar

타이머

Timer, TimerTask

압축과 해제

zip.ZipInputStream, zip.ZipOutputStream

zip.jar.JarInputStream, zip..jar.JarOutputStream

기타

Arrays - 배열에 대한 정렬, 탐색 등의 부가 기능들 제공

 

StringTockenizer - 문자열을 토큰을 이용해서 분리


  1) Vector

    배열은 크기가 고정되어 있으며, 배열의 크기를 넘어설 수 없다. 그러나 Vector는 배열과 다르게 크기가 가변적이며, 필요시 크기를 늘려서 제한없이 사용할 수 있다. 따라서 크기를 알 수 없는 배열을 사용해야 할 경우 유리하다. 개수가 정해지지 않은 데이터를 한 곳에 모을 경우에는 편하지만 배열보다는 속도가 느리다. 벡터에서 전체 크기를 용량이라고 부르며, 저장된 객체를 합친만큼을 크기라고 부른다.

  벡터에서 원소의 저장은 add()메서드로 이루어지며 제거는 remove()메서드를 사용한다. 저장된 객체는 get(int index)를 통해 얻을 수 있는데 Object 리턴형을 가지므로 저장했던 원래의 클래스로 형변환후 사용해야 한다.

  객체를 자주 저장하거나 복원할 경우 속도를 증가시키기 위해서는 벡터를 생성할 당시 초기 크기나 증가량을 충분히 설정할 필요가 있다. 또한 많은 수의 객체를 저장하기 전에 ensureCapacity(벡터의 최소 용량) 메서드로 용량을 원하는 만큼 한꺼번에 키워주는 것도 권장한다. 용량에 여유가 있다면 버퍼에 할당하는 회수가 많이 줄어들기 때문에 속도를 높이는 한가지 방법이다.

public class User {

    private int number;

    private String name;

    public User(int number, String name){

        this.number=number;

        this.name=name;

    }

    public void print(){

        System.out.println(number+"번 이름 : "+name);

    }

}

import java.util.Vector;

public class VectorEx {

    public static void main(String args[]){

        Vector v = new Vector();

        User ob1 = new User(1, "홍길동");

        User ob2 = new User(2, "이순신");

        User ob3 = new User(3, "박문수");

        User ob4 = new User(4, "김유신");

        v.add(ob1);

        v.add(ob2);

        v.add(ob3);

        v.add(ob4);

       

        for(int i=0;i<v.size();i++){

            User ob = (User)v.get(i);

            ob.print();

        }

       

    }

}


  2) Hashtable

    해시 테이블은 키 값과 대응되는 값을 저장하는 구조체인 사전 기능을 구현한 클래스이다. 쉽게 생각하면 사전을 찾을때 단어를 찾아 단어의 뜻을 찾아내는 것과 같은 이치이다. 벡터는 인덱스라는 int형의 키를 가지고 있지만, 해시 테이블은 int형이 아닌 객체 자체를 키값으로 가질 수 있다는 장점이 있다.

  키 값과 대응 값이 하나씩 짝지어지는 것을 매핑이라고 하며, 해시 테이블의 매핑은 항상 한 키에 여러개의 대응되는 값이 있어서는 않된다. 만약 같은 킷값을 이용하여 저장하려고 할 경우 먼저 있던 값에 덮어씌워지는 결과를 초래하게 된다. 또한 vector와 마찬가지로 get을 하게되면 Object형으로 리턴된다. 그러므로 클래스형으로 변환하여 사용해야 한다.

  void clear() - 모든 킷값을 제거

  Enumeration keys() -  해시 테이블의 키 값을 돌려줌

  Enumeration elements() - 해시 테이블에 저장된 객체를 돌려줌

  Object get(Object key) - 주어진 키에 대응되는 값을 돌려줌

  Ojbect put(Object key, Object value) - 키와 대응하는 것을 저장한다

  int size() - 해시 테이블의 대응 관계의 개수를 리턴한다.


  3) Enumeration

    위에서 리턴형 중에 Enumeration 클래스가 존재하는데 이 클래스는 hasMoreElements와 nextElements 두 메서드를 가지고 있다. 이를 이용하면 다음의 예와 같이 객체를 모두 얻어낼 수 있다.

for(Enumeration enu=hashtable.key(); enu.hasMoreElements() ; )

    Object ob = hashtable.get(enu.nextElement());

  다음의 예는 HashTable과 Enumeration 클래스를 이용하여 전화번호부를 구성한 예이다.

import java.util.Hashtable;

import java.util.Enumeration;

public class HTEx {

    public static void main(String args[]) {

        Hashtable ht = new Hashtable();

        ht.put("홍길동", "3481-1001");

        ht.put("박문수", "3481-1002");

        ht.put("이순신", "3481-1003");

        System.out.println((String) ht.get("박문수"));

        for (Enumeration enu = ht.keys(); enu.hasMoreElements(); ) {

            String key = (String) enu.nextElement();

            String value = (String) ht.get(key);

            System.out.println("Key : " + key + " Value : " + value);

        }

        ht.clear();

    }

}

Comments