배경화면꾸미기

2012. 5. 8. 18:36

 

 
이번에는 안드로이드 SDK에 포함된 예제인 JetBoy를 따라해 보도록 하겠습니다.  물론 게쪽을 사용해서 만들기 때문에 소스는 완전히 다른 스타일로 진행 됩니다.
 
 
 
기초 작업
 
우 선 [그림 1]처럼 프로젝트의 메인 Activity의 Package Name은 app.main으로 정했습니다.  이 부분은 여러분들이 각자 마음에 드는 이름으로 지정하셔도 됩니다.  그리고, Main Activity Class의 이름은 Main, 배경을 담당 할 클래스의 이름은 BackGround로 지정하였습니다.  이후 RyuLib를 src 폴더에 복사해서 사용하고 있습니다.
 
"RyuLib.Game for Android 시작하기"에서 이미 설명한 것과 중복되지만, "Add External JARs" 등을 이용하여 외부 참조를 하는 것이 익숙하지 않은 분들에게서 질문이 올라오고 있어서, 좀 쉽게 가기로 했습니다.  모든 예제의 소스에는 해당 예제를 작성할 때의 RyuLib를 복사해서 배포 할 예정입니다.  RyuLib는 아직 안정화 단계가 아니기 때문에 서로 버전이 달라 질 수 있음을 유의하시기 바랍니다.
 
이미지와 관련해서는 JetBoy의 drawable 폴더에 있는 이미지를 그대로 복사 해 왔습니다.
 
K-20101224-145750-5.png
[그림 1] 프로젝트 준비
 
이제 [소스 1]과 같이 AndroidManifest.xml 를 수정하여 화면을 가로로 변경하도록 하겠습니다.
 
[소스 1] AndroidManifest.xml
   1 :  <?xml version="1.0" encoding="utf-8"?>
   2 :  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
   3 :       package="app.main"
   4 :       android:versionCode="1"
   5 :       android:versionName="1.0">
   6 :      <application android:icon="@drawable/icon" android:label="@string/app_name">
   7 :          <activity android:name=".Main"
   8 :                   android:label="@string/app_name"
   9 :                   android:screenOrientation="landscape">
  10 :              <intent-filter>
  11 :                  <action android:name="android.intent.action.MAIN" />
  12 :                  <category android:name="android.intent.category.LAUNCHER" />
  13 :              </intent-filter>
  14 :          </activity>
  15 :      </application>
  16 :  </manifest> 
 
9: android:screenOrientation="landscape" 를 추가해서 지금 작성하는 어플리케이션이 가로로 화면이 출력되어야 함을 알립니다.
 
 
 
일단 무조건 표시하고 이동 해보자
 
이후 Main.java와 BackGround.java의 소스를 [소스 2]와 [소스 3]과 같이 작성합니다.
 
[소스 2] Main.java
   1 : package app.main;
   2 : 
   3 : import ryulib.game.GamePlatform;
   4 : import android.app.Activity;
   5 : import android.os.Bundle;
   6 : import android.view.ViewGroup;
   7 : import android.widget.LinearLayout;
   8 : 
   9 : public class Main extends Activity {
  10 :     /** Called when the activity is first created. */
  11 :     @Override
  12 :     public void onCreate(Bundle savedInstanceState) {
  13 :         super.onCreate(savedInstanceState);
  14 : 
  15 :         _GamePlatform = new GamePlatform(this);
  16 :         _GamePlatform.setLayoutParams(
  17 :         new LinearLayout.LayoutParams(
  18 :         ViewGroup.LayoutParams.FILL_PARENT, 
  19 :         ViewGroup.LayoutParams.FILL_PARENT, 
  20 :         0.0F
  21 :         )
  22 :         );
  23 : 
  24 :         setContentView(_GamePlatform);
  25 :         
  26 :         _BackGround = new BackGround(this);
  27 :         _GamePlatform.AddControl(_BackGround);
  28 :     }
  29 :     
  30 :     private GamePlatform _GamePlatform = null;
  31 :     private BackGround _BackGround = null;
  32 :     
  33 : }
 
"RyuLib.Game for Android 시작하기"에서 충분히 설명한 부분이라서 설명을 생략합니다.
 
 
[소스 3] BackGround.java
   1 : package app.main;
   2 : 
   3 : import ryulib.game.GameControl;
   4 : import ryulib.game.GamePlatformInfo;
   5 : import android.content.Context;
   6 : import android.content.res.Resources;
   7 : import android.graphics.Bitmap;
   8 : import android.graphics.BitmapFactory;
   9 : import android.graphics.Canvas;
  10 : import android.graphics.Paint;
  11 : 
  12 : public class BackGround extends GameControl {
  13 : 
  14 : public BackGround(Context context) {
  15 : super(null);
  16 : 
  17 : Resources resources = context.getResources();
  18 : 
  19 : _BackGoundBitmap = BitmapFactory.decodeResource(resources,   20 : R.drawable.background_a);
  21 : }
  22 : 
  23 : private Canvas _Canvas = null;
  24 : private Paint _Paint = null;
  25 : 
  26 : private Bitmap _BackGoundBitmap = null;
  27 : private double _X01 = 0;
  28 : 
  29 : @Override
  30 : protected void onStart(GamePlatformInfo platformInfo) {
  31 : _Canvas = platformInfo.getCanvas();
  32 : _Paint = platformInfo.getPaint();
  33 : }
  34 : 
  35 : @Override
  36 : protected void onDraw(GamePlatformInfo platformInfo) {
  37 : long tick = platformInfo.getTick();
  38 : 
  39 : // 현재 위치에 먼 거리 배경 이미지 그리기
  40 : _Canvas.drawBitmap(_BackGoundBitmap, (int) _X01, 0, _Paint);
  41 : 
  42 : _X01 = _X01 - (25 * tick / 1000);
  43 : }
  44 : 
  45 : }
 
17: Resources는 이미지나 오디오 등의 자원들을 코드에서 사용해 줄 수 있게 합니다.  우리는 지금 이미지가 필요한 시기이므로 간절히 필요합니다.
 
19: BitmapFactory를 이용해서 Resources에서 이미지를 불러옵니다.  drawable 폴더에서 background_a.png 파일을 가져옵니다.
 
 
26: 배경 이미지를 시간이 갈 수록 왼쪽으로 스크롤 하기 위해서, 이미지가 표시될 왼쪽 좌표를 저장 할 변수를 _X01로 지정하였습니다.  좌표의 이름 뒤에 "01"을 붙인 이유는 배경 이미지 표시가 두 번 필요하기 때문입니다.  이는 뒤에서 설명하도록 하겠습니다.
 
 
39: 현재 좌표 (_X01, 0)에 비트맵을 그려줍니다.  배경의 Y축 좌표는 변하지 않기 때문에 0으로 지정하였습니다.
 
 
41: 시간에 따라 X축 좌표를 왼쪽으로 이동하기 위해 시간에 맞춰서 빼기 연산을 합니다.  얼마만큼 이동하느냐는 1초 단위마다 25 픽셀로 정하였습니다.  tick은 이미 설명한 것과 같이 1/1000(천분의 1) 단위를 가지고 있기 때문에 1000으로 나눠서 계산하였습니다.
 
 
 
 
[그림 2]는 실행 화면입니다.  배경 이미지의 크기 이상으로 스크롤이 진행되자, 화면 오른쪽에 이미지의 잔상만을 남기면서 이상한 모양새가 되어 버렸습니다.
 
screenshot1.png
[그림 2] 배경 이미지 크기 이상으로 스크롤 된 화면
 
이 미지를 무한히 크게 하지 않는 한 이런 현상을 피할 수는 없습니다.  따라서, 대개의 경우 배경 이미지를 반복적으로 사용하게 됩니다.  아예 배경 이미지를 실시간으로 랜더링하는 방법도 있긴 합니다.  하지만, 실시간 랜더링은 다소 복잡하니 나중으로 미루도록 하겠습니다.
 
 
 
배경 이미지 순환 반복
 
여 기서는 이미지를 두 장 사용하여, 한 장이 화면에서 지나가면 바로 오른쪽에 이어서 표시하는 방식을 거듭해서 무한히 반복되도록 하겠습니다.  [그림 3]을 보시면 "배경 이미지 1"이 스크롤되면서 생긴 화면의 공백을 "배경 이미지 2"가 이어서 표시되도록 하는 것이 보입니다.  이후 "배경 이미지 1"이 화면영역에서 완전히 벗어나면, 이것을 다시 오른쪽에 이어 붙여서 재 활용 합니다.
 
pic1.png
[그림 3] 배경 이미지 두 장으로 연속적인 스크롤 구현
 
 
[소스 4] BackGround.java의 1차 수정
   1 : package app.main;
   2 : 
   3 : import ryulib.game.GameControl;
   4 : import ryulib.game.GamePlatformInfo;
   5 : import android.content.Context;
   6 : import android.content.res.Resources;
   7 : import android.graphics.Bitmap;
   8 : import android.graphics.BitmapFactory;
   9 : import android.graphics.Canvas;
  10 : import android.graphics.Paint;
  11 : 
  12 : public class BackGround extends GameControl {
  13 : 
  14 : private static final int BACKROUND_SPEED = 25;
  15 : 
  16 : public BackGround(Context context) {
  17 : super(null);
  18 : 
  19 : Resources resources = context.getResources();
  20 : 
  21 : _BackGoundBitmap = BitmapFactory.decodeResource(resources,   22 : R.drawable.background_a);
  23 : }
  24 : 
  25 : private Canvas _Canvas = null;
  26 : private Paint _Paint = null;
  27 : 
  28 : private Bitmap _BackGoundBitmap = null;
  29 : private double _X01 = 0;
  30 : private double _X02 = 0;
  31 : 
  32 : @Override
  33 : protected void onStart(GamePlatformInfo platformInfo) {
  34 : _Canvas = platformInfo.getCanvas();
  35 : _Paint = platformInfo.getPaint();
  36 : }
  37 : 
  38 : @Override
  39 : protected void onDraw(GamePlatformInfo platformInfo) {
  40 : long tick = platformInfo.getTick();
  41 : 
  42 : // 현재 위치에 먼 거리 배경 이미지 그리기
  43 : if ((_BackGoundBitmap.getWidth()+_X01) > 0) {
  44 : _Canvas.drawBitmap(_BackGoundBitmap, (int) _X01, 0, _Paint);
  45 : }
  46 : 
  47 : if ((_BackGoundBitmap.getWidth()+_X01) <= _Canvas.getWidth()) {
  48 : _Canvas.drawBitmap(_BackGoundBitmap, (int) _X02, 0, _Paint);
  49 : }
  50 : 
  51 : _X01 = _X01 - (BACKROUND_SPEED * tick / 1000);
  52 : _X02 = _X01 + _BackGoundBitmap.getWidth();
  53 : 
  54 : if ((_BackGoundBitmap.getWidth()+_X02) <= _Canvas.getWidth()) {
  55 : double temp = _X01;
  56 : _X01 = _X02;
  57 : _X02 = temp + _BackGoundBitmap.getWidth();
  58 : }
  59 : }
  60 : 
  61 : }
 
14: [소스 3]의 41: 라인에 있는 25라는 숫자는 어떤 의미로 쓰이는 지 알 수가 없기 때문에 이런 경우에는 상수로 정의해서 쓰는 것이 정석입니다.  따라서, 배경 이미지의 스크롤 속도에 맞게 상수 이름을  BACKROUND_SPEED로 정하였습니다.
 
29: 배경 이미지 좌표 정보가 두 개 필요하기 때문에 추가된 코드 입니다.
 
42: 첫 번째 이미지가 좌측 경계선을 넘어서면, 이미지를 표시 할 필요가 없습니다.
 
46: 두 번째 이미지는 첫 번째 이미지가 화면 전체를 덮지 못 할 경우에 표시 합니다.  첫 번째 이미지의 크기에 좌표를 더하면 현재 화면에 표시되고 있는 이미지의 넓이가 나옵니다.  여기서 좌표를 더하는 이유는 좌표가 음수 영역이기 때문입니다.
 
50-51: 우선 첫 번째 이미지 좌표 _X01을 이동 시키고, _X02는 _X01에 이미지의 넓이를 더해 줍니다.
 
53-57: 두 번째 이미지 마저 화면을 꽉 채우지 못하게 되면, 이미 사라져 버린 _X01과 자리를 바꿔서 이미지 표시를 순환 반복 합니다.
 
 
[그림 4]를 보시면 이미지 스크롤이 이미지 크기보다 더 진행되어 이미지의 앞 부분이 화면 오른쪽에 다시 반복되서 출력되는 것을 확인하실 수 있습니다.  이제 배경 이미지는 빈틈없이 순환 반복되어 출력 됩니다.
 
screenshot2.png
[그림 4] 배경 이미지의 순환 반복
 
배 경 이미지 표시를 이대로 해도 큰 문제가 되지는 않지만, 좀 더 세련된 표현을 해보도록 하겠습니다.  게임에서 자주 활용되는 기법인데, 배경 이미지를 여러 개 사용하고, 모든 배경 이미지의 속도를 다르게 함으로써 입체적인 표시를 하는 것 입니다.  느린 속도로 스크롤하는 배경은 멀리 있어 보이고, 빠를 수록 가까운 거리로 느껴지게 됩니다.
 
자 그럼 어떻게 하면 됩니까?  이미 배경 이미지 표시는 해봤으니까, 속도만 변경해서 Bitmap과 좌표를 저장 할 변수를 선언하여 코딩하면 쉽게 해결 될 것 입니다.  그리고, 이제 바로 코딩에 들어 가면 될 까요?
 
K-20101224-163446-4.png
No!!  틀렸지만, 참 잘 했어요 ^^
 
 
 
배경 이미지 처리를 캡슐화하여 코드를 간결하게
 
그 런건 아마추어들이나 하는 짓이고, 우리는 프로답게 "프로그래밍 7거지악" 중에 하나인 중복 코드도 피해가고, 배경 이미지의 위치를 계산하는 등의 전체 흐름과 무관한 코드를 캡슐화 해보록 하겠습니다.  우선 새로운 클래스인 BackGroundImage.java를 생성하였고, 그로 인해서 BackGround.java는 [소스 5]와 같이 간결해 졌습니다.
 
[소스 5] BackGround.java의 2차 수정
   1 : package app.main;
   2 : 
   3 : import ryulib.game.GameControl;
   4 : import ryulib.game.GamePlatformInfo;
   5 : import android.content.Context;
   6 : import android.content.res.Resources;
   7 : import android.graphics.BitmapFactory;
   8 : import android.graphics.Canvas;
   9 : import android.graphics.Paint;
  10 : 
  11 : public class BackGround extends GameControl {
  12 : 
  13 : private static final int BACKROUND_SPEED_SLOW = 25;
  14 : private static final int BACKROUND_SPEED_FAST = 50;
  15 : 
  16 : public BackGround(Context context) {
  17 : super(null);
  18 : 
  19 : Resources resources = context.getResources();
  20 : 
  21 : _BackGround_A.setBitmap(
  22 : BitmapFactory.decodeResource(resources, R.drawable.background_a)
  23 : );
  24 : _BackGround_A.setSpeed(BACKROUND_SPEED_SLOW);
  25 : 
  26 : _BackGround_B.setBitmap(
  27 : BitmapFactory.decodeResource(resources, R.drawable.background_b)
  28 : );
  29 : _BackGround_B.setSpeed(BACKROUND_SPEED_FAST);
  30 : }
  31 : 
  32 : private Canvas _Canvas = null;
  33 : private Paint _Paint = null;
  34 : 
  35 : private BackGroundImage _BackGround_A = new BackGroundImage();
  36 : private BackGroundImage _BackGround_B = new BackGroundImage();
  37 : 
  38 : @Override
  39 : protected void onStart(GamePlatformInfo platformInfo) {
  40 : _Canvas = platformInfo.getCanvas();
  41 : _Paint = platformInfo.getPaint();
  42 : }
  43 : 
  44 : @Override
  45 : protected void onDraw(GamePlatformInfo platformInfo) {
  46 : long tick = platformInfo.getTick();
  47 : 
  48 : _BackGround_A.Draw(_Canvas, _Paint, tick);
  49 : _BackGround_B.Draw(_Canvas, _Paint, tick);
  50 : }
  51 : 
  52 : }
 
전반적으로 수정되어 수정된 부분을 표시하지 않았습니다.
 
14: 새로운 배경 이미지는 속도를 두 배 빠르게 하여 가까운 배경으로 지정할 예정입니다. 
 
35-36: 배경 이미지를 처리해 주는 BackGroundImage의 객체를 두 개 생성합니다.
 
21, 26: Resources에서 각각 background_a와 background_b를 불러 들여 BackGroundImage.setBitmap()으로 지정 합니다.
 
24, 29: 각각 BackGroundImage의 객체의 속도를 지정해 줍니다.  하나는 느리고, 하나는 빠르게 설정하였습니다.
 
48-49: 배경 이미지의 그리기와 스크롤 처리를 BackGroundImage 클래스에게 위임하여 캡슐화 하였기 때문에, onDraw() 메소드 구현이 상당히 간결해 졌습니다.
 
 
[소스 6]는 BackGroundImage의 내부 구현 입니다.
 
[소스 6] BackGroundImage.java
   1 : package app.main;
   2 : 
   3 : import android.graphics.Bitmap;
   4 : import android.graphics.Canvas;
   5 : import android.graphics.Paint;
   6 : 
   7 : public class BackGroundImage {
   8 : 
   9 : private double _X01 = 0;
  10 : private double _X02 = 0;
  11 : 
  12 : // Property 
  13 : private Bitmap _Bitmap = null;
  14 : private int _Speed = 0;
  15 : 
  16 : public void Draw(Canvas canvas, Paint paint, long tick) {
  17 : // 현재 위치에 먼 거리 배경 이미지 그리기
  18 : if ((_Bitmap.getWidth()+_X01) > 0) {
  19 : canvas.drawBitmap(_Bitmap, (int) _X01, 0, paint);
  20 : }
  21 : 
  22 : if ((_Bitmap.getWidth()+_X01) <= canvas.getWidth()) {
  23 : canvas.drawBitmap(_Bitmap, (int) _X02, 0, paint);
  24 : }
  25 : 
  26 : _X01 = _X01 - (_Speed * tick / 1000);
  27 : _X02 = _X01 + _Bitmap.getWidth();
  28 : 
  29 : if ((_Bitmap.getWidth()+_X02) <= canvas.getWidth()) {
  30 : double temp = _X01;
  31 : _X01 = _X02;
  32 : _X02 = temp + _Bitmap.getWidth();
  33 : }
  34 : }
  35 : 
  36 : public void setBitmap(Bitmap value) {
  37 : _Bitmap = value;
  38 : }
  39 : public Bitmap getBitmap() {
  40 : return _Bitmap;
  41 : }
  42 : 
  43 : public void setSpeed(int value) {
  44 : _Speed = value;
  45 : }
  46 : 
  47 : public int getSpeed() {
  48 : return _Speed;
  49 : }
  50 : 
  51 : }
 
대분의 코드는 BackGround.java에서 구현했던 것과 동일 합니다.  특별히 다시 설명해야 할 만한 곳이 보이지 않기 때문에 설명을 생략하도록 하겠습니다.
 
