'2013/10'에 해당되는 글 3건

  1. 2013.10.14 Thread
  2. 2013.10.10 인터페이스
  3. 2013.10.10 추상 클래스
2013.10.14 15:27


java.lang.Tread 클래스


java.lang.Runnable 인터페이스


Thread 클래스를 상속 받는 경우

class 클래스명 extends Thread{

...

}


Runnable 인터페이스를 상속받는 경우 - 다른 클래스를 상속하여, Tread 클래스르를  상속받지 못하는 경우

class 클래스명 extends 수퍼클래스 implements Runnable{

...

}


Thread 클래스를 상속받아 스레드를 만드는 과정


1. Thread 클래스를 상속 받은 클래스를 선언

2. Thread 클래스의 추상 메소드인 run() 메소드를 재정의

class Threadtest extends Thread{ // Thread 클래스 상속

....;

public void run(){

....; // run 메소드의 재정의

}

}


3. main() 메소드에서 Thread 클래스를 상속 받은 클래스 객체를 생성

4. 생성된 객체를 사용해 start() 메소드 호출


public static void main(String[] args){

Threadtest obj = new Threadtest(); // 객체 생성

obj.start(); // start 메소드 호출

}


: 중요 메소드

public void start() :     스레드를 시작

public void run() :     스레드가 실행될 부분을 기술하는 메소드

Thread 클래스에 있는 run() 메소드에는 아무런 내용이 구현되어 있지 않고 상속 받은 클래스에서 재정의 해야 함


run() 대신 start()를 호출하는 이유

프로세스나 스레드가 실행된다는 의미는 CPU를 사용해 작업을 수행하는 것을 뜻한다. 그런데 한가지 작업만 처리하는 것이 아니고 동시에 2개 이상의 작업을 처리하는 멀티 프로세싱을 위해서는 CPU 스케쥴링이 필요하다. 운영체제는 CPU를 보다 호율적으로 사용하기 위해 작업의 우선 순위를 정해 처리한다. 결국 CPU의 사용권한을 정하는 것은 프로그램이 아니고 운영체제의 몫이다. start() 메소드는 스레드를 실행 가능한 상태, 즉 스레드가 CPU를 사용할 수 있는 준비 상태로 만드는 역할을 한다. 그리고 CPU 스케쥴링에 따라 run() 메소드를 호출해CPU를 사용하는 상태로 변한다.


Runnable 인터페이스

이미 다른 클래스를 상속 받아서 Thread 클래서를 상속 받을 수 없을 때 사용한다.


1. Runnable 인터페이스를 implements 하는 클래스 정의

2. Runnable 인터페이스의 run() 메소드를 재정의

3. main() 메소드에서 Runnable 인터페이스를 구현한 클래스 객체를 생성

4. Thread 클래스의 객체를 생성하면서, 3에서 만든 객체를 매개변수로 전달

5. 4.에서 생성한 Thread 클래스의 객체를 사용해서 start() 메소드를 호출


public static void main(String[] args){

RunnableTest obj = new RunnableTest();

Thread obj_t = new Thread(obj);

obj_t.start();

}


Thread의 우선순위 지정

여러 개의 스레드 중에 어떤 스레드가 CPU를 사용할지는 스레드 스케쥴러가 결정해서 처리하기 때문에 자바의 스레드의 정확한 동작은 예측하기 어렵다. 하지만 setPriority() 메소드를 이용해 우선순위를 부여할 수 있다.

대부분의 컴퓨터는 한 개의 CPU 만을 가지고 있기 때문에, 여러 스레드 중 하나의 스레드 만을 수행한다.

스레드가 작동하는 방식은 하나의 스레드가 종료될 때 까지 CPU를 독점하는 것이 아닌, 여러개의 스레드를 번갈아 가면서 처리하는 방식이다. 이처럼 여러 개의 스레드를 교차하면서 처리하는 것을 Scheduling 이라고 한다.

Posted by saudades

댓글을 달아 주세요

2013.10.10 14:50

인터페이스


인터페이스는 추상 메소드와 상수 정의로 이루어진 단위이다. 즉, 오로지 상수와 추상 메소드만 정의할 수 있다.


다음과 같은 특징이 있다.

- 다중 상속이 가능

- 모든 메소드가 추상 메소드로 이루어져 있음

- interface 키워드를 사용하여 정의

- implements 키워드를 사용하여 상속

- 인터페이스 내부의 추상 메소드 앞에는 abstract를 사용하지 않음


인터페이스를 만드는 이유

- 다중 상속이 가능하므로, 단일 상속의 한계를 보완

- 클래스 명세표를 만듬


형식

public interface 인터페이스명 extends 인터페이스명,인터페이스명...{ // extends 이하는 다중 상속을 의미

//상수선언

//메소드선언

}


예제 1. 인터페이스의 다중 상속


package java_1010;


interface Speed {

public int INIT_SPEED = 60;


public void speedUp(int inc);


public void speedDown(int dec);

}


interface Direction {

public void turn(boolean b);

}


class Car2 implements Speed, Direction {

int speed = INIT_SPEED;


@Override

public void speedUp(int inc) {

// TODO Auto-generated method stub

speed += inc;


}


@Override

public void speedDown(int dec) {

// TODO Auto-generated method stub

speed -= dec;


}


public void display() {

System.out.println("현재 속도는  " + speed + "입니다.");

}


@Override

public void turn(boolean b) {

// TODO Auto-generated method stub

if (b == true) {

System.out.println("현재 방향은  왼쪽입니다.");

} else {

System.out.println("현재 방향은 오른쪽입니다.");

}

}

}


