5.1.1 추상클래스의 개념

Abstract클래스는 빈 깡통 클래스입니다. abstract클래스는 구현이 덜 되었거나 또는 아직은 미완성 클래스이기 때문에 우리는 이 클래스를 추상 클래스라 부릅니다. 어디가 미완성일까요? 미완성 메서드를 포함하고 있기 때문에 클래스자체가 미완성이 되는 것입니다. 미완성 메서드는 어디가 미완성일까요? 메서드의 몸체가 없습니다. 몸체 없는 메서드, 이를 우리는 추상 메서드라 부릅니다. 그리고 이 추상 메서드를 단 하나라도 포함하고 있는 클래스를 추상 클래스라고 합니다.

 

 

5.1.2 추상클래스와 추상메서드

 추상클래스는 미완성 클래스이기 때문에 약점이 있습니다. 완전한 클래스가 아니기 때문에 절대 객체를 생성하지 못합니다. 당연한 것 아니겠습니까? 완성되지 않은 클래스이니 객체를 만들 수 없다는 것은 이치에 합당합니다. 이 미완성 클래스를 어디에 사용할까요? 사용방법은 다음과 같습니다.(이해하기 편하게 추상클래스를 추상아버지클래스, 이를 상속 받는 클래스를 아들클래스라고 하겠습니다. )

 

n        추상아버지 클래스는 추상 메서드를 가지고 있습니다.

n        아들 클래스는 추상 아버지클래스로부터 상속 받습니다.

n        아들은 추상 아버지 클래스의 몸체 없는 메서드를 모두 메서드 재정의와 같이 다시 만듭니다. 이것을 우리는 구현한다고 말합니다. 몸체를 달아 주는 것입니다.

n        아들 클래스는 완성된 클래스이기 때문에 객체를 생성할 수 있습니다.

 

 다음은 추상 메서드를 만드는 방법을 보여 주고 있는 예입니다.

추상 메서드를 만드는 방법

abstract class 클래스이름 {

abstract 메소드선언;        // 메소드의 몸체는 없음

abstract 메소드선언;        // 메소드의 몸체는 없음

}

 

)

 

public abstract class AbstractTest {

   public abstract void abstractMethod();

}

 

메서드에 몸체가 붙지 않는다면 여러분은 반드시 abstract키워드를 붙여야 합니다. 그리고 이 abstract메서드를 하나라도 포함하고 있다면 클래스명 앞에 abstract를 붙여야 합니다. 안 붙이면 언제나 그런 것처럼 친절하게 에러를 발생 시킵니다. 아래의 에러는 추상클래스내에 추상 메서드에 abstract를 붙이지 않았을 때 발생하는 에러입니다.

 

C:\examples\5. Class for Polymorphism Java>javac AbstractTest.java

AbstractTest.java:2: missing method body, or declare abstract

        public void abstractMethod();

                    ^

1 error

 

아주 간단하죠. 추상 클래스는 그 자체로는 객체를 생성할 수 없다는 것을 한번 더 밝혀 두며 실제 이용하는 가장 간단한 예를 보도록 하겠습니다.

 

NewCan.java(추상 메서드를 만드는 방법)

public class NewCan extends EmptyCan{

             public void sound(){

                           System.out.println("EmptyCan:빈깡통은 소리가 요란하다");

             }

             public void who(){

                           System.out.println("EmptyCan:나는 빈깡통입니다.");

             }

             public void sayHello(){

                           System.out.println("NewCan:추상클래스 테스트입니다.");

             }

             public static void main(String args[]) {

                           NewCan ecm = new NewCan();

                           ecm.who();

                           ecm.sound();

                           ecm.sayHello();

             }

}

Empty.java(추상클래스)

public abstract class EmptyCan{  

   public abstract void sound();//몸체없음

   public abstract void who();//몸체 없음  

}

C:\examples\5. Class for Polymorphism Java>javac NewCan.java

 

C:\examples\5. Class for Polymorphism Java>java NewCan

EmptyCan:나는 빈깡통입니다.

EmptyCan:빈깡통은 소리가 요란하다

NewCan:추상클래스 테스트입니다.

 

추상클래스는 객체가 가지는 특성들을 추상화시켜 놓았을 뿐, 아직 구체화 시키지 못한 클래스이므로, 이 추상클래스를 상속하는 하위클래스에서 좀 더 구체화 시키도록 하는 방법을 사용합니다. 주의 할 것은 추상 메서드를 하나도 빼지 말고 전부 구현 해야 객체를 생성할 수 있습니다. 아들이 상속을 받아서 추상 메서드를 하나라도 남겨 두었다면 아들도 추상클래스가 됩니다. 부전자전이죠. 다음은 상속을 했지만 추상 메서드를 전부 구현 하지 않았다면 abstract클래스가 되는 것을 증명하는 예제입니다.

 

CompleteCan.java(추상 메서드를 만드는 방법)

public class CompleteCan extends IncompleteCan{

             public void who(){

                           System.out.println("EmptyCan:나는 빈깡통입니다.");

             }

             public void sayHello(){

                           System.out.println("NewCan:추상클래스 테스트입니다.");

             }

             public static void main(String args[]) {

                           CompleteCan cc = new CompleteCan();

                           cc.who();

                           cc.sound();

                           cc.sayHello();

             }

}

Incomplete.java(추상클래스)

public abstract class IncompleteCan extends EmptyCan{

             public void sound(){

                           System.out.println("EmptyCan:빈깡통은 소리가 요란하다");    

             }

}

Empty.java(추상클래스)

public abstract class EmptyCan{  

   public abstract void sound();//몸체없음

   public abstract void who();//몸체 없음  

}

C:\examples\5. Class for Polymorphism Java>javac EmptyCan.java

C:\examples\5. Class for Polymorphism Java>javac IncompleteCan.java

C:\examples\5. Class for Polymorphism Java>javac CompleteCan.java

C:\examples\5. Class for Polymorphism Java>java CompleteCan