이제와서 느낀건데 왜 BackGround가 Background보다 자연스럽게 느껴졌던 걸까요?  아놔!!
 
 
screenshot3.png
[그림 5] 완성된 결과
 
 
 
정리
  • 배경 이미지를 표시하고 스크롤 하기 (배경 이미지 순환 반복)
  • 배경 이미지를 여러 개를 준비하고, 속도를 달리하여 입체감 살리기
 
 
 
소스
 
첨부 파일을 참고 하세요.
 
 

이 글은 스프링노트에서 작성되었습니다.

'안드로이드' 카테고리의 다른 글

안드로이드 강좌 모음 pdf&동영상 강좌.  (0) 2012.05.11
화면회전  (0) 2012.05.08
배경화면꾸미기  (0) 2012.05.08
밑에 메뉴바.  (0) 2012.05.08
나인패치  (1) 2012.05.08
Posted by 사라링

배경화면꾸미기

2012. 5. 8. 18:36

 

 
이번에는 안드로이드 SDK에 포함된 예제인 JetBoy를 따라해 보도록 하겠습니다.  물론 게쪽을 사용해서 만들기 때문에 소스는 완전히 다른 스타일로 진행 됩니다.
 
 
 
기초 작업
 
우 선 [그림 1]처럼 프로젝트의 메인 Activity의 Package Name은 app.main으로 정했습니다.  이 부분은 여러분들이 각자 마음에 드는 이름으로 지정하셔도 됩니다.  그리고, Main Activity Class의 이름은 Main, 배경을 담당 할 클래스의 이름은 BackGround로 지정하였습니다.  이후 RyuLib를 src 폴더에 복사해서 사용하고 있습니다.
 
"RyuLib.Game for Android 시작하기"에서 이미 설명한 것과 중복되지만, "Add External JARs" 등을 이용하여 외부 참조를 하는 것이 익숙하지 않은 분들에게서 질문이 올라오고 있어서, 좀 쉽게 가기로 했습니다.  모든 예제의 소스에는 해당 예제를 작성할 때의 RyuLib를 복사해서 배포 할 예정입니다.  RyuLib는 아직 안정화 단계가 아니기 때문에 서로 버전이 달라 질 수 있음을 유의하시기 바랍니다.
 
이미지와 관련해서는 JetBoy의 drawable 폴더에 있는 이미지를 그대로 복사 해 왔습니다.
 
K-20101224-145750-5.png
[그림 1] 프로젝트 준비
 
이제 [소스 1]과 같이 AndroidManifest.xml 를 수정하여 화면을 가로로 변경하도록 하겠습니다.
 
[소스 1] AndroidManifest.xml
   1 :  <?xml version="1.0" encoding="utf-8"?>
   2 :  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
   3 :       package="app.main"
   4 :       android:versionCode="1"
   5 :       android:versionName="1.0">
   6 :      <application android:icon="@drawable/icon" android:label="@string/app_name">
   7 :          <activity android:name=".Main"
   8 :                   android:label="@string/app_name"
   9 :                   android:screenOrientation="landscape">
  10 :              <intent-filter>
  11 :                  <action android:name="android.intent.action.MAIN" />
  12 :                  <category android:name="android.intent.category.LAUNCHER" />
  13 :              </intent-filter>
  14 :          </activity>
  15 :      </application>
  16 :  </manifest> 
 
9: android:screenOrientation="landscape" 를 추가해서 지금 작성하는 어플리케이션이 가로로 화면이 출력되어야 함을 알립니다.
 
 
 
일단 무조건 표시하고 이동 해보자
 
이후 Main.java와 BackGround.java의 소스를 [소스 2]와 [소스 3]과 같이 작성합니다.
 
[소스 2] Main.java
   1 : package app.main;
   2 : 
   3 : import ryulib.game.GamePlatform;
   4 : import android.app.Activity;
   5 : import android.os.Bundle;
   6 : import android.view.ViewGroup;
   7 : import android.widget.LinearLayout;
   8 : 
   9 : public class Main extends Activity {
  10 :     /** Called when the activity is first created. */
  11 :     @Override
  12 :     public void onCreate(Bundle savedInstanceState) {
  13 :         super.onCreate(savedInstanceState);
  14 : 
  15 :         _GamePlatform = new GamePlatform(this);
  16 :         _GamePlatform.setLayoutParams(
  17 :         new LinearLayout.LayoutParams(
  18 :         ViewGroup.LayoutParams.FILL_PARENT, 
  19 :         ViewGroup.LayoutParams.FILL_PARENT, 
  20 :         0.0F
  21 :         )
  22 :         );
  23 : 
  24 :         setContentView(_GamePlatform);
  25 :         
  26 :         _BackGround = new BackGround(this);
  27 :         _GamePlatform.AddControl(_BackGround);
  28 :     }
  29 :     
  30 :     private GamePlatform _GamePlatform = null;
  31 :     private BackGround _BackGround = null;
  32 :     
  33 : }
 
"RyuLib.Game for Android 시작하기"에서 충분히 설명한 부분이라서 설명을 생략합니다.
 
 
[소스 3] BackGround.java
   1 : package app.main;
   2 : 
   3 : import ryulib.game.GameControl;
   4 : import ryulib.game.GamePlatformInfo;
   5 : import android.content.Context;
   6 : import android.content.res.Resources;
   7 : import android.graphics.Bitmap;
   8 : import android.graphics.BitmapFactory;
   9 : import android.graphics.Canvas;
  10 : import android.graphics.Paint;
  11 : 
  12 : public class BackGround extends GameControl {
  13 : 
  14 : public BackGround(Context context) {
  15 : super(null);
  16 : 
  17 : Resources resources = context.getResources();
  18 : 
  19 : _BackGoundBitmap = BitmapFactory.decodeResource(resources,   20 : R.drawable.background_a);
  21 : }
  22 : 
  23 : private Canvas _Canvas = null;
  24 : private Paint _Paint = null;
  25 : 
  26 : private Bitmap _BackGoundBitmap = null;
  27 : private double _X01 = 0;
  28 : 
  29 : @Override
  30 : protected void onStart(GamePlatformInfo platformInfo) {
  31 : _Canvas = platformInfo.getCanvas();
  32 : _Paint = platformInfo.getPaint();
  33 : }
  34 : 
  35 : @Override
  36 : protected void onDraw(GamePlatformInfo platformInfo) {
  37 : long tick = platformInfo.getTick();
  38 : 
  39 : // 현재 위치에 먼 거리 배경 이미지 그리기
  40 : _Canvas.drawBitmap(_BackGoundBitmap, (int) _X01, 0, _Paint);
  41 : 
  42 : _X01 = _X01 - (25 * tick / 1000);
  43 : }
  44 : 
  45 : }
 
17: Resources는 이미지나 오디오 등의 자원들을 코드에서 사용해 줄 수 있게 합니다.  우리는 지금 이미지가 필요한 시기이므로 간절히 필요합니다.
 
19: BitmapFactory를 이용해서 Resources에서 이미지를 불러옵니다.  drawable 폴더에서 background_a.png 파일을 가져옵니다.
 
 
26: 배경 이미지를 시간이 갈 수록 왼쪽으로 스크롤 하기 위해서, 이미지가 표시될 왼쪽 좌표를 저장 할 변수를 _X01로 지정하였습니다.  좌표의 이름 뒤에 "01"을 붙인 이유는 배경 이미지 표시가 두 번 필요하기 때문입니다.  이는 뒤에서 설명하도록 하겠습니다.
 
 
39: 현재 좌표 (_X01, 0)에 비트맵을 그려줍니다.  배경의 Y축 좌표는 변하지 않기 때문에 0으로 지정하였습니다.
 
 
41: 시간에 따라 X축 좌표를 왼쪽으로 이동하기 위해 시간에 맞춰서 빼기 연산을 합니다.  얼마만큼 이동하느냐는 1초 단위마다 25 픽셀로 정하였습니다.  tick은 이미 설명한 것과 같이 1/1000(천분의 1) 단위를 가지고 있기 때문에 1000으로 나눠서 계산하였습니다.
 
 
 
 
[그림 2]는 실행 화면입니다.  배경 이미지의 크기 이상으로 스크롤이 진행되자, 화면 오른쪽에 이미지의 잔상만을 남기면서 이상한 모양새가 되어 버렸습니다.
 
screenshot1.png
[그림 2] 배경 이미지 크기 이상으로 스크롤 된 화면
 
이 미지를 무한히 크게 하지 않는 한 이런 현상을 피할 수는 없습니다.  따라서, 대개의 경우 배경 이미지를 반복적으로 사용하게 됩니다.  아예 배경 이미지를 실시간으로 랜더링하는 방법도 있긴 합니다.  하지만, 실시간 랜더링은 다소 복잡하니 나중으로 미루도록 하겠습니다.
 
 
 
배경 이미지 순환 반복
 
여 기서는 이미지를 두 장 사용하여, 한 장이 화면에서 지나가면 바로 오른쪽에 이어서 표시하는 방식을 거듭해서 무한히 반복되도록 하겠습니다.  [그림 3]을 보시면 "배경 이미지 1"이 스크롤되면서 생긴 화면의 공백을 "배경 이미지 2"가 이어서 표시되도록 하는 것이 보입니다.  이후 "배경 이미지 1"이 화면영역에서 완전히 벗어나면, 이것을 다시 오른쪽에 이어 붙여서 재 활용 합니다.
 
pic1.png
[그림 3] 배경 이미지 두 장으로 연속적인 스크롤 구현
 
 
[소스 4] BackGround.java의 1차 수정
   1 : package app.main;
   2 : 
   3 : import ryulib.game.GameControl;
   4 : import ryulib.game.GamePlatformInfo;
   5 : import android.content.Context;
   6 : import android.content.res.Resources;
   7 : import android.graphics.Bitmap;
   8 : import android.graphics.BitmapFactory;
   9 : import android.graphics.Canvas;
  10 : import android.graphics.Paint;
  11 : 
  12 : public class BackGround extends GameControl {
  13 : 
  14 : private static final int BACKROUND_SPEED = 25;
  15 : 
  16 : public BackGround(Context context) {
  17 : super(null);
  18 : 
  19 : Resources resources = context.getResources();
  20 : 
  21 : _BackGoundBitmap = BitmapFactory.decodeResource(resources,   22 : R.drawable.background_a);
  23 : }
  24 : 
  25 : private Canvas _Canvas = null;
  26 : private Paint _Paint = null;
  27 : 
  28 : private Bitmap _BackGoundBitmap = null;
  29 : private double _X01 = 0;
  30 : private double _X02 = 0;
  31 : 
  32 : @Override
  33 : protected void onStart(GamePlatformInfo platformInfo) {
  34 : _Canvas = platformInfo.getCanvas();
  35 : _Paint = platformInfo.getPaint();
  36 : }
  37 : 
  38 : @Override
  39 : protected void onDraw(GamePlatformInfo platformInfo) {
  40 : long tick = platformInfo.getTick();
  41 : 
  42 : // 현재 위치에 먼 거리 배경 이미지 그리기
  43 : if ((_BackGoundBitmap.getWidth()+_X01) > 0) {
  44 : _Canvas.drawBitmap(_BackGoundBitmap, (int) _X01, 0, _Paint);
  45 : }
  46 : 
  47 : if ((_BackGoundBitmap.getWidth()+_X01) <= _Canvas.getWidth()) {
  48 : _Canvas.drawBitmap(_BackGoundBitmap, (int) _X02, 0, _Paint);
  49 : }
  50 : 
  51 : _X01 = _X01 - (BACKROUND_SPEED * tick / 1000);
  52 : _X02 = _X01 + _BackGoundBitmap.getWidth();
  53 : 
  54 : if ((_BackGoundBitmap.getWidth()+_X02) <= _Canvas.getWidth()) {
  55 : double temp = _X01;
  56 : _X01 = _X02;
  57 : _X02 = temp + _BackGoundBitmap.getWidth();
  58 : }
  59 : }
  60 : 
  61 : }
 
14: [소스 3]의 41: 라인에 있는 25라는 숫자는 어떤 의미로 쓰이는 지 알 수가 없기 때문에 이런 경우에는 상수로 정의해서 쓰는 것이 정석입니다.  따라서, 배경 이미지의 스크롤 속도에 맞게 상수 이름을  BACKROUND_SPEED로 정하였습니다.
 
29: 배경 이미지 좌표 정보가 두 개 필요하기 때문에 추가된 코드 입니다.
 
42: 첫 번째 이미지가 좌측 경계선을 넘어서면, 이미지를 표시 할 필요가 없습니다.
 
46: 두 번째 이미지는 첫 번째 이미지가 화면 전체를 덮지 못 할 경우에 표시 합니다.  첫 번째 이미지의 크기에 좌표를 더하면 현재 화면에 표시되고 있는 이미지의 넓이가 나옵니다.  여기서 좌표를 더하는 이유는 좌표가 음수 영역이기 때문입니다.
 
50-51: 우선 첫 번째 이미지 좌표 _X01을 이동 시키고, _X02는 _X01에 이미지의 넓이를 더해 줍니다.
 
53-57: 두 번째 이미지 마저 화면을 꽉 채우지 못하게 되면, 이미 사라져 버린 _X01과 자리를 바꿔서 이미지 표시를 순환 반복 합니다.
 
 
[그림 4]를 보시면 이미지 스크롤이 이미지 크기보다 더 진행되어 이미지의 앞 부분이 화면 오른쪽에 다시 반복되서 출력되는 것을 확인하실 수 있습니다.  이제 배경 이미지는 빈틈없이 순환 반복되어 출력 됩니다.
 
screenshot2.png
[그림 4] 배경 이미지의 순환 반복
 
배 경 이미지 표시를 이대로 해도 큰 문제가 되지는 않지만, 좀 더 세련된 표현을 해보도록 하겠습니다.  게임에서 자주 활용되는 기법인데, 배경 이미지를 여러 개 사용하고, 모든 배경 이미지의 속도를 다르게 함으로써 입체적인 표시를 하는 것 입니다.  느린 속도로 스크롤하는 배경은 멀리 있어 보이고, 빠를 수록 가까운 거리로 느껴지게 됩니다.
 
자 그럼 어떻게 하면 됩니까?  이미 배경 이미지 표시는 해봤으니까, 속도만 변경해서 Bitmap과 좌표를 저장 할 변수를 선언하여 코딩하면 쉽게 해결 될 것 입니다.  그리고, 이제 바로 코딩에 들어 가면 될 까요?
 
K-20101224-163446-4.png
No!!  틀렸지만, 참 잘 했어요 ^^
 
 
 
배경 이미지 처리를 캡슐화하여 코드를 간결하게
 
그 런건 아마추어들이나 하는 짓이고, 우리는 프로답게 "프로그래밍 7거지악" 중에 하나인 중복 코드도 피해가고, 배경 이미지의 위치를 계산하는 등의 전체 흐름과 무관한 코드를 캡슐화 해보록 하겠습니다.  우선 새로운 클래스인 BackGroundImage.java를 생성하였고, 그로 인해서 BackGround.java는 [소스 5]와 같이 간결해 졌습니다.
 
[소스 5] BackGround.java의 2차 수정
   1 : package app.main;
   2 : 
   3 : import ryulib.game.GameControl;
   4 : import ryulib.game.GamePlatformInfo;
   5 : import android.content.Context;
   6 : import android.content.res.Resources;
   7 : import android.graphics.BitmapFactory;
   8 : import android.graphics.Canvas;
   9 : import android.graphics.Paint;
  10 : 
  11 : public class BackGround extends GameControl {
  12 : 
  13 : private static final int BACKROUND_SPEED_SLOW = 25;
  14 : private static final int BACKROUND_SPEED_FAST = 50;
  15 : 
  16 : public BackGround(Context context) {
  17 : super(null);
  18 : 
  19 : Resources resources = context.getResources();
  20 : 
  21 : _BackGround_A.setBitmap(
  22 : BitmapFactory.decodeResource(resources, R.drawable.background_a)
  23 : );
  24 : _BackGround_A.setSpeed(BACKROUND_SPEED_SLOW);
  25 : 
  26 : _BackGround_B.setBitmap(
  27 : BitmapFactory.decodeResource(resources, R.drawable.background_b)
  28 : );
  29 : _BackGround_B.setSpeed(BACKROUND_SPEED_FAST);
  30 : }
  31 : 
  32 : private Canvas _Canvas = null;
  33 : private Paint _Paint = null;
  34 : 
  35 : private BackGroundImage _BackGround_A = new BackGroundImage();
  36 : private BackGroundImage _BackGround_B = new BackGroundImage();
  37 : 
  38 : @Override
  39 : protected void onStart(GamePlatformInfo platformInfo) {
  40 : _Canvas = platformInfo.getCanvas();
  41 : _Paint = platformInfo.getPaint();
  42 : }
  43 : 
  44 : @Override
  45 : protected void onDraw(GamePlatformInfo platformInfo) {
  46 : long tick = platformInfo.getTick();
  47 : 
  48 : _BackGround_A.Draw(_Canvas, _Paint, tick);
  49 : _BackGround_B.Draw(_Canvas, _Paint, tick);
  50 : }
  51 : 
  52 : }
 
전반적으로 수정되어 수정된 부분을 표시하지 않았습니다.
 
14: 새로운 배경 이미지는 속도를 두 배 빠르게 하여 가까운 배경으로 지정할 예정입니다. 
 
35-36: 배경 이미지를 처리해 주는 BackGroundImage의 객체를 두 개 생성합니다.
 
21, 26: Resources에서 각각 background_a와 background_b를 불러 들여 BackGroundImage.setBitmap()으로 지정 합니다.
 
24, 29: 각각 BackGroundImage의 객체의 속도를 지정해 줍니다.  하나는 느리고, 하나는 빠르게 설정하였습니다.
 
48-49: 배경 이미지의 그리기와 스크롤 처리를 BackGroundImage 클래스에게 위임하여 캡슐화 하였기 때문에, onDraw() 메소드 구현이 상당히 간결해 졌습니다.
 
 
[소스 6]는 BackGroundImage의 내부 구현 입니다.
 
[소스 6] BackGroundImage.java
   1 : package app.main;
   2 : 
   3 : import android.graphics.Bitmap;
   4 : import android.graphics.Canvas;
   5 : import android.graphics.Paint;
   6 : 
   7 : public class BackGroundImage {
   8 : 
   9 : private double _X01 = 0;
  10 : private double _X02 = 0;
  11 : 
  12 : // Property 
  13 : private Bitmap _Bitmap = null;
  14 : private int _Speed = 0;
  15 : 
  16 : public void Draw(Canvas canvas, Paint paint, long tick) {
  17 : // 현재 위치에 먼 거리 배경 이미지 그리기
  18 : if ((_Bitmap.getWidth()+_X01) > 0) {
  19 : canvas.drawBitmap(_Bitmap, (int) _X01, 0, paint);
  20 : }
  21 : 
  22 : if ((_Bitmap.getWidth()+_X01) <= canvas.getWidth()) {
  23 : canvas.drawBitmap(_Bitmap, (int) _X02, 0, paint);
  24 : }
  25 : 
  26 : _X01 = _X01 - (_Speed * tick / 1000);
  27 : _X02 = _X01 + _Bitmap.getWidth();
  28 : 
  29 : if ((_Bitmap.getWidth()+_X02) <= canvas.getWidth()) {
  30 : double temp = _X01;
  31 : _X01 = _X02;
  32 : _X02 = temp + _Bitmap.getWidth();
  33 : }
  34 : }
  35 : 
  36 : public void setBitmap(Bitmap value) {
  37 : _Bitmap = value;
  38 : }
  39 : public Bitmap getBitmap() {
  40 : return _Bitmap;
  41 : }
  42 : 
  43 : public void setSpeed(int value) {
  44 : _Speed = value;
  45 : }
  46 : 
  47 : public int getSpeed() {
  48 : return _Speed;
  49 : }
  50 : 
  51 : }
 
