|  책 이름 ㅣ 가장 빨리 만나는 코어 자바 9


|   해볼 것 들   |


JShell 활용


Java 가변 인수


Factory Method -> ex) getInstance()


자바 문서화 주석 , javadoc, ex ) @author


클래스 주석, 메서드 주석, 변수 주석, 일반 주석, 링크, 


람다 표현식 ( 메서드 참조, 생성자 참조 , 지연 실행 구현, 함수형 인터페이스 선택, ), 람다표현식과 에러처리


super 을 이용한 메서드 표현식 

super::work


자바 예외 처리

메소드에서 예외를 던지는 것이 더 낫다고 ??

" 빨리 던지고, 늦게 잡아내라 "


자바와 로깅

자바 제네릭 메서드 와 타입 경계

T extends A 하면 T는 A의 서브타입임이 보장된다.

서버 타입 와일드 카드

? extends A 

자바 정규표현식


애너테이션 과 JUNIT

@ 이런애들


Nashorn



정수 배열과 타겟 숫자가 주어지면, 

합이 타겟값이 되는 두 원소의 인덱스를 찾으시오.

단, 시간복잡도 O(n) 여야 합니다.


예제)

Input: [2, 5, 6, 1, 10], 타겟 8

Output: [0, 2] // 배열[0] + 배열[2] = 8


문제를 처음 보았을 때 어 간단한데? 라고 생각했는데

풀려고 끄적대보니 O(n)만 쓰는 방법이 생각 안나서 결국 풀이를 봤는데

해시맵 실화야? 허허.,...


시간 복잡도: O(n). 해쉬맵의 containsKey 는 보편적으로 O(1). O(n)*O(1) = O(n).

공간 복잡도: O(n)




문제의 풀이는 다음과 같다.

계속 돌면서 타켓 - 현재 인덱스 값 을 해시맵에서 찾는다.

나오면 끝, 안나오면 계속 돈다. 

그러면 O(n)안에 나오게 된다.


와우...





for ( 초기식 ; 조건식 ; 반복후 작업 ) 에서 셋다 옵션이라 있어도 없어도 된다.


( )를 이용하여 연산자 우선순위 해결

{ } 을 이용해 danglig else 문제 해결


switch 값 안에 들어갈수있는것 


예전 ) 정수, 문자 + 문자열 리터럴 ( 최신 ) ==> 실수 리터럴 허용 X


>>> -> 최상위 비트를 항상 0으로 채움


Java 선언


int[] arr = new int[n];

래퍼런스니까 포인터 개념으로 이해하자!


나중에 클래스도 그런댜!


변수의 크기 필드를 가진다. 

array.length 이롷게 사용가능


평균 구할때 더블캐스팅!!


for(int n : intArr) {

sum += n;

}


자바의 새로운 문법이다.


루프를 돌때 마다 한칸식 간다.


java에서 배열 할당시


int Arr[][] = new int[2][5] 과


Arr = new int[2] 후

Arr[0] = new int[5] 

이런식으로 가능


후자가 유동적이 가능


public static void main(String[] args)에서

변경가능한것은 args일뿐





Exception 부모클래스 ㅇㅇ


"파일이 없다"

Exception -> 캐치 -> 끝나버림-> 어?


FileNotFound -> 내 정보를 받아가 ㅠㅁㅠ 


...


그래서 

제일 하단이 제일넓게 ! " 캐치문의 순서 "


finally  옌 어쨋든 해야할덧


예상은 되었지만 예외처리는 시험에 꼬옥 나온댄다

정상시 / 비정상시

비정상시는 어캐되는지

프로그래밍/Java

0313 자바

2018. 3. 13. 15:06

자바 식별자 규칙 잘외워 무조건 하나이상낸데 _ 언더바 가아능 $랑


___________jmh : 변수명을 이따고로
jmh_____3


클래스대소문자 구문


자바에서도 개행문자가 버퍼에 남으면서 생기는 문제 발생


그래서 nextDouble()후 nextLine()하면 뒤 메소드가 남아있던 개행받고 끝나버림

제거해버리고 진행해야함


for(int n=1, int n1=2;조건문;i++, j++ ) 요렇게 가능

prologue..

4시간 자바 수업은 .. 수업의 질이 좋아도 힘들다...


History

프로그래밍은 기계어 코딩에서 어셈블리어를 거쳐 High-level 언어까지 진화한다.

