System.out.println("Hello, World");

오류
- 프로그램이 정상적으로 실행하지 못하는 상황


오류의 종류
Error : 심각한오류 - H/W적 오류
Exception(예외) : mild(덜 심각)한 오류 - S/W적 오류
                         실행시 정상적인 흐름, 프로그래머가 의도한 흐름으로 가지 못하는 상황을 일컫는다.



Throwable : 오류의 최상위


Unchecked
- 컴파일러가 Exception 처리여부를 check 안함
- 처리(Handling)보다는 code수정을 통해 해결한다.
발생이유 : Code상의 문제 때문에 발생
                 Complier의 check가 불가능한 경우 

Checked
 - 컴파일러가 Exception 처리 여부를 check함
 - check하지 않았을 경우 complie 에러 발생
 - Exception Handling을 통해 해결한다.
발생이유 : Code상 문제가 아니라 User가 잘못 사용하거나 실행 환경상 문제로 발생.
               발생확률은 50:50이며 처리가 필요하다. 

Exception 관련 Keyword
오류를 발생
- throw

오류를 처리하는 역할
- throws
- try : catch 또는 finally와 함께 사용되어야 한다.
- catch : try와 함께 사용되어야 한다.
- finally : try와 함께 사용되어야 한다.

Exception Class 정의하는 법
◇ Exception class 작성
1. checked : Exception을 extends
  unchecked : RuntimeException을 extends

2. public class로 정의
3. no-argument 생성자 정의
4. 필요한 Attribute, 메소드 구현
5. class의 이름 : ~~Exception(~~는 Exception 발생원인으로 네이밍한다.)

 Exception의 발생
 - 구문 : throw Throwable의 객체;

Posted by 김마농
BigDecimal
java.Math.BigDecimal - double로 표현이 안되는 부동소수점(실수)로 표현
              BigInteger  - long으로 표힌이 안되는 정수를 표현

BigDecimal의 생성
new BigDecimal("10.5");
BigDecimal 사용 예
import java.math.BigDecimal;
public class BigDecimalTest {
    public static void main(String[] args) {
        System.out.println(2.00 - 1.10); // 0.9나와야 하는데 0.899999999 나옴
        BigDecimal b1 = new BigDecimal("2.00");
        BigDecimal b2 = new BigDecimal("1.10");
        System.out.println(b1.subtract(b2)); // 제대로 나옴
    }
}
BigDecimal 나눗셈시 주의사항
- 나눗셈 계산이 끝나지 않고 무한히 반복될때(무한소수)exception이 발생하므로 표기할 자리수와 처리방식을 정해주어야 함.
import java.math.BigDecimal;
public class BigDecimalTest {
	public static void main(String[] args) {
		System.out.println(2.00-1.10);
		BigDecimal d1 = new BigDecimal("2.00");
		BigDecimal d2 = new BigDecimal("1.10");
		//+:add(), -:subtract(), / : divide(), *:multiply
		BigDecimal result = d1.subtract(d2);
		double d = result.doubleValue();
		System.out.println(result +" :"+d);
		//첫번째 인수 : 나눌수, 2번째 인수는 scale : 소수점이하 몇 자리까지, 3번째는 소수점 이하 처리 방식
		result = d1.divide(d2,3,BigDecimal.ROUND_CEILING);//소수점자리 3자리까지 반올림처리
		System.out.println("나눈결과 : "+result);
	}
}
Posted by 김마농
 
//Exception클래스 만들기
//0으로 숫자를 나눴을때의 예외상황을 표현하기 위한 클래스
public class ZeroDivideException extends Exception{
	public ZeroDivideException(){}//Exception 클래스 형태
	public ZeroDivideException(String message){
		super(message);
	}
}
 


Posted by 김마농

3. 자바

2012. 3. 25. 11:18 : 프로그래밍/자바
Abstractron(추상화)
- 구체적인것들에서 공통적인 것을 뽑아내는 과정
- 프로그래밍에서는 객체를 >>class로 구상하는 것을 추상화라고 한다.
- 즉 class자체가 추상적이라 할 수 이다. 실제 존재하진 않지만 객체들의 공통점을 지니고 있는 틀.

객체 -> 구체적
클래스 -> 추상적, 틀

