본문 바로가기
코스웨어/10년 스마트폰BSP

[BSP]업무일지-이상구-20100816

by 알 수 없는 사용자 2010. 8. 16.
728x90
반응형
[자바 - final 변경자]
final은 '마지막의', '변경될 수 없는'의 의미를 가지고 있으며 메소드, 글래스, 필드에 사용할 수 있다.

대상

설명

필드

값을 변경할 수 없는 상수로 사용하기 위해서 final을 붙인다.

메소드

오버라이딩을 금지하고자하는 메소드에 final을 붙인다.

클래스

상속 불가능한 클래스에 final을 붙인다. 다른 클래스의 슈퍼 클래스가 될 수 없다.

[자바 - 추상 클래스]
추상 클래스는 인스턴스를 생성할 수 없는 미완성의 클래스이다. 몸체가 없는 빈껍데기만 있는 미완성의 추상 메소드를 갖고 있어서 인스턴스를 생성할 수 없다 단지 상속을 통해서 서브 클래스에서 완성할 수 있도록 한다.
클래스 설계할때 class앞에 abstract를 기술하여 클래스를 설계해 줌으로써 '이 클래스는 추상 메소드가 있으니 상속을 통해서 추상 메소드를 구현해야 함'을 알려준다. 몸체가 없는 추상 클래스는 추상 메소드를 포함하고 있다는 것을 제외하고는 일반 클래스와 전혀 다르지 않다. 즉, 생성자도 있고, 필드와 메소드도 가질 수 있다.

형식

abstract class 추상 클래스_이름 {

//필드 선언

//일반 메소드 정의

//생성자 정의

abstract 접근_제어자 리턴 타입 추상 메소드_이름(매개변수 리스트);

//추상 메소드 선언

}


AbstractTest.java

package exam05;

abstract class Shape{
  protected double area; //면적을 저장할 도형의 공통된 필드
  public double getArea(){ //면적 값을 알려주는 메소드
    return area;
  }
  abstract public void calcArea(); //도형의 면적을 구하기 위한 추상 메소드
}

class Circle extends Shape{
  protected int radius;
  public Circle(){
  }
  public Circle(int radius){
    this.radius=radius;
  }
  public void calcArea(){ //오버라이딩
    area=radius*radius*Math.PI;
  }
}

class Rectangle extends Shape{
  protected int width;
  protected int height;
  public Rectangle(){
  }
  public Rectangle(int width, int height){
    this.width=width;
    this.height=height;
  }
  public void calcArea(){ //오버라이딩
    area=width*height;
  }
}

class Triangle extends Shape{
  protected int width;
  protected int height;
  public Triangle(){
  }
  public Triangle(int width, int height){
    this.width=width;
    this.height=height;
  }
  public void calcArea(){ //오버라이딩
    area=width*height*0.5;
  }
}

public class AbstractTest {
  public static void main(String[] args) {
    Shape[] sha=new Shape[3];
    sha[0]=new Circle(5);
    sha[1]=new Rectangle(5,8);
    sha[2]=new Triangle(10,15);
    
    for(int i=0;i<sha.length; i++){
      sha[i].calcArea();
      System.out.println("도형의 넓이:"+sha[i].getArea());
    }
  }
}





ShipMain.java

package test01;

//abstract 키워드를 이용하여 추상클래스 선언
//추상클래스는 자신의 이름으로 객체 생성안됨.
//상속한 자식 클래스의 객체를 생성하여 사용.

abstract class  Ship 
{
  //추상필드는 없음.
  
  //추상메소드는 반드시 자식클래스에서 오버라이딩하여 구현해야함.
  //추상메소드는 바디({}로 묶인 부분)가 없음.
  public abstract int move();// 사람을 몇명 나르는가
  public abstract int carry();// 무기를 몇 정 나르는가
}

//추상클래스 ship을 상속한다.
class  Boat extends Ship
{
  //추상메소드  move() 오버라이드 -반드시 구현해야함.
  public  int move(){
    return 6;
  }// 사람을 몇명 나르는가
  //추상메소드  carry() 오버라이드 -반드시 구현해야함.
  public  int carry(){
    return 0;
  }// 무기를 몇 정 나르는가
  public String name(){
    return "쌩쌩 보트 :   ";
  }
}