대분의 코드는 BackGround.java에서 구현했던 것과 동일 합니다.  특별히 다시 설명해야 할 만한 곳이 보이지 않기 때문에 설명을 생략하도록 하겠습니다.
 
이제와서 느낀건데 왜 BackGround가 Background보다 자연스럽게 느껴졌던 걸까요?  아놔!!
 
 
screenshot3.png
[그림 5] 완성된 결과
 
 
 
정리
  • 배경 이미지를 표시하고 스크롤 하기 (배경 이미지 순환 반복)
  • 배경 이미지를 여러 개를 준비하고, 속도를 달리하여 입체감 살리기
 
 
 
소스
 
첨부 파일을 참고 하세요.
 
 

이 글은 스프링노트에서 작성되었습니다.

'안드로이드' 카테고리의 다른 글

화면회전  (0) 2012.05.08
배경화면꾸미기  (0) 2012.05.08
밑에 메뉴바.  (0) 2012.05.08
나인패치  (1) 2012.05.08
activity  (0) 2012.05.08
Posted by 사라링

밑에 메뉴바.

2012. 5. 8. 18:36
  1. package kr.or.ddit.hello;

    import java.net.URL;

    import android.app.Activity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;

    public class HelloAndroidActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
           setContentView(R.layout.main);

            Button startBtn  = (Button)findViewById(R.id.startBtn);
           
            startBtn.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
    //                Toast.makeText(getApplicationContext(), "시작 버튼을 누룸", 2000).show();
                    //2000(2초) 잠시 창이 뛰어짐.
                    Intent myIntent = new Intent(getApplicationContext(),NewActivity.class);
                    startActivity(myIntent);
                }
            });
           
            Button secondBtn = (Button)findViewById(R.id.secondBtn);
            secondBtn.setOnClickListener(new OnClickListener() {
               
                public void onClick(View v) {
                    Intent myIntent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://m.daum.net"));
                    startActivity(myIntent);
                    //Intent란?
                    // 전달 해주는 역활.
                    // 인터넷 다음 창으로 접속함.
                }
            });
            Button endBtn = (Button)findViewById(R.id.endBtn);
            endBtn.setOnClickListener(new OnClickListener() {
               
                public void onClick(View v) {
                    Intent  myIntent = new Intent(Intent.ACTION_VIEW,Uri.parse("tel:010-8837-6366"));
                    startActivity(myIntent);
                   
                }
            });
           
           
           
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                MenuItem item01 = menu.add(Menu.FIRST,Menu.FIRST, Menu.NONE,"설정");
              MenuItem item02 = menu.add(Menu.FIRST,Menu.FIRST+1, Menu.NONE,"전화하기");
              MenuItem item03 = menu.add(Menu.FIRST,Menu.FIRST+2, Menu.NONE,"웹뷰");
              MenuItem item04 = menu.add(Menu.FIRST,Menu.FIRST+3, Menu.NONE,"바탕화면");
              item01.setIcon(R.drawable.ic_launcher);
            return super.onCreateOptionsMenu(menu);
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
    //        if(item.getItemId()==1){
    //           
    //        }else if(item.getItemId()==2){
    //           
    //        }
           
            switch (item.getItemId()) {
            case 1:
                Intent intent  = new Intent(getBaseContext(),NewActivity.class);
                startActivity(intent);
                break;
            case 2:
                Intent  myIntent = new Intent(Intent.ACTION_VIEW,Uri.parse("tel:010-8837-6366"));
                startActivity(myIntent);
               
                break;
            case 3:
                Intent myIntentw = new Intent(Intent.ACTION_VIEW,Uri.parse("http://m.daum.net"));
                startActivity(myIntentw);
                break;
            case 4:
                Toast.makeText(getApplicationContext(), "바탕화면누룸", 2000).show();
                break;

            default:
                break;
            }
           
           
            return super.onOptionsItemSelected(item);
        }
       
       
       
    }

이 글은 스프링노트에서 작성되었습니다.

'안드로이드' 카테고리의 다른 글

화면회전  (0) 2012.05.08
배경화면꾸미기  (0) 2012.05.08
배경화면꾸미기  (0) 2012.05.08
나인패치  (1) 2012.05.08
activity  (0) 2012.05.08
Posted by 사라링

나인패치

2012. 5. 8. 18:36

Nine-Patch
 - 동적 비트맵 이미지
 - 나인 패치를 배경 이미지로  사용하면 안드로이드가 컨텐츠 크기에 따라서 자동적으로 배경 이미지의
   사이즈를 조절하게 된다.
 - 예를 들어 버튼의 경우 버튼 안의 문자열 길이에 따라 버튼이 가변적으로 늘어나게 된다.
 - 가장 자리에 1px의 라인을 포함하는 표준 PNG로써, 확장자는 반드시 '이름.9.png' 형태로 저장되어야한다.


참고 ::
http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch
http://developer.android.com/guide/developing/tools/draw9patch.html


구조

 - 왼쪽, 상단은 지정된 픽셀 길이만큼 늘어나는 영역에 해당된다.
 - 오른쪽, 하단은 지정된 픽셀 길이만큼 내용이 들어가는 영역에 해당된다.


 

만드는 방법
 - 나인 패치 제작 툴은 자바 어플리케이션이므로 JDK가 설치되어 있어야한다.
 - 안드로이드 SDK 폴더내 tools 폴더에 보면 'draw9patch.bat' 파일을 실행하거나 아래 파일을 다운 받아 실행한다.

 
1. 툴 실행 화면 

 

2. 나인 패치를 적용할 이미지를 불러온다.

 

3. 첨에 불러왔을때 위와 같이 나오는데 아래처럼 Zoom 옵션을 만져주면 아래처럼 정상적으로 나온다.

 

4. 먼저 가변적으로 늘어날 영역을 지정한다. 'Show patches'를 체크한 후 왼쪽과 상단 가장자리에
   마우스를 클릭하면 픽셀이 생기는데 그 라인이 늘어날 영역에 해당된다. (오른쪽 클릭은 픽셀 제거)

 

5. 이제 내용(컨텐츠)가 들어갈 영역을 지정해준다. 'Show contents'를 체크한 후 오른쪽 화면을 보면서

   오른쪽과 하단 영역 가장자리 픽셀에 원하는 만큼 그어준다.



6. 다 되었으면 저장한다. 확장자는 반드시 '이름.9.png'여야 적용이 된다.

 

7. 나인 패치가 적용된 이미지는 아래처럼 보인다.

 

8. 나인 패치를 배경 이미지로 적용한 결과

 


응용)

이 글은 스프링노트에서 작성되었습니다.

'안드로이드' 카테고리의 다른 글

화면회전  (0) 2012.05.08
배경화면꾸미기  (0) 2012.05.08
배경화면꾸미기  (0) 2012.05.08
밑에 메뉴바.  (0) 2012.05.08
activity  (0) 2012.05.08
Posted by 사라링

activity

2012. 5. 8. 18:35

액티비티, 뷰 그리고 레이아웃

액티비티(Activity)

액티비티는 안드로이드 어플리케이션을 구성하는 가장 기본적인 빌딩블록입니다. 보통의 경우 한 화면을 차지하면서 뷰(View)로 구성된 유저 인터페이스를 화면에 표시하고 사용자의 입력을 처리하는 역할을 합니다.보통의 어플리케이션은 여러 다른 화면을 가지고 있고, 각각의 화면은 다른 액티비티로 구현되어있습니다. 그러므로 화면의 전환이 이루어지게되면 새로운 액티비티가 실행되어 처리하게 됩니다. 어떤 경우는 액티비티 간에 데이터를 서로 주고 받을 수도 있습니다. 새로운 화면이 생성되며 기존의 화면은 스택에 놓여집니다. 각각의 액티비티는 스택을 통해 관리되며 현재 액티비티를 종료하면 그 이전 화면의 액티비티로 돌아가게 됩니다.

뷰(View)

뷰는 화면상에서 유저 인터페이스를 구성하는 기본 빌딩블록입니다. 예를 들어 버튼, 그림, 텍스트, 에디트, 라디오 버튼, 체크박스 등의 기본적인 화면 구성 요소들이 뷰에 포함됩니다. 또한 웹, 맵, 비디오등을 표시하는 고급 구성 요소들도 모두 뷰에 포함됩니다. 뷰의 리스너(Listener) 설정을 통해 이벤트가 발생했을 경우를 처리할 수 있습니다. 예를 들어 버튼이 클릭되었을때 등록된 OnClickListener가 호출되어 처리됩니다.

레이아웃(Layout)

각각의 뷰들을 화면상에 배치하고 구성해주는 것을 레이아웃이라고 합니다. 레이아웃은 보통의 경우 XML을 이용하여 구성합니다. 이전 강좌에서도 리소스(res) 아래의 layout에 myactivity.xml파일을 생성해 준 적이 있지요. 

 레이아웃 XML

01.<?xml version="1.0" encoding="utf-8"?>
02.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03.android:orientation="vertical"
04.android:layout_width="fill_parent"
05.android:layout_height="fill_parent"
06.>
07.<TextView
08.android:layout_width="fill_parent"
09.android:layout_height="wrap_content"
10.android:text="안녕하세요 모바일 플레이스 안드로이드 강좌 수강생 여러분"
11./>
12.</LinearLayout>

(예제 4-1)

lecture4-1.JPG
(그림 4-1)

먼저 기본으로 생성되는 형태의 레이아웃 XML인 (예제 4-1)을 분석해보겠습니다.

XML파일은 <?xml version="1.0" encoding="utf-8"?> 으로 시작합니다. 그리고 첫번째 태그에는 xmlns:android="http://schemas.android.com/apk/res/android" 라는 XML Namespace가 들어가야 합니다.  레이아웃 XML의 각각의 태그 (LinearLayout, TextView)는 하나의 뷰를 나타내며 연결되는 자바 클래스를 가지고 있습니다. 뷰는 크게 두가지 형태가 존재하는데 버튼, 그림과 같이 실제 기능을 가지고 화면에 표시되는 뷰와 다른 뷰를 포함하고 배치하는 역할을 하는 레이아웃이 있습니다. 레이아웃은 하는 역할은 약간 다르지만 View 클래스를 상속하는 일종의 뷰라고 할 수입니다. 레이아웃 XML의 최상위에는 하나의 뷰만 존재할 수 있습니다. 보통 레이아웃이 들어가서 트리 형태로 다른 뷰들을 배치하고 구성하지만 일반 뷰 하나만 들어있는 레이아웃 XML도 작성할 수 있습니다.

흔히 많이 쓰이는 뷰와 레이아웃은 다음과 같습니다.

뷰       : TextView, Button, ImageView, ListView, EditText, ...
레이아웃 : LinearLayout, RelativeLayout, FrameLayout, AbsoluteLayout, ...

(예제 4-1)은 LinearLayout이 하나의 TextView를 자식으로 가지고 있는 형태입니다. 레이아웃 태그 사이에는 자식 뷰들이 여러 개 들어갈 수 있으며 레이아웃이 레이아웃을 자식으로 가지고 있는 형태도 가능합니다.

View Attribute

XML에서 각각의 뷰가 가지는 속성을 Attribute로 지정해할 수 있습니다. 모든 View가 공통적으로 가지고 있는 Attribute에 대해서 먼저 설명하도록 하겠습니다.

layout_width, layout_height 뷰의 넓이와 높이를 지정합니다. 값으로 fill_parent, wrap_content 혹은 절대적인 수치를 가질 수 있습니다. fill_parent는 컨테이너 즉 부모가 가지는 길이를 모두 채울때 사용하고, wrap_content는 해당 뷰가 그려질 수 있게 필요한 길이만 차지한다는 것을 나타냅니다. 절대적인 값도 넣을 수 있는데 픽셀의 경우 "100px", "100dp", "100sp" 처럼 수치와 단위를 써서 지정해줍니다. 사용할 수 있는 단위는 px, in, mm, pt, dp, sp등이 있는데 주로 dp, sp, px이 주로 쓰입니다. px는 픽셀을 나타내고, dp는 Density-independent Pixel이라고 화면의 밀도의 변화에 독립적으로 1dp는 160dpi의 화면에서의 1px에 대응됩니다. sp는 Scale-independent Pixel 이라고 하여 사용자의 폰트 선호도에 따라 크기가 달라지며 주로 폰트 사이즈 설정에 사용됩니다.

background 배경색 혹은 그림을 지정해줍니다. 색은 #RGB, #ARGB, #RRGGBB, #AARRGGBB 의 포맷으로 지정해 줄 수 있는데 저는 통일성있게 #AARRGGBB포맷만을 주로 사용합니다. 제일 앞에 AA는 투명도를 의미하고 나머지 부분은 RGB값을 의미합니다. 투명도인 AA는 00이 완전 투명, FF가 불투명이 됩니다. 예를 들어 android:background="#FFFF0000"로 지정해주면 빨간색으로 배경을 칠하게 됩니다. 배경그림을 지정해줄 수도 있는데 android:background="@drawable/background_image" 와 같은 형태로 사용가능합니다. 배경 그림은 리소스에 들어있는 jpg, png등의 그림을 배경으로 지정할 때 사용합니다.


visibility 뷰가 화면에 보이게 할지 안보이게 할지를 설정합니다. visible, invisible, gone의 값을 가질 수 있습니다. visible 화면에 보임, invisible 화면에 보이지 않으나 공간은 차지함, gone 화면에 보이지도 않고 공간도 차지 하지 않음.

id 코드에서 해당 뷰를 찾아올 수 있도록 id를 지정합니다. id에 사용에 대해서는 자바코드와 연결하는 부분에서 자세하게 다루도록 하겠습니다.

myactivity.xml을 수정해보면서 각 속성값이 어떻게 실제 화면에 영향을 주는지 확인해보도록 하겠습니다.

01.<?xml version="1.0" encoding="utf-8"?>
02.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03.android:orientation="vertical"
04.android:layout_width="fill_parent"
05.android:layout_height="fill_parent"
06.android:background="#FF888888"
07.>
08.<TextView
09.android:layout_width="fill_parent"
10.android:layout_height="wrap_content"
11.android:text="파랑"
12.android:background="#FF0000FF"
13./>
14.</LinearLayout>

(예제 4-2)

lecture4-2.JPG
(그림 4-2)

자 그럼 속성값들을 변경해보도록 하겠습니다. 먼저 배경색을 지정하여 실제 뷰가 차지하는 영역을 살펴보도록 하겠습니다. (예제4-2)에서 LinearLayout은 width, height를 각각 fill_parent로 화면 전체를 채우고 있으며, TextView는 width는 fill_parent로 부모의 길이만큼 모두 차지하지만 height를 wrap_content로 하여 자신이 차지하는 부분만을 높이로 가지는 것을 볼수 있습니다.

01.<?xml version="1.0" encoding="utf-8"?>
02.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03.android:orientation="vertical"
04.android:layout_width="fill_parent"
05.android:layout_height="fill_parent"
06.>
07.<TextView
08.android:layout_width="fill_parent"
09.android:layout_height="wrap_content"
10.android:text="빨강"
11.android:background="#FFFF0000"
12./>
13.<TextView
14.android:layout_width="wrap_content"
15.android:layout_height="50dp"
16.android:text="녹색"
17.android:background="#FF00FF00"
18./>
19.<TextView
20.android:layout_width="fill_parent"
21.android:layout_height="wrap_content"
22.android:text="파랑"
23.android:background="#FF0000FF"
24./>
25.</LinearLayout>

(예제 4-3)

lecture4-3.JPG
(그림 4-3)

자 이번에는 (예제 4-3)에 TextView를 두개 더 추가하여 배경색을 빨강, 녹색, 파랑으로 칠하고 가운데 있는 TextView의 width를 wrap_content로 height를 50dp로 지정해 보았습니다.

lecture4-4.JPG
(그림 4-4)

lecture4-5.JPG
(그림 4-5)


(그림 4-4)와 (그림 4-5)는 각각 두번째 TextView에 android:visibility="invisible", android:visibility="gone"으로 설정하여 화면에 보일때와 안보일 때 그리고 영역을 차지 하지 않을 때의 차이를 살펴보실 수 있습니다.

이 글은 스프링노트에서 작성되었습니다.

'안드로이드' 카테고리의 다른 글

화면회전  (0) 2012.05.08
배경화면꾸미기  (0) 2012.05.08
배경화면꾸미기  (0) 2012.05.08
밑에 메뉴바.  (0) 2012.05.08
나인패치  (1) 2012.05.08
Posted by 사라링

기본편 2

2012. 5. 8. 18:34
 
  1. Struts는 Resource Bundle을 이용하여 JSP의 메세지를 쉽게 처리할 수 있다. Resource Bundle은 자바에서 흔히 사용하는 Properties파일에 JSP의 메세지나 에러 메세지들을 처리하는 경우 손쉽게 사용이 가능하도록 하였다. Properties파일에 메세지를 저장한 후에 JSP에서 메세지를 사용할 수 있도록 예제를 만들어보자.!
  2. -------------------------------------------------------------------------------------
  3. Properties파일 생성. 위치는 WEB-INF\classes\javajigi\tutorial을 기본디렉토리로 MessageResources.properties파일을 생성하자. 생성한 properties파일을 Struts가 사용하기위해 web.xml과 struts-config.xml을 다음과 같이 설정하자.
    1. Struts의 Resource Bundle을 이용하기 위하여 수정된 web.xml
    2. <?xml version="1.0" encoding="ISO-8859-1"?>
      <!DOCTYPE web-app
      PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
      "
      http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
    3. <web-app>
      <!-- Action Servlet Configuration -->
      <servlet>
      <servlet-name>action</servlet-name>
      <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

      <!-- Resource bundle base class -->
      <init-param>
      <param-name>application</param-name>
      <param-value>net.javajigi.tutorial.MessageResources</param-value>
      </init-param>

      <init-param>
      <param-name>config</param-name>
      <param-value>WEB-INF/struts-config.xml</param-value>
      </init-param>

      <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>

      </servlet>

      <!-- Action Servlet Mapping -->
      <servlet-mapping>
      <servlet-name>action</servlet-name>
      <url-pattern>*.do</url-pattern>
      </servlet-mapping>
    4. <!-- Struts Tag Library Descriptors -->
      <taglib>
      <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
      <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
      </taglib>

      <taglib>
      <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
      <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
      </taglib>

      <taglib>
      <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
      <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
      </taglib>
      </web-app>
  4. struts-config.xml : MessageResources.properties파일을 이용하기 위하여 설정한 struts-config.xml파일

    1. <?xml version="1.0" encoding="ISO-8859-1" ?>

    2. <!DOCTYPE struts-config PUBLIC
      "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
      "
      http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

    3. <struts-config>
      <data-sources />
      <form-beans />
      <global-exceptions />
      <global-forwards />
      <action-mappings />
      <controller />
      <message-resources parameter="net.javajigi.tutorial.MessageResources" />
      </struts-config>
  5. MessageResources.properties 파일에 메세지를 추가.

    zigi2.title = 내가 만드는 두번째 Struts application!
    zigi2.text1 = 이 페이지는 내가 만든 두번째 Struts Application페이지이다.!!!

  6. zigi2.jsp파일을 생성 및 코딩.

    <%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>

  7. <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
    <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>

  8. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

  9. <html:html locale="true">
    <head>
    <title><bean:message key="zigi2.title"/></title>
    <html:base/>
    </head>

  10. <body>
    <bean:message key="zigi2.text1"/>
    </body>
    </html:html>
  11. // ***********한글이 깨질때! properties editor 검색해서 해봐..


     


 

 