<Java Class 선언>
Class 선언 구문
[제한자 modifier]class Class식별자[identifier]
예)public class Helloworld
-제한자는 class가 가지는 기능/역할을 사용자에게 설명해주는 역할을 담당한다.

변수 : 값을 저장하는 저장소
1. 선언 : 저장소를 만드는 작업 변수식별자
[modifier]DataType 변수식별자;
예) int i;

2. 값을 변수에 대입(할당)
변수식별자 = 값(value)
예)i=10;

3. 선언 + 대입
int age = 10;

4. 같은 Type 변수를 동시에 선언
int age, grade, student;

-종류
숫자
-정수 : short, byte, long, int
-실수 : float, double

문자 : char, string

논리 : boolean(true, false)


동작(behavior)

 Attribute(속성)
-instance class로 부터 실제 만들어진 개체
-member변수(variable = 값을 저장하는 저장소)
 

 ◎ 메소드 정의-동작/기능
하나의 기능을 실행하기 위한 명령문(실행문)들의 묶음
선언 : [제한자]return type 식별자([변수선언(인수 parameter)
 
예제
public class student{
         string id;               =
         string name;         =   이부분을 Attribute라고 한다.
         int score;              =
Posted by 김마농
객체지향언어(Object Oriented Programming)OOP
 -유지보수가 쉽고, 재사용성이 높다.

 절자지향언어
- 유지보수 어려우며, 재사용성 떨어짐

객체(Object)-존재하는 모든것, 눈에 안보이느넋
-> 프로그램을 실행해서 특정부분의 일을 담당한는 주체

 


<UML>

Posted by 김마농
자바 기술군
- JavaMe(Micro Edition)-핸드폰, 카드 등
-JavaSE(Standard Edition)-데스크톱
-JavaEE(Enterprise Edition)-기업, 웹, 프레임워크

JRE(Java Runtime Enviorment) 자바 실행환경
┖── JVM(Java Virtual Machine) -소프트웨어적으로 O/S나 H/W를 구현, 자바 프로그램을 실행시키는 플랫폼
┖── API(Abstract Programming Interface)미리 만들어 놓은 코드(미리 만들어서 쓰기 쉽고 자주 사용된다.)

Java의 특징
1. 플랫폼(OS와 HW) 독립적 - WORA(Wirte Once Run Anywhere)
2. 객체지향언어 OOP (Object Orated Programming Language)
 


<인터프리터와 컴파일러 비교>
컴파일러의 경우, 프로그램을 컴파일 하기 위해서는 모든 프로그램 소스를 가지고 한꺼번에 번역을 해서 목적코드를 제작한다. 반면에 인터프리어의 경우 필요한 부분을 행(Line 보통 ;로 구분되는 단위)단위 구문으로 번역을 하여 바로 실행시킨다.

이와 같은 특징 때문에 컴파일러의 경우 한꺼번에 모든 부분을 번역해야 하기에 번역속도가 느린편이라 할 수 있다. 반면에 인터프리터는 필요한 부분만 컴파일(번역)을 하기 때문에 하나 하나를 컴파일 하는 속도가 빠르다고 할 수 있다.

대신에 프로그램을 실행하면서 컴파일을 동시에 수행하기에 프로그램을 구동하는 시간은 오래 걸리는 편이다.


[자바는 인터프리터 방식]
 SRC -사람    -> High leve 언어
  ┖──file명 : java  예)Helloworld.java
  │
  │
  │     컴파일 : javac  file명.java
  │     예)javac Helloworld.java
  │  
  │
  class file 생성 -> bvte code(기계어가 아니고, JVM이 이해하는 언어)
  실행 : java class파일명   예)java HelloWorld
  실행시점(RunTime)->JVM
  1. class loading->class파일을 메모리에 올리는 작업
  2. 실행-> 인터프리터 방식, 실행, 구문 단위로 기계어로 변경후 실행
 

Posted by 김마농
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
    /// 윈도우 클래스 등록
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, 
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      "D3D Tutorial", NULL };
    RegisterClassEx( &wc );

    /// 윈도우 생성
    HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice", 
                              WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                              GetDesktopWindow(), NULL, wc.hInstance, NULL );

    /// Direct3D 초기화
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    { 
        /// 윈도우 출력
        ShowWindow( hWnd, SW_SHOWDEFAULT );
        UpdateWindow( hWnd );

        /// 메시지 루프
        MSG msg; 
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }

    /// 등록된 클래스 소거
    UnregisterClass( "D3D Tutorial", wc.hInstance );
    return 0;
}

 