C언어에서 OOP 를 담은 C++이 나오지만 문법이 너무 어려웠다. 

그래서 나온 언어가 Java 이다. ( unofficial )

그래서 문법들이 비슷하다.


cf. ) Java Native Interface를 이용하여 C, C++ 언어 코드를 Java에서 사용 가능하다. 

참고 : http://blog.bagesoft.com/805


cf. ) main 메소드가 프로젝트 안에 여러개 들어있을 수 있다. 하지만 상관 ㄴㄴ이다. 

사용할 메인 클래스를 정해두면 되기 때문이다.


OOP : http://deokho.tistory.com/45?category=644446


클래스는 추상적인 상이고 이러한 클래스를 이용하여 구체적인 형태인 객체들을 만들어 낸다 ( 인스턴스 화 ).

클래스는 메소드와 멤버변수로 이루어 져있다.

중요한 점은 메소드 안 변수는 멤버 변수라고 하지 않는다. 이들은 지역변수 ( 로컬변수 ) 라고 부른다.


이 이야기는 나중에도 자세히 진행될 것이다.


자바 식별자의 특징 : 한글이 사용가능 하다. --> 

But. 그러나 아직까지는 한글 사용을 비추한다. 다른 언어에 지원가 한글깨짐시 힘듦....

 

정수 리터럴은 자동으로 int 자료형으로 처리 된다. int가 컴퓨터가 가장 처리하기 좋기 때문이다.

그래서 byte a = 1000 해버리면 에러가 난다.


자동 형변환은 작은 값이 큰 자료형에 들어갈 수는 있으나 

반대는 값 손실을 초래하는 캐스팅 과정을 거쳐야만 한다.


C언어와 다르게 while은 boolean ( true, false ) 가 있어야 한다.


자바에서는 C와 다르게 System.out.println("값 :"+var); 이 가능한데

이 것은 var이 toString이라는 기본 object 클래스 속 메소드의 의해 String 타입으로 변환되기 때문이다.


String s1; 와 String s2 = null 의 차이점

s1은 쓰레기 값을 가리키고 있고 s2는 아무 값도 가리키지 않는 널 상태가 된다.


cf. JDK 7 에서 숫자 리터럴에 _ 허용


phoneNum = 010_1234_5678 이렇게 가능


* _을 사용불가능할때 *

1. 끝에 쓰일 때

2. 소수점 앞에 쓰일때

3. 접미사 ( L, f ) 앞에 쓰일때

4. 접두사 ( 0x ... ) 사이에 쓰일때


자바에서 입력받기 ( Scanner )

 1. Scanner 객체 만들기

   Scanner scanner = new Scanenr(System.in);

2. Scanner 메소드 이용

    1. 문자열 입력받기 ( '\n'포함 ) : .next();

    2. 문자 하나 입력받기 : .next().charAt(0); 

        cf. ) charAt(index) : index번째의 문자를 가져온다.

    3. 자료형 입력받기 ( 보통 ) : .next자료형이름( 첫문자 대문자 );

3. 다 사용후 스캐너 닫아주기 .close() 메소드


cf.) 알고는 있겠지만 자바 가상 기계자체는 플랫폼종속적










1. 이클립스에 테마를 적용하고 싶어요.

 

 : 마켓플레이스에서 Eclipse Color Theme 설치 

 참고 : http://www.leafcats.com/235


2. 에디터에 폰트와 글꼴 크기를 바꾸고 싶어요.


 : preference 탭에서 font치면 나온다.

 참고 : https://www.lesstif.com/pages/viewpage.action?pageId=22642808


3. 유용한 단축키 알아두기

1. ctrl + shift -> 자동완성

ex ) sysout -> System.out.println();

      try, for도 있더라

2. ctrl + n -> 프로젝트 or 새 파일 만들기

3. ctrl + d -> 한줄 삭제\

