The Java Programming Language 1~3장

1. 자바의 개요
2. 클래스와 객체
3. 클래스 확장

<용어 정리>
  • 클래스(Class)
  • 객체(Object)
  • 인스턴스(Instance)
  • byte code
  • native code


- 클래스 멤버
  • 필드 : 클래스/객체에 속하는 데이터 변수 -> C++ : 멤버 변수
  • 메소드 : 필드의 상태를 조작하기 위한 수행문으로 구성됨 -> C++ : 멤버 함수

- 첫번째 예제

class Hello world {
    public static void main( String[] args ) {
        System.out.println("Hello, World");
    }
}
    - header
    - signature
    - declaration


<기본 데이터 타입>


  • boolean : true / false
  • char : 16 bits 유니코드 2.1문자
  • byte : 8 bits 정수
  • short : 16 bits 정수
  • int : 32 bits 정수
  • long : 64 bits 정수
  • float : 32 bits 부동소수점표현
  • double : 64 bits 부동소수점표현

<Named Constant>


class Suit {
    final static int CLUB = 1;
    final static int DIAMONDS = 2;
    final static int HEARTS = 3;
    final static int SPADES = 4;
}

<주석
>

  • // : 한줄 주석
  • /* ... */ : 구역 주석
  • /** ... */ : 문서 주석(doc comment) -> javadoc 에서 사용

<제어문 / 반복문>

  • for
  • while
  • if - else
  • switch
  • do - while

<연산자>

  • ++ , += , -= , *= , /=
  • & , | , ^
  • || , &&

<클래스 / 객체>


 - 객체 변수 / 클래스 변수
  • instance variable
class Point {
    public double x, y;
}
Point Left = new Point();
Left.x = 1.0;
  • class variable
class Point {
    public static int cnt;
}
Point Right = new Point();
Point.cnt = 1;
  • 메소드의 경우에도 적용됨(스태틱/클래스 메소드)


 - 클래스의 상속

class Point {
    public double x, y;
}
class Pixel extends Point {
    Color color;
    int col;

    public void clear() {
        super.clear();
        this.col = 0;
        color = null;
    }
}
  • 상속은 extends를 이용해서 한다.
  • 다중상속은 허용하지 않는다.
  • this : 현재 객체 참조
  • super : 상위 클래스참조

 - 필드(Fields)

     - 접근한정자 -
  • public : 모든 클래스에서 접근가능
  • private : 해당 클래스에서만 접근
  • protected : 동일한 패키지, 해당 클래스, 서브클래스에서 접근 가능
  • package : 동일한 패키지, 해당 클래스에서 접근가능(기본값)
  • static
  • final : 초기화되지 않을 경우 컴파일 X
  • transient
  • volatile


 - 메소드(method)
  • 접근한정자
  • abstract : declaration X
  • static
  • final
  • strictfp(strict floating point) : 정밀하게 부동소수점 연산
  • call by value 로 수행
  • main : public static void
  • native : 다른 언어로 만들어진 메소드
  • overloading : 같은이름 / 다른 signature
  • overriding : 동일한 메소드를 서브클래스에서 덮어씀


 - 클래스(Class)
  • public : 하나의 소스파일에 파일이름과 이름이 같은 하나의 public 클래스 존재
  • abstract : 추상 메소드 포함 - 인스턴스 X
  • final : 서브클래스 X
  • strictfp


 - 생성자

  • 예제
class A {
    A() {
        ...
    }
}
  • 초기화블록
class A {
    {
        ...
    }
}
  • static block
class A {
    static {
        ...
    }
}

<Exception>

  • 새로운 예외 정의
class BadDataSetException extends Exception { }
  • 사용