EmptyCan:나는 빈깡통입니다.

EmptyCan:빈깡통은 소리가 요란하다

NewCan:추상클래스 테스트입니다.

 

추상메소드는 추상클래스와 마찬가지로 아직 구현이 이루어지지 않고 단지 그 메서드의 이름만 가지고 있다는 뜻입니다. 그래서 몸체가 없다고 말하고 있는 것입니다. 이것을 역으로 말한다면 추상메서드가 되려면 몸체가 없어야 한다라는 명제를 얻을 수 있습니다. 보통 우리가 전문적인 용어로 이야기 할 때 추상메서드는 메서드의 프로토타입만 가지고 있다라고 이야기 합니다. 

 

 

5.1.3 클래스의 구조를 디자인하기 위한 추상 클래스

 추상클래스는 클래스의 구조를 잡기 위한 방법으로 사용됩니다. 하나의 클래스를 만든다고 가정한다면 하나의 클래스에 모든 것을 전부 넣을 수는 없습니다. 이러한 방법은 별로 좋지 않은 방법이죠. 클래스가 크다고 가정한다면 작업별로 클래스를 쪼개게 됩니다. 작업을 분할 하는 것은 수평적인 개념에서 비슷한 작업끼리 묶는 것입니다. 유유상종(類類相從)이라는 말이 적당할 것 같군요. 비슷한 작업끼리 묶어서 작업별 클래스를 만드는 것입니다.

 

저 또한 초보시절의 자바 프로그램은 비슷한 작업을 묶는 것으로 시작했습니다. 하지만 수평적으로 묶는 것 조차도 작업의 설계와 분석을 해야만 이루어지는 아주 어려운 일입니다. 이 단계를 거치고 나면 작업을 레벨단위로 묶는 것을 생각하게 됩니다. 거의 1년 이상 걸리더군요. 제가 머리가 나빠서 그런지도 모르겠지만 개인적으로는 상당히 어려운 일이었습니다. 레벨 단위의 작업으로 발전하기까지는 상당히 많은 시간과 생각이 필요한 것 같습니다. 작업을 단계별로 만들어 주는 역할을 하는 것이 바로 추상 클래스의 역할입니다.

레벨 단위의 구조를 살펴 보도록 하죠.

위의 그림은 도형을 그리기 위한 클래스를 디자인 하고 있습니다. 모든 클래스에서 공통되는 작업을 상위레벨에 놓고 그 클래스를 상속 받아 각각의 다른 클래스로 분류되어지고 있습니다. 상위레벨에 존재하는 작업은 구현할 필요성이 없다고 생각하여 abstract으로 만듭니다. 즉, 하위레벨에서 구현하겠다는 것입니다. 이렇게 하였을 때의 코드를 직접 만들어 보겠습니다. 물론 Shape클래스는 abstract으로 만들어질 것이며 그 하위의 Circle, Triangle, Rectangle은 모두 Shape의 abstract메서드를 구현 할 것입니다. 구현은 대충 아래와 같이 되어 질 것입니다.

 

FigureTest.java(abstract의 레벨기법을 테스트하기 위한 예제)

abstract class Shape {

             public abstract void draw();

             public abstract void delete();

}

class Circle extends Shape {

             public void draw(){

                           System.out.println("원을 그립니다");           

             }

             public void delete(){

                           System.out.println("원모양을 지웁니다");     

             }

}

class Triangle extends Shape {

             public void draw(){

                           System.out.println("삼각형을 하나, 둘, 셋, 그립니다.");          

             }

             public void delete(){

                           System.out.println("삼각형을 지웁니다");     

             }

}

class Rectangle extends Shape {

             public void draw(){

                           System.out.println("사각형을 원, 투, 쓰리, 포 그립니다.");     

             }

             public void delete(){

                           System.out.println("사각형을 지웁니다");     

             }

}

//abstract을 테스트하기 위한 클래스

public class FigureTest{

             public static void main(String[] args){

                           Circle c = new Circle();

                           Triangle t = new Triangle();

                           Rectangle r = new Rectangle();

                           c.draw();

                           t.draw();

                           r.draw();

                           c.delete();

                           t.delete();

                           r.delete();

             }

}

C:\examples\5. Class for Polymorphism Java>javac FigureTest.java

C:\examples\5. Class for Polymorphism Java>java FigureTest

원을 그립니다

삼각형을 하나, 둘, 셋, 그립니다.

사각형을 원, 투, 쓰리, 포 그립니다.

원모양을 지웁니다

삼각형을 지웁니다

사각형을 지웁니다

 

상속과 abstract을 설명하기 위해서 어디서나 흔히 볼 수 있는 예제입니다. 이 간단한 예제가 무엇을 의미하는지 제대로 안다면 자바의 강력한 힘을 발휘할 수 있습니다. 클래스의 수평적인 작업 분할과 수직적인 작업 분할을 동시에 이용한다면 여러분은 아주 효율적인 코드를 작성할 수 있습니다. 재사용성 100%와 유지, 보수, 관리 능력까지 갖춘 잘 설계된 프로그램을 하실 수 있을 것입니다.

 

 

5.1.4 결론

추상클래스에 대하여 정리 해 보죠.

 

n         추상 메서드는 몸체 없는 프로토타입만을 가진 메서드입니다.

n         추상 메서드는 반드시 메서드이름 앞에 abstract 키워드를 명시해야 합니다.

n         추상 메서드를 단 하나라도 포함하고 있으면 이를 추상 클래스라고 합니다.

n         추상 클래스는 클래스이름 앞에 abstract를 명시해야 합니다.

n         상속을 이용하여 추상 메서드를 모두 구현한 뒤, 객체를 생성할 수 있습니다.

 

