'java'에 해당되는 글 2건

  1. 2008.08.08 <JESS> Jess 에서 Java클래스를 사용해보자. (2)
  2. 2008.02.27 [JAVA] 2차원 배열 동적할당 (2)
。공부 。2008.08.08 21:08
Jess 라는 인공지능 프로그램은 Java의 모든클래스를 객체화하여 사용할수 있다.
그 방법또한 어렵지 않아 쉽고 간단하게 객체를 만들어 사용할 수 있다.

- Java의 파일클래스를 객체화하여 사용하기 -
(bind ?file (new java.io.File file.txt))
(bind ?fr (new java.io.FileReader ?file))
(bind ?br (new java.io.BufferedReader ?fr))

(bind ?a (call ?br readLine))
(bind ?b (call ?br readLine))
(bind ?c (call ?br readLine))
(bind ?d (call ?br readLine))

(printout t"A : " ?a crlf)
(printout t"B : " ?b crlf)
(printout t"C : " ?c crlf)
(printout t"D : " ?d crlf)

jess에서는 변수타입과 객체형태가 따로 존재하지 않기 때문에 변수에 값을 할당할때 쓰이는
bind 키워드를 사용하여 자바클래스를 호출하여 만들어진 객체를 담을수있게 된다.
(bind ?file (new java.io.File file.txt))
위의 소스는 자바의 파일클래스 new키워드를 사용해 객체를 만드는 방법이다.
만약 자바였다면 File file = new File("file.txt"); 이런식으로 객체를 만들테지만 jess에는 위에서 설명했듯이 따로 변수타입이나 객체형태가 존재하지 않기 때문에  bind 키워드를 사용해 변수인 ?file에 File객체를 담을수 있게 된다.

위의 세줄은 파일클래스 ?file를 FileReader에 연결해 기능을 확장하고 BufferedReader클래스에 FileReader 클래스 객체인 ?fr을 연결해 버퍼단위로 데이터를 불러올수있는 최종 파일개체인 ?br객체를 만드는 과정이다.

자. 이젠 다만들어진 객체를 활용해 볼 차례지요.
파일객체에는 다양한 메소드들이 많습니다. 이번에 써볼 메소드는 제가 테스트를 할때 주로 쓰는 readLine() 메소드를 호출해 file.txt 안의 데이터를 불러와 봤습니다.

(bind ?a (call ?br readLine))
메소드를 불러들일때 사용하는 키워드는 'call' 입니다.
call 키워드를 사용해 ?br객체를 호출하고 객체의 readLine메소드를 사용한다는 뜻이죠
readLine메소드를 이용해 불러들인 데이터는 변수 ?a에 저장 되게 됩니다.

마지막 4줄은 단순히 불러들인 데이터를 변수별로 출력하게 됩니다.

이런식이로 자바의 모든클래스를 사용할수있습니다. 똑같은 방법으로 말이죠
하지만 제가 직접만든 클래스를 jess에서 객체화 하려고 했는데 잘 되질 않더군요..
객체화하는 방법이 분명 있을텐데말이죠.. 흠...

신고
Posted by kyoe
。공부 。2008.02.27 23:49
우리는 배열을 이용해서 힙영역에 내가 원하는 크기만큼의 배열을 동적할당할수 있습니다.
왜굳이 동적할당을 해야하나? 그냥 넉넉하게 지정해주면 안되나? 하는 분들도 있겠지만 그렇게 되면 메모리손실이 뜻하지 않게 너무커져버릴수 있기 때문입니다.
고등학교를 예로 든다면 반별로 학생수가 다를수가 있습니다 1반에는 30명 2반에는 35명 이렇게 있을수가 있다는 거죠..
이럴땐 그냥 넉넉하게 배열을 50씩 잡아줄수 있겠지만 우리는 동적할당을 이용해서 배열을 크기를 지정해 보도록하죠.

import java.io.*;

public class Exam_array {
    public static void main(String[] args)throws IOException{
        BufferedReader in  = new BufferedReader(new InputStreamReader(System.in));
        int[][] array = null;        //배열을 만들어 주고 널값을 넣어준다.
       
        System.out.print("배열의 행을 입력 : ");
        int x = Integer.parseInt(in.readLine());
        array = new int[x][];        //new 라는 키워드를 이용해 입력받은 값으로 배열의 행을 동적할당한다.
       
        for(int i=0; i<array.length; i++){
            System.out.print("배열의 "+ i +"번째 열을 입력 : ");
            int y = Integer.parseInt(in.readLine());
            array[i] = new int[y];
        }
       

        for(int i=0; i<array.length; i++){
            for(int j=0; j<array[i].length; j++){
                System.out.println("["+ i +"]["+ j +"]");
            }
        }
    }
}

위와 같이 하면 행과 열을 입력 받을수 있습니다.
new라는 키워드를 이용해 배열의 크기를 지정해주면 쉽게 동적할당이 되는데 여기서 주의해서 볼것이 있습니다
array.length 와 array[].length 가 그것인데..
둘의 차이가 무엇이 길래 array뒤에 '[]' 을 붙여줄때도 있고 안붙일때도 있는지 말이죠
length가 있는걸로 봐서는 배열의 크기를 반환한다는것이죠.  맞습니다 분명 배열의 크기를 배환하는것입니다.
하지만 array앞에 '[]' 가 붙지않는다면 바로 행의 크기를 반환하고 '[]'가 붙는다면 열의 크기 반환한다는것입니다.
사용자 삽입 이미지












위의 이미지는 int array[][] = new int[3][2]; 였을때 메모리 영역에 할당되는 것을 그림으로 표현해 본것입니다. int array라는 것은 스텍영역에 4Byte로 할당되는 것을 볼수 있습니다 만약 char형이였다면 몇바이트가 할당될까요? 2Byte라고요? 아니죠 데이터를 힙영역에 할당하고 있기때문에 변수 array는 레퍼런스 변수가 됩니다 즉 주소를 가르키게되는 포인터가 되는것이죠 그렇기때문에 자료형이 무엇이든간에 new라는 키워드로 만들어진 변수의 크기는 4Byte가 됩니다.
이 array라는 녀석은 힙영역에 있는 int[3]을 가리키게 됩니다 자바에선 1차원 배열만을 가르킬수 있기때문에 바로 앞에 있는 공간 즉 그주소를 가르키게 되는것입니다 그리고 그주소는 또다시 바로 앞에 있는 주소를 가르키게 되는것이죠 배열은 레퍼런스이기 때문에 가르키는 주소값은 4Byte 됩니다. 마지막공간은 실제 자료형의 크기를 갖게 되는데 여기서는 이역시 int형이기 때문에 4Byte를 갖게 되는것입니다. 만약 char형이라면파란색세로줄 부분의 4라는 숫자는 2로 표기를 했을겁니다.
우리는 왜 '[]'를 붙여주고 안붙여 주는지를 알았습니다.
그럼 array.length 는 배열 array[3][2]  의 첫번째 값이 3을 반환하게 되는것이죠
array[].length는 2를 반환하게 되는겁니다.

흠.. 제표현이 맞았는지 모르겠네요.. 틀린점있음 바로 수정 들어가겠습니다. ^^;
신고
Posted by kyoe

티스토리 툴바