패키지
- 서로 관련있는 클래스와 인터페이스를 하나의 단위로 묶는 것을 의미
- 일종의 Library(자료실)
- package 패키지경로명으로 사용
- 주석문을 제외하고 반드시 소스파일의 첫줄에 와야 함
import static java.lang.*;
system.out.print() → out.print()로 사용가능
:있는 기능인데 많이 사용하지는 않음, 명시하는것이 좋을 것
예외
- 예외(Exception) : 가벼운 오류이며 프로그램적으로 처리
- 오류(Error) : 치명적인 오류이며 JVM에 의존하여 처리
예외처리 try-catch
try{
//예외가 발생가능한 문장들
}catch(예상되는 예외 객체 변수명){
//해당 예외가 발생했을 때 수행할 문장들
}
- 정상적으로 종료시키기 위함.
** exception을 사용하면 모든 오류 잡을 수 있음 → 자바는 상속구조라서 exception을 받기 때문에
throws 예약어
public static void 메소드명 throws ~~Exception
finally
try{
//예외가 발생가능한 문장들
}catch(예상되는 예외 객체 변수명){
//해당 예외가 발생했을 때 수행할 문장들
}finally{
//예외 발생 여부와 상관없이 수행할 문장들
//DB를 닫는다던가 파일을 다룬다거나 네트워크를 끊는다거나 할 때 사용
**위에서 return을 해도 동작함
}
public class Exam {
public static void main(String[] args) {
int var[] = {10,200,30};
for(int i=0; i <= 3; i++) {
try {
System.out.println("var["+i+"]:"+var[i]);
}catch(ArrayIndexOutOfBoundsException ae) {
System.out.println("배열을 넘었습니다.");
return;
}finally {
System.out.println("::::finally::::");
}
} //for 끝
System.out.println("프로그램 끝!");
}
}
>>>
var[0]:10
::::finally::::
var[1]:200
::::finally::::
var[2]:30
::::finally::::
배열을 넘었습니다.
::::finally::::
사용자 정의 예외처리
~~ UserException extends Exception {
}
제네릭 Generics
컬렉션(자료구조)
객체들을 저장(수집)하는 구조적인 성격을 보강하기 위해 제공되는 것
필요성
- 특정 컬렉션(자료구조)에 원하는 객체 ㄷ타입을 명시하여 실행하기 전에 컴파일 단계에서 지정된 객체가 아니면 절대 저장이 불가능
- 실행시 자원 검출을 하게 되면 별도의 형 변환(Casting)이 필요없이 <>사이에 선언한 객체 자료형으로 변환되어 편함
<1글자로 된 영문대문자>
API에서는 전달되는 객체가 현 객체 내에서 자료형(type)으로 쓰일 때 T로 유도를 하고 있음
전달되는 객체가 현 객체 내에서 하나의 요소(element)로 자리 잡으면 E로 유도
class GenericEx<T> {
T[] v;
public void set(T[] n) {
v = n;
}
public void print() {
for(T s: v) {
System.out.println(s);
}
}
}
public class GenericExam{
public static void main(String[] args) {
GenericEx<String> t = new GenericEx<String>();
String[] ss = {"가","나","다"};
t.set(ss);
t.print();
}
}
자바 컬렉션 프레임워크
Interfaces (인터페이스)
Implementations (구현객체)
Algorithms (메서드)
Set 인터페이스
Set ← HashSet
← TreeSet
Set내에 저장되는 객체들은 큭별한 기준에 맞춰서 정렬되지 않는다.
그리고 저장되는 객체들간의 중복된 요소가 발생하지 못하도록 내부적으로 관리되고 있다
HashSet
내부적으로 HashMap사용 얻어지는 Iterator의 정렬상태를 보장하지 못하므로 특정한 기준으로 정렬을 이루고 있지 않으며 저장및 검출과 같은 동작에는 일정한 시간을 필요로한다
→ add, remove
TreeSet
내부적으로 set인터페이스 구현 TreeMap의 후원을 받는다
기본적으로 얻어지는 Iterator의 요소들은 오름차순 정렬 상태를 유지하고 있다.
import java.util.HashSet;
public class Exam {
public static void main(String[] args) {
String[] str = {"java","beans","java","XML"};
HashSet<String> hs1 = new HashSet<String>();
HashSet<String> hs2 = new HashSet<String>();
for (String n: str) {
if (!hs1.add(n)) {
hs2.add(n);
}
}
System.out.println("hs1:"+hs1);
hs1.removeAll(hs2);
System.out.println("hs1:"+hs1);
System.out.println("hs2:"+hs2);
}
}
List 인터페이스
Sequence라고도 하며 시작과 끝이 선정되어 저장되는 요소들을 일관적인 정렬상태를 유지하면서 요소들의 저장이 이루어진다.
가변적 길이를 가진다
List → Stack : LIFO구조 push, pop사용
→ Vector : 배열과 같이 정수 인덱스로 접근할 수 있음. 스레드 동기화 기우너되는 구조
→ ArrayList : 스레드 동기화는 지원하지 않는다
Queue
LinkedList
offer
Map
key-value 값을 가진다
Hashtable : null 허용X
HashMap : null 허용한다
import java.util.HashMap;
import java.util.Set;
public class Exam {
public static void main(String[] args) {
String[] str = {"자바","beans","java","XML"};
HashMap<Integer, String> map = new HashMap<Integer,String>();
for (int i = 0; i< str.length; i++) {
map.put(i, str[i]);
}
Set<Integer> keys = map.keySet();
for(Integer n : keys) {
System.out.println(map.get(n));
}
}
}
>>>
자바
beans
java
XML
내부 클래스
특정 클래스 내에 또 다른 클래스가 정의되는 것을 의미한다.
종류
Member : (현업사용)
Local
Static
Anonymous : (현업사용)(가장 많이 사용)
Member class
객체를 생성해야만 사용할 수 있는 멤버들과 같은 위치에 정의 되는 클래스
내부 클래스 생성하려면 외부 클래스의 객체를 생성한 후에 사용할 수 있다
Class Outer{
Class Inner{
...
>>> MemberInner.Inner inner = new MemberInner().new Inner();
public class InnerClassExam {
int a;
private int b = 100;
static int c = 200;
class Inner {
public void printData() {
System.out.println("a : "+a);
System.out.println("b : "+b);
System.out.println("c : "+c);
}
}
public static void main(String[] args) {
InnerClassExam.Inner inner = new InnerClassExam().new Inner();
inner.printData();
}
}
Local Class
특정 메서드 안에서 정의되는 클래스
특정 메서드 안에서 선언되는 지역변수와 같은 것
메서드가 호출될 때 생성할 수 있으며
메서드의 수행력이 끝나면 지역변수와 같이 자동 소멸된다.
Class Outer{
public void Method(){
Class Inner{
...
Static class
Class Outer{
Static Class Inner{
...
: Member가 더 확장성이 좋아서 Member를 많이 사용함
Anonymous class
정의된 클래스의 이름이 없을 때
Class Outer{
Inner inner = new Inner();
abstract class Test{
int data = 10000;
public abstract void printData(); //추상메소드
}
public class AnonyExam {
Test inn = new Test() {
public void printData() { //미완성된 것을 완성시킨다
System.out.println("data : "+data);
}
};
public static void main(String[] args) {
AnonyExam ae = new AnonyExam();
ae.inn.printData();
}
}
멀티태스킹
프로세스 : 운영체제에서 실행중인 하나의 프로그램
멀티 프로세스 : 두개 이상의 프로세스가 실행되는 것
멀티 태스킹 : 두 개 이상의 프로세스를 실행하여 일을 처리하는 것
멀티 스레드
스레드 : 프로세스 내에서 실행되는 세부 작업 단위
멀티 스레드 : 하나의 프로세스에서 여러개의 스레드가 병행적으로 처리되는 것을 말한다.
스레드의 생명주기
new : 스레드가 만들어진 상태
Runnable : 스레드 객체가 생성된 후에 star()메서드를 호출하면 Runnable상태로 이동하게 됨
Running : Runnable 상태에서 스레드 스케줄러에 의해running상태로 이동
Blocked : 스레드가 다른 특정한 이유로 Running상태에서 blocked상태로 이동
Dead : 스레드가 종료되면 그 스레드는 다시 시작할 수 없게된다
스레드의 생성과 실행
스레드의 생성 방법
- Thread 클래스를 상속받는 방법
- Runnable 인터페이스를 구현하는 방법 [90%]
스레드 클래스 생성자, 주요 메서드
public class CreateRunnable implements Runnable{
public void run(){
}
public static void main(String[] args){
CreateRunnable ct = new CreateRunnable();
Thread t = new Thread(ct);
t.start();
extends 버전
public class SingleThreadEx extends Thread{
private int[] temp;
public SingleThreadEx(String threadname) {
super(threadname);
temp = new int[10];
for(int start=0;start<temp.length; start++) {
temp[start] = start;
}
}
public void run() {
for(int start : temp) {
try {
Thread.sleep(1000);
}catch(InterruptedException ie){
ie.printStackTrace();
}
System.out.printf("스레드 이름: %s,", currentThread().getName());
System.out.printf("temp value : %d %n",start);
}
}
public static void main(String[] args) {
SingleThreadEx st = new SingleThreadEx("첫번째");
st.start();
}
}
>>>
스레드 이름: 첫번째,temp value : 0
,스레드 이름: 첫번째,temp value : 1
,스레드 이름: 첫번째,temp value : 2
,스레드 이름: 첫번째,temp value : 3
,스레드 이름: 첫번째,temp value : 4
,스레드 이름: 첫번째,temp value : 5
,스레드 이름: 첫번째,temp value : 6
,스레드 이름: 첫번째,temp value : 7
,스레드 이름: 첫번째,temp value : 8
,스레드 이름: 첫번째,temp value : 9
,
Implements 버전
public class SingleThreadEx implements Runnable{
private int[] temp;
public SingleThreadEx() {
temp = new int[10];
for(int start=0;start<temp.length; start++) {
temp[start] = start;
}
}
public void run() {
for(int start : temp) {
try {
Thread.sleep(1000);
}catch(InterruptedException ie){
ie.printStackTrace();
}
System.out.printf("스레드 이름: %s, ", Thread.currentThread().getName());
System.out.printf("temp value : %d %n",start);
}
}
public static void main(String[] args) {
//1번 방법
SingleThreadEx st = new SingleThreadEx();
Thread thread = new Thread(st,"첫번째");
thread.start();
//2번 방법
Thread thread = new Thread(new SingleThreadEx());
thread.setName("첫번째");
thread.start();
}
}
>>>
스레드 이름: 첫번째, temp value : 0
스레드 이름: 첫번째, temp value : 1
스레드 이름: 첫번째, temp value : 2
스레드 이름: 첫번째, temp value : 3
스레드 이름: 첫번째, temp value : 4
스레드 이름: 첫번째, temp value : 5
스레드 이름: 첫번째, temp value : 6
스레드 이름: 첫번째, temp value : 7
스레드 이름: 첫번째, temp value : 8
스레드 이름: 첫번째, temp value : 9
Join
try{
스레드 이름.join()
}catch(){
}
: 스레드가 끝나고 지나가라
스레드 우선순위
스레드 스케줄링 방식
- 선점형 스레드 스켇줄링 방식은 스레드의 우선권을 가지고 우선순위가 높은
동기화
- 임계 영역이란 멀티 스레드에 의해 공유자원이 참조될 수 있는 코드의 번위를 말한다
- 멀티스레드 프로그램에서 임계영역을 처리하는 경우 심각한 문제 발생할 수 있다
- → 이런 상황을 막을 수 있는 방법이 동기화를 이용하는 것
- 동기화를 처리하기 위해 모든 객체에 락(Lock)을 포함시켰다
- 락이란 공유 객체에 여러 스레드가 동시에 접근하지 못하도록 하기 위한 것으로 모든 객체가 힙 영영이 될 때 자동으로 만들어진다.
공정(fairness)
여러개의 스레드가 하나의 컴퓨팅 자원을 사용하기 위해 동시에 접근하는 프로그램을 작성할ㄹ 경우, 스레드는 공정하게 그 자원을 사용할 수 있도록 해줘야함
기아(starvation)
하나 또는 그 이상의 스레드가 자원을 얻기 위해 Blocked 상태에 있고 그 자원을 얻을 수 없게 되면 작업을 못하는 상태를 말함
교착상태(deadlock)
두 개 이상의 스레드가 만족하지 못하는 상태로 계속 기다릴 때 발생한다.
동기화된 생산자와 소비자
Object 클래스의 wait(0, notify(), notifyAll()
- 동기화된 스레드는 동기화 블록에서 다른 스레드에게 제어권을 넘기지 못한다.
- 스레드 간 통신(제어권넘김)을 위해서는 위의 메서드를 사용해야한다
- Synchronized 블록에서만 의미가 있다
순위
숙제
- 입력 : 이름 국 영 수 (총, 평)
- 출력 : 전체 출력
- 검색 : 이름, 성적
- 삭제 : 객체 삭제
Set, Map, List 세가지 버전으로 만들기
'Java' 카테고리의 다른 글
자바의 정석 [Ch.07] 4 (0) | 2024.01.24 |
---|---|
자바의 정석 [Ch.07] 3 (1) | 2024.01.24 |
자바의 정석 [Ch.06] 2 (0) | 2024.01.24 |
자바의 정석 [Ch.01 ~ Ch.05] 1 (1) | 2024.01.24 |