이 글은 스프링노트에서 작성되었습니다.

'스트러츠' 카테고리의 다른 글

기본편 1  (0) 2012.05.08
스트러츠  (0) 2012.05.08
Posted by 사라링

기본편 1

2012. 5. 8. 18:34
 
  1. 워크스페이스는 " C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps " 로 설정.
  2. webapps 폴더에 소스가 있어야 톰켓 서비스가 가능함
  3. New -> Java Project 로 한다. (Dynamic Web Project는 익숙해지면 사용하자!)
  4. struts에서 가장 기본이 되는 파일 (struts-blank.war) 을 검색하여 다운받아 압출을 풀면 기본 폴더들이 나온다.
  5. 기본구조에 맞게 맞추어 준다.
  6. WebContent 폴더 생성 -폴더 안에-> META-INF폴더, WEB-INF폴더 생성
  7. META-INF 폴더 안에는 MANIFEST.MF 파일을 넣어둔다.
  8. WEB-INF 폴더안에는 해당 폴더 및 파일 복사.
  9. 디렉토리 구조는 이러하다.
  10. 디렉토리구조1.JPG
  11. 첫번째 예제를 시작해보자! 우선 Struts의 커스템 태그를 사용하기 위해 web.xml을 설정해보자.
  12. <?xml version="1.0" encoding="ISO-8859-1"?>
  13. <!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
    "
    http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
  14. <web-app>
    <!-- Struts Tag Library Descriptors -->
    <taglib>
    <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
    </taglib>

    <taglib>
    <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
    </taglib>

    <taglib>
    <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
    </taglib>
    </web-app>

    1. // taglib은 태그라이브러리에서 태그를 꺼나와 사용할 수 있는 기능을 제공해주는 지시부이다.
    2.  
  15. Struts의 커스텀 태그를 이용하는 JSP파일을 생성하자. 위치는 zigistruts/struts1/zigi1.jsp
    1. <%@ page language="java" %> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <html:html> <head> <title>내가 만드는 첫번째 Struts application!</title> <html:base/> </head> <body> 이 페이지는 내가 만든 첫번째 Struts Application페이지이다.!!! </body> </html:html>
    2. //기본은 이러한데... 한글이 안먹힐수 있으니 이러하게 사용해도 된다.
      
    3. <%@ page language="java" contentType="text/html; charset=EUC-KR"
      pageEncoding="EUC-KR"%>
    4. <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
      <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
      <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
    5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
      <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
    6. <html:html>
      <head>
      <title>내가 만드는 첫번째 Struts application!</title>
      <html:base/>
      </head>
    7. <body>
      이 페이지는 내가만든 첫번째 Struts application!
      </body>
      </html:html>
  16. 완성  주소창에 다음과 같이 입력하면 된다..
    
    1. 기본예제1_완료.JPG
      

 

 

 

1. 섯다 Mini 온라인 게임

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1.  

 

이 글은 스프링노트에서 작성되었습니다.

'스트러츠' 카테고리의 다른 글

기본편 2  (0) 2012.05.08
스트러츠  (0) 2012.05.08
Posted by 사라링

스트러츠

2012. 5. 8. 18:34

 

  1. 스트러츠란?

     - 스트러츠란 자바 기반의 Web Application을 개발하는데 사용되는 FrameWork이다. 

  2. 스트러츠 기초 설정

    1. 스트러츠2 파일 다운

      1. http://struts.apache.org 접속 하여 다운을 받는다.

    2. 다운받는 파일 압축을 풀고 그 안의 lib폴더에 들어가면 많은 .jar파일이 보인다. 그 중 필요한 파일은

      1. commons-logging-X.jar : log4 와 같은 로깅을 위한 라이브러리(JSP 2.1스펙에 포함된 EL과 매우 비슷)

      2. freemarkert-X.jar : UI태그 템플릿을 위한 것

      3. ognl-X.jar : 스트러츠2를 위한 EL(Expression Language)이다.

      4. struts2-core-X.jar : 스트러츠2의 코어라이브러리

      5. xwork-core-@.jar : 웹워크와 통합

    3. Eclipse-EE 실행 후 앞으로 사용할 Dynamic web project를 하나 만든다. 그 후 WebContent > WEB-INF > lib 안에 위 파일을 복사한다

    4. WebContent에 index.jsp파일을 생성 하여 실행해보기.

 

기본예제 해보기

  1. 자바프로젝트 생성

    1. 위의 기본 셋팅을 끝낸다.

    2. 액션 작성

      1. 테스트할 자바 소스를 추가한다. 스트처츠2에서는 Action이라고 말하며 [Java Resources:src]항에서 마우스 우클릭 후 파일을 생성

      2. eclipse_6_hipwg[1].png

        1. (1) 기본 소스폴더

        2. (2)패키지명

        3. (3)파일명

        4. (4)상속받을 클랙스 [ Browse...]버튼 클릭후 "ActionSupport를 입력하면 쉽게 찾을 수 있다.

      3. HelloWorld.java의 소스내용

        1. package test;

          import com.opensymphony.xwork2.ActionSupport;

          public class HelloWorld extends ActionSupport {
          private String message;

          public String getMessage(){
          return message;
          }

          public void setMessage(String message){
          this.message=message;
          }

          public String execute()throws Exception{
          message="hi Struts!!!";
          return "success";
          }
          }

      4. Result페이지 작성

        1. -실행된 Action의 결과를 표시해 주는 리절트 페이지를 만들기. jsp페이지에 하면 됨..

      5. hello.jsp생성후 코딩...

        1. <title>Insert title here</title>
          <body>
          Hi..
          <hr>
          Message:${message}

          <form name="frm" action="helloWorld.action">
          <input type="submit" value="Action">
          </form>

          </body>
          </html>

      6. 매핑작업

        1. -Action 페이지와 Result페이지 두 파일을 적당한 규칙을 사용하여 묶어주는 작업이다 작업파일은 struts.xml파일에서 해야함
        2. Project Explorer의 해당 프로젝트 이름을 우클릭후 New -> Other -> xml을 검색 하면 "XML File" 선택후 Next 클릭하면 아래화면이 나온다
        3. zzzzz.PNG
        4. 이때 위치가 중요한데 해당 프로젝트의 src를 클릭 그리고 파일명을 적고 Finish를 클릭한다.
        5. struts.xml 파일 코딩...
        6. <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE struts PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
          "
          http://struts.apache.org/dtds/struts-2.0/dtd">
          <struts>
          <package name="test" extends="struts-defalut">
          <action name="HelloWorld" class="test.HelloWorld"
          <result name="success">/hello.jsp</result>
          </action>
          </package>
          </struts>

           

      7. 필터작업

        1. -필터작업이란 url부분에 xxx.action과 같이 "action"이 포함되어 있으면 해당 내용을 struts가 처리하겠다는 선언이라 볼 수 있다.
        2. -필터작업은 [WebContent]/[WEB-INF]/web.xml 파일에서 구현해야 함.
        3.  

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

 

<display-name>Struts_test</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>

<filter>
<filter-name>struts2</filter-name>
             <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>

 

 

이 글은 스프링노트에서 작성되었습니다.

'스트러츠' 카테고리의 다른 글

기본편 2  (0) 2012.05.08
기본편 1  (0) 2012.05.08
Posted by 사라링

 디자인패턴목차003.jpg 디자인패턴목차004.jpg 디자인패턴목차005.jpg 디자인패턴목차006.jpg 디자인패턴목차007.jpg 디자인패턴목차008.jpg 디자인패턴목차009.jpg 디자인패턴목차010.jpg 디자인패턴목차011.jpg 디자인패턴목차012.jpg 디자인패턴목차013.jpg 디자인패턴목차014.jpg 디자인패턴이미지001.jpg 디자인패턴이미지002.jpg 디자인패턴이미지003.jpg 디자인패턴이미지004.jpg 디자인패턴이미지005.jpg 디자인패턴이미지006.jpg 디자인패턴이미지007.jpg 디자인패턴이미지008.jpg 디자인패턴이미지009.jpg 디자인패턴이미지010.jpg 디자인패턴이미지011.jpg 디자인패턴이미지012.jpg 디자인패턴이미지013.jpg 디자인패턴이미지014.jpg 디자인패턴이미지015.jpg 디자인패턴이미지016.jpg 디자인패턴이미지017.jpg 디자인패턴이미지018.jpg 디자인패턴이미지019.jpg 디자인패턴이미지020.jpg 디자인패턴이미지021.jpg 디자인패턴이미지022.jpg 디자인패턴이미지023.jpg 디자인패턴이미지024.jpg 디자인패턴이미지025.jpg 디자인패턴이미지026.jpg 디자인패턴이미지027.jpg 디자인패턴이미지028.jpg 디자인패턴이미지029.jpg 디자인패턴이미지030.jpg 디자인패턴이미지031.jpg 디자인패턴이미지032.jpg 디자인패턴이미지033.jpg 디자인패턴이미지034.jpg 디자인패턴이미지035.jpg 디자인패턴이미지036.jpg 디자인패턴이미지037.jpg 디자인패턴이미지038.jpg 디자인패턴이미지039.jpg 디자인패턴이미지040.jpg 디자인패턴이미지041.jpg 디자인패턴이미지042.jpg 디자인패턴이미지043.jpg 디자인패턴이미지044.jpg 디자인패턴이미지045.jpg 디자인패턴이미지046.jpg 디자인패턴이미지047.jpg 디자인패턴이미지048.jpg 디자인패턴이미지049.jpg 디자인패턴이미지050.jpg 디자인패턴이미지051.jpg 디자인패턴이미지052.jpg 디자인패턴이미지053.jpg 디자인패턴이미지054.jpg 디자인패턴이미지055.jpg 디자인패턴이미지056.jpg 디자인패턴이미지057.jpg 디자인패턴이미지058.jpg 디자인패턴이미지059.jpg 디자인패턴이미지060.jpg 디자인패턴이미지061.jpg 디자인패턴이미지062.jpg 디자인패턴이미지063.jpg 디자인패턴이미지064.jpg 디자인패턴이미지065.jpg 디자인패턴이미지066.jpg 디자인패턴이미지067.jpg 디자인패턴이미지068.jpg 디자인패턴이미지069.jpg 디자인패턴이미지070.jpg 디자인패턴이미지071.jpg 디자인패턴이미지072.jpg 디자인패턴이미지073.jpg 디자인패턴이미지074.jpg 디자인패턴이미지075.jpg 디자인패턴이미지076.jpg 디자인패턴이미지077.jpg 디자인패턴이미지078.jpg 디자인패턴이미지079.jpg 디자인패턴이미지080.jpg 디자인패턴이미지081.jpg 디자인패턴이미지082.jpg 디자인패턴이미지083.jpg 디자인패턴이미지084.jpg 디자인패턴이미지085.jpg 디자인패턴이미지086.jpg 디자인패턴이미지087.jpg 디자인패턴이미지088.jpg 디자인패턴이미지089.jpg 디자인패턴이미지090.jpg 디자인패턴이미지091.jpg 디자인패턴이미지092.jpg 디자인패턴이미지093.jpg 디자인패턴이미지094.jpg 디자인패턴이미지095.jpg 디자인패턴이미지096.jpg 디자인패턴이미지097.jpg 디자인패턴이미지098.jpg 디자인패턴이미지099.jpg 디자인패턴이미지100.jpg 디자인패턴이미지101.jpg 디자인패턴이미지102.jpg 디자인패턴이미지103.jpg 디자인패턴이미지104.jpg 디자인패턴이미지105.jpg 디자인패턴이미지106.jpg 디자인패턴이미지107.jpg 디자인패턴이미지108.jpg 디자인패턴이미지109.jpg 디자인패턴이미지110.jpg 디자인패턴이미지111.jpg 디자인패턴이미지112.jpg 디자인패턴이미지113.jpg 디자인패턴이미지114.jpg 디자인패턴이미지115.jpg 디자인패턴이미지116.jpg 디자인패턴이미지117.jpg 디자인패턴이미지118.jpg 디자인패턴이미지119.jpg 디자인패턴이미지120.jpg 디자인패턴이미지121.jpg 디자인패턴이미지122.jpg 디자인패턴이미지123.jpg 디자인패턴이미지124.jpg 디자인패턴이미지125.jpg 디자인패턴이미지126.jpg 디자인패턴이미지127.jpg 디자인패턴이미지128.jpg 디자인패턴이미지129.jpg 디자인패턴이미지130.jpg 디자인패턴이미지131.jpg 디자인패턴이미지132.jpg 디자인패턴이미지133.jpg 디자인패턴이미지134.jpg 디자인패턴이미지135.jpg 디자인패턴이미지136.jpg 디자인패턴이미지137.jpg 디자인패턴이미지138.jpg 디자인패턴이미지139.jpg 디자인패턴이미지140.jpg 디자인패턴이미지141.jpg 디자인패턴이미지142.jpg 디자인패턴이미지143.jpg 디자인패턴이미지144.jpg 디자인패턴이미지145.jpg 디자인패턴이미지146.jpg 디자인패턴이미지147.jpg 디자인패턴이미지148.jpg 디자인패턴이미지149.jpg 디자인패턴이미지150.jpg 디자인패턴이미지151.jpg 디자인패턴이미지152.jpg 디자인패턴이미지153.jpg 디자인패턴이미지154.jpg 디자인패턴이미지155.jpg 디자인패턴이미지156.jpg 디자인패턴이미지157.jpg 디자인패턴이미지158.jpg 디자인패턴이미지159.jpg 디자인패턴이미지160.jpg 디자인패턴이미지161.jpg 디자인패턴이미지162.jpg 디자인패턴이미지163.jpg 디자인패턴이미지164.jpg 디자인패턴이미지165.jpg 디자인패턴이미지166.jpg 디자인패턴이미지167.jpg 디자인패턴이미지168.jpg 디자인패턴이미지169.jpg 디자인패턴이미지170.jpg 디자인패턴이미지171.jpg 디자인패턴이미지172.jpg 디자인패턴이미지173.jpg 디자인패턴이미지174.jpg 디자인패턴이미지175.jpg 디자인패턴이미지176.jpg 디자인패턴이미지177.jpg 디자인패턴이미지178.jpg 디자인패턴이미지179.jpg 디자인패턴이미지180.jpg 디자인패턴이미지181.jpg 디자인패턴이미지182.jpg 디자인패턴이미지183.jpg 디자인패턴이미지184.jpg 디자인패턴이미지185.jpg 디자인패턴이미지186.jpg 디자인패턴이미지187.jpg 디자인패턴이미지188.jpg

이 글은 스프링노트에서 작성되었습니다.


Posted by 사라링

유니코드 표

 | JAVA
2012. 5. 8. 18:32

유니코드표.png 

이 글은 스프링노트에서 작성되었습니다.


'JAVA' 카테고리의 다른 글

passwd 암호화  (0) 2012.05.15
OS CPU MEMORY 값 보여주기  (0) 2012.05.15
SqlExploler(eclipse)  (0) 2012.05.08
자바 EXE 만들기.  (0) 2012.05.08
JDBC  (0) 2012.05.08
Posted by 사라링

SqlExploler(eclipse)

 | JAVA
2012. 5. 8. 18:32

== 이클립스에 JDBC 에 연동 하여 sqlplus 처럼 사용 하는 것이다.

http://sourceforge.net/projects/eclipsesql/  에서 다운 받아 이클립스 폴더 에 덮어 쒸운다. 무거 우므로 따로 이클립스를 만든후 사용 하는게 좋다.

이클립스를 사용 중이라면 사용 종료후 재시작 을 한다./ 맨처음 로딩에 시간이 좀 걸린다...

 

SqlExploer.jpg

 

preperenc-> SQL Exploler  -> auto commit  제거

 

오른쪽 위에 open perspective -> other ->Sql Exploler 선택

 

왼쪽에 Connection 에서 마우스 오른쪽 버튼 -> new Connect 클립 한다. Name 은 사용자의 이름 적고 (아무거나.)

나머지는 그림 따라서 알아서 하삼.

user 에는 사용자 계정 아이디를 반드시 적어야함.

SqlExploer_00005.jpg SqlExploer_00005_00000.jpg SqlExploer_00005_00001.jpg SqlExploer_00005_00002.jpg SqlExploer_00005_00003.jpg   

 

 

    

 

이 글은 스프링노트에서 작성되었습니다.

'JAVA' 카테고리의 다른 글

OS CPU MEMORY 값 보여주기  (0) 2012.05.15
유니코드 표  (0) 2012.05.08
자바 EXE 만들기.  (0) 2012.05.08
JDBC  (0) 2012.05.08
VisualSVN  (0) 2012.05.08
Posted by 사라링

자바 EXE 만들기.

 | JAVA
2012. 5. 8. 18:32
 


 




준비물