1. RegisterClassEx()로 생성하고자 하는 윈도우의 클래스를 등록한다.
2. CreateWindow()로 윈도우를 생성한다.
3. InitD3D() 함수에서 Direct3D를 초기화한다.
4. ShowWindow(), UpdateWindow()로 윈도우를 화면에 표시한다.
5. GetMessage(), TranslateMessage(), DispatchMessage()로 이루어진 메시지 루프를 수행한다.
6. 메시지 루프를 빠져나올경우 초기화한 Direct3D를 메모리에서 해제한다.
7. 프로그램을 종료한다.

대부분의 DirectX인터페이스는 초기화 시점에서 윈도우의 핸들(HWND)을 필요로 한다. 그렇기 떄문에 CreateWindow()로 윈도우를 생성한 다음 InitD3D()를 호출하고 있다. 그리고 프로그램이 종료된 다음에 생성한 Direct3D 인터페이슬ㄹ 메모리에서 해제하기 위해 메시지 루프 이후에 CelanUp() 함수를 호출 하고 있다. 이 순서 역시 상당히 중요하다. WM_CLOSE나 WM_DESTORY 등의 메시지에서 Direct3D를 해제할 경우 메시지 루프에서 문제가 생길 수 있다. 


InitD3D()함수
 * Direct3D 초기화
 *------------------------------------------------------------------------------
 */
HRESULT InitD3D( HWND hWnd )
{
    /// 디바이스를 생성하기위한 D3D객체 생성
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    D3DPRESENT_PARAMETERS d3dpp;                /// 디바이스 생성을 위한 구조체
    ZeroMemory( &d3dpp, sizeof(d3dpp) );        /// 반드시 ZeroMemory()함수로 미리 구조체를 깨끗이 지워야 한다.
    d3dpp.Windowed = TRUE;                      /// 창모드로 생성
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;   /// 가장 효율적인 SWAP효과
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;    /// 현재 바탕화면 모드에 맞춰서 후면버퍼를 생성

    /// 디바이스를 다음과 같은 설정으로 생성한다.
    /// 1. 디폴트 비디오카드를 사용(대부분은 비디오카드가 1개 이다.)
    /// 2. HAL디바이스를 생성한다.(HW가속장치를 사용하겠다는 의미)
    /// 3. 정점처리는 모든 카드에서 지원하는 SW처리로 생성한다.(HW로 생성할경우 더욱 높은 성능을 낸다.)
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

    /// 디바이스 상태정보를 처리할경우 여기에서 한다.

    return S_OK;


그리기 함수(Render() 함수)
VOID Render()
{
    if( NULL == g_pd3dDevice )
        return;

    /// 후면버퍼를 파란색(0,0,255)으로 지운다.
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
    
    /// 렌더링 시작
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        /// 실제 렌더링 명령들이 나열될 곳
    
        /// 렌더링 종료
        g_pd3dDevice->EndScene();
    }

    /// 후면버퍼를 보이는 화면으로!
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );

Render()함수의 알고리즘
1. 먼저 화면을 깨끗이 지운다(Clear())
2. 이제부터 폴리곤을 그리겠다고 D3D에게 알린다.(BeginScene())
3. 폴리곤을 다 그렸다고 D3D에게 알린다.(EndScene())
4. 화면에 나타나게 한다.(Present())

-인터페이스를 메모리에서 해제하기
VOID Cleanup()
{
    if( g_pd3dDevice != NULL) 
        g_pd3dDevice->Release();

    if( g_pD3D != NULL)
        g_pD3D->Release();
}
디바이스(g_pd3dDevice)는 D3D 인터페이스보다 나중에 생성되었다. 해제할때는 반드시 생성 순서의 역순으로 해제해줘야 한다. 그것만 주의하면 된다.

<생성화면>
 


Posted by 김마농
카드 뒷면과 3장의 카드들



카드게임을 시작하게 되면 카드는 모두 뒤집은 상태에서 시작하게 된다. 그리하여 뒤집힌 카드를 먼저 구현하기로 한다.

아까와 똑같이 카드뒷면을 변수로 추가해주고, 이미지 정보를 불러온다.