4. ctrl + / -> 주석 처리 ( // )

5. alt + up/down -> 줄 이동

6. 디버깅시 유용

1. f11 -> 디버깅 / cf . ctrl + f11 -> 그냥 실행

2. f8 -> 디버깅 진행

3. f5 : 함수 안으로 들어가는 진행 / f6: 한줄 한줄 실행되는 진행

즉 f5가 더 깊숙히 들어감


7. 클래스네 메소드 보기 ㄷㄷ -> f4

클래스 클릭하고 F4를 누르면 옆에 사용가능한 클래스, 메소드가 뜬다.

8. ctrl + shift + o -> 임포트 자동관리

'프로그래밍 > Java' 카테고리의 다른 글

0313 자바  (0) 2018.03.13
자바 프로그래밍 _ 이병대교수 _ 1차시 _ 자바 기본 문법  (0) 2018.03.11
8장정리_자바GUI_Swing  (0) 2017.12.19
6장정리_자바패키지활용  (0) 2017.12.19
7장정리_컬렉션과제네릭  (0) 2017.12.19

1. AWT와 Swing

AWT

자바가 처음 나왔을 때 함께 배포된 GUI 패키지

운영체제의 도움을 받아 GUI를 그리기 때문에 속도가 빠르나 

그만큼 운영체제에 부담을 주어 중량 컴포넌트라고 불리며

최근에는 거의 사용하지 않는 추세이다.

Swing

순수하게 Java언어로만 작성된 패키지
운영체제의 도움을 받지 않기 때문에 경량 컴포넌트라고 불린다.
AWT보다 화려하고 다양한 많은 GUI 컴포넌트를 제공하며,
AWT와의 구분을 위하여 모두 J로 시작한다.

AWT에 구현된 이벤트 처리나 GUI 컴포넌트의 기본원리를 바탕으로 작성되었기 때문에
스윙을 사용하기 위해선 AWT 패키지가 필요하다.


하지만 컴포넌트는 서로 다른 구조로 구현되있기 때문에 혼용하면 안된다.


2. 컨테이너와 컴포넌트

GUI 패키지의 주요 클래스의 상속 관계

모든 GUI 컴포넌트들은 Component 클래스를 상속받고 있다.

* Font, Dimension, Color, Graphics 클래스는 GUI " 컴포넌트 "는 아니다. *

그리고 스윙 컴포넌트들은 JComponent를 상속받는다.


컨테이너

컴포넌트를 포함할 수 있는 특별한 GUI 컴포넌트

awt.Container 를 상속받아야 하며 

해당 클래스도 컴포넌트를 상속 받고 있으므로

컨테이너 또한 컴포넌트이다.


( JFrame, JPanel, JApplet, JDialog, JWindow )가 스윙 컨테이너 


컴포넌트

대부분 다른 컴포넌트를 포함할 수 없으며,

임의의 컨테이너에 포함되어야 화면에 출력될 수 있는 GUI 객체

Component 클래스는 모든 컴포넌트들의 공통적인 요소를 구현하고 있고
JComponent 클래스도 순수 스윙 컴포넌트들의 공통적인 기능을 구현하고 있다.


최상위 컨테이너

컨테이너들 중에서 다른 컨테이너에 속하지 않고도 독립적으로 존재 하여

화면에 출력가능한 컨테이너를 일컫는다.

JFrame, JDialog, JApplet등이 이에 속한다.


계층 구조

최상위 컨테이너 ) 컨테이너 ) 컴포넌트 


3. 스윙 프로그램 만들기 


GUI 프로그래밍에 주로 쓰이는 import 구문

import java.awt.*, import javax.swing.*
import java.awt.event.*, import javax.swing.event.*


스윙 프레임과 ContentPane

JFrame은 스윙에서 프레임 ( 최상단 컨테이너 ) 역할을 한다.

JFrame 객체는 Frame, 메뉴바, 컨텐트 팬의 세 공간으로 구성된다.

Frame은 상속을 받았기 때문에 존재하는 것이고

메뉴바는 이름 그대로이고

ContentPane은 메뉴를 제외한 모든 GUI 컴포넌트를 부착하는 공간이다.


JFrame 주요 속성

setTitle(str) or super(str) : 프레임 타이틀 설정
setSize : 크기 설정
setVisible : 화면에 보이게 설정


cf. main()이 종료한 뒤에도 프레임이 살아 있는 이유는?

메인 스레드가 죽어도 이벤트 처리 스레드가 살아있기 때문이다.


컨텐트팬에 컴포넌트 달기

스윙에서는 컨텐트팬에만 컴포넌트를 부착할 수 있다. 

하지만 JDK1.5 이후부터 JFrame에 add 메소드를 호출하는 것 만으로 

컨텐트팬에 컴포넌트를 추가하도록 수정되었다.

기존의 방법을 알아 보면
Container contentPane = getContentPane(); 으로 해당 프레임의 컨텐트팬을 얻고
거기다가 붙이는 거였다.


컨텐트팬의 변경

