728x90
반응형

주어진 데이터 중 최소값을 찾음

- 최소값을 맨 앞에 위치한 값과 교환

- 정렬된 데이터를 제외한 나머지 데이터를 같은 방법으로 정렬

- 시간복잡도 : O(n^2)



 [1회전]


 [2회전]


 [3회전]


 [4회전]

선택 정렬의 장점

- 데이터의 양이 적을 때 좋은 성능을 나타냄.

- 작은 값을 선택하기 위해서 비교는 여러번 수행되지만 교환횟수가 적다.


선택 정렬의 단점

- 100개 이상의 자료에 대해서는 속도가 급격히 떨어져 적절히 사용되기 힘들다.


JAVA 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Selection {
    public void sort(int[] data){
        int size = data.length;
        int min; //최소값을 가진 데이터의 인덱스 저장 변수
        int temp;
        
        for(int i=0; i<size-1; i++){ // size-1 : 마지막 요소는 자연스럽게 정렬됨
            min = i;
            for(int j=i+1; j<size; j++){
                if(data[min] > data[j]){
                    min = j;
                }
            }
            temp = data[min];
            data[min] = data[i];
            data[i] = temp;
        }
    }
    public static void main(String[] args) {
            
        Selection selection = new Selection();
        
        int data[] = {66101995};
 
        selection.sort(data);
 
        for(int i=0; i<data.length; i++){
            System.out.println("data["+i+"] : " + data[i]);
        }
    }
}
cs



출처: http://hahahoho5915.tistory.com/7?category=653519 [넌 잘하고 있어]

728x90
반응형
728x90
반응형

1. JAVA

JAVA는 네트워크상에서 쓸 수 있도록 미국의 선 마이크로 시스템즈가 개발한 객체 지향 프로그래밍 언어

JAVA의 특징

a. 자바가상머신(JVM)만 설치하면 컴퓨터의 운영체제에 상관없이 작동한다.(즉, 운영체제에 독립적)

b. 기본 자료형을 제외한 모든 요소들이 객체로 표현

c. 객체 지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언어

d. Garbage Collector를 통한 자동적인 메모리 관리

e. 멀티쓰레드(Multi-thread)를 지원



2. OOP(객체지향 프로그래밍)

OOP란 Object-Oriented Programming의 약어로써 객체지향 프로그래밍을 의미

데이터를 객체로 취급하여 프로그램에 반영한 것이며, 순차적으로 프로그램이 동작하는 기존의 것들과는

다르게 객체와 객체의 상호작용을 통해 프로그램이 동작하는 것을 말한다.

OOP 특징

a. 객체지향 프로그래밍은 코드의 재사용성이 높다.

b. 코드의 변경이 용이

c. 직관적인 코드분석

d. 개발속도 향상

e. 상속을 통한 장점 극대화



3. Object

Object(객체)는 OOP에서 데이터(변수)와 그 데이터에 관련되는 동작(함수). 즉 절차, 방법, 기능을 모두 포함한 개념

예)기차역에서 승차권을 발매하는 경우, 실체인 '손님'과 동작인 '승차권 주문'은 하나의 객체이며, 실체인 '역무원'과

동작인 '승차권 발매'도 하나의 객체이다.

같은 성질, 같은 구조와 형태를 가지는 객체는 등급으로 정의하고 등급에 속하는 객체는 그 등급의 인스턴스라고 한다.



4. Overloading vs Overriding ( 한번공부할때 확실히 차이를 알아둘 것, 평소에 알고 있어도 헷갈림)

Overloading(오버로딩)

같은 이름의 메소드를 여러개 정의하는 것

매개변수의 타입이 다르거나 개수가 달라야 한다.

* return type과 접근 제어자는 영향을 주지 않음.


Overriding(오버라이딩)

- 상속에서 나온 개념

상위 클래스(부모 클래스)의 메소드를 하위 클래스(자식 클래스)에서 재정의