일반적인 특징은 이러하지만 추상클래스의 뒷면에 존재하는 느낌은 수직적인 작업의 분할이라는 아주 무서운 개념이 숨어 있습니다. 프로그램을 하면서 어떻게 계층적으로 프로그램을 할지를 결정하지말고 펜을 들고 작업을 분석하는 것이 옳을 것입니다. 그리고 작업 분석이 끝났다면 수직과 수평의 개념을 적용 시켜서 어느 정도 설계를 하는 것이 옳을 것입니다. 하지만, 기본적인 배경 없이는 아무것도 할 수 없으니 지금은 느낌을 얻으시기 바랍니다.

 

여러분이 클래스를 만들고 시간이 지나서 다시 여러분이 만든 클래스를 볼 기회 있을 것입니다. 절대 같은 디자인의 클래스는 만들 수 없습니다. 물론, 클래스를 만드는 기법은 비슷하지만 같은 디자인으로는 프로그램을 하려고 해도 잘 되지 않습니다. 약간의 시간이 지난 후, 과거와 현재를 비교해 보면 여러분 스스로 진화했다는 말을 사용해도 될 만큼 아주 많은 발전을 이룬 것을 볼 날이 있을 것입니다. 

'개발지식창고 > JAVA' 카테고리의 다른 글

static 키워드 바로 알기  (0) 2011.09.11
오버로딩, 오버라이딩, 추상클래스, 인터페이스 개념  (0) 2011.09.11
Final  (0) 2011.09.11
Vector(벡터) 정리  (0) 2011.09.11
자바 벡터 테스트 예제  (0) 2011.09.11
Posted by 모과이IT
,

Final

개발지식창고/JAVA 2011. 9. 11. 23:18

final 키워드는 대개 정적인 방식으로 많이 쓰입니다. 예를 들어 클래스 상수로 쓰이거나, 클래스의 상속이나 메소드 재정의(overriding)을 막기 위해서 자주 사용되죠.

상대적으로 잘 쓰이지 않지만, 초기화 이후에 값을 바꿀 수 없는 변수를 만드는 동적인 용도로도 사용이 가능합니다. 자바 언어 레퍼런스를 보면 다음과 같이 내용이 있습니다:

A variable can be declared final. A final variable may only be assigned to once. It is a compile time error if a final variable is assigned to unless it is definitely unassigned immediately prior to the assignment.

C나 C++에 const라는 키워드가 있는데 변수에 대해서는 final보다 const가 더 적절한 이름이라고 생각합니다. 하지만, 클래스나 메소드 정의에 부여하는 경우는 final이 아주 좋다고 생각합니다.

배열을 인자로 받아서 합계를 내는 함수가 있다고 해보죠.

int sum(int[] a) {
  int result = 0;
  for (int i : a)
       result += i;
  return result;
}

이 경우 어떤 이유에서건 아래와 같이 구현된다면 해당 메소드를 사용자 입장에서는 의도하지 않은 결과를 접하게 될 가능성이 높습니다.

int sum(int[] a) {
 int[] others = {-1, -2, -3};
 a = others;
 int result = 0;
 for (int i : a)
  result += i;
 return result;
}

간단한 예를 통해서 보면 완전히 어리섞은 구현이긴 합니다. 하지만, 테스트가 없이 장문의 타이핑을 하는 환경에서는 이와 유사한 일이 일어나지 말라는 법은 없습니다.

int sum(final int[] a) {
  int result = 0;
  for (int i : a)
       result += i;
  return result;
}

이와 같이 정의해주면 적어도 a에 새로운 할당을 시도할 수 없게 됩니다.

3 + 4 = ?

위와 같이 더하기라는 연산을 할 때 피 연산자인 3과 4는 변하지 않습니다. 3과 4가 변한다면 사람들은 위험해서(?) 덧셈을 하지 않겠죠. :)

sum()에 인자로 제공해주는 것은 피연산자와 같습니다. 의미적으로 상수가 전달되어야 하는 경우라고 할 수 있죠. 이럴 때 final을 붙여주면 보다 의미가 명확해질 수 있습니다.

아래와 같은 구문에 왜 final을 쓰면 안되느냐는 질문을 받은 일이 있습니다.

int sum(int[] a) {
  final int result = 0;
  for (int i : a)
       result += i;
  return result;
}

자칫 범하기 쉬운 오류지만, result라는 변수의 용처를 명확하게 정립해보면 논리적인 오류임을 알 수 있습니다. result는 말 그대로 임시 저장소입니다. 지역 변수(local variable)은 임시(temp/temporary) 변수라고 하는데 딱 어울리는 용도로 사용한 것이죠.

세로 타원으로 그린 것이 for 문의 실행시의 논리적인 영역을 나타냅니다. 문맥(context)이라고 할 수도 있겠죠.  반복이 진행되면서 우측으로 이동하기 때문에 배열의 요소들의 이전 값을 기억하기 위해서는 별도의 저장소가 요구됩니다. 어떤 프로그래밍 언어를 배우거나 초기에 익히는 것이지만, 논리적으로 이러한 그림을 머리속에 그릴 수 있다면 더욱 복잡한 경우를 포용할 때 매우 유리합니다.

위와 같은 경우 a[0]의 값이 temp에 들어가 있어야 하고, 반복이 한 차례 더 수행되면 temp 값에 a[1]을 더한 값이 다시 할당되어져야 하니 final로 정의하는 것은 실수죠.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 모과이IT
,

●벡터(Vector)

   1. 대용량의 데이터를 효과적으로 다룰 있는 클래스

   2. 용량의 변경이 용의

   3. 벡터에 저장하는 모든 데이터는 Object타입

   4. 어떤 종류의 객체도 함께 담을 있다.

   +++ 배열의 크기를 한번 정해지면 변경 불가하고 같은 종류의 데이터만

        사용할 있다는 단점 보안

 

벡터 생성자

   1. Vector :  초기용량이 10, 용량 초과시 크기를 두배 증가

   2. Vector(int aaa) : 지정한 크기의 용량으로 초기화된 Vector 객체를 생성한다.

   3. Vector(int aaa, int bbb) : 지정한 크기의 용량으로 초기화된 벡터객체를 생성하고

                                          용량 초과시 bbb만큼 증가 시킨다.