1. JDK 설치와 환경변수 설정 (http://heartcrack.tistory.com/entry/JDK-다운로드와-환경변수-설정)

링크참조


2. 이클립스 다운로드(http://www.eclipse.org/downloads/)


3. JSmooth 를 다운로드 한뒤 컴퓨터에 설치




실행방법

1. 이클립스를 들어가서 해당하는 소스 파일을 연다.




2. FILE - EXPORT를 클릭한다. 그리고 Runnable jar file을 클릭 --> Next !

 

 

 

 

3.Launch Configuration에서 적절한 파일을 찾아 주고 추출 목적지에는 Jar파일이 저장될 곳을


지정해준다. 그다음 Finish를 눌러서 JAR파일을 생성해준다

 



4. JAR파일이 생성된것을 확인하고 이제 JSmooth를 실행해보자!

JSmooth의 첫페이지.



5. (불러오기를 하지 않은채로) 왼쪽탭에서 Skeleton을 클릭한다.

console wrapper는 콘솔 프로그램이고 windows wrapper는 윈도우 프로그램이다.

윈도우 프로그램을 선택했다면 첫번째 박스를 체크해준다. 나는 콘솔프로그램으로 진행



6. 그다음으로 이제 Executable탭에서

binary에는 저장될 파일명을 기록해 준다( exe확장자로 끝나도록)

그담에 icon에서는 ...을 눌러서 그림같은것들을 지정할수 있다.

이것이 exe파일의 아이콘이 되는데 바로가기 같은것을 해버리면,

컴파일이 실패 해버리므로. 적당한게 없으면 그냥 공백으로 두어도 좋다.


7. 그다음엔 Application 탭에 들어가서

   1번의 추가 버튼으로 2번의 JAR파일을 class path에 등록시킨 다음

   3번의 탭을 클릭해서 밑에 보이는 스샷처럼 메인 클래스(실행클래스 -public class)를 지정해준다.

 

 

    Embbeded jar 는 jar파일을 실행 파일에 포함시키는지에 대한 여부이다.



8. 그다음탭에 들어가서는 자바 VM ware의 버전을 적어 준다.

나는 1.7 버전을 기입.




9. 메모리에 대한 세팅을 한다 . 안해주어도 무방하다.


 11. 표시된 해골모양 또는, 프로젝트-컴파일을 클릭한다.

컴파일이 실패했다고 메시지가 떴다면 앞의 과정중에서 다른것이 잘못된것이다.


12. 바탕화면에 jsmooth로 확장자가 끝나는 파일과

 


exe파일이 생성되었다(나는 아이콘을 지정하지 않아서 기본모양으로 생성됨)

더블클릭해보면 잘 실행되는것을 알수있다.


이렇게 해서 JAVA파일 EXE 만들기 끗 ^ㅅ^

(참고: JDK가 설치된 컴퓨터에서만 EXE파일이 유효하니 알아두길)

이 글은 스프링노트에서 작성되었습니다.

'JAVA' 카테고리의 다른 글

유니코드 표  (0) 2012.05.08
SqlExploler(eclipse)  (0) 2012.05.08
JDBC  (0) 2012.05.08
VisualSVN  (0) 2012.05.08
JAVA 에러코드  (0) 2012.05.08
Posted by 사라링

JDBC

 | JAVA
2012. 5. 8. 18:31

JDBC[제이디비씨]자바로 작성된 프로그램을, 일반 데이터베이스에 연결하기 위한 응용프로그램 인터페이스 규격이다. 이 응용프로그램 인터페이스는 데이터베이스 관리시스템에 넘겨질 SQL 형태의 데이터베이스 접근요구 문장을, 각 시스템에 맞도록 바꾸어준다. 처리 결과도, 이와 비슷한 인터페이스를 통해 얻게된다. JDBC는 ODBC와 아주 유사해서, 조그만 연결 프로그램만 있으면, ODBC 인터페이스를 통해 데이터베이스에 연결하는 JDBC 인터페이스를 사용할 수 있다. 예를 들어, 다수의 운영체계 플랫폼 상에 있는 많은 데이터베이스 제품들을 연결하도록 설계된 프로그램을 작성할 수 있으며, JDBC 문장을 사용한 프로그램은 심지어, 윈도우95에서 운영되는 마이크로소프트 액세스 데이터베이스에 접근하는 것도 가능할 것이다.

JDBC는 실제로는 두 계층의 인터페이스로 구성되어 있다. 주 인터페이스 외에도 JDBC "manager"에서 나온 API 가 있는데, 이것의 역할은 개별 데이터베이스 제품의 드라이버들과 차례대로 통신을 하는 것이다. 이때, 만약 필요하다면 JDBC-ODBC bridge와, 그리고 자바 프로그램이 원격 데이터베이스를 액세스하기 위해 네트웍 환경에서 실행되고 있다면 JDBC 네트웍 드라이버 등과의 통신도 수행한다.

JDBC가 원격 데이터베이스에 접근할 경우에는, 인터넷 파일 주소 구조의 강점을 이용하는데, 파일이름이 웹페이지 주소(URL) 체계와 아주 유사하게 보인다. 예를 들어, 자바 SQL 문장에서는, 다음과 같은 주소를 통해 원하는 데이터베이스를 인식할 수 있다.

 

jdbc:odbc://www.somecompany.com:400/databasefile

 

JDBC 는 커넥터 jar 파일이 있어야 하며. 보통

D:\tools\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib // 위치에 잇다.

 파일명은 ojdbc14.jar 을 복사 하여 프로젝트 에 붙여 넣기 한후에 .  위의 그림처럼 패키지 마우스 오른쪽 프로퍼티브 후에 자바빌드 패치로 이동 하여 add jars 클릭후 붙여 넣은 ojdbc14.jar을 추가 한다.

 

이후 Connect 생성자 생성이 가능 하다.

 

이후 DAO 파일 생성시에 Arraylist의 제너레이션을 위한. simple.java 생성.

package kr.hun.bean;

public class Simple {
    private int sid=0;
    private String name="";
    private String tel="";
    public int getSid() {
        return sid;
    }
    public void setSid(int sid) {
        this.sid = sid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
}

DAO 파일. 생성.

package kr.hun;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import kr.hun.bean.Simple;
public class SimpleDao {
    private String strconn="jdbc:oracle:thin:@localhost:1521" +
            ":xe";
    // 집에서는 익스 프레션./ 집에선 :xe 가 붙는다 // 본래는 :xe 대신 :orcl
    //e : java.sql.SQLException: IO 예외 상황: The Network Adapter could not establish the connection
    // 오류 시에 제대로 오라클에 접속 이안되는것을 말한다./ 이대에는 포트 번호 확인. 및 :xe or :orcl  아이디 패스워드 등을 확인 해야 한다. 오라클 켜짐 여부.
    private String strid="jdbc";
    private String strpass="jdbc";
    private  String strdriver="oracle.jdbc.driver.OracleDriver";
    Connection conn=null; // 연결 하는것
    ResultSet rs=null;    // 연결시 한줄씩 내리는것
    Statement sm=null;  // 연결 받아 온것을 한줄씩 받아 오는것
   
   
    public ArrayList<Simple> getData(String query){
        ArrayList<Simple> list = new ArrayList<Simple>();
        try {
            Class.forName(strdriver);
            conn = DriverManager.getConnection(strconn, strid, strpass);
            sm =conn.createStatement();
            rs = sm.executeQuery(query);
            while(rs.next()){
            int sid=rs.getInt("sid");
            String name=rs.getString("name");
            String tel=rs.getString("tel");
            Simple simple =new Simple();
            simple.setSid(sid);
            simple.setName(name);
            simple.setTel(tel);
            list.add(simple);
            //System.out.println("sid : "+sid+"name : "+name+"tel : "+tel);
            }
       
        } catch (Exception e) {
            System.out.println("e : "+e);
        }finally{
            if(rs!=null)try {rs.close();} catch (SQLException e) {e.printStackTrace();}
            if(sm!=null)try {sm.close();} catch (SQLException e) {e.printStackTrace();}
            if(conn!=null)try {conn.close();} catch (SQLException e) {e.printStackTrace();}
            // 닫지 않으면 메모리를 지속적으로 조금씩 잡아 먹는다. 반드시 close 시켜야 한다.
        }
        return list;
    }
    public int updateSimple(int sid,String name,String tel){
        int applieNum=0;
        // 생성시에 리턴값 1을 돌려 받기 위한 지역변수 applieNum 생성.
        try {
            Class.forName(strdriver);
            conn = DriverManager.getConnection(strconn, strid, strpass);
            String query="";
            query+="UPDATE simple set ";
            query+="name ='"+name+"', ";
            query+="tel='"+tel+"' ";
            query+="where sid='"+sid+"' ";
            sm =conn.createStatement();
            applieNum = sm.executeUpdate(query);
           
            // 집에서는 익스 프레션./ 집에선 :xe 가 붙는다 // 본래는 :xe 대신 :orcl
            //e : java.sql.SQLException: IO 예외 상황: The Network Adapter could not establish the connection
            // 오류 시에 제대로 오라클에 접속 이안되는것을 말한다./ 이대에는 포트 번호 확인. 및 :xe or :orcl  아이디 패스워드 등을 확인 해야 한다. 오라클 켜짐 여부.
       
        } catch (Exception e) {
            System.out.println("e : "+e);
        }finally{
            if(rs!=null)try {rs.close();} catch (SQLException e) {e.printStackTrace();}
            if(sm!=null)try {sm.close();} catch (SQLException e) {e.printStackTrace();}
            if(conn!=null)try {conn.close();} catch (SQLException e) {e.printStackTrace();}
            // 닫지 않으면 메모리를 지속적으로 조금씩 잡아 먹는다. 반드시 close 시켜야 한다.
        }
        return applieNum;
    }
    public int insertSimple(int sid,String name,String tel){
        int applieNum=0;
        try {
            Class.forName(strdriver);
            conn = DriverManager.getConnection(strconn, strid, strpass);
            String query="";
            query+="INSERT into simple (sid,name,tel) values ";
            query+="('"+sid+"', ";
            query+="'"+name+"', ";
            query+="'"+tel+"')";
           
            sm =conn.createStatement();
            applieNum = sm.executeUpdate(query);
           
            // 집에서는 익스 프레션./ 집에선 :xe 가 붙는다 // 본래는 :xe 대신 :orcl
            //e : java.sql.SQLException: IO 예외 상황: The Network Adapter could not establish the connection
            // 오류 시에 제대로 오라클에 접속 이안되는것을 말한다./ 이대에는 포트 번호 확인. 및 :xe or :orcl  아이디 패스워드 등을 확인 해야 한다. 오라클 켜짐 여부.
       
        } catch (Exception e) {
            System.out.println("e : "+e);
        }finally{
            if(rs!=null)try {rs.close();} catch (SQLException e) {e.printStackTrace();}
            if(sm!=null)try {sm.close();} catch (SQLException e) {e.printStackTrace();}
            if(conn!=null)try {conn.close();} catch (SQLException e) {e.printStackTrace();}
            // 닫지 않으면 메모리를 지속적으로 조금씩 잡아 먹는다. 반드시 close 시켜야 한다.
        }
        return applieNum;
    }
    public int deleateSimple(int sid){
        int applieNum=0;
        try {
            Class.forName(strdriver);
            conn = DriverManager.getConnection(strconn, strid, strpass);
            sm =conn.createStatement();
            String query="";
            query+="DELETE from simple where sid="+sid ;
            applieNum = sm.executeUpdate(query);
        //    System.out.println("applieNum : "+applieNum);
           
            // 집에서는 익스 프레션./ 집에선 :xe 가 붙는다 // 본래는 :xe 대신 :orcl
            //e : java.sql.SQLException: IO 예외 상황: The Network Adapter could not establish the connection
            // 오류 시에 제대로 오라클에 접속 이안되는것을 말한다./ 이대에는 포트 번호 확인. 및 :xe or :orcl  아이디 패스워드 등을 확인 해야 한다. 오라클 켜짐 여부.
       
        } catch (Exception e) {
            System.out.println("e : "+e);
        }finally{
       
            if(sm!=null)try {sm.close();} catch (SQLException e) {e.printStackTrace();}
            if(conn!=null)try {conn.close();} catch (SQLException e) {e.printStackTrace();}
            // 닫지 않으면 메모리를 지속적으로 조금씩 잡아 먹는다. 반드시 close 시켜야 한다.
        }
        return applieNum;
    }

   
}

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.

'JAVA' 카테고리의 다른 글

SqlExploler(eclipse)  (0) 2012.05.08
자바 EXE 만들기.  (0) 2012.05.08
VisualSVN  (0) 2012.05.08
JAVA 에러코드  (0) 2012.05.08
JAVA 기초수업  (0) 2012.05.08
Posted by 사라링

VisualSVN

 | JAVA
2012. 5. 8. 18:29

 

서버 설치. http://www.visualsvn.com/server/download/

 

클라이언트 설치 :  http://subclipse.tigris.org/update_1.6.x

밑PDF 작성자 최재현 / 및 선용 아빠라인.

 

슬라이드1.JPG 슬라이드2.JPG 슬라이드3.JPG 슬라이드4.JPG 슬라이드5.JPG 슬라이드6.JPG 슬라이드7.JPG 슬라이드8.JPG 슬라이드9.JPG 슬라이드10.JPG 슬라이드11.JPG 슬라이드12.JPG 슬라이드13.JPG 슬라이드14.JPG 슬라이드15.JPG 슬라이드16.JPG 슬라이드17.JPG 슬라이드18.JPG 슬라이드19.JPG 슬라이드20.JPG 슬라이드21.JPG 슬라이드22.JPG 슬라이드23.JPG

 

이 글은 스프링노트에서 작성되었습니다.

'JAVA' 카테고리의 다른 글

SqlExploler(eclipse)  (0) 2012.05.08
자바 EXE 만들기.  (0) 2012.05.08
JDBC  (0) 2012.05.08
JAVA 에러코드  (0) 2012.05.08
JAVA 기초수업  (0) 2012.05.08
Posted by 사라링

JAVA 에러코드

 | JAVA
2012. 5. 8. 18:29

 

번 호 1
ERROR Exception in thread "main" java.lang.NoClassDefFoundError: 파일명
발생되는 경우 클래스 파일을 찾을 수 없는 경우
조 언 실행하려는 클래스 파일 이름이 제대로 되어 있는지 확인한다.
또한, CLASSPATH 설정이 제대로 되어 있는지 확인하며 (도스모드에서 set명령어)
만약, 되어있지 않다면 설정한다. (CLASSPATH = jdk1.3/jre/lib/rt.jar; 2-1강좌 참조)

번 호 2
ERROR cannot resolve symbol
symbol : class in(에러가 난 부분)
location : class StackTest(찾으려는 위치)
발생되는 경우 이해할 수 없는 클래스나 메소드, 변수명이 올경우
조 언 보통 이 에러는 철자가 틀렸을 경우에 많이 발생한다. 클래스, 메소드, 변수의 철자를 세심히 확인해 본다.
특히, 철자를 확인할때 대소문자 구분을 확실히 체크한다.(자바는 대소문자를 구별한다.) 그리고 클래스에서 발생할 경우 import를 해주었는지 확인해 봅니다.

번 호 3
ERROR non-static variable 변수이름(or method 메소드이름) cannot br referenced from a static context
발생되는 경우 static 메소드 안에서 static 으로 선언되지 않은 메소드나 변수를 참조(사용)했을 경우.
특히, 메소드의 경우는 인스턴스를 사용하지 않고 static메소드 내에서 바로 선언한 경우.
조 언 static 선언자의 사용여부를 살펴보고 static 메소드 안에 static으로 선언되어지지 않은 메소드나 변수가 있느지 확인해본다.
만약 그런것이 있으면 메소드를 새로 만들어 그쪽에서 선언한다. 단, 인스턴스를 생성해서 불러줘야 한다는 것을 잊지 말아야한다.

번 호 4
ERROR valiable 변수명 might not have been initialized
발생되는 경우 지역변수인 변수명의 변수가 초기화가 되어있지 않았을 경우
조 언 지역변수(메소드 내에서 선언한 변수)를 초기화 하지 않은채 선언했을 경우 발생한다.
멤버 필드가 아닌 경우는 반드시 변수 선언시 초기화를 해주어야 한다.
(멤버 필드는 자바 프로그램 자체에서 자동으로 default값으로 초기화 해준다.)

번 호 5
ERROR class 클래스명 is public, should be declared in a file named 클래스명.java
발생되는 경우 클래스명이 public으로 선언되었는데 파일명과 다를 경우
조 언 public으로 선언된 클래스가 있다면 반드시 그 클래스명과 파일명이 같아야 한다.
클래스명과 파일명의 대소문자 및 철자가 같은지 비교해 본다.
또한, public으로 선언된 클래스가 하나 이상 있는지 찾아본다.(반드시 하나만 있어야한다.)

번 호 6
ERROR push(java.lang.object)[메소드(인자로 받을 수 있는 형)] in java.util.Stack(메소드의 클래스) cannot be applied to (int)[잘못 들어간 형]
발생되는 경우 메소드에서 인자를 받을 때 받을 수 있는 형이 아닌 자료형 또는 클래스형을 사용할 경우
조 언 사용하는 메소드의 API를 참고하여 어떤 형을 인자로 받을 수 있는지 찾아본다.
API를 보지 못할 경우는 각 자료형으로 인자를 직접 바꾸어 본다.

번 호 7
ERROR java.lang.NoSuchMethodError: main
Exception in thread "main"
발생되는 경우 클래스 파일 안에서 main() 메소드를 찾을 수 없는 경우
조 언 자바 애플릿이 아닌 이상 자바 애플리케이션은 반드시 main() 메소드를 사용해야 합니다.
main() 메소드를 빼먹지 않았는지 확인해 보십시요. 또한 public static void main(String[] args) 형식으로 씌어졌는지도 확인해 보십시요.
(main 클래스는 반드시 위와 같은 형식으로 만들어져야 합니다.)

번 호 8
ERROR unreported exception java.io.IOException(Exception명); must be caught or declared to be thrown
발생되는 경우 예외가 발생하는데 예외처리를 해주지 않았을 경우
조 언 예외를 발생하는 메소드 같은 경우는 반드시 예외처리를 해주어야 합니다.
예외를 발생하거나 예외처리를 해야하는 메소드는 API를 확인해 보시면 알 수 있습니다.
그렇지 않다면 컴파일 후 지금처럼 에러가 난 예외를 예외처리해 주시면 됩니다.
또한, 예외를 처리할 때는 메소드 차원에서 throws 예외명을 이용해서 처리할 수 있고
try{} catch{} 구문을 이용해서 직접 처리해 주셔도 됩니다.(예외 강좌를 참고하세요.)
특히, 예외도 클래스이므로 반드시 예외가 들어간 패키지를 import 해주어야 합니다.

번 호 9
ERROR Note : Calculator.java(파일명) uses or overrides a deprecated API.
Note : Recompile with -deprecation for details.
발생되는 경우 JDK 버전이 높아졌거나 보안등의 기타이유로 사용이 deprecated된 메소드를 사용한 경우
조 언 이건 예외라기 보다는 경고 입니다.(실행하면 됩니다.^^)
JDK가 버전이 높아지거나 보안등의 이유에 따라 예전에 만들어졌지만 필요가 없어지거나 대체된 메소드가 생겨났습니다.
그런 메소드를 deprecated 되었다고 하는데 이것은 API상에 나왔있습니다.
또한, 컴파일할때 -deprecation 옵션주면 어떤 메소드가 deprecate됐는지 알수있읍니다.
사용이 중지 됐다고 보기 보다는 사용을 가능하면 하지 않게끔 해주는 거죠.
대치되었거나 버전 업된 메소드를 사용하시면 됩니다.


번 호 10
ERROR MouseEvent(클래스명) should be declared abstract; it does not define mouseDragged(java.awt.event.MouseEvent)[메소드명(메소드가 포함된 클래스)] in MouseEvent(클래스명)
발생되는 경우 implements한 Interface의 모든 메소드를 구현하지 않아서 발생됨
조 언 Interface는 모든 메소드가 선언만 되고 구현되지 않은 추상(abstract) 메소드입니다.
만약 Interface를 implements하려면 implements한 클래스가 Interface에서 선언한 모든 메소드를 구현해 주어야 합니다.
하나라도 빠질 경우 implements한 클래스도 추상 클래스로 보고 에러가 발생합니다.
에러에 구현해 주어야할 메소드명이 나오므로 그곳에 쓰여있는 메소드를 구현해 주면 됩니다.
만약, 그 메소드를 구현해 주었는데 에러가 나면 철자 및 대소문자를 다시 확인해 보십시요.


번 호 11
ERROR incompatible types
found : /null(입력한 자료형)
required : int(요구하는 자료형)
발생되는 경우 입력을 했을때 맞지 않는 자료형이나 클래스형을 입력할 경우
조 언 incompatible 은 '성미가 맞지 않는','모순된' 이라는 뜻을 가진 단어 입니다.
단어뜻 처럼 입력 경우 required 에 나타난 자료형 및 클래스형을 요구하는데
found 에서 나타난 자료형 및 클래스형을 써주어서 입력을 하지 못하게 되어서 발생하는 에러입니다.
found 에 나타난 자료형을 required 에 나타난 자료형으로 변경해 주시면 됩니다.


번 호 12
ERROR package java.servlet(패키지명) does not exist
발생되는 경우 import한 패키지가 존재하지 않을 경우
조 언 import한 패키지가 존재하지 않을 경우에 발생하는 에러입니다.
철자와 대소문자를 먼저 확인하고 CLASSPATH 설정을 확인해 보시기 바랍니다.
또한 그 곳에 패키지가 jar파일로 있는지도 확인해 보셔야 합니다.
(API에 나와있는 패키지는 rt.jar에 다 있습니다.
단 javax가 붙거나 다름으로 시작되는 확장 패키지는 설치해 주어야합니다.(javax.swing 제외))

번 호 13
ERROR java.lang.NullPointerException
Exception in thread "main"(메소드) java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:341)... [에러가 일어난 부분]
발생되는 경우 참조하거나 사용한 클래스 또는 자료형이 초기화 되지 않은 경우
조 언 보통 이것은 awt나 배열 부분에서 자주 발생하는데 초기화를 해주지 않아서 많이 발생합니다.
자바의 변수들은 기본적으로(자동으로 초기화 되는 멤버필드등을 제외하고) 초기화를 요구합니다.
에러에 체크된 부분을 검토해 보시고 초기화를 해주십시요.

번 호 14
ERROR ';'(빠진 부분) expected
발생되는 경우 문법상으로 써야할 것을 쓰지 않은 경우 발생합니다.
조 언 주로 ';'을 안써주시거나 아님 '()'(괄호)를 열기만 하고 닫지 않은 실수를 할 경우 발생합니다.
대부분 이 에러가 발생한 경우는 에러에 나온것을 소스에 추가해 주시면 됩니다.

번 호 15
ERROR unexpected type
required : value(요구하는 타입)
found : class(소스상 써준 타입)

발생되는 경우 써주어야 할 타입이 아닌 잘못된 타입을 써주었을 경우
조 언 unexpected type 에러를 해석하면 '기대하지 않은 타입'이란 뜻을 가지고 있습니다.
즉, 원하는 타입(required)이 아닌데 잘못된 타입(found)을 써준 경우 발생합니다.
에러 체크된 부분의 타입을 required 에서 나타난 타입으로 변경해 주시면 됩니다.


번 호 16
ERROR java.lang.ArrayIndexOutOfBoundsException
at Test.main(Test.java:10)[클래스.메소드(파일명:에러난 위치)]
Exception in thread "main"(예외가 던져진 메소드)

발생되는 경우 배열의 범위를 넘어선 값을 넣었을 경우
조 언 위의 에러는 특이하게 컴파일은 이상없이 되지만 실행을 하면 발생하는 에러입니다.
배열의 범위를 넘어설 경우에 발생하므로 에러난 위치의 배열의 참조 범위를 확인해보시고
선언해둔 배열의 범위에 맞게 조정해 주시면 됩니다.

번 호 17
ERROR illegal start of expression
발생되는 경우 선언자(modifier)를 잘못 집어 넣은 경우
조 언 에러의 단어뜻을 확인해 보면 '표현의 시작이 부적격 합니다.'하고 해석할 수 있습니다.
보통 선언자가 맞지 않거나 쓰일데가 아닌데 선언자를 줄 경우에 많이 발생합니다.
특히 메소드안에서 static 선언자를 쓴 경우에는 직격으로 볼수 있죠.
에러가 난 부분의 선언자를 제거하거나 맞는 것인지 다시 확인해 보십시요.

번 호 18
ERROR java.io.InputStream(클래스) is abstract; cannot be instantiated
발생되는 경우 abstract로 선언된 클래스를 직접 new 명령어를 이용하여 인스턴스화 할 경우
조 언 abstract로 선언된 클래스를 직접 new 명령어를 이용하여 인스턴스화 할 경우에 발생하는 에러입니다.
왜냐하면, 추상 클래스는 직접 new 명령어를 이용하여 인스턴스화 할수 없기 때문입니다.(객체를 못만든다구요.)
이 경우에는 인스턴스를 다른 방법으로 생성하시면 됩니다.
예를 들어 인스턴스를 반환하는 메소드를 이용한다거나 상속을 통해서 상속받은 클래스의 인스턴스를 만들어
직접 인스턴스를 만드는 효과를 낼수도 있구요. 원하시는 방법으로 바꾸어 보시길...

번 호 19
ERROR local variable name(변수명) is accessed from within inner class; needs to be declared final
발생되는 경우 Local Class의 변수를 final로 선언하지 않은 경우
조 언 Local Class의 변수는 참조변수의 참조값 변동을 방지하기 위하여 final 선언자를 붙여주어야 합니다.
변수에 final 선언자를 붙이면 변수는 값을 변동할 수 없는 상수 처럼 쓰이며
만약 이 값을 참조할 경우 자바는 이 값을 넘기는게 아니라 이 값의 복사본을 참조 값으로 넘기게 됩니다.
그러므로 Local Class에서 참조값 변동없이 변수를 참조할 수 있게 되는 것입니다.
Local Class를 정의해준 곳을 살펴보고 final 선언자를 확실하게 확인하시기 바랍니다.

번 호 20
ERROR inner classes cannot have static declarations
발생되는 경우 내부 클래스 안에서 static 선언자를 쓴 경우
조 언 내부 클래스 안에서는 static 선언자를 쓸수 없습니다.
내부 클래스 안에서 사용된 static 선언자를 제거해 주십시요.

번 호 21
ERROR referenceto List is ambiguous,both class java.util.List(클래스) in java.util(패키지)
and class java.awt.List(클래스) in java.awt(패키지) match
발생되는 경우 클래스 사용시 다른 패키지내에 동일이름의 클래스들이 있어서 참조가 모호할 경우
조 언 예시를 보면 아시겠지만 import 한 패키지중에 같은 이름을 사용하는 클래스를 클래스 이름만으로
생성함으로서 참조가 모호해질 경우 발생하는 에러입니다.
이와 같은 경우는 import를 하나 제거 하거나 아님 java.util.List 이런식으로
직접 그 클래스의 패키지를 같이 써줌으로서 모호성을 제거할수 있습니다.


번 호 22
ERROR m()(메소드명) in B(클래스명) cannot override m()(메소드명) in A(클래스명);
attempting to use incompatiable return type
발생되는 경우 클래스를 상속받고서 메소드를 오버라이드 하고자할때 잘못한 경우
조 언 클래스를 상속받고서 메소드를 오버라이드 할 경우에는 지켜야 하는 규칙이 있습니다.
1. 메소드의 이름이 같아야 합니다.
2. 메소드의 파라미터 개수, 데이터형이 같아야 합니다.
3. 메소드의 리턴형이 같아야 합니다.
4. 상위 메소드와 동일하거나 더 구체적인 Exception을 발생시켜야 합니다. => 아님 예외는 조상클래스의 메서드보다 많이 선언할 수 없다.
5. 상위 메소드와 동일하거나 접근범위가 더 넓은 접근 제한자를 사용해야 합니다.

님의 메소드 오버라이드시 위 규칙을 잘 지켰는가를 다시 한번 확인해 보세요.


번 호 23
ERROR getPathBetweenRows(int,int)(메소드) has protected access in javax.swing.jTree(클래스)
발생되는 경우 protected로 선언된 메소드를 상속 없이 직접 불러쓸 경우
조 언 protected로 선언되어 있는 메소드는 상속하거나 같은 package에 있을 때만 쓸 수 있습니다.
상속해서 다시 public 메소드로 값을 받던지 아니면
public 메소드 중에서 비슷한 기능을 하는 메소드가 있는지 찾아서 바꾸어주어야 합니다.

번 호 24
ERROR invalid method declaration; return type required
발생되는 경우 리턴 타입을 쓰지 않아 메소드의 선언이 잘못된 경우
조 언 리턴 타입을 쓰지 않아 메소드의 선언이 잘못된 경우에 발생하는 에러이므로
에러가 발생한 메소드를 확인해보고 리턴 타입을 맞게 적어주어야 합니다.

번 호 25
ERROR Error occurred during initialization of VM
java.lang.ExceptionInInitializerError
발생되는 경우 static으로 선언된 변수중 초기화가 안되어 있는 것이 있는 경우
조 언 static으로 선언된 변수중에 초기화가 안된게 있는 경우에 발생하는 에러이므로
에러가 발생한 변수를 확인해보고 알맞은 초기화를 시켜주거나 변수의 위치를
자동 초기화가 가능한 메소드 밖의 클래스 변수로서 사용하게 합니다.

번 호 26
ERROR Error opening registry key 'Software\JavaSoft\Java Runtime Environment'
Error: could not find java.dll
Error: could not find Java 2 Runtime Environment
발생되는 경우 중복설치 등으로 인해 레지스트리 키값이 잘못되어 있는 경우
조 언 중복설치 등으로 인해 레지스트리 키값이 잘못되어 있는 경우에 발생하는 에러이므로
레지스트리 편집기를 열어서 HKEY_LOCAL_MACHINE -> SOFTWARE -> JavaSoft에
보시면 3개의 키가 있을 겁니다. 그중에서 첫번째 키인 Java 런타임 환경 을 마우스
오른쪽 버튼으로 클릭하여 Java Runtime Environment로 이름을 바꿔주시면 됩니다.


번 호 27
ERROR Error Registry Key 'Sofrware\JavaSofrware\Java Runtime Environment\CurrentVerison'
has value '1.1',but '1.3' is requried.
Error: could not find java.dll
Error: could not find java 2 Runtime Enviroment.
발생되는 경우 중복설치 등으로 인해 레지스트리 키값의 자바 버전이 잘못되어 있는 경우
조 언 중복설치 등으로 인해 레지스트리 키값의 자바 버전이 잘못되어 있는 경우에 발생하는 에러이므로
레지스트리 편집기를 열어서 HKEY_LOCAL_MACHINE -> SOFTWARE -> JavaSoft -> Java Runtime Environment의 Current version의 값을 1.3으로 되어있는지 확인해 주시면 됩니다.


번 호 28
ERROR java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver(드라이버명)
발생되는 경우 JDBC로 데이터 베이스에 연결하는 중 드라이버를 찾지 못할 경우
조 언 JDBC를 연결하는 중에 드라이버를 찾지 못할 경우에 발생하는 에러이므로
각 데이터 베이스에 맞는 드라이버가 제대로 다운로드 되었는지 확인해 보시고
드라이버의 위치가 클래스 패스에 잡혀 있는지 확인해주시면 됩니다.

번 호 29
ERROR Method printIn(java.lang.String)(메소드명) not found in class java.io.PrintStream(클래스명)
발생되는 경우 자신이 사용한 클래스의 메소드가 맞지 않는(=없는)경우
조 언 자신이 사용한 클래스의 메소드가 맞지 않는(=없는) 경우에 발생하는 에러이므로
API를 통해서 사용하고자 하는 클래스와 메소드를 다시 한번 확인해 봅니다.
보통 이경우 메소드의 철자나 대소문자를 잘못 쓴 경우가 많으니 그점을 유심히 살표봅니다.
마지막으로 철자와 대소문자도 맞는다면 메소드의 인자의 객체형을 맞게 주었는지 확인해보면 됩니다.

이 글은 스프링노트에서 작성되었습니다.

'JAVA' 카테고리의 다른 글

SqlExploler(eclipse)  (0) 2012.05.08
자바 EXE 만들기.  (0) 2012.05.08
JDBC  (0) 2012.05.08
VisualSVN  (0) 2012.05.08
JAVA 기초수업  (0) 2012.05.08
Posted by 사라링

JAVA 기초수업

 | JAVA
2012. 5. 8. 18:29

 // 날짜 생각 없이 만들자.

1월 25일 (1일)

  1. JDK 설치

    www.orcale.com 에서 JAVA SE-> jdk 다운.. 후 설치..

    JAVA EE - Enterprise(기업..)

    JAVA ME -micro(휴대폰 등..)

    JAVA SE - Standard (기본)

  2. 환경변수 설정

    1. 내컴퓨터->속성->고급->환경설정-> 시스템변수의 CLASSPATH에 C:\Program Files\Java\jdk1.6.0_30\bin를 추가..
  3. 클래스명은 파일명과 동일하게 만들어야 한다.
  4. 자바는 모든명령문들이 class 내에 존재해야 한다.
  5. main method는 이 class를 실행할 때 최초 실행되는 method이다.
  6. 주석

    1. // - 한 줄 주석..
    2. /* 내용 */ - 여러줄 주석...
    3. /** 내용 */ - 특별한 주석.

 

1월 26일 (2일)

  1. 변수(Variable) - 임시저장공간 (자바의 정석 P.20)

    1. 변수타입

      * 기본형

      문자 - char

      숫자 - 정수 - byte, short, int, long

      실수 - float, double

      논리 - boolean

      * 참조형

기본형을 제외한 나머지.. (String , System 등)

2. 보수 = 보충해주는수..

  1. 10의 보수 4 > 6

 

3 > 7

3. 명명규칙..

  1. 대소문자가 구분되며 길이에 제한이없다.
  2. 예약어를 사용해서는 안된다..
  3. 숫자로 시작해서는 안된다.
  4. 특수문자는 " _ "와 " $ "만을 허용한다.
  5. 권장사항

    1. 클래스 이름의 첫 글자는 항상 대문자로 한다..
    2. 여러 단어 이름은 단어의 첫글자를 대문자로 사용한다..(낙타표기법.) 예) lastIndexOf, StringBuffer
    3. 상수의 이름은 대문자로 쓰고, 단어는 " _ " 로 구분한다. (변수는 값을 변경해도 되지만 상수는 값을 한번 정하면 바꿀수 없다.)

      • 예) final int NUM = 0;
      • NUM = 10; ->에러...
      • final int MAX_NUMBER = 0; <- 이런식으로 전부 대문자로 표시함.....
  6. 리터럴과 접미사

    1. 특수문자를 저장할때 사용 (자바의정석 P.26).. 역슬러시 (|)를 사용함..

      • String str = "그가 |"잘가|"라고 말했다. ";
      • 역슬러시를 저장할때도 ||으로 하면 특수문자인 | 로 인식한다.
    2. int i = 100; = 10진수 표현 >> (자바의정석 P.34)
    3. int oct = 0100; = 8진수 표현 0을 붙히면 8진수 라는 것을 의미
    4. int hex = 0x100; = 16진수 표현 0x 를 붙히면 16진수 라는 것을 의미
  7. 변수의 기본값과 초기화

    1. 초기화 = 변수의 처음 값으로 변경.
  8. 형변환 - 값의 타입을 다른 타입으로 변환하는것.(boolean을 제외한 7개의 기본형은 서로 형변환이 가능)

    1. 예) float형을 int 형으로 바꿀 때.. (자바의 정석P.36 표 참고.)

      • float f = 1.6f;
      • int i = (int)f;
    2. 변환시 값의 크기가 변환된 타입의 표현가능한 범위를 넘어가면 값 손실이 발생할 수 있다.

 