//추상클래스 ship을 상속한다.
class  Cruise extends Ship
{
  //추상메소드  move() 오버라이드 -반드시 구현해야함.
  public  int move(){
    return 300;
  }// 사람을 몇명 나르는가
  //추상메소드  carry() 오버라이드 -반드시 구현해야함.
  public  int carry(){
    return 200;
  }// 무기를 몇 정 나르는가
  public String name(){
    return "전함 무궁화 : ";
  }
}

class  ShipUtil
{
  //객체를 생성하지 않고 사용하기 위해 static으로  메소드 선언.
  //매개변수로 ship 클래스를 받았으므로 
  //ship 클래스의 서브 클래스는 모두 받을 수 있다.
  public static void search(Ship s){

    System.out.println(s.move());
    System.out.println(s.carry());

    if(s instanceof Boat){
      //매개변수의 다형성에 의해 부모의 이름으로 자식을 받을 수 있다.
      //부모의 이름으로 받으면 부모의 메소드만 받을 수 있다.
      //자식에게만 있는 메소드를 호출할 때는 타입 캐스팅을 하여 호출하여야함.
      //따라서 ship 타입을 Boat로 타입 캐스팅.
      Boat b=(Boat)s;
      System.out.println("Boat 이름: "+b.name());
    }else if(s instanceof Cruise){
      //매개변수의 다형성에 의해 부모의 이름으로 자식을 받을 수 있다.
      Cruise b=(Cruise)s;
      System.out.println("Cruise 이름:"+b.name());
    }
  }
}


public class  ShipMain
{
  public static void main(String[] args) 
  {
    //추상클래스는 자신의 이름으로 객체를 생성할 수 없으므로 자식의 클래스로 생성.
    Ship ship1=new Boat();
    Ship ship2=new Cruise();
    System.out.println(ship1.move());
    System.out.println(ship1.carry());
    System.out.println(ship2.move());
    System.out.println(ship2.carry());
    //search의 매개변수 타입이 ship이므로 ship과 ship의 자식을 매개변수로 입력할 수 있다.
    ShipUtil.search(ship2);
  }
}



[자바 - 인터페이스로 다중상속 구현]
자바에서는 다중상속을 지원하지 않는다 따라서 인터페이스로 간접적으로 다중 상속을 한다. 인터페이스를 사용한 다중 상속을 살펴보자.

InterfaceTest.java
package exam06;

interface Color{
  int RED=1;
  int GREEN=2;
  int BLUE=3;
  void setColor(int c);
  int getColor();
}

interface Drawable{
  void draw();
}

class Circle implements Drawable, Color{
  int color=0;
  public int getColor(){
    return color;
  }
  public void setColor(int color){
    this.color=color;
  }
  public void draw(){
    System.out.println(" 원을 그리다.");
  }
}

public class InterfaceTest {
  public static void main(String[] args) {
    
    Circle cir=new Circle();
    cir.setColor(Color.RED);
    switch(cir.getColor()){
    case Color.RED:
      System.out.print("빨간색");
      break;
    case Color.GREEN:
      System.out.print("초록색");
      break;
    case Color.BLUE:
      System.out.print("파란색");
      break;
    }
    cir.draw();
  }
}



[안드로이드 - 글자 그리기]
StringEx.java

package net.itisn.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class StringEx extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(new StringView(this));
    }
}


 StringView.java
