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

/*
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

이런저런 문제들로 정신없는 와중에 새로운 일을 떠 맡았다. 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

/*
ID: ****
LANG: C
TASK: clock
*/

#define __DEBUG__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* itoc(int num);

int main()
{
    char* temp;
    char time[6];
    int hour;
    int min;
    char out[100];
#ifndef __DEBUG__
    FILE *fin;
    FILE *fout;
   
    fin = fopen("clock.in","r");
    fout = fopen("clock.out","w");
    fscanf(fin,"%s",time);
#else
    printf("Input time : ");
    scanf("%s",time);
#endif
   
    temp = strtok(time,":");
    hour = atoi(temp);
    temp = strtok(NULL,":");
    min = atoi(temp);
   
    switch(min)
    {
    case 0:
        sprintf(out,"%s o'clock",itoc(hour));
        break;
    case 15:
        sprintf(out,"Quarter past %s",itoc(hour));
        break;
    case 45:
        sprintf(out,"Quarter to %s",itoc(hour%12+1));
        break;
    default:
        if(min>45)
            sprintf(out,"%s to %s",itoc(60-min),itoc(hour%12+1));
        else
            sprintf(out,"%s %s",itoc(hour),itoc(min));
    }
    out[0]=toupper(out[0]);
#ifndef __DEBUG__
    fprintf(fout,"%sn",out);
    fclose(fin);
    fclose(fout);
#else
    printf("%sn",out);
#endif
    return 0;
}

char* itoc(int num)
{
    char* retval;
    retval = (char*)malloc(sizeof(char)*20);
   
    if(num<20)
    {
        switch(num)
        {
        case 1:    return "one";
        case 2:    return "two";
        case 3:    return "three";
        case 4:    return "four";
        case 5:    return "five";
        case 6:    return "six";
        case 7:    return "seven";
        case 8:    return "eight";
        case 9:    return "nine";
        case 10: return "ten";
        case 11: return "eleven";
        case 12: return "twelve";
        case 13: return "thirteen";
        case 14: return "fourteen";
        case 15: return "fifteen";
        case 16: return "sixteen";
        case 17: return "seventeen";
        case 18: return "eighteen";
        case 19: return "nineteen";
        default: return "";
        }
    }
    else
    {
        switch(num/10)
        {
        case 2:
            sprintf(retval,"twenty");
            break;
        case 3:
            sprintf(retval,"thirty");
            break;
        case 4:
            sprintf(retval,"forty");
            break;
        case 5:
            sprintf(retval,"fifty");
            break;
        }

        switch(num%10)
        {
        case 0:
            break;
        case 1:
            strcat(retval,"-one");
            break;
        case 2:
            strcat(retval,"-two");
            break;
        case 3:
            strcat(retval,"-three");
            break;
        case 4:
            strcat(retval,"-four");
            break;
        case 5:
            strcat(retval,"-five");
            break;
        case 6:
            strcat(retval,"-six");
            break;
        case 7:
            strcat(retval,"-seven");
            break;
        case 8:
            strcat(retval,"-eight");
            break;
        case 9:
            strcat(retval,"-nine");
            break;
        }
    }
    return retval;
}

상당히 간단한 문제였다.

'Developing' 카테고리의 다른 글

PERL에서의 웹 프로그래밍  (0) 2006.06.03
USACO Training - Barn Repair  (0) 2006.05.09
USACO Training - Mixing Milk  (0) 2006.05.03

/*
ID: ****
LANG: C
TASK: barn1
*/

/*#define __DEBUG__*/
#define MAXSTALL1 200+1

#include <stdio.h>

int main()
{
    int max, stal, cow;
    int i, temp;
    int before = 0;
    int total = 0;
    int ival[MAXSTALL1];
    int status[MAXSTALL1];
   
    for(i=0 ; i<MAXSTALL1 ; i++)
    {
        ival[i] = 0;
        status[i] = 0;
    }
   
#ifndef __DEBUG__
    FILE *fin;
    FILE *fout;
   
    fin = fopen("barn1.in","r");
    fout = fopen("barn1.out","w");
    fscanf(fin,"%d %d %d",&max,&stal,&cow);
#else
    printf("Input max & stall & cow : ");
    scanf("%d %d %d",&max,&stal,&cow);
#endif
   
    for(i=0 ; i<cow ; i++)
    {
#ifndef __DEBUG__
        fscanf(fin,"%d",&temp);
#else
        scanf("%d",&temp);
#endif
        status[temp] = 1;
    }
   
    for(i=0 ; i<=stal ; i++)
    {
        if(status[i] == 1)
        {
            if(before != 0)
                ival[i-before-1]++;
            before = i;
        }
    }
   
    max--;
    for(i=stal ; i>0 ; i--)
    {
        if(max > 0)
        {
            if(ival[i] >= max)
            {
                total += (ival[i] - max)*i;
                max = 0;
            }
            else
                max -= ival[i];
        }
        else
            total += ival[i]*i;
    }
#ifndef __DEBUG__
    fprintf(fout,"%dn",total+cow);
    fclose(fin);
    fclose(fout);
#else
    printf("%dn",total+cow);
#endif
    return 0;
}

저번 문제와 비슷한 접근 방법으로 문제를 해결했다.

주어진 갯수의 널판지로 최소한의 길이의 널판지를 이용해서 헛간을 고치겠다는 것이 문제였다. 비어있는 칸은 반드시 고칠 필요가 없고, 소가 있는 칸만 고치면 되므로, 소가 있는 칸 사이의 넓이가 가장 넓은 곳 부터 비우는 방식으로 널판지 갯수를 맞췄다.

소가 있는 칸 번호가 반드시 순서대로 들어오는 것은 아니므로 연산이 더 필요했다.

'Developing' 카테고리의 다른 글

PERL에서의 웹 프로그래밍  (0) 2006.06.03
USACO Training - What Time Is It?  (0) 2006.05.15
USACO Training - Mixing Milk  (0) 2006.05.03

구입할 우유의 양과 구입할 수 있는 목장의 수를 입력 받은 뒤에, 각 목장에서 판매할 수 있는 우유의 양과 가격을 입력받는다.

단위당 우유의 가격이 0~1000으로 한정되어 있는 것에 착안하여 1001짜리 배열을 생성한 뒤에 0으로 초기화 하고, 각 가격별로 구입할 수 있는 양을 더해서 0부터 시작해서 1000까지 구입할 양만큼만 값을 계산하도록 했다.

'Developing' 카테고리의 다른 글

PERL에서의 웹 프로그래밍  (0) 2006.06.03
USACO Training - What Time Is It?  (0) 2006.05.15
USACO Training - Barn Repair  (0) 2006.05.09

+ Recent posts