1월 27일 (3일)

  1. Overflow..
  2. 연산자. (자바의 정석 P.44)

    1. 단항 연산자 = 값이 하나만 필요로 하는 연산자..
    2. 이항 연산자 = 값이 두개를 필요로 하는 연산자..
    3. 삼항 연산자 = '?' , ':' 를 이용하여 값을 세개로 필요로 하는 연산자.. (조건식?참일경우:거짓일경우) x>y?a:b
    4. 대입 연산자 = 값을 대입 할 때 사용.. (int result = z + b;)
    5.  
    • i = j++ 은 i에 j값을 대입 한 뒤 j가 증가된다..
    • i = ++j 는 j를 증가한뒤 i에 대입된다..
    • 비트 전환 연산자 ' ~ '

      • byte b = 10;
      • System.out.println("~b = " + ~b); ==> -11
    • 이항연산자는 크기가 int보다 작은 자료형은 int 형으로 형변환 후 연산 된다..

      • byte a = 10;
      • byte b = 20;
      • byte c = a + b; <- int형으로 변환되기때문에 에러가 난다 그러므로
      • byte c = (byte)(a+b); <- byte로 형변환을 다시 시켜줘야함..
      •  
      •  

1월 30일( 4일)

  1. 연산자

    1. / = 나누기 연산자(몫을 저장 ex. 10/8 = 1)
    2. % = 나머지 연산자 (나눈 뒤 나머지값을 저장. ex. 10%8 = 2 )
    3.  
  2. 쉬프트연산자

    1. <<
    2. >>
    3. <<<
  3. 비교 연산자

    1. 대소비교 연산자

      1. <
      2. >
      3. <=
      4. >=
    2. 등가비교 연산자

      1. ==
      2. !=
    3. 논리 연산자

      1. && = (AND결합) 피연산자 양쪽 모두 true 이어야 결과값이 true.
      2. || =(OR결합) 피연산자 중 한 쪽만 true이면 true를 결과로 얻는다.
    4. 비트 연산자 - 이진 비트연산을 수행한다.

      1. & = (AND연산자) 피연산자 양 쪽이 모두 1 이어야 1을 결과로 얻는다. 그 외에는 0을 얻는다.
      2. | = (OR연산자) 피연산자 중 한 쪽의 값이 1 이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.
      3. ^ = (XOR연산자) 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 그 외에는 0을 얻는다.
    5. 삼항 연산자

      1. ?: = (조건식) ? 식1: 식2 > 조건식이 true이면 식1을 false면 식2를 수행함.. if문과 비슷..
    6. 대입연산자

      1.  

 

1월 31일 (5일)

  1. 조건문

    1. if문
    2. switch
  2. 반복문

    1. for
    2. while
    3. do-while
  3. 입력 받기.
    1. BufferedReader..

      1. // 키보드로 부터 줄단위로 입력받기 위한 리더준비.
      2. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      3. String readStr1 = br.readLine(); //입력받은 값을 String형태로 저장.
      4. (생략..)
      5. //입력받은 String 값을 int형으로 바꿔서 계산하는 방법..
      6. int sum = Integer.parseInt(readStr1) + Integer.parseInt(readStr2) ;
      7. //Integer.parseInt(s), Double.parseDouble(s), Float.parseFloat(s) 등의 형태로 바꿀 수 있음.
    2. scanner...

      1. Scanner scan = new Scanner(System.in); //new Scanner
      2. String str = scan.next();//문자열 1개를 입력받기.(공백기준)
      3. String strLine = scan.nextLine();//문자열 1개를 입력 받기(엔터키 기준)
      4. int num = scan.nextInt();//숫자로 이루어진 문자열을 숫자형 데이터로 입력 받기
      5. System.out.println( strLine ); //test.... strLine = 엔터키 기준으로 입력을 받는다..
      6. System.out.println( num ); //test.... 숫자만 받아서 출력한다.
    3. JOptionPane

      1. String str = JOptionPane.showInputDialog("입력하세요.제발..;"); //다이얼로그 형식의 입력폼이 뜬다..
      2. System.out.println("다이얼로그에 입력한 문자열 : " + str);

 