class A {
    public int get(int input)
        throws BadDataSetException {
        ...
        ...
        throw new BadDataSetException();

<etc>

 - 배열
  • 배열의 생성
int[] = new int[10];

 - String 객체

 - Package
  • 패키지 이름의 중복을 막기위한 코딩 규약 (~.~.~)
  • 패키지에 소속시키기
package net.gnuvill.game;
  • 패키지의 사용
import java.util.*;

 - 유니코드

    자바는 유니코드를 사용하기때문에 변수이름으로 유니코드를 사용할 수 있다.

'Developing' 카테고리의 다른 글

파이의 정의  (0) 2007.04.03
USACO Training - Friday the Thirteenth  (0) 2006.09.12
PERL에서의 웹 프로그래밍  (0) 2006.06.03

패키지 설치

우분투에서 vmplayer를 설치하기 위해서는 다음과 같은 패키지가 필요하다.

  • qemu
  • vmware-player
  • vmware-player-kernel-modules

만약, 패키지가 나타나지 않거나 kernel에 맞는 모듈 패키지가 없을때는 universe, multiverse 저장소를 추가해줬는지 확인한다.(updates 서버와 security 서버에도 추가가 되어있어야한다.)


가상 디스크 만들기

vmplayer는 무료 버전이라서 가상 디스크를 만드는 기능이 없다. qemu를 이용해서 가상 디스크를 만든다.

qemu-img create -f vmdk < 생성할 이미지 파일 이름> < 이미지 크기 (예. 4G)>

그 뒤에 설정파일인 vmx파일을 만들어야 한다.


vmx 파일 만들기

다음 내용을 참고로하여 vmx파일을 새로 만든다.

config.version = "8"
virtualHW.version = "3"
ide0:0.present = "TRUE"
ide0:0.filename = "ImageFileName.vmdk"
memsize = "128"
MemAllowAutoScaleDown = "FALSE"
ide1:0.present = "TRUE"
ide1:0.fileName = "auto detect"
ide1:0.deviceType = "cdrom-raw"
ide1:0.autodetect = "TRUE"
floppy0.present = "FALSE"
ethernet0.present = "TRUE"
usb.present = "FALSE"
sound.present = "FALSE"
displayName = "Fedora Core 4"
guestOS = "other26xlinux"
nvram = "fc4nox.nvram"
MemTrimRate = "-1"
ide0:0.redo = ""
ethernet0.addressType = "generated"
ethernet0.connectionType = "nat"
uuid.location = "56 4d 0d 92 c9 cd 3c 25-c5 bf 91 91 43 5d bf 33"
uuid.bios = "56 4d 0d 92 c9 cd 3c 25-c5 bf 91 91 43 5d bf 33"
ethernet0.generatedAddress = "00:0c:29:5d:bf:33"
ethernet0.generatedAddressOffset = "0"
tools.syncTime = "TRUE"
ide1:0.startConnected = "TRUE"
uuid.action = "create"
checkpoint.vmState = ""
tools.remindInstall = "TRUE"

  • ide0:0.filename : primary master로 사용될 이미지 파일 이름
  • memsize : 가상 머신의 메모리 크기
  • displayName : VMPlayer가 실행될 때 창에 표시될 이름
  • navram : VMPlayer가 실행될 동안 사용될 메모리 파일의 이름
  • guestOS는 설치하여 사용할 os 형태, 아래 목록을 참고

"darwin" = Darwin (unsupported)
"other-64" = Other 64-bit OS
"other" = Other OS
"freeBSD-64" = freeBSD 64-bit
"freeBSD" = freeBSD
"solaris10-64" = Solaris 10 64-bit
"solaris10" = Solaris 10
"solaris9" = Solaris 9
"solaris8" = Solaris 8
"solaris7" = Solaris 7
"solaris6" = Solaris 6
"solaris" = Other Solaris
"netware6" = Netware 6.x
"netware5" = Netware 5.x
"netware4" = Netware 4.x
"netware" = Other Netware
"otherlinux-64" = Other Linux 64Bit
"linux" = Other Linux
"other26xlinux-64" = Other Linux 2.6.x 64-bit
"other26xlinux" = Other Linux 2.6.x
"other24xlinux-64" = Other Linux 2.4.x 64-bit
"other24xlinux" = Other Linux 2.4.x
"ubuntu-64" = Ubuntu Linux 64-bit
"ubuntu" = Ubuntu Linux
"turbolinux" = Turbo Linux
"mandrake" = Mandrake Linux
"sjds" = Sun Java Desktop System
"nld9" = Novell Linux Desktop 9
"sles-64" = SUSE Linux Enterprise Server 64-bit
"sles" = SUSE Linux Enterprise Server
"suse-64" = SUSE Linux 64-bit
"suse" = SUSE Linux
"rhel4-64" = Red Hat Enterprise Linux 4 64-bit
"rhel4" = Red Hat Enterprise Linux 4
"rhel3-64" = Red Hat Enterprise Linux 3 64-bit
"rhel3" = Red Hat Enterprise Linux 3
"rhel2" = Red Hat Enterprise Linux 2
"redhat" = Red Hat Linux
"winVista-64" = Windows Vista x64 Edition (experimental)
"winVista" = Windows Vista (experimental)
"longhorn-64" = Windows Longhorn x64 Edition (experimental)
"longhorn" = Windows Longhorn (experimental)
"winNetBusiness" = Windows Server 2003 Small Business
"winNetEnterprise-64" = Windows Server 2003 Enterprise x64 Edition
"winNetEnterprise" = Windows Server 2003 Enterprise Edition
"winNetStandard-64" = Windows Server 2003 Standard x64 Edition
"winNetStandard" = Windows Server 2003 Standard Edition
"winNetWeb" = Windows Server 2003 Web Edition
"winXPPro-64" = Windows XP Professional x64 Edition
"winXPPro" = Windows XP Professional Edition
"winXPHome" = Windows XP Home Edition
"win2000AdvServ" = Windows 2000 Advanced Server
"win2000Serv" = Windows 2000 Server
"win2000Pro" = Windows 2000 Professional
"winNT" = Windows NT
"winMe" = Windows Me
"win98" = Windows 98
"win95" = Windows 95
"win31" = Windows 3.1
"windows" = Other Windows
"MS-DOS" = MS-Dos

CD-ROM 대신 ISO 파일을 사용하고 싶으면 다음과 같이 설정한다.

ide1:0.present = "TRUE"
ide1:0.fileName = "<iso 파일 경로와 이름>"
ide1:0.deviceType = "cdrom-image"

사운드 카드를 사용하고 싶으면 다음과 같이 설정한다.

sound.present = "TRUE"
sound.virtualDev = "es1371"


실행에 문제가 있을 경우...

vmplayer를 시작하면 어떠한 입력도 되지않고 먹통이 되는 경우가 있다. 그런 경우에는 다음과 같이 실행해야한다.

# GTK_IM_MODULE=xim vmplayer


한영키 사용

VMWARE에서 한영키를 사용하려면 <strong>/etc/vmware/config</strong> 파일에 다음 두 줄을 추가해주면 된다.  물론, 리눅스에서 한영키 인식이 잘 되는 상태여야 한다.

xkeymap.keysym.Hangul = 0x0f2
xkeymap.keysym.Hangul_Hanja = 0x0f1


VMWARE-TOOLS 설치

vmware-tools는 따로 구해야하는데, 구하는 방법은 VMWARE 공식사이트에 가서 평가판을 다운로드 받은뒤에 압축을 푼다. vmware-distrib/lib/isoimages 디렉토리 안에 각 운영체제별로 vmware-tools 이미지가 있는데, 설치한 운영체제에 따라서 마운트하여 사용하면 된다.

'Operating' 카테고리의 다른 글

리눅스에 picasa 2 설치하기  (0) 2007.04.23
install XGL + compiz in ubuntu dapper  (0) 2006.11.05
Install FreeNX in Debian Linux  (0) 2006.10.13

먼저 다음의 패키지들의 설치가 필요하다.

  • libgl1-mesa
  • libglitz1
  • libglitz-glx1
  • xserver-xgl
  • compiz-gnome

kde로도 설치가 가능하지만 현재 안정적이지 않다고 한다. 그래서, gnome에 설치했다. nvidia 의 경우 설정이 더 필요했는데, nvidia-glx 패키지와 nvidia-glx-config 패키지를 설치하고, 다음 명령어를 실행한다.

# nvidia-glx-config enable

아니면, 직접 xorg.conf 를 수정해줘도 된다.

Driver          "nv"  --> Driver          "nvidia"

그리고, 다음과 같은 내용으로 .gnomerc 파일을 편집한다.

compiz --replace gconf decoration wobbly fade minimize cube rotate zoom scale move resize place switcher
nohup gnome-window-decorator &

컴퓨터를 재시작하면 멋진 XGL 화면을 볼수 있다.

다음은 단축키 목록들

  • 윈도우 전환 Alt + Tab
  • 윈도우 줄 세우기 F12
  • 큐브로 데스크탑 전환 Ctrl + Alt + Left/Right Arrow
  • 큐브로 프로그램을 데스크탑으로 보내기 Ctrl + Shift + Alt + Left/Right Arrow
  • 창 이동 Alt + left-click
  • 창 크기 바꾸기 Alt + right-click
  • 창 투명화 right-click the window's title bar and select Opacity
  • Zoom-in once = Super-key right-click
  • Zoom-in manually = Super-key + wheel mouse up
  • Zoom-out manually = Super-key + wheel mouse down
  • Snap Move window (will stick to borders) = Ctrl + Alt + left-click


'Operating' 카테고리의 다른 글

Use vmware-player in ubuntu dapper  (0) 2006.11.08
Install FreeNX in Debian Linux  (0) 2006.10.13
소스 하이라이팅해서 출력하기  (0) 2006.10.10

데비안에서는 FreeNX 패키지를 기본으로 제공하지 않기 때문에 저장소 추가가 필요하다. 다음 줄을 '/etc/apt/source.list' 에 추가한다.

deb http://www.linux.lk/~anuradha/nx/ ./

이렇게 하고 나면 다음과 같이 하는 것으로 설치가 가능하다.

# apt-get update
# apt-get install freenx

설치하면 몇가지를 물어보는데 key는 nomachine key로 하는 것이 편하다. 보안을 위해서라면 ssh를 위한 키를 새로 만들어 써도 무방하다. 설치가 끝나면 다음과 같이 사용자를 등록한다.

# nxserver --adduser < 유저명>
# nxserver --passwd < 유저명>

설정파일 '/etc/nxserver/node.conf를 적당히 고쳐준다. ssh 포트 번호와 kde, gnome 실행파일이 적혀있는 부분의 주석을 풀어주면 된다.

SSHD_PORT=ssh 포트번호
COMMAND_START_KDE=startkde
COMMAND_START_GNOME=gnome-session

이렇게 하고 클라이언트로 접속하면 안되는 경우가 있는데, 특히 Detail 메지시에서 'NX> 1004 Error: nxagent failed to start with: Unrecognized option: 1' 란 메시지가 나오고 접속이 안될때는 Backingstore 문제라고 한다. 이 문제는 '/usr/bin/nxnode' 파일을 편집하는 것으로 해결이 가능하다.

...
node_start_agent()
...
[ -n "$backingstore" ] && B="-bs $backingstore"
# 다음을 추가한다.
# backingstore = { "when_requested", "always", ... }
[ -n "$backingstore" -a "$ENABLE_2_0_0_BACKEND" != "1" -a "$backingstore" != "1" ] && B="-bs $backingstore"
# backingstore = 1 (new nxclient 2.0.0 doesn't send any strings in the option-string for backingstore anymore)
[ -n "$backingstore" -a "$ENABLE_2_0_0_BACKEND" != "1" -a "$backingstore" = "1" ] && B="+bs"
# backingstore = 1 and 2.0.0-Backend EXPERIMENTAL
[ -n "$backingstore" -a "$ENABLE_2_0_0_BACKEND" = "1" ] && B="-bs $backingstore"

출처 : http://openfacts.berlios.de

GNU enscript를 이용해서 소스를 하이라이팅해서 ps 파일로 만들 수 있다.

$ enscript -Bp OUTPUT_FILE.ps --color -E CODE_FILE.c

enscript는 꽤 많은 옵션을 가지고 있으며, 'enscript --help'를 이용해 옵션을 확인할 수 있다. 다른 옵션을 사용하면, 페이지를 다른 모양으로 꾸미는 것도 가능하고, ps 파일 외에 html로 만드는 것도 가능하다. 이렇게 만들어진 ps파일은 'ps2pdf'를 이용해서 pdf로 쉽게 만들 수 있다.

$ ps2pdf INPUT.ps OUTPUT.pdf

pdf 문서 뒤쪽에 소스 파일을 첨부하고 싶을 경우에는 pdf 합치는 유틸리티인 'pdftk'를 이용하면 된다.

$ pdftk 1.pdf 2.pdf ... n.pdf output OUTPUT.pdf

한가지 단점이 있다면, enscript가 한글을 지원하지 않아서 소스 안에 주석으로 달린 한글이 모두 깨진다는 문제가 있었다. /etc/enscript.cfg 파일에서 인코딩 관련 설정을 고치면 될 것도 같은데, 아직 해결 방법은 모르겠다.

NetworkManager는 자동으로 AP를 찾아서 접속을 해주어서 편하긴 하지만, (우리 학교처럼) 제대로 동작하지 않는 AP가 있는 곳에서 해당 AP로 접속이 한번 이루어지면 다른 AP로 전환이 되지 않는 경우가 생겼다.

이러한 경우가 나의 경우 (Linksys WPC54G v3, xubuntu 6.06) 에서만 발생하는지 어떤지는 잘 모르겠지만, 제대로 동작하는 다른 AP로 먼저 접속하면 인터넷 연결에 문제가 없었기 때문에 잘못된 AP로 먼저 접속하는 것만 막으면, 문제가 해결되었다.

그 방법으로는, ~/.gconf/system/networking/wireless/networks/ 디렉토리 안에 있는 AP정보들이 담긴 디렉토리 중에서, 잘못된 AP의 이름을 가진 디렉토리를 지워주면, NetworkManager가 잘못된 AP로 자동 접속하는 것을 막을수 있다.

'Operating' 카테고리의 다른 글

소스 하이라이팅해서 출력하기  (0) 2006.10.10
WPC54G on ubuntu 6.06 dapper LTS  (0) 2006.09.22
우분투 XGL/compiz  (0) 2006.08.21

Linksys 사에서 나온 PCMCIA 타입의 무선 랜카드 중에 하나인 WPC54G 를 우분투에서 기본 지원하지 않는다. 리눅스 커널에서 지원하지 않기 때문인데, 내 랜카드가 바로 이것이다. 리눅스에서 지원하지 않는 이것을 사용하기 위한 방법이 나와있는데, 그것이 바로 ndiswrapper를 이용해서 Windows Driver를 사용하는 방법이다.

# apt-get install ndiswrapper-utils bcm43xx-fwcutter

Linksys 사이트로 가서 Windows Driver를 다운로드 받는다. v1,v2,v4용이 있지만 v3 용은 존재하지 않으니 CD에서 직접 복사해야 한다. Driver를 받아왔으면 적당한 디렉토리에 압축을 푼 뒤에 다음을 수행한다.

# bcm43xx-fwcutter bcmwl5.sys
# cp *.fw /lib/firmware
# ndiswrapper -i LSBCMNDS.inf

이것으로 랜카드는 잡혔고, 다음으로 network-admin을 이용해서 네트워크 설정(IP입력등..)만 마무리 하면 끝이다.

마지막으로 WPC54G v3 Driver를 첨부한다.

wpc54g31.zip


/*
ID: ****
LANG: C
TASK: friday
*/

/*#define __DEBUG__*/

#include <stdio.h>

int main()
{
    int period, last, year, leap, i;
    int day=0; // 0=Mon ... 6=Sun
    int count[7];
    for(i=0 ; i<7 ; i++)
        count[i] = 0;
#ifndef __DEBUG__
    FILE *fin;
    FILE *fout;
   
    fin = fopen("friday.in","r");
    fout = fopen("friday.out","w");
    fscanf(fin,"%d",&period);
#else
    do{
        printf("Enter period(N years) : ");
        scanf("%d",&period);
    }while(period<=0 || period>400);
#endif

    last = 1900+period;

    for(year=1900 ; year<last ; year++)
    {
        if(year%100 == 0)
        {
            if(year%400 == 0)
                leap = 1;
            else
                leap = 0;
        }
        else if(year%4 == 0)
            leap = 1;
        else
            leap = 0;

        count[day]++;
        day = (day+3)%7;
        count[day]++;
        day = (day+leap)%7;
        count[day]++;
        day = (day+3)%7;
        count[day]++;
        day = (day+2)%7;
        count[day]++;
        day = (day+3)%7;
        count[day]++;
        day = (day+2)%7;
        count[day]++;
        day = (day+3)%7;
        count[day]++;
        day = (day+3)%7;
        count[day]++;
        day = (day+2)%7;
        count[day]++;
        day = (day+3)%7;
        count[day]++;
        day = (day+2)%7;
        count[day]++;
        day = (day+3)%7;
    }

#ifndef __DEBUG__
    for(i=0 ; i<6 ; i++)
        fprintf(fout,"%d ",count[i]);
    fprintf(fout,"%dn",count[6]);
    fclose(fin);
    fclose(fout);
#else
    for(i=0 ; i<7 ; i++)
        printf("%d ",count[i]);
#endif
    return 0;
}

1900년부터 시작해서 주어진 몇년의 기간동안 날짜가 13일이 되는 요일의 수를 구하는 프로그램인데, 조금 생각하고 코딩을 했더니 결과가 너무 지저분해졌다. 게다가 1월부터 12월까지 달마다 요일을 구하는 부분에서 날짜를 미리 계산해서 넣는 만행을...;

저부분을 제대로 하자면, 각 달의 날짜수를 배열같은 곳에 저장해둔 다음, 윤년을 판단해서 윤년일 경우 2월 계산부분에 하루를 더해주고, 반복문으로 해결을 볼수 있을 듯한데, 일단 이걸로 이번문제는 통과..;;; 더 고치기가 귀찮다.

'Developing' 카테고리의 다른 글

The Java Programming Language - 1일차  (0) 2007.02.03
PERL에서의 웹 프로그래밍  (0) 2006.06.03
USACO Training - What Time Is It?  (0) 2006.05.15

Mac OS X 만 멋있는 줄 알았더니, 이제 리눅스도 이정도는 된다.

이런저런 문제들로 정신없는 와중에 새로운 일을 떠 맡았다. PHP와 펄을 이용한 간단한 웹 프로그래밍이었는데, 두가지 경우 모두 FORM을 이용해서 값을 넘겨받아야 했다. PHP의 경우는 그냥 간단히 name과 동일한 변수로 받아서 해결되었지만, 펄의 경우에는 약간 해줘야할 것이 있어서 머리가 아팠다. 아무래도 PHP처럼 원래 CGI 전용으로 나온 스크립트가 아니라서 그런가보다.

어쨌든 아래와 같은 방법으로 해결했다.

예제 : 간단한 사칙연산 프로그램

#!/usr/bin/perl

print "Content-type: text/htmlnn";
&parse;
$first = $FORM{'first'};
$second = $FORM{'second'};

print "<html><head><title>계산 결과</title></head><body>";
print "<h1>계산 결과</h1><br />";
print "<table><tr><td>더하기</td><td>";
print $first+$second;
print "</td></tr><tr><td>빼 기</td><td>";
print $first-$second;
print "</td></tr><tr><td>곱하기</td><td>";
print $first*$second;
print "</td></tr><tr><td>나누기</td><td>";
print $first/$second;
print "</td></tr><tr><td>나머지</td><td>";
print $first%$second;
print "</td></tr></table></body></html>";

sub parse {
  if($ENV{'REQUEST_METHOD'} eq "GET") {
      $buffer = $ENV{'QUERY_STRING'};
  }
  else {
      read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
  }

  @pairs = split(/&/,$buffer);

  foreach (@pairs) {
      ($name, $value) = split(/=/,$_);
      $value =~ tr/+/ /;
      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;

      $FORM{$name} = $value;
  }
}

parse 부분이 핵심 부분인데, 거의 정형화되어있어서 다들 copy&paste한다고 한다.

'Developing' 카테고리의 다른 글

USACO Training - Friday the Thirteenth  (0) 2006.09.12
USACO Training - What Time Is It?  (0) 2006.05.15
USACO Training - Barn Repair  (0) 2006.05.09

+ Recent posts