일반적으로 용량의 문제가 거의 발생하지 않기 때문에 보통 인자가 없는

    생성자를 사용하여 벡터 객체를 생성한다.      Vector v = new Vector();

 

●벡터에 객체 저장

  메소드

   1. void add(int index, Object object) - 지정한 인덱스의 위치에 객체를 추가함

   2. void addElement(Object objec) - 벡터의 끝에 객체를 추가한다

        Vector v = new Vector();

        v.add(1, "은주");             //지정한 위치에 객체 추가

        v.addElement("현규");     //마지막에 객체 추가

        v.addElement("수미");     //마지막에 객체 추가

 

●벡터로 부터 객체 삭제

  메소드

1.       Object remove(int index) – 지정한 위치의 객제를 벡터에서 제거

2.       boolean remove(Object object) – 지정한 객체를 벡터에서 제거

3.       void clear() – 벡터의 모든 요소를 제거

) Vector v = Vector();            //벡터 생성

   v.remove(3);                        //지정한 위치의 객체 제거

   v.remove(“은주”);            //지정한 객체 제거

   v.clear();                        //벡터의 모든 요소를 제거

 

●벡터로 부터 객체 검색

  메소드

1.       Object elementAt(int index) – 지정한 위치의 객체를 리턴

2.       Object get(int index) – 지정한 위치의 객체를 리턴

벡터에 요소를 추가할 때는 String형을 그대로 사용할 있지만 검색한 결과는 Object형이므로 사용하기 위해서는 원래 데이터형으로 캐스팅해야 한다.

) Vector v = Vector();                        //벡터 생성

   String s = (String)v.elementAt(0);            //지정한 위치의 객체를 리턴

   String s2 = (String)v.get(1);                   //지정한 위치의 객체를 리턴

   Enumeration e = v.elements();            //Vector 요소의 리스트를 리턴

    Iterator 비슷한 역할(저장 객체 추출)

 

 

●벡터의 기타 메소드

1.      int capcity() – 벡터의 현재 용량의 리턴

2.      boolean contains(Object object) – 주어진 요소가 벡터에 있는지 알아낸다.

3.      int indexof(Object object) – 주어진 요소의 위치를 리턴(없으면 -1)

4.      int size() – 벡터에 포함되어 있는 요소의 수를 리턴

5.      void trimToSize() – 벡터의 용량을 현재 벡터의 크기에 맞게 수정

 

Enumeration

벡터에 저장된 객체를 열거형으로 리턴

  Enumeration e = v.elements();               //Vector 요소의 리스트를 리턴

     While(e.hasMoreElements()) {

    System.out.println(e.nextElement());

}

 

Iterator

Collection 저장된 객체를 나열 또는 열거하기 위한 인터페이스

  Iterator ie = v.iterator();         //Vector 요소의 리스트를 리턴

  While(ie.hasNext()){

    System.out.println(ie.next());

}

 

Stack

1.      Object 저장하는 하나의 방법

2.       가장 나중에 들어간 데이터가 가장 먼저 밖으로 나오는 형태

LIFO(Last In First Out)

) import java.util.*;

public class StackTest{

public static void main(String[] args){

      Stack s = new Stack();

      System.out.println(s.empty());           //스택이 비어있는지 확인 true

      s.push(“은주”);           //데이터 넣기

      s.push(“현규”);

      System.out.println(s.empty());           //false

      System.out.println(s.peek());   //가장 먼저 나올 데이타(은주)

      System.out.println(s.pop());           //스택에 저장 되어 있는 차례로 출력

      System.out.println(s.pop());

      System.out.println(s.empty());            //스택이 비어있는지 확인 true

}

}

 

LinkedList

1.      List 인터페이스의 링크 리스트의 구현

2.      void add(int index, Object element) – 지정된 위치에 지정된 요소 삽입

void addLast(Object element) – 리스트의 마지막에 지정된 요소 추가

Object get(int index) – 지정된 위치에 있는 요소 리턴

Object getLast() – 리스트내의 마지막 요소 리턴

Object remove(int index, Object element) – 지정된 위치에 있는 요소 삭제

3.      데이터의 첨가, 삭제가 편리하고 속도가 빠르다.

 

Map & hashing

키와 값의 쌍으로 이루어진 요소를 저장하는 자료구조

해싱이란 키객체를 처리하여 hash code(정수값) 만들어 내는 방법이다.

 

HashMap

Null허용, Map interface implements 클래스

 

Hashtable

Null 허용하지 않음, Map interface implements 클래스

'개발지식창고 > JAVA' 카테고리의 다른 글

추상클래스의 개념  (0) 2011.09.11
Final  (0) 2011.09.11
자바 벡터 테스트 예제  (0) 2011.09.11
Eclipse Console 에서 한글이 깨지는 경우  (0) 2011.09.11
[JAVA] 자바의 자료형  (0) 2011.09.10
Posted by 모과이IT
,

자바 벡터 테스트 예제 기본입니다.
기본적인 기능을 있는 예제 입니다.