5. Servlet, JSP

Servlet - Container가 이해할 수 있게 구성된 순수 자바 코드로만 이루어진 것(Html in JAVA)

JSP(Java Server Page) - html기반에 JAVA코드를 블록화하여 삽입한 것(JAVA in Html)



6. JDBC

Java Data Base Connection의 약자로 JAVA 언어를 통해 데이터 베이스에 접근 할 수 있는 프로그래밍을 의미



7. Get과 Post 방식

Get 방식

- 클라이언트에서 서버로 데이터를 전달할 때, 주소 뒤에 "이름"과 "값"이 결합된 스트링 형태로 전달

- 주소창에 쿼리 스트링이 그대로 보여지기 때문에 보안성이 떨어진다.

길이에 제한이 있다.(=전송 데이터의 한계가 있다.)

Post방식보다 상대적으로 전송 속도가 빠르다.


Post 방식

- 일정 크기 이상의 데이터를 보내야 할 때 사용한다.

- 서버로 보내기 전에 인코딩하고, 전송 후 서버에서는 다시 디코딩 작업을 한다.

- 주소창에 전송하는 데이터의 정보가 노출되지 않아 Get방식에 비해 보안성이 높다.

속도가 Get방식보다 느리다.

- 쿼리스트링(문자열) 데이터 뿐만 아니라, 라디오 버튼, 텍스트 박스 같은 객체들의 값도 전송가능.


Get과 Post 차이점

- Get은 주로 웹 브라우저가 웹 서버에 데이터를 요청할 때 사용

- Post는 웹 브라우저가 웹 서버에 데이터를 전달하기 위해 사용.

- Get을 사용하면 웹 브라우저에서 웹 서버로 전달되는 데이터가 인코딩되어 URL에 붙는다.

- Post방식은 전달되는 데이터가 보이지 않는다.

- Get방식은 전달되는 데이터가 255개의 문자를 초과하면 문제가 발생할 수 있다.

- 웹서버에 많은 데이터를 전달하기 위해서는 Post 방식을 사용하는 것이 바람직하다.



8. Session과 Cookie

Session과 Cookie 사용 이유

- 현재 우리가 인터넷에서 사용하고 있는 HTTP프로토콜은 연결 지향적인 성격을 버렸기 때문에 새로운 페이지를 요청할 때마다

 새로운 접속이 이루어지며 이전 페이지와 현재 페이지 간의 관계가 지속되지 않는다. 이에 따라 HTTP프로토콜을 이용하게 되는 

 웹사이트에서는 웹페이지에 특정 방문자가 머무르고 있는 동안에 그 방문자의 상태를 지속시키기 위해 쿠키와 세션을 이용한다.


Session

- 특정 웹사이트에서 사용자가 머무르는 기간 또는 한 명의 사용자의 한번의 방문을 의미한다.

- Session에 관련된 데이터는 Server에 저장된다.

- 웹 브라우저의 캐시에 저장되어 브라우저가 닫히거나 서버에서 삭제시 사라진다.

- Cookie에 비해 보안성이 좋다.


Cookie

- 사용자 정보를 유지할 수 없다는 HTTP의 한계를 극복할 수 있는 방법

- 인터넷 웹 사이트의 방문 기록을 남겨 사용자와 웹 사이트 사이를 매개해 주는 정보이다.

- Cookie는 인터넷 사용자가 특정 웹서버에 접속할 때, 생성되는 개인 아이디와 비밀번호, 방문한 사이트의 정보를 담은 임시 파일로써,

  Server가 아닌 Client에 텍스트 파일로 저장되어 다음에 해당 웹서버를 찾을 경우 웹서버에서는 그가 누구인지 어떤 정보를 주로 찾았는지 등을 파악할 때 사용된다.

- Cookie는 Client PC에 저장되는 정보기 때문에, 다른 사용자에 의해서 임의로 변경이 가능하다.(정보 유출 가능, Session보다 보안성이 낮은 이유)


