|
1. 변수명과 데이터 형
변수 명은, 첫 문자가 영문, 언더바( _ ), 달러 마크( $ )중 어느 하나로
시작. 대문자와 소문자는 구분되므로 각각의 변수 명은 별개의
것이 된다. 길이에는 제한이 없음.
여기서 16 bit의 정수형 short,
8 bit의 정수형 byte는 생략하고 있다.
변수의 형 선언은 반드시 필요하고, 묵시적인 선언은 없다.
통상, 정수형은 int, 실수형은 double을 사용.
|
표1 변수의 형
| 종류 | type | 크기 | 기술 예 |
| 정수형 | int | 32 bit | 123 |
| long | 64 bit | 1234L |
| 실수형 | float | 32 bit | 123.0f |
| double | 64 bit | 123.0,
12.3E3, 12.3e-5 |
| 문자형 | char | 16bit | 'a' ( 1문자로
제한하고 ' '로 둘러싼다 ) |
| String | | "abc" ( 문자열은 " " 으로
둘러친다. ) |
| 논리형 | boolean | 1 bit | true
or false |
|
|
문자변수를 숫자로
변환하는 경우는 표2 에 나타낸 변환방법을 사용.
String st = " 10" 과 같은 숫자의 전(후)에 공백이 잇는 문자를 변환시키면
에러 발생. 이 경우는 문자변수 st로부터 공백을 st.trim( )을
이용하여 제거하고 난 뒤에 사용.
|
표2 문자열을 숫자로 변환하는 방법
| 종류 | 변환 방법 |
| int 형으로 | int a = Integer.parseInt( 문자열 ); |
| float 형으로 | float a = Float.valueOf( 문자열 ).floatValue( ); |
| float a = new Float( 문자열 ).floatValue( ); |
| double 형으로 | double a = Double.valueOf( 문자열 ).doubleValue( ); |
| double a = new Double( 문자열 ).doubleValue( ); |
|
|
2. 사칙연산
가감승제의 연산자는
각각 +, -, *, /를 사용.
하나의 식은 세미콜론 ";"으로 끝나야 하고 보기 좋게 하기 위해서 개행시키지만
한 행에 복수개의 식을 적기도 한다.
|
double a = 5.0, b = 2.0, c, d;
a += b; c -= d; // a = a + b; c = c - d; 로
기술해도 같은 계산
a *= b; c /= d; // a = a * b; c = c / d; 등가적인
기술
i = 5, j = 2, k;
k ++; j--; // k = k + 1; j = j - 1; 좌동
k %= j; // k = k % j; 로 적어도 좋고 k 를 j 로 나눈 나머지 |
|
|
행중의 "//" 이하
행끝까지의 문장은 주석문이다. ( "/*" 과 "*/" 로
둘러싼 복수행의 문장도 주석).
행 2-3, 5-6과 같이, 계산식은 "//" 의 부분보다는 왼편의 기술방법이
계산속도가 빠르다고 알려져 있음. 증분
연산자 ++ 는, i ++ 로 했을 경우는 i 에 1 을 증가시키기 전에 i 를
사용하고 ++ i 의 경우는 i 를 1 증가시킨 후에 i 를 사용.
-- 의 경우도 마찬가지.
변수의 형이 서로 다른 경우의 연산은, 변환하려는 데이터 형의
정도가 원래의 형보다 정도가 높으면 자동변환이 일어난다.
역의 경우는 명시적인 형 변환이 필요하고 변수명 앞에 ( int ),
( float ) 등으로 명확히 지정한다.
데이터 형에 따른 정도의 순서는 int < long < float < double 이다. 예를
들어,
|
| int k = ( int )( 5 / 2.0 ); //
( 5 / 2.0 ) 의 실수계산결과 2.5가 정수화 되어
2가 k에 대입된다. |
|
|
의 경우, 우변에 (int)가
없으면 에러가 발생.
|
|
3. 수학함수
sin, cos 등의 수학함수는,
java.lang.Math의 클래스 라이브러리에서
정의되어 있으며 주된 함수들은 표3 에 정리되어 있다.
수학함수는 어느 클래스에서도 참조 가능하다.
|
표3 수학 함수 지원을 위한 주요 메서드 (java.lang.Math클래스)
| 종류 | 메서드 | 인수의 형 | 반환 값 |
| 절대값 | Math.abs( a ) | int, long, float, double | a 의
값과 동일 |
| sin | Math.sin( a ) | double, 라디안 | double |
| cos | Math.cos( a ) | double, 라디안 | double |
| tan | Math.tan( a ) | double, 라디안 | double |
| sin-1 | Math.acos( a ) | double | double |
| cos-1 | Math.asin( a ) | double | double |
| tan-1 | Math.atan( a ) | double | double |
| 평방근 | Math.sqrt( a ) | double | double |
| a 와 b 곱 | Math.pow( a, b ) | double | double |
| 지수 | Math.exp( a ) | double | double |
| 자연대수 | Math.log( a ) | double | double |
| 최대값 | Math.max( a, b ) | nt, long, float, double | a 와
동일 |
| 최소값 | Math.min( a, b ) | int, long, float, double | a 와
동일 |
| 자리버림 | Math.floor( a ) | double | double |
| 사사오입 | Math.rint( a ) | double | double |
| 자리올림 | Math.ceil( a ) | double | double |
| 사사오입을 이용한 정수형 변환 | Math.round( a ) | double, float | long, int |
| 난수발생 | Math.random( ) | 없음 | 0.0 < a |
| 원주율 π | Math.PI | 없음 | double |
| 자연지수 e | Math.E | 없음 | double |
|
|
주 1) a=1.5의
경우, Math.floor(a)는 1.0 이고, Math.ceil(a), Math.rint(a)는
2.0, Math.round(a)는 2 이다.
주 2) a=-1.5의
경우,Math.ceil(a)는 -1.0, Math.round(a)는 -1이지만
Math.floor(a), Math.rint(a)는 -2.0이 된다.
|
|
4. 조건분기
조건분기를 수행하는 if 문은
|
if ( 조건식 ) { [ 처리
본체 1 ] }
else{ [ 처리 본체 2 ] }
|
|
|
조건식은 x = y 의
경우 if( x == y ),
x > y 의 경우 if( x > y ), x ? y 의 경우 if( x >= y ),
x ≠ y 이면 if( x != y ),
x ? y 의 경우에는 if( x <= y ) 등으로 기술.
조건식이
x 와 y 의 논리적 ( 둘 다 참이면 참 ) 의 경우 if( x && y),
논리합 ( 하나라도 참이면 참 ) 의 경우는 if( x || y )
등으로 기술.
수치에
의한 조건분기에는 switch 문을
사용할 수 있고, 디음과 같이 기술한다.
|
if ( a == 0 ) tool = 1; else if( a < 0 ) tool = 2; else
tool = 3;
switch ( tool ) {
case 1:
[ 처리 1 ]
break;
case 2:
[ 처리
2 ]
break;
default:
[ 처리
3 ]
}
|
|
|
5. 반복명령
특정의 명령을 반복 수행하는
명령문으로 일반적으로 for 문을
사용.
|
for (int i = 0; i < mx; i++){
// i++ 는 i = i + 1 과 등가
[ 처리 본체 ]
} |
|
|
이러한 반복계산은 i 가 0 에서 1 씩
증가하여 mx-1 까지의 mx 회의 연산을 수행.
또한 for 문에서 정의된 변수 i 는 이 루프 안에서만 유효하고 루프의 연산수료 후에는
gabage collection된다.
도중에 루프의 끝 단으로 이동하고 싶을 경우는 continue를,
이 루프로부터 빠져 나오기 위해서는 break 를
사용한다.
마찬가지로 반복명령에는 while 문을 사용하기도 한다.while 문은
조건식을 평가하여 참 ( true ) 이면 반복을 수행하고, 거짓 ( false ) 이면
정지한다.
조건식은 논리형 변수를 사용할 수 있다..
|
while ( 조건식 ){ // 조건식은 예를 들어 i >= 0 등으로
[ 처리 본체 ]
} |
|
|
6. 배열
정수, 실수, 문자열형
변수 ( int, double, String ) 의 배열은 형선언과 영역의
확보를 별도로 선언할 수 있다.
형 선언만 할 경우는
|
int a [ ]; // int [] a;로 기술하는 것도
가능
double b [ ], c [ ], d [ ][ ]; |
|
|
로 하고, 뒤에 영역을
확보할 필요가 있는 경우는
|
| int n = 90; d = new double [ n ][ n ]; // n 대신 크기를
숫자로 대입해도 좋음 |
|
|
한편,
형 선언과 영역(메모리) 확보를 동시에 선언하기 위해서는
|
double b [ ] = new double [ 50 ]; // a[ 0 ] 에서 a[ 49 ] 까지
50개 영역 확보
float c [ ] = {10.0f, 15.0f, 10.0f}; // 뒤에
추가하는 것은 불가 |
|
|
2차원 배열 int a[ ][ ] = { { 1, 2 }, { 3, 4 } } 의
요소 값은 a[ 0 ][ 0 ] = 1, a[ 0 ][ 1 ] = 2, ......이다.
대입을 하지 않고 확보된 배열의 각 요소의 초기값은 0 이다.
배열 a 의 영역의 크기는 a.length 로
참조할 수 있다.
|
|
7. 메소드(method)
메소드의 정의는 다음과
같이 한다.
|
[ 억세스 수식자 ] return값의 형 메소드명 ( 인수의
형 인수명, ...) {
[ 프로그램 ];
return ( 식 or 변수 ); // return
값의 형은 void 로 선언한 경우는 불요
} |
|
|
인수의 수가 메소드내의
계산처리에 의해변할 경우, 이 값은 원래 호출한 측의 값에
반영되어 영향을 미치는 경우는 없다.
예를 들어, 3 이라는 값이 대입되어 있는 인수 a 가 메소드에 전달되어, 메소드내에서
이 값이 10으로 변했다고 할지라도 호출한 측에서의 a 의 값은
3 그대로 이다.
이것은, FORTRAN 이나 C 의 경우와 다르므로 주의.
호출한 측의 값을 변경하기 위해서는, 변수
a 를 return 값으로 하던지
인스턴스 변수 ( 클래스내의 시작부분에서 정의한 변수 ) 로 할 필요가
있다. 단, 인수가 배열의 경우는 제외.
억세스 수식자는,,
어느 클래스로부터도 억세스 가능한 public,
자신의 클래스에서만 억세스 가능한 private 등이 있다.
억세스 수식자는 클래스에도 인스턴스 변수에도 적용된다.
static 변수는 클래스에 속하는
변수이나, 클래스에서 생성된 모든 객체로부터 공용된다.
참고: 해당 클래스의
부모에 해당하는 슈퍼 클래스의 메소드를 변경시킬 경우는,
같은 이름으로 인수라든지 데이터 형이 같은 메소드를 정의하는
것도 가능하다. 이것을 메소드의 오버라이드라 한다.
부모 클래스와 같은 이름의 메소드는 이 클래스에서는 사용되지
않는다.
|
|
8. 클래스
클래스는 하나의 프로그램
단위.
복수개의 클래스를 이용하여 일련의 연산을 수행하는 것도 가능하다. 복수개의 클래스가
하나의 파일에 포함된 경우, 메인의 클래스이고 html 의 태그에
기재된 클래스명의 수식자는 public 이지만,
그 외의 클래스는 수식자를 사용하지 않는다.
기존의
클래스의 메소드나 변수를 상속받은 클래스를 정의하기 위해서는
클래스명의 뒤에 extends 라고 붙이고,
기존 클래스명을 지정한다.
기존의 클래스를 슈퍼 클래스, 상속받은 클래스를 서브클래스라 하며,
이러한 방법을 상속 이라 한다.
다른
클래스의 인스턴스 변수나 메소드를 이용하기 위해서는, 그
클래스의 객체를생성시켜 둘 필요가 있다.
객체 생성방법은,
클래스명을 Animation, 생성시킬 객체를 anime 라 한다면 다음 두 가지 방법을 들
수 있다.
|
Animation anime = new Animation( );
또는,
Animation anime;anime = new Animation( ); |
|
|
객체가 생성되었을 때
최초로 호출되는 메소드를 작성하고, 변수의 초기화용으로 사용할
수도 있다.
이러한 방법을 컨스트럭트(생성자) 라고 해서, 클래스와 같은 이름을 가지며, return
값은 가지지 않는다.
클래스내의 메소드나 변수에 대하여, 다른 클래스에서 직접적인 조작이나 액세스를
금지하는 조치를 캡슐화 라고 한다. 구체적으로, 클래스내의
인스턴스 변수르 private 선언하는
것으로 구현된다.
변수 a[ ] 에 클래스 밖으로부터 억세스할 필요가 있는 경우는다음과 같이 public 을
선언하여 해당 클래스내에 기술해 둔다.
|
| public double [ ] getAarray( ){ return a; } // a 는
return되는 배열 |
|
|
억세그 하는쪽의 클래스에서는,
위에 기술한 클래스의 객체를 anime 라고 했다면 다음과 같이
하여 배열 b 에 값을 가지게 할 수 있다.
|
| double b [ ] = anime.getArray( ); |
|
|
9. Graphics
Applet을 이용한 프로그램은
다음과 같은 기본 형식을 취한다.
|
import java.applet.Applet;
import java.awt.*;
public void Example extends Applet{ // 이
경우, 소스 코드명은 Example.java 이다.
[ 인스턴스
변수의 정의 ]
public void init( ){
[
Applet을 load할 때의 조기화 수행 ]
}
public void paint( Graphics g ){
[ Applet
실행 내용을 기술 ]
}
} |
|
|
선 등을 작도하는 그래픽 기능은 java.awt.Graphics 의 그래픽 라이브러리에서 정의되어
있고, 주된 메소드는 표4 를 참조
|
표4 그래픽 관련 주된 메서드 ( java.awt.Graphics 클래스 )
| 종류 | 메소드 | 인수의 형 |
| 문자형 | drawString( str, x, y ) 문자의
좌하의 좌표를 ( x, y ) 로 하여 문자열 str 을
그린다. | str 은 String
x, y 는 int |
| 직선 | drawLine( x0, y0, x1, y1 )
( x0, y0 ) 에서 ( x1, y1 ) 으로
직선을 그린다. | int |
| 장방형 | drawRect( x, y, width, height )
fillRect( x, y, width, height )
clearRect( x, y, width, height )
좌상 모서리 좌표를 ( x, y ), width, height 는
폭과 높이 clearRect( ) 는
사각영역을 배경색으로 채운다. | int |
| 타원 | drawOval( x, y, width, height )
fillOval( x, y, width, height )
타원을 두러싼 사각영역의 좌상 모퉁이의
좌표 ( x, y ), 장방형의 폭과 높이는 width, height 인
타원을 그린다. | int |
| 다각형 | drawPolygon( x, y, n ) fillPloygon( x, y, n ) | x, y 는
정수형 배열 n 은 정수 |
|
|
그래픽 관련의 메소드와
색상의 지정방법은 이곳 을
참조.
|
|
10. 이벤트 처리
마우스 이외의 각종
GUI ( Graphical User's Interface ) 부품을 이용할 경우는
다음의 예제 프로그램 참조.
GUI 에 대응하는 이벤트 리스너를 인터페이스에 준비 ( implements ) 하고,
거기에 대응한 이벤트 처리용 메소드를 사용한다.
대응관계는 표5 를 참조하고, GUI 부품은 장착 ( add ) 순으로 옆으로 나열한다.
|
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*; // 이벤트가 필요할 때 추가
public void Example extends Applet
implements ActionListener, ItemListener, AdjustmentListener{ // 필요한
이벤트 리스너 준비
// 인스턴스 변수를 정의
Choice choice_A; Button button_STOP; Scrollbar scr;
Checkbox ch1, ch2; CheckboxGroup ck; // 체크
박스 관련
Textfield chTxt; // 텍스트
필드 관련
....................
public void init( ) { // 초기화
메소드로 GUI 부품을 생성, 장착
add( new Label("select"));
// select 라 불리는 라벨을 실장
choice_A = new Choice( );// 초이스의
작성
choice_A.ddItem("10");
// 10개의 초이스 항목 설정 add( choice_A ); // 초이스
실장
ck = new CheckboxGroup(); // 체크박스
생성
ch1 = new Checkbox("ch1", true, ck); // 라벨 ch1 의
내용을 디폴트로 설정
ch2 = new Checkbox("ch2", false, ck); // 라벨 ch2
add(ch1); add(ch2);
button_STOP = new Button("STOP"); // STOP 이라는
이름의 버튼 작성
add(button_STOP);
chTxt = new TextField("0.02", 4); // 4 문자분의
텍스트 필드 기입
add(chTxt);
scr = new Scrollbar(Scrollbar.HORIZONTAL, 40, 10, 0, 110); // 스크롤바의
정의
add(scr); // ↑ 수평방향으로
실장, 초기치 40, 바의 폭 10, 최소값 0, 최대값
110
.......................
choice_A.addItemListener( this ); //
이벤트 리스너 등록
ch1.addItemListener( this ); //
this 는 실행중의 객체를 참조하는 것을 의미
ch2.addItemListener( this );
button_A.addActionListener( this );
chTxt.addActionListeneer( this );
scr.addAdjustmentListener( this );
}
public void itemStateChanged( ItemEvent e ){ //
초이스에 대한처리를 정의하는 메소드
if( e.getSource( ) == choice_A ){ //
초이스가 눌러졌는지 여부 검사
String st = choice_A.getSelectedItem( );// 선택값을
문자형변수 값으로 취득
a = Integer.parseInt( st ); // 선택값을
정수형 a 에 변환시켜 대입(계산에 반영)
}
if( ch1.getState( )){ col = 0; }
// 첵크 박스 ch1이
true 인 경우의 조치
else if( ch2.getState( )){col = 2; } // ch2 가 true 인
경우의 조치
repaint( ); // 화면을
다시 그린다.
}
public void actionPerformed( ActionEvent e ){ //
버튼에 대한 처리를 정의하는 메소드
if( e.getSource( ) == button_STOP )
{ // STOP 버튼이 눌러졌을 때의 조치
....................
}
else if( e.getSource( ) == chTxt ) { // 텍스트
필드 입력시에 조치
String st = chTxt.getText( ).trim( ); // 값을
문자형 변수 st 로 읽어 들임
....................
}
repaint( );
}
public void adjustmentValueChanged( AdjustmentEvent e ){ //
스크롤바에 의한 조치
if( e.getSource( ) == scr ) repaint( );
}
public void paint( Grphics g ){ // 메인
프로그램(페인트 메소드)
float dx = ( float ) scr.getValue( ); // 스크롤바의
위치를 취득
..............
}
}
|
|
|
마우스를 이용한 처리의
기본형은 다음과 같고 위에서 말한 각종 GUI 부품과의 병용도
가능하다.
|
public void Example1 extends Applet
implements MouseListener, MouseMotionListener{
int moX, moY, moXup, moYup;
// 마우스의 위치
......
public void init(){
.........
addMouseListener(this);
addMouseMotionListener(this);
}
public void mousePressed(
MouseEvent e ){ // 버틍을 눌렀을 때의 위치 취득
moX = e.getX( );
moY = e.getY( ); // 마우스 조작위치의 ( x,
y ) 좌표 취득
}
public void mouseReleased( MouseEvent e ){ // 버튼을
놓았을 때의 위치좌표 취득
moXup = e.getX( ); moYup = e.getY( );
repaint( );
}
public void mouseClicked( MouseEvent e ){ }
public void mouseEntered( MouseEvent e ){ }
// 사용하지 않는 경우에도
기술해 둔다
public void mouseExited( MouseEvent e ){ }
public void mouseMoved( MouseEvent e ){ }
public void mouseDragged( MouseEvent e ){ }
public void paint( Graphics g ){
................
}
} |
|
표5 이벤트의 종류와 처리 방법 (java.lang.Math 클래스)
| GUI 부품 | Event Listener | method |
Button Text Field | ActionListener | actionPerformed |
Choice Check Box | ItemListener | itemStateChanged |
| Scroll Bar | AdjustmentListener | adjustmentValueChanged |
Push Mouse button Release
Mouse button Click Mouse
position in window Mouse position
out of window | MouseListener | mousePressed
mouseReleased mouseClicked
mouseEntered mouseExited |
Mouse drug Mouse is moved | MouseMotionListener | mouseDragged
mouseMoved |
|
|
|
이벤트 처리 프로그램의
예는 이곳 을 참조.
|
|
11. 레이아웃
레이아웃 매니져에는,
디폴트로 옆으로 나열하는 FlowLayout, 부품을 좌우, 상하,
중앙에 배치하는 BorderLayout,
부품을 타일모양으로 표안에 배치하는 GridLayout,
서로 다른 크기를 가지는 부품을 타일 모양으로 배치하는 GridBagLayout,
부품을 카드와 같이 나열하여 배치하는 CardLayout 이 있다. 상세한 것은 Layout
Manager 참조.
|