프레임의 붙어있는 컨텐트팬을 제거하고 새 컨텐트팬을 만들어 붙일수 도 있다.
컨텐트팬은 Container 타입이므로 해당 컴포넌트가 컨테이너를 상속받았다면 
컨텐트팬이 될 수 있다.

설정은 setContentPane을 이용한다.


cf. 자바에서 응용프로그램의 종료를 원할시 System.exit(0); 을 이용한다.

cf. 스윙 프로그램에서 (x)버튼과 함께 완벽히 프로그램이 종료되길 원한다면
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 를 추가하면 된다.


4. 컨테이너와 배치관리자

배치관리자

하나의 컨테이너는 하나의 배치관리자를 가진다. ( 물론 아예 안가질수는 있다 )

배치관리자는 컴포넌트가 부착되는 시점에 컴포넌트의 위치와 크기를 결정한다.

컨테이너의 크기가 변경되면 배치관리자는 

컨테이너의 모든 컴포넌트들의 위치와 크기를 재조정한다.

배치관리자의 종류

java.awt 패키지에 배치관리자 클래스들이 존재한다.

1. FlowLayout

왼쪽상위에서 오른쪽상위로 그후 왼쪽 하위에서 오른쪽 하위로 배치

컴포넌트의 크기는 적당한 크기로 설정한다.

2. BorderLayout

컴포넌트의 공간을 동서남북중앙으로 나누고,

응용프로그램에서 지정한 영역에 컴포넌트를 배치한다.

컴포넌트의 크기는 영역의 크기와 동일하게 설정한다.

3. GridLayout

설정한 크기대로 2차원의 그리드로 나누고
플로우 레이아웃과 비슷하게 배치되며
컴포넌트의 크기는 셀의 크기와 일치시킨다.

4. CardLayout
    컴포넌트를 포개어 배치하며 컴포넌트의 크기는 컨테이너의 크기와 일치시킨다.

새로운 배치관리자 설정을 위해선 setLayout(배치관리자) 메소드를 이용한다.

예) setLayout(new BoxLayout(...));

Default 배치관리자

BorderLayout -> JFrame, JWindow, JDialog
FlowLayout -> JPanel, JApplet

5. FlowLayout

생성자

FlowLayout() or FlowLayout(int align, int hGap, int vGap)

- align : 중앙 정렬이 Default, FlowLayout.RIGHT등의 static 상수를 이용
- hGap, vGap : 각각 좌우 상하 간격, 픽셀 단위이며, 5px이 Default

6. BorderLayout

생성자

BorderLayout() or BorderLayout(int hGap, int vGap)
- 의미는 같으며 Default : 0


add(comp, index) : index는 동서남북중앙에 해당한다.

( BorderLayout.CENTER 등의 상수 이용 )

7. GridLayout

생성자

GridLayout() or GridLayout(int rows, int cols)

or GridLayout(int rows, int cols, int hGap, int vGap)

" row가 ㅣ 방향, col이 - 방향 "
- Default는 각각 1,1,0,0


만약 격자의 셀 수보다 더 많은 컴포넌트가 추가되면
모든 컴포넌트를 수용할 수 있게 적당히 수가 변경된다.


8. 배치관리자 제거

이유

1. 컴포넌트의 크기나 위치를 개발자가 정하고 싶은 경우

2. 수시로 위치가 변경되는 환경일 경우

3. 여러 컴포넌트들이 서로 겹치는 효과가 핅요할 경우


제거 방법 : setLayout(null); : 참 쉽쥬


제거후엔

setSize, setLocation 혹은 setBound 메소드를 이용하여 크기와 위치를 설정해주어야 하며
그렇지 않으면 보이지 않을 것이다.

CardLayout을 제거하고 컴포넌트들이 겹치도록 배치할 수 있는 방법중 하나이다.

ㄹㅇ 3~4시간 남아다 ㄷㄷㄷ


1. 패키지

패키지

서로 관련이 있는 클래스나 인터페이스의 컴파일된 .class 파일들을 한 곳에 묶어 놓은것

패키지는 곧 디렉토리 구조로 a.b.c는 a/b/c와 동일한 구조이다.

패키지는 import 문을 통해 가져 올 수 있다.

패키지의 선언시 package 키워드를 이용한다.

* 패키지 선언문이 없을때 자바 컴파일러는 해당 클래스나 인터페이스를 

디폴트 패키지에 소속시키는데 현재 디렉터리에 해당한다.


2. 자바 JDK의 주요 패키지