Q. 보안성이 낮은 Cookie 대신 Session을 사용하면 되는데 안하는 이유?

A. 모든 정보를 Session에 저장하면 Server의 메모리를 과도하게 사용하게 되어 Server에 무리가 감



9. MVC 패턴

MVC란?

- 객체지향프로그래밍에서, MVC란 사용자 인터페이스를 성공적이며 효과적으로 데이터 모형에 관련 시키기 위한 방법론 또는 설계 방식중 하나이다. MVC방식은 자바, Smalltalk,

- MVC 패턴은 목적 코드의 재사용에 유용한 것은 물론, 사용자 인터페이스와 응용프로그램 개발에 소요되는 시간을 현저하게 줄여주는 형식이라고 많은 개발자들이 평가하고 있다.

MVC 구성요소

Model - 소프트웨어 응용과 그와 관련된 고급 클래스 내의 논리적 데이터 기반 구조를 표. 이 목적 모형은 사용자 인터페이스에 관한 어떠한 정보도 가지고 있지 않다.

View - 사용자 인터페이스 내의 구성요소들을 표현(사용자에게 보여지는 화면)

Controller - Model과 View를 연결하고 있는 클래스를 대표, Model과 View 내의 클래스들 간 정보 교환하는데 사용.



10. Interface, Abstract

Interface

일종의 추상 클래스

- 오직 추상메서드와 상수만을 멤버로 갖는다.

Implements 키워드를 사용

- 상속의 관계가 없는 클래스간 서로 공통되는 로직을 구현하여 쓸 수 있도록한다.

- Extends는 하나의 클래스만 상속 가능하나 Interface는 다중 상속이 가능하다.

Abstract

추상메서드를 하나 이상 가진 클래스

자신의 생성자로 객체 생성 불가능

- 하위 클래스를 참조하여 상위 클래스의 객체를 생성

- 하위 클래스를 제어하기 위해 사용


Interface vs Abstract

공통점 

- new 연산자로 인스턴스 생성 불가능.

- 프로토타입만 있는 메서드를 갖는다.

- 사용하기 위해서는 하위클래스에서 확장/구현 해야 한다.

차이점

- 사용하는 키워드가 다르다.

- Abstract는 일반 메서드를 사용할 수 있지만, Interface는 메서드 선언만 가능하다.



11. Call by Reference, Call by Value

Call by Reference - 매개 변수의 원래 주소에 값을 저장하는 방식. 클래스 객체를 인수로 전달한 경우

Call by Value - 인수로 기본 데이터형을 사용. 주어진 값을 복사하여 처리하는 방식. 메서드 내의 처리 결과는 메서드 밖의 변수에 영향을 미치지 않는다.



12. Static의 의미 

- 클래스가 로딩될 때, 메모리 공간을 할당하는데 처음 설정된 메모리 공간이 변하지 않음을 의미

- 객체를 아무리 많이 만들어도 해당 변수는 하나만 존재(객체와 무관한 키워드)



13. Framework
- 특정 형태의 소프트웨어 문제를 해결하기 위해 상호 협력하는 클래스프레임과 인터페이스 프레임의 집합
- 특정한 틀을 만들어놓고 거기에 살을 붙여 놓음으로써 프로그램을 만들어 작업시간을 줄여주는 것이다. 
- 프레임워크는 특정 개념들의 추상화를 제공하는 여러 클래스나 컴포넌트로 구성된다.
- 프레임워크는 이렇게 추상적인 개념들이 문제를 해결하기 위해 같이 작업하는 방법을 정의한다.
- 프레임워크 컴포넌트 들은 재사용이 가능하다.
- 프레임워크는 좀 더 높은 수준에서 패턴을 조작한다.
* 프레임워크가 중요한 이유는 객체지향 개발을 하게 되면서 개발자의 취향에 따라 다양한 프로그램이 나오게 되었다.
 프로그램 개발에 투입되는 개발자도 점점 늘어남에 따라 전체 시스템의 통합성, 일관성이 부족하게 되었기 때문이다. 
 그래서 개발자의 자유를 제한하기 위해 프레임워크를 도입했다.