class VectorTest 
{
 public static void main(String[] args) 
 {
  /*
  // Vector의 요소 접근
  java.util.Vector v = new java.util.Vector();

  for(int i=0; i<args.length; i++)
   v.addElement(args[i]);  // 데이터를 낱개로 addElement을 사용
  System.out.println(v);

  for(int i=0; i<v.size(); i++){
   System.out.println("Vector " + i + "번째 요소는 " + v.elementAt(i));
  }
  */
  /*
  // Vector의 요소 찾기
  java.util.Vector v = new java.util.Vector();
  for(int i=0; i<args.length; i++)
   v.addElement(args[i]);

  String s = "임꺽정";

  if(v.contains(s)){
   int i = v.indexOf(s);
   System.out.println("해당 객체가 " + (i+1) + "번재 있다.");
  }
  else{
   System.out.println("해당 객체가 없다.");
  }
  */

  /*
  // 벡터의 요소 지우기
  java.util.Vector v = new java.util.Vector();

  for(int i=0; i<args.length; i++)
   v.addElement(args[i]);  // 데이터를 낱개로 addElement을 사용
  System.out.println(v);

  for(int i=0; i<v.size(); i++){
   System.out.println("Vector " + i + "번째 요소는 " + v.elementAt(i));
  }

  System.out.println("===================지우고 난 후 ==================");

  v.removeElementAt(0);

  for(int i=0; i<v.size(); i++){
   System.out.println("Vector " + i + "번째 요소는 " + v.elementAt(i));
  }
  */

  // Vector의 크기 변화 시키기 
  java.util.Vector v = new java.util.Vector();

  for(int i=0; i<args.length; i++)
   v.addElement(args[i]);  // 데이터를 낱개로 addElement을 사용

  System.out.println("벡터에 들어있는 엘리먼트 수는 " + v.size());
  System.out.println("벡터의 크기는 " + v.capacity());

  v.trimToSize();

  System.out.println("벡터의 크기는 " + v.capacity());


 }
}

==========================예제2===================================== 

자바 벡터를 객체로 적용된 예제입니다.

class Mem{
 String name;
 int age;
 String address;

 Mem(String name, int age, String address){
  this.name = name;
  this.age = age;
  this.address = address;
 }
 void Disp(){
  System.out.println(name + "\t" + age + "\t" + address);
 }
}

class VectorTest1 
{
 public static void main(String[] args) 
 {
  Mem ob1 = new Mem("홍길동", 24, "서울");
  Mem ob2 = new Mem("임꺽정", 28,  "광주");
  Mem ob3 = new Mem("이순신", 32, "제주");

  java.util.Vector v = new java.util.Vector();
  v.addElement(ob1);
  v.addElement(ob2);
  v.addElement(ob3);

  //System.out.println(v);

  java.util.Enumeration e = v.elements();
  
  Mem m[] = new Mem[3];
  int i = 0;
  while(e.hasMoreElements()){
   m[i] = (Mem)e.nextElement();
   i++;
  }

  m[0].Disp();
  m[1].Disp();
  m[2].Disp();
///////////////////////////////////////////////////////////////
  for(i=0; i<3; i++){
   Mem m2 = (Mem)v.elementAt(i);
   m2.Disp();
  }

 }

}

 

'개발지식창고 > JAVA' 카테고리의 다른 글

Final  (0) 2011.09.11
Vector(벡터) 정리  (0) 2011.09.11
Eclipse Console 에서 한글이 깨지는 경우  (0) 2011.09.11
[JAVA] 자바의 자료형  (0) 2011.09.10
이클립스로 자바 프로그램 Hello World 만들기  (0) 2011.09.10
Posted by 모과이IT
,

최근 Java Module을 만들면서 UTF-8로 프로젝트를 생성하고 코드를 작성하고 있었다.
회사에서 배포하는 Module이 다국어를 지원 할 수 있어야 하는 관계로 어쩔 수 없는 상황.

그런데 묘하게도 실행/디버깅을 하는 과정에서 Eclipse 콘솔 화면에 한글이 깨져서 출력되는 것이다.

이클립스 콘솔에서 어플리케이션 실행 시 한글이 깨져서 출력되는 모습.


'아띠...! 이게 모야...'

위 화면은 실제 업무중 어플리케이션 실행시 입력한 인자값을 체크하여 부적합한 옵션 입력 시 에러를 출력하는 화면을 간단하게 만들어 테스트 하는 과정에서 발생한 경우이다.

프로젝트 인코딩을 UTF-8로 설정하였기에 각 Java 소스 파일이 ANSI로 저장되었나 싶어 확인 해보니 Java 소스는 UTF-8 포맷으로 저장되어 있었다.

이쯤 되면 이제 고민에 빠진다... 구글링을 할 것인가.. 그냥 넘어 갈 것인가.
요즘 출퇴근 하는 동안 '실용주의 프로그래머' 라는 책을 읽고 있는데, 책의 저자를 생각해서라도 저건 그냥 넘어가서는 안될 것 같았다. 찾아보면 해결방법은 얼마든지 있다.

Run Configuration > 작성중인 Application 선택 > Common 탭 으로 이동하여 보면 "Console Encoding" 이라는 항목이 있으며, Default 가 inherited 되어 있기 때문에 현재는 Console Encoding이 UTF-8로 설정되어 있을 것이다. 이걸 Other 옵션에서 EUC-KR로 바꿔준다.

현재 Console Encoding 이 UTF-8 로 프로젝트 Encoding에 의해 상송되어 있다.

Other 옵션을 체크하고 우측의 Select Box 에서 EUC-KR을 선택하였다.


위 화면과 같이 설정하고 Apply를 클릭.
이제 어플리케이션을 실행하여 한글이 정상적으로 출력 되는지 확인하는 과정만 남았다.
두근거리는 가슴을 안고 실행...!!


오~!! 멋져..!! 이제 한글이 정상적으로 출력 된다.
이런 순간이 되면, 오늘 할일을 다 한것 같은 기분이 든다.

Posted by 모과이IT
,

[JAVA] 자바의 자료형

▶ 자료형 : 데이터가 갖는 형으로 데이터의 실질적인 구조 및 개념을 의미한다.

▶ 기본 자료형
- boolean, byte, short, int, long,float, double, char

▶ 참조형 (주기억 장치에 저장되어 있는 객체의 주소값을 가르킨다.)
-  배열 참조형 : 배열 객체를 참조하기 위한 자료형
- 클래스 참조형 : 클래스 객체를 참조하기 위한 자료형
- 인터페이스 참조형 : 인터페이스 객체를 참조하기 위한 자료형