JDK는 개발에 필요한 기본적인 기능과 다양한 응용기능을 표준 패키지로 제공하는데 

이를 자바 API라고 한다.

java.lang

자바 프로그래밍에 필요한 기본적인 클래스와 인터페이스를 제공하는 패키지
import문 없이 자동으로 임포트되는 특징을 가진다.


3부터 6까지 java.lang 의 클래스들을 알아보자

3. Object 클래스

Object

java.lang에 속한 클래스, 모든 클래스의 슈퍼 클래스인 최상위 클래스이다.

hashCode(), getName()을 통해 객체의 정보를 얻을 수 있다.


toString 메소드

객체를 문자열로 변환하는 메소드.
객체들은 해당 메소드를 오버라이딩하여 자신만의 문자열을 리턴가능 하다. ( * public 으로 선언 * )


객체 + 문자열 같은 연산 혹은 객체의 출력이 요구될 때 자동으로 호출되는 메소드이다.


객체 비교와 equals() 메소드

기본타입의 값을 비교할 때 사용한 ==으로 객체를 비교시 객체의 레퍼런스 값을 비교한다.
즉 같은 내용임에도 객체는 독립적이므로 false를 리턴하게 된다.

이러한 문제점을 해결하기 위하여 equals 메소드를 사용한다.
equals(Object obj) 메소드는 객체의 내용이 같은지를 비교한다.


해당 메소드도 오버라이딩을 통해 개발자의 입맛에 맞게 변형이 가능하다.


4. Wrapper 클래스

객체 지향 언어이므로 객체 단위로 처리하는 경우가 많아 불편함 해소를 목적으로 만들어졌다.


/* 이름이 Wrapper인 클래스가 아니다. 

그저 기본 타입을 객체화한 8개의 클래스를 통칭한 말일 뿐이다. */

Byte, Short, Integer, Long, Character, Float, Double, Boolean 의 통칭이다.


cf. Character을 제외한 나머지 Wrapper 클래스의 경우 

문자열로 된 값을 주어도 알아서 parse 메소드가 작동하여 인식한다.


객체에 들어있는 기본 타입 값 알아내기

객체 생성 후, type이름Value(); 메소드를 사용한다. 

문자열을 기본 타입으로 변환

parseInt, parseBoolean, parseDouble 등을 활용,
static타입이기 때문에 바로 호출 가능.

기본 타입을 문자열로 변환

toString, to(진법)String 메소드를 이용한다. cf. 8진법 Octal

역시나 static 타입이다.

박싱과 언박싱

객체과 되는 것이 박싱이고 역과정이 언박싱이며 
JDK 1.5부터 자동 박싱 / 자동 언박싱이 일어 나게되었다.

Wrapper 클래스의 활용

Character클래스의 메소드
    toLowerCase
    isDIgit, isAlphabetic

5. String과 관련된 클래스

String 객체와 스트링 리터럴

String str = "Hello"; || String str = new String("Hello");

전자는 스트링 리터럴이고 후자는 객체 생성으로 생성된 스트링이다.

스트링 리터럴은 JVM안 리터럴 테이블에서 특별히 관리되며
스트링 생성에 대핸 실행시간을 줄이기 위하여 

동일한 리터럴은 공유시키는 특징을 가진다.

객체 생성에 의해 생성된 스트링은 힙 메모리에 별도로 생성되며

공유되는 특성을 가지지는 않는다. 


cf. char 배열을 매개변수로 String의 생성도 가능하다.


한번 만들어진 스트링은 수정이 불가능하다. 

그래서 스트링이 공유되어도 아무 문제가 없는 것이다.


String 활용

concat(str) : 해당 문자열의 끝에 str을 덧붙인 문자열을 가리키게 한다.
compareTo(str) : 두개의 스트링을 사전 순서로 비교하여

같으면 0, 현재 스트링이 먼저나오면 음수, 나중에 나오면 양수를 리턴


trim() : 문자열의 앞 뒤 공백문자( 스페이스, \t, \n .. ) 제거 

** 사이 공백들은 제거 되지 않는다 **


length() : 문자열의 길이
contains(str) : 해당 문자열 포함 여부

replace(str1, str2) : str1부분을 str2로 치환

split(char) : 해당 구분자로 분리하여 배열 형태로 리턴
substring(index) : 인덱스 ~ 끝까지의 스트링 리턴
charAt(index) : 해당 위치의 문자 리턴