프레임워크가 가져야할 특징
a. 개발자들이 따라야할 가이드라인을 가진다.
b. 개발할 수 있는 범위가 정해져 있다.
c. 개발자를 위한 다양한 도구들이 지원된다.

프레임워크의 장/단점
장점 - 개발 시간을 줄일 수 있고 오류로부터 자유로울 수 있다.
단점 - 프레임워크에 너무 의존하면 개발 능력이 떨어져서 프레임워크 없이 개발하는 것이 불가능해지는 점이다.


14. Garbage Collection(가비지 컬렉션)

시스템에서 더이상 사용하지 않는 동적 할당된 메로리 블럭을 찾아 자동으로 다시 사용 가능한 자원으로 회수하는 것으로 

시스템에서 가비지컬렉션을 수행하는 부분을 가비지 컬렉터라 부른다.



15. Primitive type과 Reference type

Primitive type - 변수에 값 자체를 저장 

정수형 byte, short, int, long

실수형 float, double

문자형 char

논리형 boolean

Primitive type은 Wrapper Class를 통해 객체로 변형할 수 있다.

예) int→Integer, char→Character(int와 char를 제외한 Primitive type의 다른 자료형들은 맨 앞 알파벳을 대문자로 바꿔주면 된다. float→Float)

Reference type - 메모리상에 객체가 있는 위치를 저장

종류 - Class, Interface, Array 등



16. Wrapper Class

Primitive type으로 표현할 수 있는 간단한 데이터를 객체로 만들어야 할 경우가 있는데 그러한 기능을 지원하는 클래스



17. Spring Framework(스프링 프레임워크)

자바(JAVA) 플랫폼을 위한 오픈소스(Open Source) 애플리케이션 프레임워크(Framework)

자바 엔터프라이즈 개발을 편하게 해주는 오픈 소스 경량급 애플리케이션 프레임워크

자바 개발을 위한 프레임워크로 종속 객체를 생성해주고,  조립해주는 도구

자바로 된 프레임워크로 자바SE로 된 자바 객체(POJO)를 자바EE에 의존적이지 않게 연결해주는 역할

스프링 특징 간단히

- 크기와 부하의 측면에서 경량.

- 제어 역행(IoC)이라는 기술을 통해 애플리케이션의 느슨한 결합을 도모

- 관점지향 프로그래밍(AOP)을 위한 풍부한 지원

- 애플리케이션 객체의 생명 주기와 설정을 포함하고 관리한다는 점에서 일종의 컨테이너(Container)라고 할 수 있음

- 간단한 컴포넌트로 복잡한 애플리케이션을 구성하고 설정할 수 있음

스프링 특징 자세히

a. 경량 컨테이너로서 자바 객체를 직접 관리.

   각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.

b. 스프링은 POJO(Plain Old Java Object) 방식의 프레임워크.

   일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에 

   존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍다.

c. 스프링은 제어의 역행(IoC : Inversion of Control)을 지원.

   컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.

d. 스프링은 의존성 주입(DI : Dependency Injection)을 지원

   각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.

e. 스프링은 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)을 지원

   따라서 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.

f. 스프링은 영속성과 관련된 다양한 서비스를 지원

   iBatis나 Hibernate 등 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.

g. 스프링은 확장성이 높음.

   스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하기 때문에 수많은 라이브러리가 

   이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.



18. Thread

Thread(쓰레드) 프로세스내에서 동시에 실행되는 독립적인 실행 단위를 말함, 장점으로는 자원을 많이 사용하지 않고 구현이 쉬우며 범용성이 높다

Process(프로세스) 운영체제에서 실행중인 하나의 프로그램(하나 이상의 쓰레드를 포함한다.)