public class CardKingView extends View {

Bitmap m_BackGroundImage;

Bitmap m_Card_BackSide;


public CardKingView(Context context) {

super(context);

m_BackGroundImage = BitmapFactory.decodeResource(getResources(),R.drawable.background,null); m_Card_BackSide = BitmapFactory.decodeResource(getResources(), R.drawable.backside,null);

}

public void onDraw(Canvas canvas)

{

canvas.drawBitmap(m_BackGroundImage, 0,0,null);

}

}

이제 카드 이미지를 4x3으로 깔도록 한다. 

public void onDraw(Canvas canvas)

{

canvas.drawBitmap(m_BackGroundImage, 0,0,null);

for(int y=0; y<2; y++){

for(int x=0; x<3; x++)

{

canvas.drawBitmap(m_Card_BackSide, 60+x*120, 280+y*170,null);

}

}

}



만약 카드 이미지를 띄웠는데 해상도가 맞지않아 카드들이 서로 겹치게 출력된다면 60+x*120, 280+y*170
이부분에 있는 수식들을 조금씩 바꿔가면서 위치를 맞추도록 한다.

뒤집한 카드의 위치 표 

 Y값 X값 m_Card_BackSide를 그리는 위치 
0 (60+X*12, 280+Y*160) = (60 , 280) 
0 1 (60+X*12, 280+Y*160) = (72 , 280)    
0 2 (60+X*12, 280+Y*160) = (84 , 280) 
 1  0 (60+X*12, 280+Y*160) = (60 , 440) 
 1  1 (60+X*12, 280+Y*160) = (72 , 440) 
 1  2 (60+X*12, 280+Y*160) = (84 , 440)   

 

Posted by 김마농
맨처음 했던 이미지 띄우기와 달리 클래스에 배경화면으로 사용할 Bitmap을 멤버변수로 추가하여
이미지를 출력하기로 한다.
 멤머변수를 추가했으면 생성자에 리소스를그려줄 배경화면을 가져와서 멤버변수에 넣어주는 작업을 해준다.

public class CardKingView extends View {
Bitmap m_BackGroundImage; // 멤버변수로 선언해줌

public CardKingView(Context context) {
super(context);
m_BackGroundImage=
BitmapFactory.decodeResource(getResources(),R.drawable.background,null);  
//여기서 background는 이미지 파일명이니까 중요함
}
public void onDraw(Canvas canvas)
{
canvas.drawBitmap(m_BackGroundImage, 0,0,null);
}

 

public class CardCard extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new CardKingView(this));
    }
}

모두 완료했으면 실행해서 배경이미지가 제대로 출력되는지 확인한다.

 

Posted by 김마농
우선 안드로이드 프로젝트를 생성한다.
- 프로젝트가 생성되었으면 src/패키지명/프로젝트명.java 파일이 존재하는걸 확인한다. 

화면의 단위 View
-안드로이드 애플리케이션을 구성하는 주요 단위는 엑티비티이다. 하지만 엑티비티 자체는 화면에 표시되지 않고 엑티비티 안에 뷰라는 것이 실제로 화면에 보이는 것이다. 뷰는 안드로이드의 UI를 구성하는 핵심 요소로서 보통 애플리케이션을 제작할 떄 이것에 대한 파생 클래스만으로도 제작이 가능할 정도로 방대한 양의 파생 클래스를 지원한다.

화면에 이미지를 띄우기 위해서 View클래스를 상속받는 새 클래스를 생성한다.
상속받는 View 클래스는 android.view.view다. 
ImageView클래스를 생성했으면 아래와 같이 입력해주자

public class ImageView extends View {
public EaxmpleView(Context context) {
super(context);
}
public void onDraw(Canvas canvas){
Bitmap _android = BitmapFactory.decodeResource(getResources(), R.drawable.android,null);
canvas.drawBitmap(_android,0,0,null);
}
}
 
이렇게 생성한후  실행하게 되면 이미지가 출력이 되지 않고 Hello Word나 출력이 된다. ImageView클래스를 만들어서 그림을 불러오고 그림을 그렸지만 정작 ImageView 클래스르 실제로 생성해서 사용한적은 없다. 그래서 엑티비티쪽에 ImageView클래스를 추가하는 과정이 필요하다.

public class ExampleImage extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new  ImageView(this));
    }
 

Posted by 김마농