▶ 정수 리터널
* 리터널 : 값이 한번 정의되면 프로그램이 실행되는 도중에 변하지 않는 값으로 소수점을 갖지 않는 정수를 말한다.
- 10진수형 : 숫자 0~ 9로 구성된 자연수 (ex 234)
- 8진수형 : 0~7이내 상수앞에 '0'을 붙인다. (ex 071)
- 16진수형 : 0~9, A~F 상수앞에 '0x'를 붙인다. (ex 0xc1)
- long형 : 상수뒤에 'l' 또는 'L'을 붙인다. (ex 36l, 36L)

▶ 정수형 변수
* 변수 : 프로그램 실행 중 처리대상이 되는 자료나 처리된 결과를 기억시킬 기억장소의 이름으로 실행도중 그 값이 변할 수 있다.


- 정의 방법 : 자료형 변수1; (ex int a; 또는 int a=0;)
- 데이터의 표현 : "2의 보수에 의한 표현방법"에 의해 표현되며, 최상위 비트(MSB)는 부호 비트로 사용된다.
* 보수 : 뺄셈을 덧셈으로 연산하기 위해 보수라는 개념을 사용하며 가산기를 이용하여 뺄셈을 수행할 목적으로 보수를 사용한다.

▶ 부동 소수 리터널
- float 형 상수 : 'f' 또는 'F'를 끝에 붙여 표현한다.
(ex .0f, 10.5f)
- doule 형 상수 : 아무것도 붙지 않거나 'd' 또는 'D'를 붙인다.
(ex 10.0 3.14D)

▶ 실수형 변수


- 정의 방법 : 자료형 변수1;
- 특징 : (1)무한대의 수나 0에 가까운 수의 표현이 가능하다.
           (2) 부동소수 연산에서는 어떤 예외도 발생하지 않는다.
           (3) 자바에서의 부동소수 값은 Float나 Double클래다음과 같이 정의되어 있다.
                  Float.POSITIVE_INFINITY : 양의 무한대 값
                  Float.NEGATIVE_INFINITY : 음의 무한대 값
                  Float.NaN : 부정, Not-a-Number(0으로 나누었을 때와 같은 잘못된 수식의 결과)
                  Double.POSITIVE_INFINITY: 양의 무한대 값
                  Double.NEGATIVE_INFINITY: 음의 무한대 값
                  Double.NaN: 부정, Not-a-Number(0으로 나누었을 때와 같은 잘못된 수식의 결과)

▶ 논리 자료형으로 boolean으로 1Byte, true 또는 false 값을 갖는다.

▶ 문자 리터널
* 단일 문자로 구성되며, 단일 인용부호('')로 둘러 싸여 있고 한 문자를 의미한다.
(ex 'A'     '1')

▶ 확장열
* 키보드로 직접 표현할 수 없는 문자등을 처리


▶ 문자열 상수
* 하나 이상의 문자들로 구성되며, 이중 인용부호("")안에 사용한다.
(ex "A"     "1")

▶ 문자형 변수
* 기본적으로 char자료 형을 사용하며 Unicode로 표현한다.


- 정의 방법 : char 변수1;

▶ 변수의 초기 값
* 멤버 변수를 선언하고 초기화 하지 않는 경우 기본값으로 초기화 된다. 하지만 지역변수는 초기화 하지 않으며, 지역변수를 초기화 하지 않고 사용할 경우 컴파일 오류가 발생한다.



Posted by 모과이IT
,

이클립스 환경에서 자바 프로그램인 Hello World를 만들어 봤습니다.
소소한 프로그램을 짜 볼까 하고 선택한 언어와 개발 툴 입니다.

개인에게는 무료로 제공되는 언어와 개발 툴이 많습니다.
그러나 상업용 까지 무료가 아닌 경우가 대부분 입니다.
공부한 언어나 개발 툴이 상업용으로 이어지지 않으니 문제가 좀 있네요.
그런면에서 자바는 조금 더 자유가 있으니 자바를 주력 언어로 하는 것이 좋다는 생각이 듭니다. (언어와 개발 툴은 상업용으로도 보다 자유롭게 풀어 주는 것이 좋을 것 같습니다)

 

 

  

 

 

 

 

 

 

 

 

붉은 부분을 타이핑

 

public class HelloWorld {
    public static void main(String[] args)
    {
            System.out.println("Hello World"); 
    }
}

 

 

 

 

 

 

 

 


 

Posted by 모과이IT
,

이클립스를 에서 BUILD_PATH를 변경해서 사용하자.

- 왜?   자바 API 코드를 보고 싶으니까..

그리고 Java API Docs(도움말) 설정하는 방법도 알아보도록 하자.

-왜? 도움말을 한글 도움말로 설정도 할수 있고 외부라이브러리 도움말도 볼수 있게 할수 있으니까.

일단 설정을 위해 이클립스 프로젝트 구조를 보도록 하자.



일단 설정을 위해 주의깊게 봐야할 것은 JRE System Libray[jre1.6.0_03] 이부분이다.

일단 어느 부분때문에 설정을 하면 더 편리한지 이유나 알아보고 설정하자.



왼쪽은 Declaration 뷰의 모습이고 오른쪽에 떠있는 것은 Java API Docs (이하 도움말이라 칭하자) 의

출력 상태를 보여준것이다.

기본적으로 Java 에서 지원하는 클래스의 메소드의 도움말은 영문 도움말이 뜰것이고 Declaration은 볼수가 없다.

아.. 굳이 내가 영어가 약하기 때문에 한글로 된 도움말이 필요한게 아니다. ㅡㅡ;

단지 도움말이 한글로 떳으면 바랄 뿐이고 자바의 클래스나 메소드의 소스 코드를 볼수 있길 바랄 뿐이다.

원하는 메소드를 클릭하고 F3 을 눌러 소스코드를 한번 보라..

소스코드 대신 다른 것이 나온다. 소스코드를 찾을수 없다는 것이다.

소스코드를 보기 위해서는 먼저 플러그인을 추가해 줘야 한다.


방법1. 플러그인 추가.

<자바디컴파일러 추가부분 09년 1월 6일 >