Thread 장점

- 빠른 프로세스 생성

- 적은 메모리 사용

- 쉬운 정보 공유

Thread 단점

교착상태에 빠질 수 있다.

* 교착상태 - 다중프로그래밍 체제에서 하나 또는 그 이상의 프로세스가 수행 할 수 없는 어떤 특정시간을 기다리고 있는 상태.

Thread와 Process 차이

여러 분야에서 '과정' 또는 '처리'라는 뜻으로 사용되는 용어로 컴퓨터 분야에서는 '실행중인 프로그램'이라는 뜻으로 쓰인다. 

이 프로세스 내에서 실행되는 각각의 일을 스레드라고 한다. 프로세스 내에서 실행되는 세부 작업 단위로 여러 개의 스레드가 하나의 프로세스를 이루게 되는 것이다.



19. 접근제한자(public > protected > default > private)

public 접근 제한이 없다.(같은 프로젝트 내에 어디서든 사용가능)

protected 같은 패키지 내다른 패키지에서 상속받아 자손클래스에서 접근 가능 

default 같은 패키지 내에서만 접근 가능

private 같은 클래스 내에서만 접근 가능



20. 소켓 통신(TCP/UDP)

TCP(Transmission Control Protocol)

연결형 서비스 제공

높은 신뢰성 보장

- 연결의 설정(3-way handshaking)

- 연결의 해제(4-way handshaking)

데이터 흐름 제어, 혼잡 제어

- 전이중, 점대점 서비스(양방향 송수신 서비스)

UDP(User Datagram Protocol)

비연결형 서비스 제공

신뢰성이 낮음

데이터의 전송 순서가 바뀔 수 있음

- 데이터 수신 여부 확인 안함(3-way handshaking과 같은 과정 X)

- TCP보다 전송속도가 빠름



21. Stack, Queue

STACK

LIFO(Last In First Out)의 후입선출 구조

- push();를 이용한 데이터 입력, pop();을 이용한 데이터 출력

- 예) 시스템 스택 : 함수의 호출과 복귀 순서는 스택의 구조를 응용하여 관리

- 역순 문자열 만들기, 수식의 괄호 검사, 수식의 후위 표기법 변환

QUEUE

FIFO(First In First Out)의 선입선출 구조

- enQueue();를 이용한 데이터 입력, deQueue();를 이용한 데이터 출력

- 예) 우선순위가 같은 작업 예약(인쇄 대기열), 선입선출이 필요한 대기열(티켓 카운터)

* Linear Queue(선형큐)는 메모리 재사용이 불가능 이러한 문제점을 보완하여 Circular Queue(원형 큐)가 나옴



22. Singleton Design Patter(싱글톤 디자인 패턴, 싱글톤 패턴)

- 클래스 인스턴스가 하나만 만들어지도록 하고, 그 인스턴스에 대한 전역 접근을 제공한다.



23. Database에서 Index란?

인덱스는 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료 구조를 일컫는다.

인덱스는 테이블 내의 1개의 컬럼, 혹은 여러 개의 컬럼을 이용하여 생성될 수 있다.

고속의 검색 동작뿐만 아니라 레코드 접근과 관련 효율적인 순서 매김 동작에 대한 기초를 제공한다.

인덱스를 저장하는 데 필요한 디스크 공간은 보통 테이블을 저장하는 데 필요한 디스크 공간보다 작다.


데이터베이스에서 테이블과 클러스터에 연관되어 독립적인 저장 공간을 보유하고 있는 객체(object)이다. 

사용자는 데이터베이스에 저장된 자료를 더욱 빠르게 조회하기 위하여 인덱스를 생성하고 사용한다. 


DB에서 자료를 검색하는 두 가지 방법

FTS(Full Table Scan) : 테이블을 처음 부터 끝까지 검색하는 방법

Index Scan : 인덱스를 검색하여 해당 자료의 테이블을 액세스 하는 방법.



