쓰레드(Thread)와 런에이블(Runnable) 2편
'◼︎ 개발 > JAVA' 카테고리의 다른 글
[JAVA] 추상(abstract) 클래스와 인터페이스(interface) 클래스 (0) | 2017.05.21 |
---|---|
[JAVA] 쓰레드(Thread)와 런에이블(Runnable) 1편 (0) | 2017.05.21 |
쓰레드(Thread)와 런에이블(Runnable) 2편
[JAVA] 추상(abstract) 클래스와 인터페이스(interface) 클래스 (0) | 2017.05.21 |
---|---|
[JAVA] 쓰레드(Thread)와 런에이블(Runnable) 1편 (0) | 2017.05.21 |
추상(abstract) 클래스와 인터페이스(interface) 클래스
1. 추상 클래스와 추상 메소드란?
추상클래스란 말 그대로 추상적으로 밖에 그려지지 않은 클래스라고 한다. 즉, 클래스가 전체적인 구성을 다 가지지 못한 채 설계만 되어있는 클래스이다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스를 생성할 수는 없다. 추상클래스는 상속(Extends)을 통해서 자식 클래스에 의해 완성이 된다. 그래서 추상클래스 자체로는 제 기능을 다하지는 못하지만, 새로운 기능을 정의하는데 있어서 바탕(틀)이 될 수 있다!
package ch7;
// 추상 클래스는 class 선언부 앞에 abstract를 적어준다.
abstract class 클래스명 {
.....
abstract 메소드명(); // 추상 메소드
}
package ch7;
// 추상클래스 선언
// 구현부가 없이 선언부만 존재하는 것을 확인할 수 있다.
abstract class Player{
boolean pause;
int currentPos;
// 생성자로 변수 초기
Player(){
pause = false;
currentPos = 0;
}
abstract void play(int pos);
abstract void stop();
}
class AudioPlayer extends Player{
// play 메소드의 구현부
void play (int pos){
System.out.println("AudioPlayer.play");
}
// void 메소드의 구현부
void stop (){
System.out.println("AudioPlayer.stop");
}
}
class CDPlayer extends Player{
// play 메소드의 구현부
void play (int pos){
System.out.println("CDPlayer.play");
}
// void 메소드의 구현부
void stop (){
System.out.println("CDPlayer.stop");
}
}
class abEx02{
public static void main (String args[]){
AudioPlayer ap = new AudioPlayer();
ap.play(1);
CDPlayer cp = new CDPlayer();
cp.play(1);
}
}
2. 인터페이스(Interface) 클래스란?
인터페이스는 추상클래스처럼 추상 메소드를 갖지만 추상 클래스보다 추상화 정도가 높아서 추상 클래스와 달리 몸통을 갖춘 일반 메소드 또는 멤버 변수를 구성원으로 가질 수 없다. 오직 추상 메소드와 상수만을 멤버로 가질 수 있으므로 그 외의 다른 어떠한 요소도 허용하지 않는다. 추상클래스를 부분적으로 미완성된 설계도라고 했다면, 인터페이스 클래스는 아무 것도 없고 밑그림만 그려져 있는 상태이다.
package ch7;
interface 클래스명{
public static final 변수타입 변수명 = 값;
public abstract 메소드명(매개변수);
}
void autoPlay(I i) {
i.play();
}
}
interface I {
public abstract void play();
}
class B2 implements I {
public void play() {
System.out.println("play in B class");
}
}
class C2 implements I {
public void play() {
System.out.println("play in C class");
}
}
class InterfaceTest2 {
public static void main(String[] args) {
A2 a = new A2();
a.autoPlay(new B2());
a.autoPlay(new C2());
}
}
결과
play in B class
play in C class
인터페이스 클래스의 장점
서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
서로 상속관계에 있지도 않고, 같은 조상 클래스를 가지고 있지 않은 서로 아무런 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어줄 수 있다.
독립적인 프로그래밍이 가능하다.
인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제 구현에 독립적인 프로그램을 작성하는 것이 가능하다.
클래스와 클래스 간의 직접적인 관계를 인터페이스를 통해서 간접적인 관계로 변경하면 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.
참고링크
[JAVA] 쓰레드(Thread)와 런에이블(Runnable) 2편 (8) | 2017.05.22 |
---|---|
[JAVA] 쓰레드(Thread)와 런에이블(Runnable) 1편 (0) | 2017.05.21 |
쓰레드(Thread)와 런에이블(Runnable) 1편
본 게시물은 jdk 1.8 기준으로 작성되었습니다.
1. 쓰레드(Thread)란?
프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)를 할당 받아서 프로그램이 실행된다. 프로그램이 실행된 결과물이 바로 프로세스이다. 예를 들어 윈도우의 Ctrl + Shift + ESC를 하면 탭 부분에 프로세스가 보이는데 클릭해보면 실행 중인 프로세스 리스트가 보인다. 즉, 실행 중인 프로그램 = 프로세스!
2. 쓰레드(Thread) 구현하기
Thread를 이용하여 만들기 : https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
Runnable을 이용하여 만들기 : https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
자바에서 쓰레드를 구현하는 방식은 Thread를 이용하는 방법과 Runnable을 이용하는 방법 2가지가 있다. Thread 클래스는 상속(Extends)를 받아서 사용해야 하므로 다른 클래스들을 상속받을 수 없다. (자바는 기본적으로 다중상속 금지) 그러나 Runnable 인터페이스는 구현(implements) 받아서 사용하므로 필요하다면 다른 클래스를 상속받아서 재사용성과 코드의 일관성을 높일 수 있다. 또한 Thread 를 한번 사용하면 재사용이 불가능하지만, Runnable 를 이용하여 Thread를 구현하면 재사용할 수 있다.
잘 와닿지 않을테니 아래의 예제를 통해서 내용을 확인하자. 혹시 이 게시물을 읽기전 상속(Extends)와 구현(implement), 인터페이스 클래스 등을 잘 모르겠다면 'http://aileen93.tistory.com/107' 이전 게시물 참고!
[방법 1] Thread로 쓰레드 구현하기
예제 1
package ch13_Thread;
class ThreadEx01 {
public static void main(String args[]) {
ThreadEx2 t1 = new ThreadEx2();
t1.start();
}
}
class ThreadEx2 extends Thread {
// 쓰레드를 통해서 수행할 내용들을 정의
public void run() {
// 작업내용
for(int i=0; 5 > i; i ++)
System.out.println("쓰레드가 실행되었습니다.");
}
}
쓰레드가 실행되었습니다.
쓰레드가 실행되었습니다.
쓰레드가 실행되었습니다.
쓰레드가 실행되었습니다.
쓰레드가 실행되었습니다.
여기서 의문이 생길 것이다. run으로 구현되어있는데, 왜 start로 Thread를 실행 시키는지!
Thread 클래스의 메소드 API 문서를 확인해보자.
void | start() 이 스레드가 실행을 시작하도록합니다. Java 가상 머신 run 이 thread 의 메소드를 호출합니다 . |
void | run() 이 스레드가 별도의 Runnable 실행 객체 를 사용하여 작성된 경우 해당 Runnable 객체의 run 메소드가 호출됩니다. 그렇지 않은 경우, 이 메서드는 아무 것도 수행하지 않고 반환합니다. |
[방법 2] Runnable로 쓰레드 구현하기
class RunnableImplements implements Runnable {
// Runnable인터페이스의 추상메서드 run()을 구현
public void run() {
// 작업내용
}
}
예제 2
package ch13_Thread;
// view-source:https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
class RunnableEx01 {
public static void main(String args[]) {
Runnable r = new ThreadEx1();
Thread t1 = new Thread(r);
t1.start();
}
}
class ThreadEx1 implements Runnable {
// 스레드를 종료시키기 위한 플래그 변수
private boolean stopped = false;
// 스레드를 통해서 실행시킬 task 로직
public void run() {
while (!stopped) {
System.out.println("Thread is alive :"+ stopped);
try {
System.out.println("active.."+Thread.activeCount());
Thread.sleep(2000);
} catch (Exception e) {
stop();
}
stop();
}
}
// 스레드 종료시키기
public void stop(){
System.out.println(Thread.currentThread().getName()+"가 종료되었습니다.");
stopped = true;
}
}
3. 결론
Thread보다 Runnable이 더 확장성(유연성)있는 코드 작성이 가능하다.
Runnable의 단점은 그럼 무엇일까?..
*쓰레드(Thread)와 런에이블(Runnable) 2편
[JAVA] 쓰레드(Thread)와 런에이블(Runnable) 2편 (8) | 2017.05.22 |
---|---|
[JAVA] 추상(abstract) 클래스와 인터페이스(interface) 클래스 (0) | 2017.05.21 |