package net.itisn.test;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class StringView extends View {
  //생성자--객체의 초기화를 시킴
  public StringView(Context context) {
    super(context);
    this.setBackgroundColor(Color.WHITE);
  }
  //그리기 onDraw()

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //그리기객체
    Paint paint=new Paint();
    paint.setAntiAlias(true); //그리기 객체에 안티알리아스
    
    paint.setTextSize(12);//12도트
    paint.setColor(Color.argb(255000));
    //폰화면의 크기를 얻어오자.
    canvas.drawText("화면크기"+this.getWidth()+"화면높이"+this.getHeight(),0,30,paint);
    //문자열의 폭
    canvas.drawText("문자열폭"+(int)paint.ascent(), 060, paint);

    //16도트 크기 문자
    paint.setTextSize(16);
    paint.setColor(Color.argb(255,0,0,0));
    canvas.drawText("16Dot!!문자표시"090, paint);
    //18도트 크기 문자
    paint.setTextSize(18);
    paint.setColor(Color.argb(255,40,0,0));
    canvas.drawText("18Dot!!문자표시"0120, paint);
    //20도트 크기 문자
    paint.setTextSize(20);
    paint.setColor(Color.argb(255,80,0,0));
    canvas.drawText("20Dot!!문자표시"0150, paint);
    //22도트 크기 문자
    paint.setTextSize(22);
    paint.setColor(Color.argb(255,120,0,0));
    canvas.drawText("22Dot!!문자표시"0180, paint);
    //24도트 크기 문자
    paint.setTextSize(24);
    paint.setColor(Color.argb(255,160,0,0));
    canvas.drawText("24Dot!!문자표시"0210, paint);
    //26도트 크기 문자
    paint.setTextSize(26);
    paint.setColor(Color.argb(255,200,0,0));
    canvas.drawText("26Dot!!문자표시"0240, paint);
    //28도트 크기 문자
    paint.setTextSize(28);
    paint.setColor(Color.argb(255,240,0,0));
    canvas.drawText("28Dot!!문자표시"0270, paint);
  }
}




[안드로이드 - 도형 그리기]
ShapeEx.java
package net.itisn.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class ShapeEx extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(new ShapeView(this));
    }
}

ShapeView.java
package net.itisn.test;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.view.View;

public class ShapeView extends View {

  public ShapeView(Context context) {
    super(context);
    //백그라운드 색상 흰색
    this.setBackgroundColor(Color.WHITE);
    
  }

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //그림객체 만들어보자!!
    Paint paint = new Paint();
    paint.setAntiAlias(true);

    //집을 그려보자!!
    paint.setStrokeWidth(2);//선의 굵기
    paint.setStyle(Paint.Style.STROKE); //스타일 지정
    paint.setColor(Color.argb(255,255,0,0)); //색깔
    
    canvas.drawLine(160,50,10,190,paint); //지붕
    canvas.drawLine(160,50,310,190,paint);
    canvas.drawLine(10,190,310,190,paint);
    
    canvas.drawLine(30,190,30,350,paint); //건물
    canvas.drawLine(290,190,290,350,paint);
    canvas.drawLine(30,350?,290,350,paint);
    
    canvas.drawLine(30,190,290,350,paint); //가운데 X
    canvas.drawLine(290,190,30,350,paint);
    
    canvas.drawOval(new RectF(30,190,290,350),paint); 
// 타원

/*    
    //선을 그리자!
    paint.setStrokeWidth(5); //선의 굵기
    paint.setStyle(Paint.Style.STROKE);//스타일 지정
    paint.setColor(Color.argb(255,255,0,0));//색지정
    
    canvas.drawLine(0, 0, 300, 300, paint);//선 그리기!
    
    //Path
    paint.setStyle(Paint.Style.STROKE);
    paint.setColor(Color.argb(255, 0, 255, 0));
    Path path=new Path();
    path.moveTo(55,10);
    path.lineTo(200,350);
    
    canvas.drawPath(path, paint);
    
    //사각형 그리기
    paint.setColor(Color.argb(255, 0, 0, 255));
    paint.setStrokeWidth(1); //선의 굵기
    canvas.drawRect(new Rect(100,100,200,200), paint);
    canvas.drawRect(110, 110, 220, 220, paint);
    
    //둥근 사각형 그리기
    paint.setColor(Color.argb(255, 0, 0, 255));
    canvas.drawRoundRect(new RectF(55,100,110,300), 10, 10, paint);
*/

  }

}


728x90