출처: http://hahahoho5915.tistory.com/16 [넌 잘하고 있어]

728x90
반응형
728x90
반응형

동기화 (synchronization)

 - 멀티스레드 프로그램이 실행될 때, 다수의 스레드가 공유 데이터를 동시에 접근하는 경우가 발생한다.

 - 특히 다수의 스레드가 동시에 공유 데이터의 값을 변경시키는 경우에는 공유 데이터의 값이 정상적으로 변경되지 않는다.

 - 이것은 마치 여러 사람이 볼 일을 보려고 한 칸의 화장실에 동시에 들어가는 경우와 같다.
 - 공유 데이터를 동시 접근하는 여러 스레드에 의해 공유 데이터의 값이 비정상적으로 유지되지 않도록 스레드의 실행을 제어하는 기술을 스레드 동기화(thread synchronization)라고 부른다.

 - 스레드를 동기화하는 방법

 방법 1 : synchronized로 동기화 블럭 지정

 방법 2 : wait()-notify() 메서드로 스레드 실행순서를 제어

 

 

synchronized로 동기화 블럭 지정

 - 동기화된 메소드를 만들기 위해서는 synchronized키워드를 메소드 선언에 붙이면 된다.

 - synchronized 키워드가 붙어 있으면 하나의 스레드가 공유 메소드를 실행하는 동안에 다른 스레드는 공유 메소드를 실행할 수 없다.

     Class Counter {

             private int value=0;

             public synchronized void increment() { value++; }       //공유 데이터를 조작하는 메소드 앞에 synchronized를 붙인다.

             public synchronized void deccrement() { value--; }

             public synchronized void printCounter() { System.out.println(value); }

      }

 

 

synchronized로 동기화 블럭 지정

 - synchronized를 사용하면 하나의 스레드가 진입하면 스레드 작업이 끝날때까지 다른 스레드는 진입할 수 없다.

>>동기화_방법1

 

 

 

 

wait()-notify() 메서드로 스레드 실행순서를 제어

 - Object 클래스의 메서드로서 synchronized에서만 사용 가능하다.

 - synchronized 키워드를 이용해 공유된 객체의 자원을 하나의 스레드에서만 사용할 수 있게 락(lock)상태를 만들면 다른 스레드에서도 사용할 수 있게 만들기 위해 스레드간의 통신이 필요하다.

 - 이 때 자원을 점유하고 있던 동기화된 스레드가 wait() 메서드를 호출하면 락 상태의 자원을 더이상 사용하지 않고 대기 상태에 들어가고, notity메서드를 호출하면 다른 스레드에게 락 상태에 자원이 사용 가능함을 알리게 하여 다른 스레드들을 대기상태에서 자원을 사용 할 수있는 준비상태로 깨우게 된다.

 

>>동기화_방법2

728x90
반응형
728x90
반응형

스레드(thread)

 - 멀티 태스킹(muli-tasking) : 여러 개의 애플리케이션을 동시에 실행하여서 컴퓨터 시스템의 성능을 높이기 위한 기법

 - 다중 스레딩 : 하나의 프로그램이 동시에 여러 가지 작업을 할 수 있도록 하는 것

 - 각각의 작업은 스레드 라고 한다.

 

 

 

프로세스와 스레드

 프로세스(process) : 자신만의 데이터를 가진다.

 스레드(thread) : 동일한 데이터를 공유한다.

 

 

 

프로그램과 프로세스

  프로그램 ---(실행)---> 프로세스

 

▶프로그램:실행 가능한 파일(HDD)                        ▶프로세스:실행 중인 프로그램(메모리)

 

 

프로세스와 스레드

 프로세스 : 실행 중인 프로그램. 자원(resources)과 스레드(thread)로 구성

 스레드(thread) : 프로세스 내에서 실제 작업을 수행하는 것, 모든 프로세스는 하나 이상의 스레드를 가지고 있다.

           프로세스 : 스레드 = 공장 : 일꾼            

 

 