StringBuffer 클래스

문자의 개수에 따라 자동 조절되는 내부의 가변크기의 버퍼를 가지고 

스트링을 다루는 클래스, 생성된 스트링의 수정이 가능하다.

스트링이 길거나 스트링 작업이 많을 경우 StringBuffer 이용이 적합하다.

append -> concat과 동일
insert(index, str) : 영어뜻

replace(start, end, str)

시작 인덱스 위치부터 끝 인덱스 위치 전까지의 문자열을 str로 교체

System.out.println으로 아무렇지 않게 출력이 가능하다.


StringTokenizer 클래스

문자열을 분리하는데 특화된 클래스

new StringTokenizer(str, 구분문자); 로 객체를 만들고

nextToken() 메소드를 통해 하나씩 토큰을 얻어낸다.

countToken() 메소드를 통해 몇개의 토큰으로 분리되었는지 알 수 도 있다.

hasMoreTokens() 메소드는 

순차적으로 토큰을 얻는 코드를 짤때 유용하게 사용 가능하다.


( + ) java.util 클래스에 소속되어 있다.



6. Math 클래스

모든 메소드가 static 타입이기때문에 Math.메소드 형태로 사용이 가능하다.

Math.random()

0~0.99 까지의 실수 값을 리턴한다. 
그렇기에 100을 곱하여 1을 더하면 1~100까지가 된다.

실수 값이기 때문에 int로 캐스팅을 해준다.


(int)(Math.random()*100 + 1)


** java.util.Random 은 기본적으로 정수 범위 안에 난수를 발생시키며,

매개변수를 줄 시 0 ~ n-1 범위의 정수 난수를 발생시킨다.


cf. sqrt -> root, exp -> e^n, round -> 반올림





'프로그래밍 > Java' 카테고리의 다른 글

자바 프로그래밍 _ 이병대교수 _ 0차시 _ 이클립스  (0) 2018.03.09
8장정리_자바GUI_Swing  (0) 2017.12.19
7장정리_컬렉션과제네릭  (0) 2017.12.19
12장정리_자바스레드  (0) 2017.12.19
5장정리_OOP  (0) 2017.12.19

호.. 4과가 남았는데 남은시간은 3~4시간이다. 속도를 더 빠르게 해야겠다.


1. 컬렉션과 제네릭


컬렉션

고정 크기의 배열이 가지는 단점을 극복하고,

요소( element )라고 불리는 객체들의 삽입, 삭제, 검색 기능을 갖춘

가변 크기의 컨테이너

컬렉션을 위한 자바 인터페이스와 클래스

java.util 패키지에 다양한 인터페이스와 클래스를 제어하는데
예를 들면 ArrayList<E>는 컬렉션<E> 인터페이스를 상속 받은 List<E> 인터페이스를 구현한것이다.


가변 크기의 배열을 구현한 것 : Vector<E>, ArrayList<E>
링크드 리스트 구현 : LinkedList<E>
스택 구현 : Stack<E>
집합 구현 : HashSet<E>

이 들은 단일 클래스의 원소 객체를 삽입/삭제하는 공통점이 있다.


이와 달리 HashMap<K, V>는 키와 값의 쌍으로 이루어지는 
파이썬의 딕셔너리 개념의 컬렉션이다.


컬렉션의 특징

1. 제네릭이라는 기법으로 구현되어 있다.
    <E>, <K>, <V>,  타입 매개 변수라고 하며
    컬렉션의 요소를 일반화 한애들
    <> 안에는 구체적인 객체 타입을 요구한다.
    <E> 를 제네릭 타입이라고 부른다.
2. 요소로는 객체만 가능하다.
    그래서 Wrapper 클래스를 이용하여 타입의 객체화가 일어나게 되고
    기본 타입의 값이 입력되면 자동 방식이 일어나 객체 형태로 저장되는 특징을 가진다.


제네릭

모든 종류의 타입을 다룰 수 있도록, 클래스나 메소드를 

일반화 된 타입 매개 변수를 이용하여 선언하는 기법 ( 일종의 템플릿..? )


예를 들어 Stack<E> 클래스에서 E pop() { ... } 

이런식으로 제네릭 타입이라 불리는 E를 사용하였다면
Stack<String>같이 구체적인 타입이 지정되었을 때 
지정된 타입만 다룰 수 있는 구체화된 스택이 된다.


cf. 관용적인 타입 매개변수
    

E : 요소 , T : Type, V : 값, K : 키



