쓰레드(Thread)와 런에이블(Runnable) 2편
'◼︎ Programming > 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 |
python 문자열 아스키코드 알아내기
# 문자열에서 아스키 코드값 추출
print(ord('a')) => 97
# 아스키 코드에서 문자열로 변환 : https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C
print(chr(65)) => A
# 슬라이싱을 이용하여서 문자열의 아스키 값 추출하기
chr(int(Str[시작:끝])))
- 이때 시작값은 0부터 시작이다.
정규식 문법
사용 문자 |
사용법 | 의미 |
비고 |
. |
a.b | \n(줄 바꿈)를 제외한 모든 문자와 매치됨을 의미한다. 즉, a와 b 문자 사이에 모든 문자가 허용된다. ex) aab, acb, afb, a3b .... |
|
^ |
^app | 문자열의 시작을 나타낸다. ex) ^app apple.... , appads .. 즉, app~로 시작하는 문자열이 모두 매치된다. |
|
$ |
ple$ | 문자열의 종료를 나타낸다. ex) abcple, aee3ple, oefple .... |
|
[] |
apple[a-z] | 집합을 의미한다. ex) [abcd]의 경우 a 또는 b 또는 c또는 d를 의미한다. ex) [^5]일 경우 5를 제외한 모든 문자를 의미한다. ex) [a-c]일 경우, a~c 문자를 의미한다. apple[a-z]는 applee, applec... 와 매치되고 apple4, appleE와 같은 문자일 경우, 매치되지 않는다. |
|
| |
a|b | OR 연산을 의미한다. ex) a|b는 a 또는 b문자열을 의미한다. |
|
() |
(a|b) | 괄호 안의 정규식을 group으로 만든다. 직접 괄호를 통하여 매칭하기 위해서 \(, \[로도 나타낸다. |
|
* |
ca*t | 0회 이상 반복되는 것을 의미한다. ex) ca*t는 ct, cat, caat, caaaaat) 등과 매치된다. |
|
+ |
a+ | 1회 이상 반복되는 것을 말한다. ex) cat, caaat 등 |
|
? |
ca?t | 0회 또는 1회 이상 반복되는 것을 의미한다. ex) ca?t는 cat, ca와 매치된다. |
|
{m} | ca{2} | {m}회 반복하는 것을 말한다. ex) ca{2}는 caa와 매치된다. |
|
{m, n} | ca{m,n} | m 회부터 n회까지 반복됨을 말한다. ex) ca{2,4}p는 caap, caap, cbbbp와 매치된다. |
|
{m,} |
|
|
|
정규식 예제
import re
print (bool(re.match( '[a-c]{3}', 'aaa')))
→ True
pip 명령어가 안먹히거나, pycharm에서 해당 에러메시지로 설치가 안되는 경우 (SSL: CERTIFICATE_VERIFY_FAILED)
Collecting pip==9.0.1
Could not fetch URL https://pypi.python.org/simple/pip/: There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645) - skipping
Could not find a version that satisfies the requirement pip==9.0.1 (from versions: )
No matching distribution found for pip==9.0.1
1. 수정할 파일 경로
C:\Users\사용자 이름\AppData\Local\Programs\Python\Python35\Lib\site-packages\pip\_vendor\requests\sessions.py
2. sessions.py 수정
.............
#: SSL Verification default. False #★
self.verify = False
.............
sessions.py에 있는 모든 verify=True로 되어있는 것을 False로 모두 바꾼다!!
3. 다시 pycharm을 통해서 tensorflow 재설치
4. 설치완료 후, Tensorlfow 예제 실행
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')sess = tf.Session()
print(sess.run(hello))
5. 결과
C:\Users\Aileen\AppData\Local\Programs\Python\Python35\python.exe E:/skcomms/PycharmProject/testProject/HelloTensor.py
b'Hello, TensorFlow!'
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "BestSplits" device_type: "CPU"') for unknown op: BestSplits
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "CountExtremelyRandomStats" device_type: "CPU"') for unknown op: CountExtremelyRandomStats
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "FinishedNodes" device_type: "CPU"') for unknown op: FinishedNodes
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "GrowTree" device_type: "CPU"') for unknown op: GrowTree
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "ReinterpretStringToFloat" device_type: "CPU"') for unknown op: ReinterpretStringToFloat
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "SampleInputs" device_type: "CPU"') for unknown op: SampleInputs
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "ScatterAddNdim" device_type: "CPU"') for unknown op: ScatterAddNdim
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "TopNInsert" device_type: "CPU"') for unknown op: TopNInsert
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "TopNRemove" device_type: "CPU"') for unknown op: TopNRemove
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "TreePredictions" device_type: "CPU"') for unknown op: TreePredictions
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "UpdateFertileSlots" device_type: "CPU"') for unknown op: UpdateFertileSlots
Process finished with exit code 0
나머지 메시지들은 에러가 아니라 정상이고, windows 버전이 아직 안정적이지 않아서 뜨는 오류!
젠장..ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅜㅠㅠㅠ을마나 삽질한거야
[Python] Pyhton 아스키 코드값 구하기 (0) | 2017.04.12 |
---|---|
[Python] Python에서 정규 표현식(Regular Expressions)과 re 모듈 사용법 (0) | 2017.04.12 |
[Python] Python 기초 프로그래밍 (0) | 2017.03.17 |
안드로이드 스튜디오에서 AAR 파일 만들기
1. 안드로이드 스튜디오 프로젝트 오른쪽에 Gradle 아이콘 클릭
2. 클릭하면 화면이 이렇게 나오는데, AAR 파일을 만들 모듈 선택 후 Execute Gradle Task 클릭
3. aR 또는 AssembleRelease 입력 후 OK
4. 하단 Run 탭을 클릭하면, AAR 파일을 만드는 중~
오른쪽 하단의 Gradle Console 클릭
5. build 완료 내용이 출력 확인
6. AAR 생성하려던 모듈 프로젝트/build/ouputs/arr/에 해당 arr파일 생성됨을 확인 가능!
* AAR 파일이란?
Android Archive package의 약자로 안드로이드 Lib용 압축 파일이다.
Java에서 사용되는 lib용으로 자주 사용되는 확장자는 Jar 파일인데, 안드로이드 스튜디오 프로젝트에서는 AAR 파일로 사용한다.
참고 링크
[Android-studio] 안드로이드 스튜디오에서 한글 깨짐 현상 (1) | 2017.02.10 |
---|---|
[Open API] 페이스북 로그인 API 연동하기(2) (0) | 2017.02.09 |
[Open API] 페이스북 로그인 API 연동하기(1) (0) | 2017.02.09 |
[Android-studio] 안드로이드 스튜디오 jar 파일 추가 (0) | 2017.02.09 |
[Android] Cannot checkout from svn: svn E155000: '경로' is already a working copy for diffent URL (1) | 2017.02.09 |
[Android] 안드로이드 activity 종류 변경하기 (0) | 2017.02.08 |
[Android] 안드로이드 android layout title 없애기 (0) | 2017.02.08 |