멀티프로세스와 멀티스레드

 " 하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 스레드를 생성하는 것이 더 적은 비용이 든다." 

 

 

 

멀티스레드의 장단점

 장점

- CPU의 사용률을 향상시킨다.

- 자원을 보다 효율적으로 사용할 수 있다.

- 사용자에 대한 응답성(responseness)이 향상된다.

- 작업이 분리되어 코드가 간결해 진다.

 

 단점

- 동기화(synchronization)에 주의해야 한다.

- 교착상태(dead-lock)가 발생하지 않도록 주의해야 한다.

- 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 한다.

- 프로그래밍할 때 고려해야 할 사항들이 많다.

※교착상태(dead-lock) : 두 스레드가 자원을 점유한 상태에서 서로 상대편이 점유한 자원을 사용하려고 기다리느라 진행이 멈춰있는 상태

 

 

 

스레드를 사용해야 하는 이유

- 웹 브라우저에서 웹 페이지를 보면서 동시에 파일을 다운로드할 수 있도록 한다.

- 워드 프로세서에서 문서를 편집하면서 동시에 인쇄한다.

- 게임 프로그램에서는 응답성을 높이기 위하여 많은 스레드를 사용한다.

- GUI에서는 마우스와 키보드 입력을 다른 스레드를 생성하여 처리한다.

 

 

스레드 생성과 실행

 스레드는 Thread 클래스가 담당한다. (java.lang.Thread)

        Thread t= new Thread();       //스레드 객체를 생성한다.

         t.start();                              //스레드를 시작한다.       

 스레드의 작업은 Thread 클래스의 run() 메서드 안에 기술한다.

 

 

 

스레드를 사용하는 방법

  스레드 생성 방법

    Thread 클래스를 상속하는 방법 :Thread 클래스를 상속받은 후에run() 메서드를 오버라이딩한다.Thread 클래스를 상속 받으면 다른 클래스는 상속받을수 없다.

    Runnable 인터페이스를 구현하는 방법 : run() 메서드를 가지고 있는 클래스를 작성하고, 이 클래스의 객체를 Thread 클래스의 생성자를 호출할 때 전달한다.

 

1. Thread클래스를 상속

  class MyThread extends Thread {

         public void run () { /* 작업내용 */ } //Thread클래스의 run()을 오버라이딩

   }

 

2. Runnable인터페이스를 구현

  class MyThread implements Runnable {

         public void run () { /* 작업내용 */ }  // Runnable인터페이스의 추상메서드 run()을 구현

   }

 

 

 

Thread 클래스 상속하는 방법

 - Thread를 상속받아서 클래스를 작성한다. (java.lang.Thread)

 - run() 메서드를 오버라이딩한다.

     class My Thread extends Thread {

          public void run()  {

                ...    // 수행해야하는 작업을 적어준다.

           }

      }

- Thread 객체를 생성한다.

        Thread t = new MyThread ();

- start()를 호출하여서 스레드를 시작한다.

         t.start();

 

 

>>Thread 클래스 상속하는 방법

 

 

 

 

Runnable 인터페이스를 구현하는 방법

 - Runnable 인터페이스를 구현한 클래스를 작성한다. (java.lang.Runnable)

 - run() 메서드를 오버라이딩 한다.

        class MyRunnable implements Runnable {

                public void run() {

                      ...

                 }

        }

 - Thread 객체를 생성하고 이때 MyRunnable 객체를 인수로 전달한다.

        Thread t = new Thread(new MyRunnable ());

 - start()를 호출하여 스레드를 시작한다.

        t.start();

 

 

 

>>Runnable 인터페이스를 구현하는 방법

 

 

 

 

 

 

Thread 클래스의 메서드

 

 

 

 

 

>>싱글 스레드