2. 제네릭 컬렉션의 활용


Vector<E>

배열을 가변 크기로 다룰 수 있게 하고, 

객체의 삽입, 삭제, 이동이 쉽도록 구성된 컬렉션 클래스

삽입되는 요소의 개수에 따라 자동으로 크기를 조절하고,

요소의 삽입과 삭제에 따라 자동으로 요소들의 자리를 이동한다.


벡터 생성
    Vectory<E> v = new Vector<E>(size);
요소 추가 ( add )

add(value) -> 맨뒤에 추가 ( 이 과정에서 자동 박싱이 보통 잘 일어난다. )
add(index, value) -> 인덱스 위치에 값을 추가, 해당 인덱스의 부재시 예외처리

요소 정보 얻기
    get(index) -> 인덱스 위치에 값 얻기 ( 이 과정에서 보통 자동 언박싱이 잘 일어난다. )

요소 크기와 용량 알아내기
    size() : 크기 ( 즉 존재하는 요소 객체의 수 ), capacity() : 벡터가 수용가능한 현재 크기

cf. default capacity : 10

요소 삭제
    remove(index), removeAllElements();

cf. 자동 방식/언박싱은 모든 컬렉션 클래스에서 작동한다.


ArrayList<E>

Vector와 거의 비슷하나 스레드간의 동기화를 지원하지 않아 사용자가 직접 구현해야 한다.

Vector와 비슷하게 사용하면 되나 capacity와 removeAllElement는 구현되어 있지 않다.


Iterator<E>

컬렉션에서 요소를 순차적으로 검색할 땐 Iterator<E> 인터페이스를 쓰면 편리하다.
검색하고자 하는 대상의 iterator 메소드를 실행하여 Iterator 객체를 얻어낸후 

예 ) Iterator<Integer> it = v.iterator();

hasNext() : 끝까지 반복,
next() : 다음 요소 리턴
remove : 최근 리턴된 요소 제거

이 세 메소드를 활용하여 검색을 진행한다. 

보통 많이 쓰이는 방식은

while(it.hasNext()) {
    int n = it.next();

....

} 이다.


HashMap<K, V>

딕셔너리를 구현한 것이라 보면된다.
put(key, value)를 통해 내용을 삽입하고 ( Stack 쌓이듯이 쌓인다. )
get(key)를 통해 value를 얻는다.
요소의 개수는 size()를 통해 받아올 수있따.


해시맵의 전체 검색을 위하여
해시맵 컬렉션은 키의 Set를 제공한다.
keySet메소드를 통해 키들의 Set를 얻은후 Iterator 객체를 얻어 순차 검색을 진행하면 된다.

3. 제네릭 클래스 만들기

클래스 이름과 함께<T> 를 사용한다.


예) 

public class MyClass<T> {

T val;

void set(T a) {

val = a;

}

T get() {

return val;

}

}


구체화 : 제네릭 클래스에 구체적인 타입을 제공하여 구체적인 객체를 생성하는 것.


'프로그래밍 > Java' 카테고리의 다른 글

8장정리_자바GUI_Swing  (0) 2017.12.19
6장정리_자바패키지활용  (0) 2017.12.19
12장정리_자바스레드  (0) 2017.12.19
5장정리_OOP  (0) 2017.12.19
Prolog_171218  (0) 2017.12.18

예상은 하고 있었지만 5장이 너무나도 오래걸려 버려서

일단 내가 익숙치 않은 개념인 12장을 먼저하고 

점점 잊혀져 가는 7장을 한후

외워야 하는 성격이 좀 있는 6,8,9 장을 하기로 계획하였다.


1. Thread ( 스레드 )

스레드

운영체제에 의해 관리되는 하나의 작업

스레드 코드와 스레드 정보로 이분화 된다.


스레드 코드 : 실제 작업
스레드 정보 : 스레드 명, 스레드 ID, 소요시간, 우선순위 등의 

운영체제가 관리하는 정보


스레드는 실행중 생성또는 중단, 종료가 가능하지만

이 모든 권한은 운영체제에 있어 우리는 반드시 운영체제를 통해

스레드에 대한 제어를 해야한다.


멀티스레딩

다수의 스레드를 동시에 실행시키도록 응용프로그램을

작성하는 기법을 멀티스레딩이라고 한다.


2. 자바 스레드와 JVM

자바 스레드

일반 스레드와 거의 차이가 없다. JVM이 운영체제의 역할을 한다.