public class CarExe {

public static void main(String[] args) {

Car2 obj = new Car2();

obj.speedUp(20);

obj.turn(true);

obj.display();


obj.speedDown(15);

obj.turn(false);

obj.display();


obj.speedDown(10);

obj.turn(false);

obj.display();

}


}



예제 2. 인터페이스의 구현


package java_1010;


interface Bird{

public long speed =80l;

public void fly();

}

interface Horse{

public void run();

}

interface Fish{

public void swim();

}

interface ChangeSpeed{

public void speedUp(int a);

public void speedDown(int a);

}


class ClassPaga implements Bird, Horse, Fish, ChangeSpeed{

long currentSpeed = speed;


@Override

public void run() {

// TODO Auto-generated method stub

System.out.println(currentSpeed + "Km/h의 속도로 커다란 평원을 달립니다.");

}


@Override

public void fly() {

// TODO Auto-generated method stub

System.out.println(currentSpeed+ "Km/h의 속도로 하늘을 날아다닙니다.");

}


@Override

public void swim() {

// TODO Auto-generated method stub

System.out.println(currentSpeed+ "Km/h의 속도로 바다를 헤엄칩니다.");

}


@Override

public void speedUp(int a) {

// TODO Auto-generated method stub

currentSpeed += a;

}


@Override

public void speedDown(int a) {

// TODO Auto-generated method stub

currentSpeed -= a;

}

}


public class Pagasus {


public static void main(String[] args) {

// TODO Auto-generated method stub

ClassPaga obj = new ClassPaga();

obj.speedUp(10);

obj.fly();

obj.speedDown(20);

obj.run();

obj.speedDown(10);

obj.swim();


}


}



Posted by saudades

댓글을 달아 주세요

2013.10.10 12:19

1. 추상 클래스


abstract 예약어를 사용한 클래스를 추상 클래스라고 한다.(추상 메소드를 포함할 수 있고, 포함하지 않을 수도 있다.)

객체화 할 수 없으며, 반드시 상속을 통해 구현하여 사용한다.


- 추상 메소드 : 구현부{}가 없는 메소드를 추상 메소드라고 한다.


형식 : 

abstract class{

abstract 리턴타입 메소드명();

}


예 :

abstract class{

int i = 5;

abstract void move();

}



예제 1. 추상클래스의 객채화를 시도하는 예제


package java_1010;


abstract class King{

int i = 25;

abstract void draw();

}


public class Abstract_1 {

public static void main(String[] args) {

King obj = new King(); // 이 부분에서 에러 발생. 추상 클래스는 객채화 할 수 없다.

System.out.println("King 클래스의 i의 값은 = "+obj.i); // obj.i를 사용할 수 없다.

}

}


예제 2. 올바른 추상클래스의 상속 및 구현


package java_1010;


abstract class 도형{ // 추상클래스

int i = 77;

abstract void draw(); // 추상메소드

}


class 사각형 extends 도형{ // 추상클래스의 상속

void draw(){ // 추상메소드의 구현

System.out.println("사각형을 그린다.");

}

}


public class Abstract_2 {

public static void main(String[] args) {

사각형 obj = new 사각형();

System.out.println("사각형 클래스 i의 값은  = "+obj.i);

obj.draw();

}

}


예제 3. 추상클래스의 업캐스팅

package java_1010;

abstract class Style{
int i = 99;
abstract void draw();
}

class Square extends Style{
@Override
void draw(){
System.out.println("사각형을 그립니다.");
}
}

class Circle extends Style{
void draw(){
System.out.println("둥근 원을 그립니다.");
}
}

class Triangle extends Style{
void draw(){
System.out.println("삼각형을 그립니다.");
}
}

public class Abstract_3 {
public static void main(String[] args) {
Square obj1 = new Square();
Circle obj2 = new Circle();
Triangle obj3 = new Triangle();
obj1.draw();
obj2.draw();
obj3.draw();
System.out.println("=========================");
Style obj = new Square(); // 추상 클래스의 업캐스팅
// (메소드는 Square 클래스의 메소드, 변수는 Style의 변수)
obj.draw();
obj = new Circle();
obj.draw();
obj = new Triangle();
obj.draw();
}

}



2. final 예약어


final의 3가지 용법

- 클래스에 사용 : 더 이상 상속 받을 수 없는 클래스

- 메소드에 사용 : 상속 관계에서 Overriding 될 수 없다.

- 변수에 사용 : 변수의 값을 변경할 수 없다(상수화).


- 클래스에 사용(final class)


더 이상 상속이 불가능한 클래스로 final 예약어를 사용하여 정의한다.


형식 :

final class 클래스명{


}


예제 1

package java_1010;


final class WordProcess{

void input(){}

void edit(){}

void print(){}

void about(){

System.out.println("King 개발 회사");

}

}


class NewWordProcess extends WordProcess{ // final 클래스는 상속할 수 없다

void about(){

System.out.println("Queen 개발회사");

}

}


public class Final_1 {

public static void main(String[] args) {

NewWordProcess obj = new NewWordProcess();

obj.about();

}

}


- 메소드에 사용(final method)


더 이상 overriding이 불가한 메소드를 정의하고자 할때 사용한다.


예제 1.

package java_1010;


class Final_2_A{

final void display(){

System.out.println("Overriding 불가한 메소드");

}

void message(){

System.out.println("Overriding 가능한 메소드");

}

}


class Final_2_B extends Final_2_A{

/*void display(){

System.out.println("Final_2_A의 display() 메소드 재정의");

}*/

void message(){

System.out.println("Overriding 한 메소드");

}

}


public class Final_2 {


}



Posted by saudades

댓글을 달아 주세요