하나의 스레드로 사용자의 입력을 받는 작업과 하면에 숫자를 출력하는 작업을 처리하기 때문에 사용자가 입력을 종료하기 전까지는 화면에 숫자가 출력되지 않고, 입력을 마치면 화면에 숫자가 출력된다.(※ 사용자가 입력을 종료하기 전까지는 아무 일도 못하고 기다려야 한다.)

 

 

 

 

 

 

>>멀티 스레드

두 개의 스레드로 사용자의 입력을 받는 작업과 화면에 숫자를 출력하는 작업을 처리하기 때문에 사용자의 입력을 기다리는 동안 다른 스레드가 작업을 처리할 수 있다. 입력받는 부분과 출력하는 부분을 두 개의 스레드로 나누어 처리하기 때문에 사용자가 입력을 종료하지 않아도 화면에 숫자가 출력된다.

 

 

 

 

 

>>main 스레드

 

 

​>>sleep() 메서드

​sleep()은 CPU의 시간을 다른 스레드에게 넘겨주는 방법이다. 다른 스레드와 보조를 맞추는 역할도 한다.

 

​join() 메서드

- 하나의 스레드가 다른 스레드의 종료를 기다리게 하는 메서드이다.

- 예를 들어서 t가 현재 실행 중인 스레드 객체이면 다음 문장을 t가 종료될 때까지 기다린다.

>>join() 메서드

join()을 사용하지 않으면 main()이 바로 종료되지만, join()을 사용해서 th1과 th2의 작업을 마칠때까지 main()이 기다리도록 한다.

한 쓰레드의 작업 중간에 다른 쓰레드의 작업이 필요할 때 join()을 사용한다.

 

 

>>join() 메서드

두 스레드가 번갈아가며 실행되지 않고, 순차적으로 실행되는 경우 (th1 실행 후 th2 실행)

 

728x90
반응형
728x90
반응형

다형성(polymorphism)

- 객체들의 타입이 다르면 똑같은 메시지가 전될되더라도 서로 다른 동작을 하는 것

- 강아지의 speak()메서드에서는 "멍멍"이라고 동작하고, 고양이의 speak()메서드에서는 "야옹"이라고 동작하도록 구현하는 것


상향 형번환(UP-Casting)

- 부모타입의 참조변수로 자식타입의 객체를 다룰 수 있는 것

- 서로 상속관계에 있는 타입간의 형변환만 가능하다.

- 자식 타입에서 부모타입으로 형변환하는 경우에는 형변환 생략가능하다.


상향 형변환이 가능한 이유

- 자식클래스 객체는 부모클래스 객체를 포함하고 있기 때문이다.



<형변환 사용하는 이유>



<형변환 사용한 경우>






객체의 타입을 알아내는 방법

  Shape s=getShape();     //참조변수 s가 가리키는 객체의 실제 타입은? Shape일수도 있지만 Rectangle일수도 있고 Circle일수도 있다.

   if ( s instanceof Rectangle ) {

        System.out.println("Rectangle이 생성되었습니다.");

   }

  else {

        System.out.println("Rectangle이 아닌 다른 객체가 생성되었습니다.");

  }





다형성의 이용

  메서드의 매개변수로 부모클래스의 참조변수를 이용한다.

  -> 다형성을 이용하는 전형적인 방법

 




제어자 조합할 때 주의사항

메서드에 static과 abstract를 함께 사용할 수 없다.

-> static메서드는 몸통(구현부)이 있는 메서드에만 사용할 수 있기 때문이다.

클래스에 abstract와 final을 동시에 사용할 수 없다.

-> 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고, abstract는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문이다.

abstract메서드의 접근제어자가 private일 수 없다.

-> abstract메서드는 자손클래스에서 구현해주어야 하는데 접근 제어자가 private이면, 자손 클래스에서 접근할 수 없기 때문이다.

메서드에 private와 final을 같이 사용할 필요는 없다.

-> 접근 제어자가 final인 메서드는 오버라이딩될 수 없기 때문이다.

728x90
반응형

+ Recent posts