자바에는 프로세스가 존재하지 않고

스레드만 존재하며, 자바 스레드는 JVM에 의해 스케쥴링되는
실행 단위코드블록이다.

JVM

한개의 응용프로그램만 실행 가능한 특징을 가지고 있다.
그 한개의 응용프로그램에서 여러 개의 스레드를 가질수 있다.


개발자의 임무는 그저 JVM에게 스레드로 작동할 코드를 작성하고
제출 하는 것뿐이다.


3. 자바 스레드 만들기

Thread 클래스 이용하기

경로명 : java.lang.Thread

1. 작업 코드 주기
    Thread 클래스에서 run() 메소드가 작업 코드에 해당하는 부분이다.
    이 run() 메소드를 오버라이딩 하여 작성한다.

* run()을 오버라이딩 하지 않는다면 아무 작업도 하지 않고 바로 종료된다.

2. 스레드 객체 생성
3. 스레드 시작 : start() 메소드 호출

start() 메소드는 스레드 객체를 새로운 스레드로 인식하고
스케쥴링 가능한 상태로 만들 것을 JVM에 지시한다.


이렇게 중요하기에 개발자가 절대 오버라이딩하면 안되는 존재이다.

cf. setPriority를 통해 우선순위를 JVM에 요구는 가능하다.
cf. sleep(ms) 메소드는 예외에 대한 try-catch블록을 강제로 요구한다.


Runnable 인터페이스 이용하기

경로명 : java.lang.Runnable

형태

interface Runnable {

void run();

}

음.. 정확히 말하면 Runnable의 이용은 그저 Thread의 상속 없이도
run 정보를 전달 할 수 있는 정도이다.


암튼 이렇게 구현후 해당 클래스의 객체를 Thread의 생성자에 전달하면 된다.


main 스레드

main()의 정체는 바로 이 코드의 스레드의 run 정보인 것이다.


스레드 종료

run 메소드의 종료또는 return으로 인한 스스로 종료하는 경우와

interrupt 메소드를 호출하여 강제 종료하는 경우가 있다.


interrupt 메소드는 호출 시점에 sleep()이나 join()이 호출될때 

InterruptedException 예외를 발생시켜
try - catch블록이 이를 인식하여종료시키는 것이다.


즉 try-catch 블록을 가지고 있지 않다면 interrupt 메소드는 의미가 없어진다.

혹은 저 sleep과 join 등의 코드가 없을시에도 마찬가지로 의미가 없어진다.


4. 스레드 동기화

스레드 동기화 필요성

멀티 스레드가 공유 데이터의 값을 변경하다 보면 ( 접근 할때 ) 

제대로 된 처리가 안되는 경우가 발생한다.

이를 방지하기 위하여 스레드의 실행을 제어하는 기술을 
" 스레드 동기화 "라고 부른다.

자바의 스레드 동기화에는 다음 2가지 방법이 있다.

- synchronized로 동기화 블록을 지정하는 방법
- wait-notify() 메소드로 스레드 실행 순서를 제어하는 방법


cf. 이 책 이상한 것중 하나가 저 두개가 완전 별개는 아닌데 별개인 것처럼 착각을 일으킴


synchronized 블록

스레드 동기화 구현을 위한 키워드
한 스레드가 synchronized 블록에 진입시 ,

자바 플랫폼은 다른 synchronized 블록에 진입하려는 스레드에 lock을 걸어 기다리도록 한다.

synchronized void print 이런식으로 동기화 메소드를 설정하는것이 가능하며,

synchronized(this) { } 이런 식으로 감싸주는 것도 가능하다.


wait()-notify()

synchronized 로 구현하였더라도 해당 블록 안에서도 대기와 깨움이 필요할 것이다.
이러한 기능을 해주는 것이 바로 wait()과 notify()이다. 

자바는 모든 객체가 동기화 객체가 될 수 있도록 설계하였기에 
Object클래스에는 wait()과 notify 메소드가 구현되어 있는데

이는 저 클래스가 모든 객체의 슈퍼클래스이기 때문이다.








'프로그래밍 > Java' 카테고리의 다른 글

8장정리_자바GUI_Swing  (0) 2017.12.19
6장정리_자바패키지활용  (0) 2017.12.19
7장정리_컬렉션과제네릭  (0) 2017.12.19
5장정리_OOP  (0) 2017.12.19
Prolog_171218  (0) 2017.12.18