2월 1일 (6일)

  1. 여러개의 점수를 입력받아 평균을 구한뒤 if문과 switch문으로 학점을 계산하는 코드...

    • workspace/Chapter4/BranchEx.java 참고
  2. 현재 시스템(pc)시간을 반환해주는 method

    1. System.currentTimeMillis();
  3. 반복문에서 break를 만나면 자신이 포함된 {}를 빠져나오고 continu를 넣으면 그 부분을 제외시키고 다음 조건을 수행함..

    • for(int j=1; j<=9; j++){//i*5까지 정상 순서로 출력
    • if(i==3&&j==5) break; or continu -->break = for문을 빠져나옴 continu = for문의 다음 조건을 수행.
    • System.out.println(i + "*" + j + "=" + i*j);
    • }
  4. while문.

    • while(조건식){ 조건식이 참인 동안 실행할 명령문}
  5. do while문.

    • do{조건식이 참인 동안 실행할 명령문들..
    • }while(조건식);

 

2월 02일

  • java에서 String 문자열 비교.

    • String 변수명 = "문자";
    • 변수명.equals("비교할 문자");
    • 변수명 == "비교할 문자"; => 비교가 되지 않는다...

 

2월 03일

  1. 변수명 한번에 바꾸기 : 바꿀 변수명에 커서를 가져간 뒤 -> alt + shift + r 누르고 난 뒤 바꾸면 그 변수의 이름이 한번에 다바뀜
  2. System.out.printf("")는

    1. System.out.printf("국어는 %d 수학은 %d 영어는 %d", kor, mat, eng) 식으로 문자 중간에 %d 같은 표현으로 입력될 수 있다..
    2. 여기서 %d는 10수 %o는 8진수 %x는 16진수.. 등등..검색 ㄱㄱㄱ
  3. Math.round() 함수는 소수점 반올림을 해준다.

 

5장. 배열

  1. 배열이란

    • 같은 타입의 여러변수를 하나의 묶음으로 다루는 것
    • 많은 양의 값을 다룰 때 유용하다.
  2. 선언 방법

    1. 타입[] 변수이름; -> int[] score; (권장 방법..)
    2. 타입 변수이름[]; -> int score[];
  3. 생성

    1. 변수이름 = new 타입[배열길이]; score = new int[5];
    2. 배열의 길이는 생략 가능하다. 만약 배열 길이를 지정해준 경우 그 길이를 벗어날 수 없다.
  4. 초기화 - 생성된 배열에 처음으로 값을 저장하는 것

    1. int[] score = {100, 90, 80, 70}; // 사용가능 선언과 초기화를 한번에 할때 가능..
    2. int[] score = new int[]{100, 90, 80, 70} // 사용가능
    3. | int[] score; | // 사용불가능 선언 따로 한뒤 초기화 시 이방법은 사용 불가.

      | score = {100, 90, 80, 70} |

    4. int[] score;

      score = new[]{100, 90, 80, 70} //사용가능

    5. 배열길이는 -> 배열이름.length 를 이용하면 알 수 있다.
    6. 랜덤 함수 ==> Math.random();

      1. random 함수는 0.0~1.0 까지만(1.0은 포함 x) 반환 하므로 *10을 해서 0~9까지의 값을 사용할 수 있도록한다..
      2. 더블 형태로 반환 하므로 int로 형변환을 해줘야 한다.

 

2월6일 월요일

*정렬 할때..

 

for(int i=0; i<score.length-1; i++){

for(int j=i+1; j<score.length; j++){

if(score[i]<score[j]){

temp = score[i];

score[i] = score[j];

score[j] = temp;

}

}

}

  1. 다차원 배열

    1. 선언방법

      • 타입[][] 변수이름; ->int[][] score;
      • 타입 변수이름[][]; ->int score[][];
      • 타입[] 변수이름[]; ->int[] score[];
    2. 생성 ==> int [][]score = new int[5][3] 이런식으로
    3. 생성과 초기화를 한번에..

      • int[][] score = new int[][]{ {100, 100, 100}, {20, 20, 20}, {30, 30, 30}, {40, 40, 40}, {50, 50, 50}}
  2. 가변 배열..

    1. 선언방법
    2. int[][] score = new int[5][];
    3. score[0] = new int[3];
    4. score[1] = new int[2];
    5. ...이하 생략...
    6. score[5] = new int[5];
    7. 이런식으로 배열 안의 배열의 크기를 바꿔서 지정할 수 있다..
  3. 간단하게 배열 복사하기..

    1. System.arraycopy(arg1, 0, arg2, 0, arg.length); 메소드를 이용하여 간단히 할 수 있다.
    2. System.arraycopy(복사할 배열, 복사할배열 시작 위치, 복사될 배열, 복사될 배열시작위치, 복사할 배열의 길이)

       

1. Overloding

  ▶ 생성자 메소드(함수)처럼 메소드의 형태가 동일하지만, 입력되는 파라미터들의 값들이 다른 경우에 overloading이라고 한다.

  ▶ 하나의 클래스에 여러 개의 overloading된 메소드들이 존재 가능하다.

2. null

  ▶ 참조하고 있는 객체가 없음을 의미한다.

  ▶ 객체생성을 하지 않은 상태에서 레퍼런스만 준비해둔 상태이다.

  ▶ String a = null;

       a라는 레퍼런스만 준비해둔 상태

       String 클래스 타입의 객체가 필요하다는 의미

3. instanceof

  ▶ 연산자 중에 객체단위에 적용되는 연산자

  ▶ A instanceof  B 는 A레퍼런스가 B타입의 객체를 가르키고 있는가를 의미한다.

  ▶ 객체의 타입을 검사하기 위해 사용.

4. this

  ▶ 객체형 변수(레퍼런스 자료형)에서 현재의 객체를 일컫는 용어이다.

  ▶ String str = new String("aaa"); 인 경우에는 현재 하나의 변수가 선언되어

      그 변수를 이용해서 객체를 언급하는것을 의미한다.

  ▶ 반면에 this.name = new String("aaa"); 와 같은 경우에는 현재 만들어 지고

     있는 객체의 name이라는 속성의 값이 "aaa"라는 것을 의미하게 된다.

이 글은 스프링노트에서 작성되었습니다.

'JAVA' 카테고리의 다른 글

SqlExploler(eclipse)  (0) 2012.05.08
자바 EXE 만들기.  (0) 2012.05.08
JDBC  (0) 2012.05.08
VisualSVN  (0) 2012.05.08
JAVA 에러코드  (0) 2012.05.08
Posted by 사라링


화면은 아래와 같이 표현되며 구글라이브러리 jQuery API 인 js 파일을

상단에 링크해준다. 그리고 Style 을 원하는 형태로 정한뒤 폼레이어에

적용하자.


소스

<html>

<head>

<title>Untitled Document</title>

<meta
http-equiv="Content-Type"
content="text/html; charset=euc-kr">

<script
type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script>

<!-- Style 선언 -->

<style
type="text/css">

#divLangSelect {

position:absolute;

display:none;

background-color:#FFCC00;

border:solid 2px #d0d0d0;

width:350px;

height:150px;

padding:10px;

}

</style>

<!-- //Style 선언 -->

</head>

<body>

<!-- 버튼이미지 -->

<img
src='1286960090_home.png'
alt="
버튼1"
width="48"
height="48"
class='imgSelect'
/>

<img
src='synchronize48.png'
alt="
버튼2"
width="48"
height="48"
class='imgSelect'
/>

<img
src='1286960551_yahoo-buzz-logo-square2.png'
alt="
버튼3"
width="40"
height="40"
class='imgSelect'
/>

<!-- //버튼이미지 -->


<!-- 레이어-->

<div
id="divLangSelect">

<div
style="position:absolute;top:5px;right:5px">

<span
onClick="javascript:document.getElementById('divLangSelect').style.display='none'"style="cursor:pointer;font-size:1.5em" title="
닫기">X</span>

</div>표현하고자하는내용을넣으면된다. 오른쪽엔닫기버튼이다. 적당한아이콘넣어서

이쁘게표현해보자.

</div>

<!-- //레이어-->

 

<script
type="text/javascript">

//-- 버튼클릭시버튼을클릭한위치근처에레이어생성 --//

$('.imgSelect').click(function(e) {

var divTop = e.clientY + 10; //상단좌표

var divLeft = e.clientX + 10; //좌측좌표

$('#divLangSelect').css({

"top": divTop

,"left": divLeft

, "position": "absolute"

}).show();

});

</script>

 

</body>

</html>

이 글은 스프링노트에서 작성되었습니다.

'J-Query' 카테고리의 다른 글

JQuery 시계  (0) 2012.06.13
조작하려는 엘리먼트 선택하기  (0) 2012.06.07
list 추출및 select 구현  (0) 2012.05.08
9일차 XML문서  (0) 2012.05.08
8일차 사용자정의객체&JSON표기법  (0) 2012.05.08
Posted by 사라링

list 추출및 select 구현

2012. 5. 8. 18:25

결과물

DAOmybatis_00000.jpg

   테이블 선택시

 

DAOmybatis_00000_00000.jpg

 

소스 / /

 

memberinfo.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>memberInfo.html::김훈</title>
        <script type="text/javascript" src="../../js/jquery-1.7.2.js">
        </script>
        <script type="text/javascript">
            $(function(){
                $.getJSON("memberData.jsp",
                     function(data){
                  //  alert(data);
                    var str = "<table id='mem_list' align='center'border='1' bordercolor='yellow' >";
                    str += "<tr bgcolor='silver'><th>회원ID</th><th>회원성명</th><th>주민번호</th><th>우편번호</th>";
                    str +="<th>주 소</th><th>회사전화</th><th>핸드폰</th><th>이메일</th></tr>";
                    $.each(data, function(i, v){
                        str += "<tr id='mem_select'>";
                        str += "<td class='mem_id'>" + v.mem_id + "</td>";
                        str += "<td>" + v.mem_name + "</td>";
                        str += "<td>" + v.mem_regno + "</td>";
                        str += "<td>" + v.mem_zip + "</td>";
                        str += "<td>" + v.mem_add + "</td>";
                        str += "<td>" + v.mem_comtel + "</td>";
                        str += "<td>" + v.mem_hp + "</td>";
                        str += "<td>" + v.mem_mail + "</td></tr>";
                    });
                    str += "</table>";
                    $("#memList").html(str);
                });
                $("#mem_select").live("click", function(){
                    var mem_id = $(this).children(".mem_id").text().trim();
                    $.getJSON("memberData.jsp",
                     "mem_id="+mem_id,
                      function(data){
                          $.each(data,function(i,v){
                        $("#mem_id").val(v.mem_id);
                        $("#mem_pass").val(v.mem_pass);
                        $("#mem_name").val(v.mem_name);
                        $("#mem_regno").val(v.mem_regno);
                        $("#mem_bir").val(v.mem_bir);
                        $("#mem_zip").val(v.mem_zip);
                        $("#mem_add").val(v.mem_add);
                        $("#mem_hometel").val(v.mem_hometel);
                        $("#mem_comtel").val(v.mem_comtel);
                        $("#mem_hp").val(v.mem_hp);
                        $("#mem_mail").val(v.mem_mail);
                        $("#mem_job").val(v.mem_job);
                        $("#mem_like").val(v.mem_like);
                        $("#mem_memorial").val(v.mem_memorial);
                        $("#mem_memorialday").val(v.mem_memorialday);
                        $("#mem_mileage").val(v.mem_mileage);
                        if (v.mem_delete != "y") {
                            $("#mem_delete").attr("checked", true);
                        }
                        });
                    });
                   
                });
               
            });
        </script>
    </head>
    <body>
        <center>
            <table id="memInfo">
                <tr>
                    <td width="400px" align="left">
                        &nbsp;&nbsp;<b>I &nbsp; D : </b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" size="20" id="mem_id" disabled="false" />
                    </td>
                    <td width="30px">
                    </td>
                    <td align="left">
                        <b>암  호 : </b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" size="20" id="mem_pass" disabled="false" />
                    </td>
                </tr>
                <tr>
                    <td width="400px" align="left">
                        <b>성 &nbsp; 명 : </b>&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" size="20" id="mem_name" disabled="false" />
                    </td>
                    <td>
                    </td>
                    <td align="left">
                        <b>주민번호 : </b>
                        <input type="text" size="15" id="mem_regno" disabled="false" />
                    </td>
                </tr>
                <tr>
                    <td width="400px" align="left">
                        <b>생년월일 : </b>
                        <input type="text" size="20" id="mem_bir" disabled="false" />
                    </td>
                    <td>
                        <td colspan="3" align="left">
                            <b>우편번호 : </b>
                            <input type="text" size="7" id="mem_zip" disabled="false" />             
                        </td>
                    </td>
                </tr>
                <tr>
                    <td colspan="3" align="left">
                        <b>주  소 : </b>
                        <input type="text" size="53" id="mem_add" disabled="false" />
                    </td>
                </tr>
                <tr>
                    <td align="left">
                        <b>집 전 화 : </b>
                        <input type="text" size="20" id="mem_hometel" disabled="false" />
                    </td>
                    <td>
                    </td>
                    <td align="left">
                        <b>회사전화 :</b>
                        <input type="text" size="20" id="mem_comtel" disabled="false"/>
                    </td>
                </tr>
                <tr>
                    <td align="left">
                        <b>핸 드 폰 :</b>
                        <input type="text" size="20" id="mem_hp" disabled="false" />
                    </td>
                    <td>
                    </td>
                    <td align="left">
                        <b>이 메 일 :</b>&nbsp;&nbsp;&nbsp;<input type="text" size="20" id="mem_mail" disabled="false"/>
                    </td>
                </tr>
                <tr>
                    <td align="left">
                        <b>직 업 :</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" size="20" id="mem_job" disabled="false" />
                    </td>
                    <td>
                    </td>
                    <td align="left">
                        <b>취 미 :</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" size="20" id="mem_like" disabled="false" />
                    </td>
                </tr>
                <tr>
                    <td align="left">
                        <b>기념일종류 :</b>
                        <input type="text" size="20" id="mem_memorial" disabled="false" />
                    </td>
                    <td>
                    </td>
                    <td align="left">
                        <b>기념일날짜 :</b>
                        <input type="text" size="20" id="mem_memorialday" disabled="false" />
                    </td>
                </tr>
                <tr>
                    <td align="left">
                        <b>마일리지 :</b>
                        <input type="text" size="20" id="mem_mileage" disabled="false"/>
                    </td>
                    <td>
                    </td>
                    <td align="left">
                        <b>탈퇴여부 :</b>
                        <input type="checkbox" size="20" id="mem_delete" disabled="false" />
                    </td>
                </tr>
            </table><hr/>
            <div id="memList">
            </div>
        </center>
    </body>
</html>

jsonData.jsp

<%@ page language="java" contentType="text/plain; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="java.sql.*"%>
<%@page import="kr.or.ddit.db.ConnectionProvider"%>
<%@page import="java.sql.Connection"%>
<%@ page import = "kr.or.ddit.db.*" %>
<% request.setCharacterEncoding("UTF-8");
    String mem_id=request.getParameter("mem_id");
    System.out.print(mem_id);
%>   
[

<%
    Connection conn = null;
    PreparedStatement psmt = null;;
    ResultSet rs = null;
   
    try{
    conn =ConnectionProvider.getConnection();
   
    if(mem_id==null){
    psmt = conn.prepareStatement("select * from member");
    }else {
    psmt = conn.prepareStatement("select * from member where mem_id=?");
        psmt.setString(1, mem_id);
    }
    rs=psmt.executeQuery();
   
    %>
   
   
    <%
    while(rs.next()){
       
        if(rs.getRow()>1){
            out.print(",");
        }
    %>
    {
    "mem_id"  : "<%=Util.toJS(rs.getString("mem_id"))%>",
    "mem_pass"  : "<%=Util.toJS(rs.getString("mem_pass"))%>",
    "mem_name"  : "<%=Util.toJS(rs.getString("mem_name"))%>",
    "mem_regno"  : "<%=Util.toJS(rs.getString("mem_regno1"))%> - <%=Util.toJS(rs.getString("mem_regno2"))%>",
    "mem_bir"  : "<%=Util.toJS(rs.getString("mem_bir")).subSequence(0, 10)%>",
    "mem_zip"  : "<%=Util.toJS( rs.getString("mem_zip"))%>",
    "mem_add"  : "<%=Util.toJS(rs.getString("mem_add1"))%> <%=Util.toJS(rs.getString("mem_add2"))%>",
    "mem_hometel"  : "<%=Util.toJS(rs.getString("mem_hometel"))%>",
    "mem_comtel"  : "<%=Util.toJS(rs.getString("mem_comtel"))%>",
    "mem_hp"  : "<%=Util.toJS(rs.getString("mem_hp"))%>",
    "mem_mail"  : "<%=Util.toJS(rs.getString("mem_mail"))%>",
    "mem_job"  : "<%=Util.toJS(rs.getString("mem_job"))%>",
    "mem_like"  : "<%=Util.toJS(rs.getString("mem_like"))%>",
    "mem_memorial"  : "<%=Util.toJS(rs.getString("mem_memorial"))%>",
    "mem_memorialday"  : "<%=Util.toJS(rs.getString("mem_memorialday")).subSequence(0, 10)%>",
    "mem_mileage"  : "<%=Util.toJS(rs.getString("mem_mileage"))%>",
    "mem_delete"  : "<%=Util.toJS(rs.getString("mem_delete"))%>"
    }
    <%
    }
    }catch(SQLException e){
        e.printStackTrace();
    }finally{
        if(rs!=null) try{rs.close();}catch(Exception e){}
        if(psmt!=null) try{psmt.close();}catch(Exception e){}
        if(conn!=null) try{conn.close();}catch(Exception e){}
   
    }

%>
]

이 글은 스프링노트에서 작성되었습니다.


'J-Query' 카테고리의 다른 글

조작하려는 엘리먼트 선택하기  (0) 2012.06.07
버튼이벤트->레이어 새창으로 표현  (0) 2012.05.08
9일차 XML문서  (0) 2012.05.08
8일차 사용자정의객체&JSON표기법  (0) 2012.05.08
7일차 Effects  (0) 2012.05.08
Posted by 사라링

9일차 XML문서

2012. 5. 8. 18:25

XML 문서

1.xml 문서의 구조

1) 서두 부분 ==> XML 선언 , PI(Process Instruction)

문서 유형 선언으로 이루어져 있다.

2) 엘리멘트 부분   = >  한 개의 루트엘리먼트가 반드시 있어야 한다.

       그 루트엘리먼트의 자식(하위) 엘리먼트들을 구성하여 문서를 완성한다.

3) 기타 부분         ==> 주석 , PI, 공백등으로 이루어져 있다.(생략가능)

2. 엘리멘트

1) 구조 ==> '<시작테그명>내용(contents)</종료테그명>' 와 같은 구조로 되어 있다.

                (시작 테그명과 종료 테그명은 같아야 한다)

2) 내용 (contents)   ==> 문자데이터, 엘리멘트 , 공백(빈엘리멘트) 등으로 구성 된다.

3) 빈엘리멘트 ==>  '<시작테그명></종료테그명>'는

'</종료테그명>'와 같이 표현 된다.

 

3. 속성 ==> 엘리멘트의 시작 테그 부분에 기술 하는 부자적인 정보의 표현 방법이다.

        1) 구조 ==> '<시작테그명 속성명 ="속성값" ...> 내용</종료테그명>' 와 같이

                          기술하는데 속성값은 반드시 큰 따옴표(")나 작은따옴표(')로 감싸야 한다.

        2) 같은 이름을 갖는 속성명이 2개 이상 올수 없다.

