반응형
반응형


 쓰레드(Thread)와 런에이블(Runnable) 2편






반응형
반응형

추상(abstract) 클래스와 인터페이스(interface) 클래스


1. 추상  클래스와  추상 메소드란?

추상클래스란 말 그대로 추상적으로 밖에 그려지지 않은 클래스라고 한다. 즉, 클래스가 전체적인 구성을 다 가지지 못한 채 설계만 되어있는 클래스이다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스를 생성할 수는 없다. 추상클래스는 상속(Extends)을 통해서 자식 클래스에 의해 완성이 된다. 그래서 추상클래스 자체로는 제 기능을 다하지는 못하지만, 새로운 기능을 정의하는데 있어서 바탕(틀)이 될 수 있다!


package ch7;


// 추상 클래스는 class 선언부 앞에 abstract를 적어준다.

abstract class 클래스명 {

.....

abstract 메소드명();  // 추상 메소드

}

  • 추상 메소드가 하나 이상 포함되면 반드시 추상클래스로 선언이 되어야 한다.
  • 추상클래스에서 추상 메소드가 아닌 일반 메소드를 포함시킬 수 있다.
  • 추상클래스를 상속하는 자식 클래스에서 부모가 가진 메소드를 모두 오버라이딩 해야 한다.
  • 추상 메소드는 몸체가 없고 선언부만 존재한다.
예제 1

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 메소드(매개변수);

}

  • 모든 멤버변수는 public static final 이어야하며, 이를 생략할 수 있다.
  • 모든 메소드는 public abstract 이어야 하며, 이를 생략할 수 있다.
  • 인터페이스는 인터페이스로부터만 상속(Extends)받을 수 있으며, 클래스와 달리 다중 상속이 가능하다.
    ex) interface Fightable extends Movable, Attackable{ } 
    여기서 MovableAttackable은 모두 interface 클래스다.
인터페이스의 구현
 class A2 {

    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


인터페이스 클래스의 장점

  1. 개발 시간을 단축시킬 수 있다.
    메소드를 호출하는 쪽에서는 메소드의 내용에 관계없이 선언부만 알면 되기 때문이다. 
  2. 표준화가 가능하다.
    프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램의 개발이 가능하다.
  3. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
    서로 상속관계에 있지도 않고, 같은 조상 클래스를 가지고 있지 않은 서로 아무런 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어줄 수 있다.

  4. 독립적인 프로그래밍이 가능하다.
    인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제 구현에 독립적인 프로그램을 작성하는 것이 가능하다.
    클래스와 클래스 간의 직접적인 관계를 인터페이스를 통해서 간접적인 관계로 변경하면 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.



참고링크

  • 자바의 정석


반응형
반응형

쓰레드(Thread)와 런에이블(Runnable) 1편

본 게시물은 jdk 1.8 기준으로 작성되었습니다.

1. 쓰레드(Thread)란?

프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)를 할당 받아서 프로그램이 실행된다. 프로그램이 실행된 결과물이 바로 프로세스이다예를 들어 윈도우의 Ctrl + Shift + ESC를 하면 탭 부분에 프로세스가 보이는데 클릭해보면 실행 중인 프로세스 리스트가 보인다. 즉, 실행 중인 프로그램 = 프로세스!

  • 프로세스 = 데이터(data) + 자원(memory) + 쓰레드(Thread) 로 구성되어서 실제로 프로그램이 실행되기까지는 쓰레드(Thread)가 바로 데이터(data)+자원(memory)를 활용하여서 작업을 수행한다.
  • 쓰레드(Thread) 작업을 수행하려면 메모리 공간이 필요하므로 메모리의 한계에 따라서 최대로 생성할 수 있는 쓰레드 수가 결정된다.
  • 모든 프로세스에는 최소한 하나 이상의 쓰레드(Thread)가 존재하며, 두 개 이상의 쓰레드(Thread)를 가지면 멀티-쓰레드(multi-threaded) 라고 한다.

2. 쓰레드(Thread) 구현하기

자바에서 쓰레드를 구현하는 방식은 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 문서를 확인해보자.

voidstart()
이 스레드가 실행을 시작하도록합니다. Java 가상 머신 run이 thread  메소드를 호출합니다 .
voidrun()
이 스레드가 별도의 Runnable실행 객체 를 사용하여 작성된 경우 해당 Runnable객체의 run메소드가 호출됩니다. 
그렇지 않은 경우, 이 메서드는 아무 것도 수행하지 않고 반환합니다.
  1. start 메소드는 thread의 메소드를 호출하고, run메소드는 Runnable 실행 객체를 사용하여서 작성된 경우에만 Runnable의 run메소드가 호출된다고 적혀있다. 그러므로 Thread를 실행시킬 때에는 start메소드를 통해서 실행시켜야하며, run을 통해서도 실행은 되지만 정확히는 Thread를 이용하여 실행시킨 것은 아니다.
  2. 1번의 내용을 더 자세하게 설명 하자면 JVM의 Call stack 메모리를 생각해보자. 쓰레드를 사용하기 위해서는 쓰레드 만의 독립적인 작업 공간(Memory)가 할당된 후 Call stack이 만들어진다. 그 후에 Call stack 안에 각 실행하고자 run()과 같은 메소드들이 올라가게 되고 Call stack에 있는 내용들이 모두 실행이 되고 나면 쓰레드는 작업 공간을 반환되며 메모리가 소멸된다. 그러므로 쓰레드를 정확히 사용하기위해서는 Start() 메소드를 사용하여야 한다.


[방법 2] Runnable로 쓰레드 구현하기


class RunnableImplements implements Runnable {


// Runnable인터페이스의 추상메서드 run()을 구현

public void run() {

// 작업내용

} 

}

  • Thread와 다른 점은 Runnable 클래스를 implements하였다는 점이다.
  • 그러므로 Thread보다 더 확장성 있는 코드를 만들 수 있다. (오버로딩하여서 작성하여야하므로)

예제 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편 


반응형
반응형

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 버전이 아직 안정적이지 않아서 뜨는 오류!


젠장..ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅜㅠㅠㅠ을마나 삽질한거야 

반응형
반응형
  1. [WIKI 문서https://wikidocs.net/book/110
  2. [코드아카데미] https://www.codecademy.com/ko/courses/python-advanced-ko/0/1?curriculum_id=53b5e0d8fed2a81590000003


반응형
반응형

안드로이드 스튜디오에서 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 파일로 사용한다. 


참고 링크


반응형

+ Recent posts