http://www.pmguda.com/276 (Jad Decompiler 사용법)

이클립스 디컴파일러인 JAD를 설치하는 방법입니다.

이클립스로 개발을하다보면 F3버튼으로 열심히 따라가는 경우가생깁니다.

그러다 라이브러리로 묶여있는 클래스파일들을 로딩하게되면 읽긴읽되 내용을 분석하지못하죠~

그래서 디컴파일러 ~ 컴파일한클래스파일을 다시 자바파일로 보여주는 도구를 설치하게되면

클래스파일도 자바파일처럼 열수있게됩니다^^~

우선 jad.exe, jadclipse_3.1.0.jar를 다운로드 합니다.

jad.exe파일은 이클립스 폴더에 jadclipse_3.1.0.jar파일은 플러그인 폴더에 카피합니다.

window->preference->general->editors->file assosiationsd에서 *.class선택후

하단의 JadClipse Class File Viewr 를 선택후 default 를 선택합니다.

window->preference->java->JadClipse를 선택한후 ignore existing source를 체크해줍니다.

이렇게하시고 이클립스를 실행시키시면 *.class파일을 찾아갈경우 자동으로 디컴파일해줍니다~

http://sourceforge.net/projects/jadclipse

</자바디컴파일러>

방법2. JDK 설정

JRE System Libray[jre1.6.0_03] 이부분 문제인 것이다. JRE에는 소스코드가 포함되어 있지 않기 때문

Java Runtime Environment  이기 때문에 실행만을 위한 것이기 때문이다.

build path 를 JRE 가 아닌 JDK로 바꿔주면 된다. JRE 와 JDK 의 차이는 모두다 알고 있을꺼라 생각한다.^^

메뉴 항목에서 Window -> Preferences 를 선택한다.


Java -> Installed JREs

이클립스에서 인식하고 있는 JRE 목록이 출력된다.

나는 각 버전별로 설치가 되어있지만 나타나지 않는군.. Search로 찾아보자.

Java 가 설치된 경로를 찾아 지정해 준다.  그러면 지정한 위치에서 설치된 Java 목록을 추가해서 보여준다.


다 검색되서 나온다.. 여기서 JDK 버전을 원하는 것으로 선택하고 OK 하면 된다.

일단 여기까지가 F3키를 누르거나 Declaration 뷰를 통해서 소스코드를 볼수 있게 하는 설정방법이다.

이렇게 해도 소스코드가 보이지 않는다 하면 설정부분을 또 확인해 보자.


Explorer -> JRE System Libray -> rt.jar -> 마우스 오른쪽 클릭 -> Properties 선택

Location path에 설정한 JDK디렉토리에 가보면 src.zip 이라고 압축되어져 있는 소스 파일이 있다.

설정하도록 하자 기본적으로 PATH는 아래와 같다.

ex) C:\Program Files\Java\jdk1.6.0_10\src.zip  <-- 이런식으로 설정해주면 소스 내용을 볼수 있다. 

방법1은 라이브러리에 포함된 클래스 파일을 디컴파일해 보여주는 것이고
방법2는 JDK에 포함된 소스 코드를 보여주는 것이다. 

이젠 도움말이 한글로 뜨길 바랄 뿐이고.. ㅎㅎ 시작해보자.

이것 또한 Package Explorer(탐색창) 에 있는 JRE System Libray 를 보도록 하자.

JRE System Libray 옆 + 아이콘을 클릭하면 jar 파일들의 목록이 나온다.

여기서 rt.jar  runtime java를 나타내는 즉 jvm이 돌아갈 때 기본적인 자바 api를 담고 있는 파일이다.

Package Explorer -> JRE System Libray -> rt.jar -> 마우스 오른쪽 클릭 -> Properties 선택

Location path를 지워준다.
이런 이걸 지우면 Declaration 뷰에서 소스 코드가 보이지 않는다.
(방법1 플러그인 설치시) F3 을 이용하면 볼수 있으니 도움말을 한글로 보기 위해서 과감히 지워주도록 하자.


그리고 Javadoc Location 에 한글 api 경로를 입력해주자.
한글API가 파일시스템에 있다면 파일시스템의 경로를 입력하고 없다면 웹주소를 입력해주도록 하자.
(내가 사용하는 한글API URL이다. http://xrath.com/javase/ko/6/docs/ko/api/ )

JRE System Libray 설정은 위에서 하는 방법 외에도 프로젝트 단위로 설정할수도 있다.

이 부분은 앞에서 설명한 것과 유사하니 스샷만으로 감을 잡을수 있으리라 생각한다.

그리고 도움말 부분도 좀 더 응용하면 외부 라이브러리를 포함한 도움말도 Java Docs 경로를 설정하면 ㅎㅎ

해당 외부라이브러리의 JavaDoc Location 을 설정하자.



이제 이클립스 설정을 통해 더 편리해진 이클립스에서 Java 소스 코드와 도움말을 체험해 보도록 하자.

앞에서 설정했던 도움말 한글로 뜬다..떠 ㅋㅋ ^^;; 

F3키를 누르면 새로운 창이뜨고 Java 소스가 보인다 보여.. ㅎㅎ  열공되겠넹.. ㅎㅎ



이렇게 해서 이클립스에서 자바 API 도움말을 한글로 볼수 있게 하는 방법과
 
자바 API 소스를 볼수 있게 되었다.

정리를 해보자면 Explorer -> JRE System Libray -> rt.jar -> 마우스 오른쪽 클릭 -> Properties 에서

Java Source Attachment 항목에  src.zip 경로설정하면 자바소스를 볼수가 있고

Javadoc Location 항목에서는 자바 API 문서에 대한 설정을 할수 있다.

여기서 유의 할것은 한글 api 문서를 보기 위해서는 Java Source Attachment  항목을 공백으로 해야 된다는 것이다.

양자택일을 해야 한다는 말이 되는것이다. 소스를 볼수 있게 하던지 아니면 한글 API를 보던지...

둘다 택한다면 디컴파일러를 활용하는 방법1을 사용하도록 하자.

외부 라이브러리의 API 도움말도 설정 할수 있다는 것을 알게 되었으니 아주 편리하게 사용할 수 있다는것 ㅎㅎ

스샷을 남발하느라..글이 길어지고.. 장황해지고 .. 또 글재주가 없다보니 참 도움이 될런지 ㅠㅠ.

Posted by 모과이IT
,
비트 시프트 연산자를 이용한 프로그램
>>(오른쪽 시프트) 연산은 2로 나눈 효과를, <<(왼쪽 시프트) 연산은 2를 곱한 효과를 줌

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int a=16, b=2;
    char bin[17];
    printf("변수 a의 값 : %3d\n", a);
    printf("a>>2 (10진수) : %3d\n", a>>2);
    printf("변수 b의 값 : %3d\n", b);
    printf("b<<2 (10진수) : %3d\n", b<<2);
    printf("\n");
    itoa(a, bin, 2);
    printf("a의 2진수 : %8s\n", bin);
    itoa(a>>2, bin, 2);
    printf("a>>2 결과 : %8s\n", bin);
    itoa(b, bin, 2);
    printf("b의 2진수 : %8s\n", bin);
    itoa(b<<2, bin, 2);
    printf("b<<2 결과 : %8s\n", bin);
    return 0;
}