4. 이름(태그명, 속성명등) 작성 규칙

        1)영문자,한글, 밑줄문자(_) 등으로 문자로 시작 할수 있다.

        2) 두번째 문자부터는 숫자, -, : 등을 사용 할 수 있다.

            ( 단 , ':' 문자는 네임스페이스의 구분자로 사용하기 때문에

                    일반적인 태그명에는 사용하지 않는 것이 좋다. )

5. XML 선언 ===> xml문서의 첫째줄에 기술하는 내용으로 현재 문서가 xml 문서임을 시스템에 알려주는 역활을 한다.       

                          형식) <?xml version ="1.0" encoding="<!--인코딩 방식 -->utf-8" standalone="yes 또는 no" ?>

                          규칙) version 은 생략 불가, encoding의 기본값은 'utf-8'

                                  standalone의 기본값은 'no'

6.빌트인 엔티티 ==> 엘리멘트의 내용으로 문자열이 사용된 때 문자열에 '<' 문자나 '&' 문자 등을 직접 사용 할수 없다. 그래서 이러한 문자를 대신
해서 사용 할수 있는 대체문자를 빌트인 엔티티 라고 한다. 

 

                 &lt;       ==> <

           &gt;      ==> >

           &amp;  ==> &

           &quot;  ==>  "

           &apos; ==>  '

           &nbsp; ==> xml에서는 사용 할수 없다. (&#160; 으로 대체 가능)

  -- 문자를 코드값을 이용하여 나타낼수 있다.

     형식) '&#코드값'       ==> 코드값은 10진수로 나타낸다.

              '&#X 코드값 '  ==>  코드값은 16진수로 나타낸다.

7.CDATA 섹션 ==> '<'나 '&' 처럼 문자열로 직접 사용 할수 없는 문자들도 대체문자를 사용하지 않고 직접 사용할수 있는 영역을 나타 낸다

           형식)                <![CDATA[문자열]]>

주석처리 ==>     '<!-- 주석내용 --> '와 같은 형식으로 사용한다.

 

<?xml version="1.0" encoding="UTF-8"?>
<!--
자신의 이력을 XML 문서로 작성 하시오.

 -->
 <이력서>
     <인적사항 >
         <성함 속성="한글">김훈</성함>
         <성함 속성="한문">金勳</성함>
         <성함 속성="영문">kim hun</성함>
         <생년월일>1984년12월24일</생년월일>
         <나이 속성="만">27</나이>
         <주소 우편번호="301-101">대전시 중구 대흥동 뿌잉뿌잉 500번지</주소>
         <연락처>
             <Home 지역번호="042">273-1234</Home>
             <핸드폰>010-123-1234</핸드폰>
             <E-mail>qqdfdg@tt.com</E-mail>
         </연락처>
     </인적사항>
     <학력사항>
         <학교 종류="고등학교">
             <재학기간>
             <시작>1999년3월5일</시작>
             <종료>2002년2월 20일</종료>
             </재학기간>
             <학교명>대덕인재고등학교</학교명>
            <소재지>대전</소재지>
         </학교>
         <학교 종류="대학교">
             <재학기간>
                 <시작>2002년 3월 5일</시작>
                 <종료>2007년 2월 12일</종료>
             </재학기간>
             <학교명>충남대학교</학교명>
            <전공>컴퓨터공학</전공>
            <소재지>대전</소재지>
            <성적>4.0</성적>
         </학교>
     </학력사항>
     <경력사항>
     <경력>
         <재직기간>
         <시작>2007/03/15</시작>
         <종료>2012/03/30</종료>
         </재직기간>
         <직장명>대저IT(주)</직장명>
         <직위>과장</직위>
         <연봉 단위="만원">3000</연봉>
         <퇴직사유>프로젝트 완료</퇴직사유>
         <업무내용>프로그램 개발(PM)</업무내용>
     </경력>
    
         <경력 분야="CS" 년차="1년">(주)블루콤</경력>
         <경력 분야="CS" 년차="4년">(주)이지오스</경력>
     </경력사항>    
     <자격사항>
         <자격면허>
             <자격증>
                 <자격명>정보처리기사</자격명>
                 <취득일>2011년 4월</취득일>
                 <발급기관>산업인력공단</발급기관>
             </자격증>
             <자격증>
                 <자격명>사무자동화산업기사</자격명>
                 <취득일>2011년 11월</취득일>
                 <발급기관>산업인력공단</발급기관>
             </자격증>
        
         </자격면허>
         <외국어 언어="영어">
             <시험명>토익</시험명>
             <점수>770</점수>
         </외국어>
     </자격사항>
    
     <병역사항>
         <구분>병역필
         </구분>
         <군별>육군</군별>
         <계급>대장</계급>
         <복무기간>
             <시작>04-01</시작>
             <종료>06-01</종료>
         </복무기간>
     </병역사항>
    
    
     <가족사항>
         <가족 관계="아버지">
             <성명>ㄱㅈㅎ</성명>
             <나이>53</나이>
            <직업>공무원</직업>
            <동거여부>여</동거여부>
         </가족>
         <가족 관계="어머니">
             <성명>ㅅㅎㅈ</성명>
             <나이>55</나이>
             <직업>주부</직업>
             <동거여부>여</동거여부>
         </가족>
         <가족 관계="동생"></가족>
             <존재>출가외인</존재>
     </가족사항>
 </이력서>

 

이 글은 스프링노트에서 작성되었습니다.


'J-Query' 카테고리의 다른 글

버튼이벤트->레이어 새창으로 표현  (0) 2012.05.08
list 추출및 select 구현  (0) 2012.05.08
8일차 사용자정의객체&JSON표기법  (0) 2012.05.08
7일차 Effects  (0) 2012.05.08
6일차 Utilities  (0) 2012.05.08
Posted by 사라링

 

사용자 정의 객체  -- 클래스를 작성

 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
  <script type="text/javascript" src="./js/jquery-1.7.2.js"></script>
  <script type="text/javascript">

//    자바 스크립트의 사용저 정의 객체
   
// -- 클래스를 작성
//    function 클래스명(파라미터변수들...){
//        this.속성명;// 속성 선언만
//        ..
//        this.속성명2 = 값 ;// 속성 선언및 초기화
//        ..
//        this.메서드명 = 실제함수명;
//    }
//   
//    function 실제함수명(파라미터 변수들){
//    처리내용;;
//    ..
//    ..
   
// -- 2. 객체를 만들고 , 사용하기
//var 객체변수1 = new 클래스명(값들...);
//var 객체변수2 = new 클래스명(값들...);

//객체변수1.속성명 = 값;
//객체변수1["속성명"]=값;
//
//객체변수1.메소드명(값들...)
 var Member = function(id, name, juminNo){
  this,id = id;
  this.name = name;
  this.juminNo = juminNo;
 }

 //

 // 클래스에 메소드 추가 (prototype명령을 이용한다.)

 // 속성값을 다른 값으로 변경하는 메소드
 Member.prototype.setValue = function(newId, newName, newJuminNo){
  this,id = newId;
  this.name = newName;
  this.juminNo = newJuminNo;
 }
 
 // 주민번호를 이용 나이를 계산하는 메소드
 Member.prototype.getAge = function(){
  var today = new Date();
  var currYear = today.getFullYear();

  var juminYear = Number( this.juminNo.substring(0,2) );
  var flag = this.juminNo.charAt(7); // 성별자리값 읽기

  if(flag=="1" || flag=="2") { // 1900년대 사람
   juminYear += 1900;
  }else{ // 2000년대 사람
   juminYear += 2000;
  }
 
  return (currYear - juminYear);
 }

 // 속성값을 문자열로 구성하여 반환하는 메소드
 Member.prototype.toString = function(){
  return this.id + "[" + this.name + "]" + this.getAge() + "세";
 }

 //------------------------------------------------------------------------

 // 객체생성 및 사용하기 -------

 var mem = new Member("gildong", "홍길동", "800101-1234567");

 var result = mem.toString();

 alert("변경전 : " + result);

 mem.setValue("jimae", "일지매", "000808-3456789");
 result = mem.toString();
 alert("변경후 : " + result);
 
 // 생성된 객체에 새로운 속성과 메소드 추가 하기
 mem.tel  = "042-3222-5453";
 mem.addr = "대전시 중구 대흥동 500번지 " ;
 mem.display= function(){
     var str = "";
     str +="ID : " +this.id +"\n";
     str +="이름 : " +this.name +"\n";
     str +="주민번호 : " +this.juminNo +"\n";
     str +="전화번호 : " +this.tel +"\n";
     str +="주소 : " +this.addr +"\n";
    alert(str);
 }
 
 mem.display();
 
 var mem2 = new Member("ddit","대덕","770707-121212");
alert(mem2.addr);

 
 
   </script>
</head>
<body>

</body>
</html>

 

오브젝트의 속성 추가

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title> </title>
  <script type="text/javascript" src="./js/jquery-1.7.2.js"></script>
  <script type="text/javascript">
    // 객체를 생서한 후 생성도니 객체에 속성과 메소드를 추가 할수 있다.
   
    // Object() => 빈 객체를 만들어 준다.
   
    var mem = new Obect();
   
    // 생성된 객체에 속성 추가
    mem.id = "gildone";
    mem.name = "홍길동";
    mem_addr = "대전" ;
   
    mem.toString = function(){
        var str = "이름 : "+this.name + "\n";;
        str += "ID : "+this.id + "\n";
        str +="주소 : "+ this.addr;
       
        alert(str);
    }
   
    //alert(mem.id);
    mem.toString();
   
//---------------------
  </script>
</head>
<body>

</body>
</html>

JSON 표기법-- 자바스크립트 오브젝트 심플 표기법

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>img 커텐 효과 </title>
  <script type="text/javascript" src="./js/jquery-1.7.2.js"></script>
  <script type="text/javascript">
     //JOSN 표기법
   
    // 1. 이름:값 형식
   
    var mem= {id : "power2c","name" : "일지매",addr: "대전"};
   
    document.write(mem.name+ "씨!!<br>당신은 ID가 "+mem.id+"이고, " +mem.addr+"에 사시는군요 !! <br><br>");

    // 2. 배열 형식
    var names = ["홍길동","일지매","변학도","성춘향","이몽룡"];
   
    for(var i=0;i<names.length;i++){
        document.write("names["+i+"] j = "+ names[i]+"<br>");
       
       
    }
    document.write("<br><hr color='red'><br> ")
 
  </script>
</head>
<body>

</body>
</html>

 

사용자 객체 생성및 사용

 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
        <script type="text/javascript" src="./js/jquery-1.7.2.js">
        </script>
        <script type="text/javascript">
/*
    학번, 이름, 국어점수 , 수학점수, 컴퓨터 점수, 총점, 평균을 기억할 속성을 갖고
    총점과 평균은 메소드를 이용하여 구하는 클래스를 작성 하시오. 

    속성
        학번,이름,국어,수학,컴퓨터,총점,평균
    메소드
        총점구하기
        평균구하기
        결과출력하기
 */
    var Student= function(myNo,myName,myKor,myMat,myCom) {
        this.no =myNo;
        this.name=myName;
        this.kor=myKor;
        this.mat=myMat;
        this.com=myCom;
        this.tot=this.getTot();
        this.avg=this.getAvg();
       
    };
    Student.prototype = {
        getTot : function(){
                var tot = this.kor+this.mat+this.com;
                 return tot;
                 },
        getAvg : function(){
            if(typeof(this.tot)=="undefined"){
                //값이 없는경우 typeof 처리 시에 undefined 라는 문자열이 반환
            }
           
            var avg = this.tot/3;
                return parseInt(avg);
        },
        getDisplay : function(){
            document.write("No : "+this.no+"<br>");
            document.write("name : "+this.name+"<br>");
            document.write("kor : "+this.kor+"<br>");
            document.write("mat : "+this.mat+"<br>");
            document.write("com : "+this.com+"<br>");
            document.write("tot : "+this.tot+"<br>");
            document.write("avg : "+this.avg+"<br>");
        }

    };
   
    var sut = new Student(15,"김훈",82,90,100);
    sut.getDisplay();
            
              
        </script>
    </head>
    <body>
    </body>
</html>

 

추가 JSON 설명

 

 

Introducing JSON - 원문보기

 

참고사항 : 한국어로 번역했을 때 개발자로서 접근하기 불편한 것들은 그냥 한글 발음으로 표기했음.

ex> object -> 오브젝트, format -> 포맷 등

 

JSON (JavaScript Object Notation) is a lightweight data-interchange format.

JSON(자바스크립트 오브젝트 표기법) 은 가벼운 데이터 변환 포맷이다. (즉, 여러가지 언어에서 사용하는 데이터 표현방식을 한가지로 표준화 해서 사용하겠다 라는 말이다. 그런데 발음이... 제이슨? 제이손?제이썬? 뭐가 맞는것인지... 당췌! 자신있는 분 답글 부탁합니다 ㅋㅋ)

 

It is easy for humans to read and write. It is easy for machines to parse and generate.

사람이 읽고 쓰기 편하다. 기계가 분석하고 생성하기가 편하다. (사람도 편하고 기계도 편하다. 꿩먹고 알먹기? 그럼 꿩은 멸종되는 것인가.. ㅡ.ㅡ; )

 

It is based on a subset of the JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999.

JSON 은 1999년 12월에 발표된 ECMA-262(에크마-262) 표준 3번째 에디션의 자바스크립트 프로그래밍 언어의 일부를 기반으로 한다.

 

JSON is a text format that is completely language independent

JOSN 은 완전히 프로그램언어와 상관없는 문자 포맷이다.

 

but uses conventions that are familiar to programmers of the C-family of languages, including C, C++, C#, Java, JavaScript, Perl, Python, and many others.

버뜨! 그러나 C, C++, C#, Java, JavaScript, Perl, Python, 기타등등의 C 언어 패밀리 ( C 문법과 유사한 언어들을 의미하는거 같음. 아님말고 ㅡㅡ+) 프로그래머들이 사용하는 형태와 비스무리하다. (번역이 좀 이상하다 - 그냥 의미만 이해하다.)

 

These properties make JSON an ideal data-interchange language.

이런 특징이 JOSN 을 데이타 변환 언어로 사용하게끔 만든다. (왜냐! 거의 모든언어를 사용할 수 있으니까!!)

 

 

JSON is built on two structures:

JSON 은 2가지 구조다.

  • A collection of name/value pairs. In various languages, this is realized as an object, record, struct, dictionary, hash table, keyed list, or associative array.
  • 이름/값  이런형식의 집합 : 많은 언어들이 이놈들을 오브젝드, 레코드, 구조체, 딕셔너리, 해쉬테이블, 키값을 가진 리스트, 연상배열(인덱스가 아닌 키값으로 접근 가능한 배열) 로 인식된다.
  • An ordered list of values. In most languages, this is realized as an array, vector, list, or sequence.
  • 값들이 순서대로 나열된 것들 : 대부분 배열, 벡터, 리스트, 시퀀스로 인식한다.

These are universal data structures.

이놈들은 통합된 데이터 구조이다.

 

Virtually all modern programming languages support them in one form or another.

왠만한 언어들이 위에 나열된 데이터형식들을 사용한다는 말이다.

 

It makes sense that a data format that is interchangable with programming languages also be based on these structures.

즉, 이러한 구조를 기반으로 하는 프로그램 언어들은 서로 데이터를 주고 받을 수 있다~~ 라는 말.

 

In JSON, they take on these forms:

JOSN 은 3가지 형식으로 사용되는데....

 

An object is an unordered set of name/value pairs.

오브젝트는 순서 상관없이 이름/값으로 이루어진이다.

 

An object begins with { (left brace) and ends with } (right brace).

{ 로 시작해서 } 로 끝난다. { ~~~ }

 

Each name is followed by : (colon) and the name/value pairs are separated by , (comma).

'이름' 하고 '값' 은 : (콜론) 으로 구분하고 여러개 구분할때는 , (콤마)로 한다.

요롷게,  { 이름1:값1 , 이름2:값2, ... }

 

 

 

An array is an ordered collection of values.

배열은 순서가 있는 값들의 집합이다.

 

An array begins with [ (left bracket) and ends with ] (right bracket). Values are separated by , (comma).

[ 로 시작해서 ] 로 끝나고 마찬가지로 , 로 여러개 구분한다.

요롷게, [ 배열1, 배열2, 배열3, ... ]

 

 

 

 

A value can be a string in double quotes, or a number, or true or false or null, or an object or an array.

'값'은 " (썅따옴표) 로 싸고있는 문자열, 숫자, 참/거짓, NULL, 오브젝트, 배열을 쓸 수 있다.

 

These structures can be nested.

당근 중첩될 수 있다.

 

 

 

A string is a collection of zero or more Unicode characters, wrapped in double quotes, using backslash escapes.

문자열은 \ (역슬래쉬) 를 이용해서 특수 문자를 넣을 수도 있고, 아예 빈값도 되고, 유니코드도 된다. 단, " 로 감싸줘야 된다.

 

A character is represented as a single character string. A string is very much like a C or Java string.

한글자도 문자열로 취급한다. (char 가 아닌 string... 이해 안되면 자바기초 공부하세요)

 

 

 

A number is very much like a C or Java number, except that the octal and hexadecimal formats are not used.

숫자는 C 랑 Java 하고 비스무리 한데, 8진수, 16진수는 안된다.

 

Whitespace can be inserted between any pair of tokens.

공백은 " 로 감싼 문자열 빼고 어디들 올 수 있다.( 문자열안에 있는 공백 빼고 나머지는 무시한다는 얘기)

 

Excepting a few encoding details, that completely describes the language.

몇가지 규칙빼고 전부 설명했다.

 

-- 원문보기 가보시면 왠만한 언어들은 다 지원된다는 것을 알 수 있습니다.

-- 예제는 안 적었습니다. 구굴링 해보면 나오니까요 ㅋㅋ

-- 나름대로 이해하기 쉽게 설명한다고 했는데... 쉬운지 모르겠네요 ^^;

    조금이라고 도움이 되셨기를...

 

이 글은 스프링노트에서 작성되었습니다.

'J-Query' 카테고리의 다른 글

list 추출및 select 구현  (0) 2012.05.08
9일차 XML문서  (0) 2012.05.08
7일차 Effects  (0) 2012.05.08
6일차 Utilities  (0) 2012.05.08
5일차 찾기관련()eq()..  (0) 2012.05.08
Posted by 사라링

BLOG main image
.. by 사라링

카테고리

사라링님의 노트 (301)
JSP (31)
J-Query (41)
JAVA (24)
디자인패턴 (1)
스트러츠 (3)
안드로이드 (11)
오라클 (45)
우분투-오라클 (1)
이클립스메뉴얼 (6)
스프링3.0 (23)
자바스크립트 (10)
HTML5.0 (17)
정보처리기사 (1)
기타(컴퓨터 관련) (1)
문제점 해결 (3)
프로젝트 (2)
AJAX (4)
하이버네이트 (3)
트러스트폼 (11)
Jeus (2)
재무관리(회계) (5)
정규식 (5)
아이바티스 (8)
취미 (2)
소프트웨어 보안 관련모음 (0)
정보보안기사 (6)
C언어 베이직 및 프로그램 (3)
보안 관련 용어 정리 (2)
넥사크로 (6)
웹스퀘어_ (0)
Total :
Today : Yesterday :