// 실행 결과

'개발지식창고 > C' 카테고리의 다른 글

전위 후위 증감 연산자, ++i, i++ 차이  (0) 2012.09.28
define함수 대신 template를 쓰자  (0) 2010.09.20
define 대신 inline을 쓰자  (0) 2010.09.20
C 문자열 함수 정리  (0) 2010.09.20
BASE64 Encode/Decode  (0) 2010.09.20
Posted by 모과이IT
,

개발언어의 선택

 

- C 와 Java , 잠시 고민하다가 우선은 자바로 선택함.... 속도 문제가 있을 수도 있지만, COD를 통해 일부 해결가능할 것으로 생각하고, 무엇보다도 C는 싫증이 나서....

 

필요한 소프트웨어 설치

 

JDK 를 다운로드 받아서 설치함.

http://java.sun.com 

최신 버전은 jdk1.5.0_02 (거의 50M임.)

시스템 환경변수에 JAVA_HOME CLASSPATH 설정해줌 (아, 귀찮아,,, 좀 그냥 알아서 자동으로 해주면 안되나)

 

Eclipse 를 다운로드 받아서 설치함.

http://www.eclipse.org

본격적인 통합개발환경은 아니지만,,,, 앞으로 많은 성장 가능성이 있을 것 같아서,,,, 그냥 EditPlus 쓰기는 좀 뭐해서....

 

WIPI SDK 를 찾아봤는데,,,, 가장 쉽게 눈에 띄이는 것이 AROMA-WIPI Emulator(SDK) 였음....

개발사는 아로마소프트(http://www.aromasoft.co.kr) 인데 정작 그 사이트에서는 찾을 수가 없고 위피 자바 개발자 커뮤니티(http://developer.wipi.or.kr/WIPI-JAVA/)의 자료실에서 다운로드받아서 설치함.

 

이클립스 작동

 

이클립스에서 첫번째 프로젝트를 생성함.... 그리고, 예제로 HelloWorld 출력하는 코드를 생성함....

역시, import org.kwis.msp 패키지를 찾을 수 없다는 에러구문이 즐비하게 뜸.... 어이쿠,,,,

 

이클립스의 프로젝트 WIPI-Test의 Properties 창을 열어서 Java Build Path 항목에 위의 아로마 에뮬레이터의 classes.zip 파일을 Add External JARS 버튼으로 추가함.... ( C:\AromaWIPI\JavaAppDemo\lib ) 

 

Javadoc location 필드는 처음에 안잡혀있으므로 브라우징해서 잡아준다....

 

 

 

WIPI Emulator 와 연동하는 법

 

자, 결과가 빨리 보고 싶어 근질거린다....

두가지 과정이 필요한데, 우선은 컴파일 결과를 Jar 파일로 만드는 일이고,

다른 하나는 이클립스의 Run->External Tools 를 설정하는 일이다.

 

첫번째, Jar 파일은 이클립스의 File->Export 메뉴 또는 Package 창에서 오른쪽 버튼을 클릭하면 나타나는 팝업 메뉴의 Export 항목을 사용하여, 처리한다.

 

 

그 다음은, Run 환경을 설정하는 일이다...

이클립스의 Run->External Tools 메뉴에서 다음과 같이 설정한다.

 

 


 

이때 Arguments 란에는 다음과 같이 설정해준다. (줄바꿈은 없음... 빈칸 하나인데 자동 줄바꿈으로 보일 뿐이다)

 

-HEAPSIZE=1024 -classpath c:\eclipse\workspace\WIPI-Test\WIPI-Test.jar org.kwis.msp.lcdui.Main HelloWorld2

 

c:\eclipse\workspace\WIPI-Test\WIPI-Test.jar : Export 해서 뽑아낸 Jar 파일

org.kwis.msp.lcdui.Main : SDK 메인 클래스

HelloWorld2 : 실행하고자 하는 클래스

 

실행버튼(Run)을 누르면 다음과 같은 결과를 얻을 수 있다.

 

 


 

참고로, Emulator의 Console 출력은 이클립스의 Console 화면에서 확인할 수 있다...

 

이상으로, WIPI JAVA 개발환경 구축을 완료했는데,,,, 아쉬운 점은,,,, JAR를 뽑아내는 일을 계속해줘야 한다는 것이다... 이걸 그냥 Run 하면서 자동으로 할 수는 없남.... 이클립스의 설정이거나 또는 Ant 를 사용하면 가능하지 않을까 싶다..... 빨리,,,, 해봐야지... ㅎㅎㅎ

http://blog.naver.com/davieyu/26781352

Posted by 모과이IT
,