9가지 사례로 익히는 고급 스파크 분석 (Advanced Analytics with Spark)

 

OREILLY

한빛미디어

샌디라이자, 유리 레이저슨, 션 오언, 조시 윌스 지음

박상은, 권한철, 서양주 옮김

 

제목 그대로 Chapter 1,2 는 빅데이터와 spark 에 대한 설명을 하고 이후에는 9가지 사례에 따른 실제 분석모델 예시를 설명해주는 책입니다.

책을 보는 순서가 약간 엇갈려 scala 보다 조금 먼저보게 되었는데 최소한 spark 나 scala 를 써보고 난 다음에 책을 보는것을 추천드립니다. 기본적인 지식없이 이해하기는 좀 어려운면이 있으며 오레일리 특성상 초심자가 이해하기 쉽도록 친절히 설명해주는 책은 아니니까요. 어느정도 이 분야에 있는 사람을 위한 책입니다.

아파치 스파크는 클러스터의 여러 노드로 프로그램을 분배하고, 그 위에서 동작하는 프로그램을 개발할 수 있도록 하는 오픈 소스 프레임워크입니다.

맵리듀스랑 비교하면 3가지 개선점이 있습니다.

1. 맵리듀스의 선형 확장성과 결함 허용성을 유지하면서 맵리듀스의 임시결과를 파일시스템에 저장하지 않고 바로 다음단계 프로세스로 진행할 수 있습니다.

2. 사용자가 연산을 쉽게 하도록 개발자 중심의 간소화된 API를 제공합니다.

3. 인메모리 처리방식으로 RDD(Resilient Distributed Dataset) 탄력적 분산데이터셋 이라는 추상개념으로 개발자가 처리 파이프라인의 어느 지점이라도 데이터를 클러스터의 메모리로 저장할 수 있도록 합니다. 이는 과거와 달리 같은 데이터를 사용하기 위해 데이터를 재연산하거나 디스크로부터 다시 읽을 필요가 없다는 이야기입니다.

 

스파크는 JVM 위에서 수행하기 때문에 자바 스택에서 돌아가는 운영, 디버깅 도구를 활용할 수 있습니다.

스파크는 하둡 생태계의 다양한 도구와 통합하기 좋습니다. 맵리듀스가 지원하는 모든 데이터포맷을 읽고 쓸 수 있고 Avro, Parquet, CSV 파일을 사용할수 있습니다. HBase 카산드라 와 같은 NoSQL DB를 사용할 수 있으며 스파크 스트리밍 라이브러리는 Flume이나 Kafka 로부터 스트림 데이터를 입력받을 수 있습니다.

스파크에 대한 특징은 위와같이 간략하게 개요만 설명하였고 상세한 내용은 다른책을 참고하라는 친절한(?) 가이드가 있습니다. 다만 RDD 에 대한 내용은 여러차례 강조를 한 부분이기에 간략히 정리해 놓습니다.

탄력적 분산 데이터셋(RDD)

RDD는 클러스터의 여러노드에 파티션으로 나뉘어 분산되며, 각 파티션은 RDD의 전체 데이터 중 일부를 담게된다.

파티션은 스파크에서 병렬 처리되는 단위다.

스파크 프레임워크는 한 파티션 안의 객체들을 순차적으로 처리하고, 파티션 단위로는 병렬로 처리한다.

RDD를 생성하는 아주 간단한 방법은 로컬 객체 컬렉션을 인수로 SparkContext 의 parallelize 메서드를 실행하는 것이다.

 

소개이후 인상적인 부분 요약

1. 스파크는 시각화 도구를 제공하지 않는다. R을 통한 시각화

2. 위키백과 이해하기는 LSA(숨은의미분석) 과 NLP(자연어처리) 기술로 처리한다.

3. 분산시스템인 스파크는 작업 대상 자바 객체들을 자주 직렬화 한다. 하지만 대부분의 경우에 자바직렬화 대신 Kryo 직렬화를 추천한다. 더 빠르고 더 촘촘한 포맷이기 때문이다.

4. 어큐뮬레이터는 잡이 실행되는 동안 부가적으로 몇몇 통계량을 수집해주는 스파크 구조체이다.

5. 예제는 textFile 을 사용하지만 대규모 데이터셋을 저장할때는 공간도 덜 차지하고 형태를 강제할 수 있는 바이너리 형식을 권장한다.

6. 현재 활발히 진행되는 스파크 하위프로젝트는 MLlib, 스파크 스트리밍, 스파크 SQL, 그래프엑스 가 있다.

 

책에서의 각 챕터로 구성된 예제 제목

1. 오디오스크로블러 데이터셋으로 음악 추천하기

2. 의사 결정 나무로 산림 식생 분포 예측하기

3. K-평균 군집화로 네트워크 이상 감지하기

4. 숨은 의미 분석으로 위키백과 이해하기

5. 그래프엑스로 동시발생 네트워크 분석하기

6. 뉴욕 택시  운행 데이터로 위치 및 시간 데이터 분석하기

7. 몬테카를로 시뮬레이션으로 금융 리스크 추정하기

8. BDG 프로젝트와 유전체학 데이터 분석하기

9. 파이스파크와 썬더로 신경 영상 데이터 분석하기

'Book' 카테고리의 다른 글

무역 천재가 된 홍대리  (0) 2019.03.21
구글은 어떻게 일하는가 독후감  (0) 2017.01.02

ArrayList 어레이리스트

 

ArrayList 는 배열과 마찬가지로 메모리가 인접해 있다. 사용법은 배열과 동일하다 단 여러가지 기능이 추가된 배열이다.

데이터 추가, 삭제를 하면 가장 마지막에 데이터가 추가, 삭제된다. 중간에 데이터를 추가하면 추가한공간만큼 데이터가 뒤로 밀리고 중간에 삭제하면 삭제된 공간만큼 데이터가 당겨진다. 배열은 생성시에 크기를 정해야하지만 ArrayList 는 크기를 정하지 않고 공간이 모두차면 자동으로 2배씩 공간이 증가한다. 배열인 만큼 데이터 검색은 빠르지만 중간의 데이터 추가, 삭제시에 부하가 많이 걸린다.

 

import java.util.*;
public class ExamArrayList {


 public static void main(String[] args) {
  ArrayList<Integer> list = new ArrayList<>();

  list.add(1); // list 에 1추가
  list.add(3); // list 에 3추가
  list.add(5); // list 에 5추가
  System.out.print("list에 index 2 의 값 : ");
  System.out.println(list.get(2)); //index 2 인 값 가져오기
  
  System.out.print("list size : ");
  System.out.println(list.size()); //list size 알아내기
  
  System.out.println("list 비었는지 확인 : ");
  boolean boo = list.isEmpty(); //list 비었는지 확인
  System.out.println(boo);
  
  System.out.print("list 에 3 값이 포함되어 있는지 확인 : ");
  boo = list.contains(3);   //list 에 3 값이 포함되어 있는지 확인
  System.out.println(boo);
  
  System.out.print("index 1 인 값 제거 : ");
  list.remove(1);     //index 1 인 값 제거
  System.out.println(list.toString());
  
  System.out.print("index 1에 4값 추가하기 : ");
  list.add(1, 4);     //index 1에 4값 추가하기
  System.out.println(list.toString());
  
  System.out.println("index 2 값을 6으로 대체 : ");
  list.set(2, 6);     //index 2 값을 6으로 대체
  System.out.println(list.toString());
  
  System.out.print("4값이 들어있는 index 값 반환 : ");
  System.out.println(list.indexOf(4)); // 4값이 들어있는 index 값 반환

  Iterator<Integer> iter = list.iterator(); // iterator 로 값을 순차접근
  
  System.out.print("iterator 로 값을 가져오기");
  while(iter.hasNext())   //다음 값이 존재하는지 확인
   System.out.print(iter.next()); // 다음값 가져오기
  System.out.println();
  
  System.out.print("list 를 clear했는지 : ");
  list.clear();  //list 비우기
  boo = list.isEmpty();
  System.out.println(boo);
 }

}

출력

list에 index 2 의 값 : 5
list size : 3
list 비었는지 확인 :
false
list 에 3 값이 포함되어 있는지 확인 : true
index 1 인 값 제거 : [1, 5]
index 1에 4값 추가하기 : [1, 4, 5]
index 2 값을 6으로 대체 :
[1, 4, 6]
4값이 들어있는 index 값 반환 : 1
iterator 로 값을 가져오기146
list 를 clear했는지 :true

'SW > 자료구조' 카테고리의 다른 글

LinkedList 연결리스트  (0) 2017.01.25
Arrays 배열  (0) 2017.01.23

배열 Arrays

배열의 기능에 대해 간략한 예제로 알아본다.

import java.util.Arrays;

/**
 *
 * @author awj
 * 배열 Arrays
      배열의 기능에 대해 간략한 예제로 알아본다.
      ctrl+I 들여쓰기 정리
      shift+ctrl+O 자동 import     
 */

public class Arrays20180404 {

 public static void main(String[] args) {

  int[] A = new int[10];
  int N = 10;

  int[] B = new int[N];
  for(int i=0;i<A.length;i++)
   A[i]=i+1;
  
  System.out.print("A 배열 최초값 : ");  
  for(int i=0;i<A.length;i++)
   System.out.print(A[i]);
  System.out.println();    
  
  B = Arrays.copyOf(A, 6); // A[0] ~ A[5] 까지 copy
  
  System.out.print("A[0] ~ A[5] 까지 B[] 에 copy : ");
  for(int i=0;i<B.length;i++)
   System.out.print(B[i]);
  System.out.println();
  
  
  B = Arrays.copyOfRange(A, 1, 3); // A[1] ~ A[2] 까지 copy
  
  System.out.print("A[1] ~ A[2] 까지 B[] 에 copy : ");
  for(int i=0;i<B.length;i++)
   System.out.print(B[i]);
  System.out.println();

  B = A.clone();  // clone 복사
  
  System.out.print("B에 A를 clone 복사 후 같은지 비교 : ");
  boolean boo = A.equals(B);
  System.out.println(boo);  
  
  A[0] = -1;
  for(int i=0;i<A.length;i++)
   System.out.print(A[i]);
  System.out.println();
  for(int i=0;i<B.length;i++)
   System.out.print(B[i]);
  System.out.println();
    
  B = A;    //reference 복사
  
  System.out.print("B에 A를 reference 복사 후 같은지 비교 : ");
  boo = A.equals(B);
  System.out.println(boo);
  
  for(int i=0;i<A.length;i++)
   System.out.print(A[i]);
  System.out.println();
  for(int i=0;i<B.length;i++)
   System.out.print(B[i]);
  System.out.println();
  
  System.out.print("A[] 요소값 전부출력 : ");  
  System.out.println(Arrays.toString(A)); // 요소값 전부찍기

  A = new int[10];
  for(int i=0;i<A.length;i++)
   A[i] = i; 
  for(int i=0;i<B.length;i++)
   B[i] = (B.length-1-i) * 2;
  
  System.out.print("정렬 전 B[] : ");  
  System.out.println(Arrays.toString(B));
  
  Arrays.sort(B); // 정렬
  
  System.out.print("binary Search 로 값을 못찾을경우 : ");
  System.out.println(Arrays.binarySearch(B, 7)); // 값을 못찾을경우 음수
  
  System.out.print("binary Search 로 찾은 인덱스 위치 : ");
  System.out.println(Arrays.binarySearch(B, 12)); // 12가 존재하는 인덱스값
  
  System.out.print("A 배열값  : ");
  System.out.println(Arrays.toString(A)); // A 배열값 출력
  System.out.print("B 배열값  : ");
  System.out.println(Arrays.toString(B)); // B 배열값 출력


 }

}


출력

A 배열 최초값 : 12345678910
A[0] ~ A[5] 까지 B[] 에 copy : 123456
A[1] ~ A[2] 까지 B[] 에 copy : 23
B에 A를 clone 복사 후 같은지 비교 : false
-12345678910
12345678910
B에 A를 reference 복사 후 같은지 비교 : true
-12345678910
-12345678910
A[] 요소값 전부출력 : [-1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
정렬 전 B[] : [18, 16, 14, 12, 10, 8, 6, 4, 2, 0]
binary Search 로 값을 못찾을경우 : -5
binary Search 로 찾은 인덱스 위치 : 6
A 배열값  : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
B 배열값  : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

'SW > 자료구조' 카테고리의 다른 글

LinkedList 연결리스트  (0) 2017.01.25
ArrayList 어레이리스트  (0) 2017.01.23

재귀호출


재귀함수는 하위작업을 수행하도록 자기 자신을 호출하여 작업을 수행한다. 어느 단계에 이러러서는, 자기 자신을 호출하지 않고도 수행할 수 있는 기본 단위를 수행합니다. 함수가 자기 자신을 호출해서 하위 작업을 수행하는 것을 재귀 경우라고 합니다. 모든 재귀 함수는 아래의 형식으로 쓰여질 수 있다.

if (기본 경우인지 확인)

return 기본 값

else if (또 다른 기본경우인지 확인)

return 또 다른 기본 값

else

(어떤 작업)

return (재귀호출)

재귀호출 될때마다 메서드의 복사본(실제로는 변수만)이 메모리에 만들어지고 메서드가 종료될때 복사본이 메모리에서 삭제된다. 


재귀와 반복 비교

재귀

1. 기본 경우에 도달하면 종료한다.

2. 각 재귀 호출은 스택에 공간을 필요로 한다.

3. 무한루프에 들어가면 메모리 용량을 초과해서 스택 오버플로우가 발생한다.

4. 어떤 문제의 답은 재귀적인 수식으로 만들기 쉽다.

반복

1. 조건이 거짓일 때 종료한다.

2. 각 반복이 별도 공간을 필요로 하지 않는다.

3. 무한 루프는 추가 메모리가 필요하지 않아 무한히 반복한다.

4. 반복 해법은 재귀 해법에 비해 간단하지 않을 때가 있다.

재귀 참고사항

재귀적 알고리즘에는 2가지, 재귀적 경우와 기본경우가 있다.

모든 재귀함수는 기본경우에 종료해야한다.

일반적으로 반복해법이 재귀해법보다 효율적이다. 반복은 추가 메모리를 필요로하지 않는다.

재귀적으로 풀 수 있는 문제는 반복적으로 풀 수도 있다.

어떤 문제들의 경우엔 눈에 띄는 반복적 알고리즘이 없을 수도 있다.

어떤 문제는 재귀적 해법이 최적이고, 어떤 문제는 그렇지 않다.


재귀알고리즘 예

피보나치 수열, 팩토리얼 구하기, 병합 정렬, 퀵 정렬, 이진 검색, 트리탐색, 중위, 전위, 후위 등 트리문제, 그래프 탐색, 깊이우선탐색(DFS), 너비우선탐색(BFS)


백트래킹

분할 정복을 이용한 완전검색 기법이다.

백트래킹 알고리즘 예

이진문자열, k-ary문자열 만들기, 배낭채우기, 문자열 일반화, 해밀턴 사이클, 그래픽 색칠


문제 : n 비트의 모든 문자열을 생성하라.

import java.io.*;

public class Binary {

static int[] A;

static void binary(int n){

if(n<1){

for(int i:A)

System.out.print(i);

System.out.println();

}

else{

A[n-1] = 0;

binary(n-1);

A[n-1] = 1;

binary(n-1);

}

}


public static void main(String[] args) throws Exception{

int N;

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

N = Integer.parseInt(br.readLine());


A = new int[N];

binary(N);

}

}

입력 / 출력

3

000

100

010

110

001

101

011

111


문제 : 0..k-1 사이에서 고른 길이가 n인 모든 문자열을 생성하라


import java.io.*;

import java.util.*;

public class Recursive {

static int N,K;

static int[] A;


public static void rec(int n,int k){

if(n<1){

for(int i:A)

System.out.print(i);

System.out.println();

}

else{

for(int j=0;j<k;j++){

A[n-1] = j;

rec(n-1,k);

}

}

}

public static void main(String[] args) throws Exception{


BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

StringTokenizer st = new StringTokenizer(br.readLine());

N = Integer.parseInt(st.nextToken());

K = Integer.parseInt(st.nextToken());

A = new int[N];

rec(N,K);

}

}

입력 / 출력

3 3

000

100

200

010

110

210

020

120

220

001

101

201

011

111

211

021

121

221

002

102

202

012

112

212

022

122

222

'SW > 알고리즘' 카테고리의 다른 글

위상정렬 Topological sort  (0) 2017.08.18
이진탐색 binary search  (0) 2017.08.08
삼각형의 넓이  (0) 2017.01.13
(a+b)%c = (a%c+b%c)%c 증명  (0) 2017.01.12
부분 문자열 일치찾기  (0) 2017.01.09

멀티스레드

스레드는 프로그램의 흐름을 말한다. 프로그램을 실행하면, main() 메소드가 호출되어 하나의 스레드가 시작된다. 일반적으로 프로그램이 하나의 흐름으로 실행되는 것을 싱글 스레드라고 하는데 이 흐름을 여러개 만들어 동시에 실행하는 것을 멀티스레드라고 한다.

Thread 클래스를 상속받아 run() 메소드를 오버라이딩 한다.


현재시각

currentTimeMills() 메소드는 그리니치 표준시로 1970/1/1 00:00:00부터 현재까지 경과시간을 밀리초로 long형 리턴한다. 밀리초인데다가 시차고려도 되지 않아 date 클래스를 이용하여 변환한다.

long time = System.currentTimeMills();

Date d = new Date(time);

Calendar 클래스

캘린더 클래스는 date 오브젝트값을 년,월,일,시간 등의 값으로 변환하는 추상클래스이다. 일반적인 달력으로 변환하기 위해서 GregorianCalendar 클래스를 사용한다.

Math 클래스

수학과 관련된 메소드를 사용한다.

메소드 

동작 

사용법 

abs() 

절대값 

int a = Math.abs(b) 

max() 

최대값

int a = Math.max(b,c) 

min() 

최소값

int a = Math.min(b,c) 

sqrt() 

제곱근

double z = Math.sqrt(x) 

exp() 

e지수

double z = Math.exp(x) 

pow() 

거듭제곱

double z = Math.pow(x,y) 

log() 

자연대수

double z = Math.log(x) 

sin() 

사인

double z = Math.sin(x) 

cos() 

코사인

double z = Math.cos(x) 

tan() 

탄젠트

double z = Math.tan(x) 

toRadians() 

각도 > 라디안

double b = Math.toRadians(a) 

toDegrees()

라디안 > 각도

double a = Math.toDegrees(b) 

random()

난수생성

double ran = Math.random() 

수학과 관련된 필드

필드명 

내용 

자연로그 밑 (2.718...) 

PI

원주율(3.141592...) 


비트연산자

논리곱 & : 각비트를 비교하여 모두 1이면 1, 아니면 0을 반환

논리합 | : 각비트를 비교하여 한쪽이 1이면 1, 아니면 0을 반환

배타적논리합 ^ : 각비트를 비교하여 한쪽이 1이고 다른한쪽이 0이면 1, 그렇지 않으면 0을 반환

보수 ~ : 각 비트를 반전한 값을 반환


시프트 연산자

비트열을 좌우로 이동하는 연산자를 시프트연산자라고 한다.

왼쪽 시프트 연산자 << : 왼쪽으로 시프트한다. 10 << 2 10을 왼쪽으로 2비트 시프트한다. 최상위비트는 사라지고 최하위비트는 0으로 채워진다.

오른쪽 시프트 연산자 >> : 오른쪽으로 시프트한다. 10 >> 2 10을 오른쪽으로 2비트 시프트한다. 최하위비트는 사라지고 최상위비트는 시프트전 최상위 비트값과 같은 값으로 채워진다.

논리 오른쪽 시프트 연산자 >>> : 오른쪽으로 시프트하면서 최상위는 0으로 채워진다. 10 >> 2 10을 오른쪽으로 논리 2비트 시프트한다. 최하위비트는 사라지고 최상위비트는 0으로 채워진다.


File 클래스

File 클래스는 파일명 자체를 표현하기도 하고 파일과 디렉토리를 다루기 위한 클래스이기도 하다. java.io 패키지를 임포트해야 사용할 수 있다.

메소드명 

기능 

사용법 

생성자 

 파일명 초기화

File f = new File("file.txt") 

getAbsolutePath() 

파일 또는 디렉토리의 절대경로명 

File f = new File("file.txt")

String a = f.getAbsolutePath() 

isAbsolute() 

절대경로명인지 판단 

File f = new File("file.txt")

boolean a = f.isAbsolute() 

list() 

디렉토리에 있는 파일과 디렉토리 문자열로 가져옴

File d = new File("dir")

String[] b = d.list() 

mkdir() 

디렉토리를 생성

File d = new File("dir")

boolean a = d.mkdir() 

delete() 

파일 또는 디렉토리 삭제

File f = new File("file.txt")

boolean a = f.delete() 

renameTo() 

파일명 변경

File f1 = new File("file1.txt")

File f2 = new File("file2.txt")

boolean a = f1.renameTo(f2) 

isFile() 

파일인지 아닌지 판정

File f = new File("file.txt")

boolean a = f.isFile() 

isDirectory() 

디렉토리인지 아닌지 판정

File d = new File("dir")

boolean a = d.isDirectory() 

exists() 

파일 또는 디렉토리가 존재하는지 판정

File f = new File("file.txt")

boolean a = f.exists() 


printf() 메소드

C언어처럼 서식을 지정하여 데이터를 표시할수 있다. format() 메소드를 사용해도 같은 결과가 나온다.

%d : 정수를 10진수로 표시

%f : 실수를 표시

%c : 문자를 표시

%s : 문자열을 표시

printf("%4d",25) : 공백두개와 25 출력. printf("%04d",25) : 0025 출력. %6.2f 는 전체 6자리 소수점이하 2자리 표시


for 확장

반복할 횟수를 미리 정하지 않고 요소의 개수만큼 반복하기.

int[] a = (1,2,3,4};

for(int b : a)    // 4번 반복됨


메소드의 가변인수

인수의 배열을 받기때문에 미리 인수의 개수를 맞춰 메소드를 호출하지 않아도 된다.

int add(int...a) {     // int 리턴값의 형, add 메소드명, int 인수형 a 인수배열명

}

int sum = add(1,2,3,4,5);    // 인수를 배열로 호출함


오버라이딩 확장

버전6.0에서 리턴값과 타입이 다른 메소드도 오버라이딩을 할 수 있다. 단, 리턴값의 타입은 상속한 메소드의 서브클래스여야 한다.


Scanner 클래스

키보드입력일 경우

Scanner sc = new Scanner(System.in);

문자열 입력일 경우

String text = "ABCDEF";

Scanner sc = new Scanner(text);


Static 임포트

static 필드와 메소드만 임포트할 수 있다.

특정 static 멤버만 임포트할 경우

import static Class1.S1;    // Class1 의 모든 멤버를 임포트할 경우 Class.*

class C {

x = S1;    // 임포트한 멤버는 클래스명 생략가능    

y = Class1.S2;    // 임포트하지 않은 멤버는 클래스명 기술해야함

}


Auto-Boxing

6.0 이상에서는 기본 데이터형과 랩퍼 클래스가 자동 변환되어 캐스트할 필요가 없다.


제네릭(Generics)

타입을 파라미터로 하여 추상적으로 표현한다. 이것을 활용하면 번거로운 타입 캐스팅과정이 필요없다. 오브젝트를 생성하기 전까지는 타입을 추상적으로 표현하고, 오브젝트 생성시에 구체적인 타입을 지정한다.

class A <T> {    //  타입 파라미터 선언

private T t ;    // 필드의 타입으로 사용    

public method1(T x) { }    // 인수의 타입으로 사용    

public T method2() { }    // 리턴값의 타입으로 사용

}

A<String> a = new A<String> ();    // 인스턴스 생성시 타입을 String 으로 지


열거형(enum)

사용자가 독자적인 상수를 정의하여 상수를 기술할 수 있음. 코드의 가독성이 향상됨.

public enum Korail { Mugunghwa, Saemaul, KTX }    //  열거형 선언    

Korail ko = Korial.Mugunghwa ;     // 열거형 변수 선언 및 상수 대입


이 내용은 ANK Co.,Ltd. 저 김성훈 역의 Java가 보이는 그림책에서 요약 발췌하였습니다.

패키지

패키지는 클래스를 하나로 모아 놓은 것이다. 패키지에 포함된 클래스는 해당 패키지를 호출하기 위해 한 줄만 기술하여 사용할 수 있다. 패키지가 다르면 동일한 이름의 클래스도 존재할 수 있다. 패키지 안에서 다른 패키지를 이용할 경우는 패키지 선언을 먼저 기술한다.

패키지 선언

package pack1;    //파일 처음에 쓴다. 

public class A { }

패키지 임포트

다른 패키지에 포함된 클래스나 인터페이스를 이용한다.

import pack1.B;

class C { B b = new B(); }


랩퍼클래스

java 의 기본데이터형에 대응하는 클래스가 존재한다. 이 클래스를 랩퍼클래스라고 하며 변수와 같이 사용할 수 있다.

기본데이터형의 랩퍼클래스

기본데이터형 

랩퍼클래스 

byte 

Byte 

short 

Short 

int 

Integer 

long 

Long 

float 

Float 

double 

Double 

char 

Character 

boolean 

Boolean 

수치형 랩퍼 클래스에는 다른 형으로 변환한 값을 얻을수 있는 메소드가 있다.

byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()

랩퍼 클래스의 오브젝트끼리 비교하기 위해서는 equals() 메소드를 사용한다. 동일할경우 true를 반환한다.

정수형 랩퍼 클래스는 각각 문자열을 정수형으로 변환하는 메소드가 있다.

parseByte(), parseShort(), parseLong(), parseInt()


String 클래스 메소드

int l = a.length();    // a 문자열의 길이를 리턴한다.

String a = "ABCDEF";

String b = a.substring(2,5);    // CDE 를 리턴한다.

int c = a.compareTo(b);     // a와 b문자열을 사전적으로 비교한다. a가 앞이면 음수, 같으면 0, 뒤면 양수를 반환한다. (대소문자 구분)

StringTokenizer a = new StringTokenizer(b,",")    // b문자열을 , 구분문자로 구분하여 a 문자열(Token)로 리턴한다 구분문자가 없을경우 공백으로 구분한다.

hasMoreTokens()    // 토큰이 있을경우 true 리턴한다.

nextToken()     // 토큰을 차례대로 가져온다.


시스템 프로퍼티

시스템 환경설정 정보를 얻을 수 있다. java.util 패키지를 import 하여 사용할 수 있다.

import java.util.*;

String str = System.getProperty("java.version");     // getProperty() 에 원하는 프로퍼티를 지정하여 환경설정 정보를 얻는다.

주요프로퍼티

프로퍼티 

의미 

java.version

자바버전 

java.vendor 

자바벤더 

java.vendor.url 

자바벤더 URL 

java.home 

자바 인스톨 디렉토리 

java.class.version 

자바 클래스 버전 

java.class.path 

자바클래스 경로 

java.ext.dir 

확장기능 클래스 포함하는 디렉토리 

os.name 

OS 이름 

os.arch 

OS 아키텍처 

os.version 

OS 버전

file.separator 

파일 구분문자 

path.separator 

경로 구분문자 

line.separator 

행 구분문자 

user.name 

사용자 계정 

user.home 

사용자 홈 디렉토리 

user.dir 

현재 작업 디렉토리 


이 내용은 ANK Co.,Ltd. 저 김성훈 역의 Java가 보이는 그림책에서 요약 발췌하였습니다.

예외처 리

프로그램 실행시 예측하지 못하는 상황이 발생하여 에러가 났을때 처리방법이다. Java는 예외가 발생하면 자동적으로 예외클래스의 오브젝트가 생성된다. 예외 클래스는 Exception 클래스와 그 서브 클래스가 있다.

try : 예외가 발생할 수 있는 처리 기술

catch : 예외의 종류를 나타내는 예외 오브젝트를 받음

finally : 예외가 일어나든 일어나지 않든 항상 실행됨. 생략가능

throws : 예외가 일어날 것 같은 메소드에 throws를 사용하여 예외 클래스를 지정함. 예외를 받아줄 catch문이 있어야 함.

class Main {

public static void main (String[] args) {

try {

back(args[0]);

} catch (Exception e) {

System.out.println("커맨드라인 인수가 없습니다.");

} finally {

System.out.println("종료합니다.");

}

}

static void back(String a) throws Exception {    // Exception은 예외 클래스명으로 Exception으로 기술하면 어떤 에러도 대응가능하다.

System.out.println(a);

}

}


스트림

파일을 읽고 쓸때 데이터의 흐름을 스트림이라고 하며 java에서는 파일을 읽고 쓰기 위해 스트림 전용 클래스로 생성된 오브젝트를 사용한다. 스트림은 취급하는 데이터에 따라 문자스트림과 바이트 스트림으로 나뉜다. 문자스트림은 16비트 유니코드 문자 데이터를 다루고 바이트 스트림은 8비트 데이터를 다룬다.

스트림 클래스는 추상 클래스의 서브 클래스로 되어있다.

스트림 

입력스트림 

출력스트림 

문자 스트림 

Reader 

Writer 

바이트 스트림 

InputStream 

OutputStream 


텍스트 파일 읽기

FileReader in = new FileReader("file1.txt");    // file1.txt 파일을 연다.

int c = in.read();        // 읽어온 문자를 int 형 정수로 변환한다. 읽을 데이터가 없으면 -1 을 리턴한다.

in.close();            // 파일을 닫는다.


import java.io.*;

class ReaderText {

public static void main(String[] args) {

try {

FileReader in = new FileReader(args[0]) ;

int c;

String s = new String();

while((c=in.read())!=-1)

s = s + (char)c;

System.out.print(s);

in.close();

} catch(IOException ie) {

System.out.println("File is not exist.");

} catch(Exception e) {

System.out.println("Error");

}

}

}


텍스트 파일 쓰기

FileWriter out = new FileWriter("file2.txt");    // file2.txt 이름의 파일을 생성한다. 같은 이름의 파일이 있을경우 덮어쓴다.

out.write("Hello\n");        // 데이터를 쓴다.

out.close();    //파일을 닫는다.


import java.io.*;

class WriteText {

public static void main(String[] args) {

try {

FileWriter out = new FileWriter("math.txt");    // math.txt 는 WriteText.java 와 동일 디렉토리에 생성됨

int a = 10, b = 5;

out.write(a + "+" + b + "=" + (a+b) + "\n");

out.close();

} catch(Exception e){

System.out.println(e);

}

}

}


바이너리 파일 읽기쓰기

바이너리 파일 읽기

FileInputStream in = new FileInputStream("file3.dat");    //바이너리 파일을 연다.

int c = in.read();    //읽은 1바이트 데이터를 int형 정수로 변환한다. 읽을 데이터가 없으면 -1을 리턴한다.

in.close();    // 파일을 닫는다.

바이너리 파일 쓰기

FileOutputStream out = new FileOutputStream("file4.dat");    // file4.dat 이름의 바이너리 파일을 생성한다.

out.write(65);    // 65를 쓴다.

out.close();    //파일을 닫는다.

바이트스트림 데이터를 문자로 읽기

FileInputStream ifile = new FileInputStream("file5.dat");

InputStreamReader in = new InputStreamReader(ifile);

바이트스트림 데이터를 문자로 쓰기

FileOutputStream ofile = new FileOutputStream("file5.dat");

OutputStreamWriter out = new OutputStreamWriter(ofile);

키보드 입력

키보드 문자 하나 입력받기

int a = System.in.read();

키보드 문자 행단위로 읽기

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String c = br.readLine();     // 읽은 데이터를 라인 한개씩 문자열로 반환함


시리얼라이즈

java에서는 오브젝트의 정보를 비트열로 만들어 파일에 기록하고, 다시 읽어서 원래의 오브젝트를 만들 수 있다. 이 때, 오브젝트를 비트열화하여 출력 스트림으로 기록하는 것을 시리얼라이즈, 입력 스트림으로 읽어 들여 원래의 오브젝트로 만드는 것을 디시리얼라이즈라고 한다. 시리얼라이즈를 하기 위해서는 클래스에서 Serializable 인터페이스를 구현해야 하는데 여기에는 메소드가 없기 때문에 오버라이딩할 필요는 없다.

import java.io.*;

class A implements Serializable { }

비트열화한 오브젝트 입출력을 위해서는 ObjectInputStream 클래스와 ObjectOutputStream 클래스를 사용한다.


이 내용은 ANK Co.,Ltd. 저 김성훈 역의 Java가 보이는 그림책에서 요약 발췌하였습니다.

추상클래스

추상화된 클래스. 추상 메소드는 처리내용을 기술하지 않고 메소드 정의만(인수와 리턴형태) 기술하는 메소드인데 추상 메소드를 가진 클래스를 추상 클래스라고 한다. 이 메소드가 무엇을 하는지는 서브클래스가 상속받은 추상 메소드를 오버라이딩하여 기술한다. 추상클래스, 추상메소드는 abstract 를 사용하여 정의한다.

abstract class Animal {

String name ;

abstract void cry();

}

서브클래스에서 상속받은 추상메소드를 오버라이딩한다.

class Cat extends Animal {

void cry() { System.out.println("야옹"); }


인터페이스

상속관계가 아닌 클래스에 기능을 제공한다. 클래스와 다른 점은 정의와 추상 메소드만이 멤버가 될 수 있다. 인터페이스를 구현하기 위해서는 implements를 사용한다.

interface A {

public static final int a = 2;    //  정수

public abstract void say( );    // 추상 메소드

}

아래와 같이 생략가능

interface A {

int a = 2;

say( ) ;

}

인터페이스는 상속관계가 아니기 때문에 몇개라도 구현 가능하다.

class X implements A,B,C {

}

인터페이스는 인터페이스를 상속할 수 있다.

interface B extends A { }

인터페이스는 인터페이스를 다중상속할 수 있다.

interface X extends A,B,C { }

클래스를 상속하고 인터페이스를 구현하는 것을 동시에 할 수 있다.

class C extends A implements B { }        // extends 를 먼저 기술한다.


다형성

상속한 클래스의 오브젝트는 슈퍼클래스나 서브클래스로 다룰 수 있다. 하나의 오브젝트와 메소드가 많은 형태를 가지고 있는 것을 다형성이라 한다.

서브클래스의 오브젝트는 슈퍼클래스의 오브젝트에 대입할 수 있다. 반면 슈펴클래스의 오브젝트가 서브클래스의 오브젝트에는 대입할 수 없다.

class A {

int m = 10;

void p() { }

}

class B extends A {

int n = 20;

void p() { }

}

A a = new A();

B b = new B();

b.m = 30;

a = b;  // a.m 은 30 이 된다.

서브클래스의 오브젝트는 슈퍼클래스의 오브젝트로 생성할 수 있다.

X a = new Y(); // X 슈퍼클래스, Y 서브클래 스

instanceof 로 지정한 클래스의 오브젝트인지 조사할 수 있다. 동일 방법으로 인터페이스를 구현하고 있는지도 확인할 수 있다.

boolean flag = c instanceof X; 


오브젝트 복제

shallow copy : 데이터형 변수 copy, 참조형 변수 공유

deep copy : 데이터형 변수 copy, 참조형 변수 copy

class Person implements Cloneable {

String name; int age;

public Object clone() {

Person a = new Person();

a.name = new String(name);

a.age = age;

return a;

}

Person x = new Person();

Person y = (Person)x.clone();


이 내용은 ANK Co.,Ltd. 저 김성훈 역의 Java가 보이는 그림책에서 요약 발췌하였습니다.

상속(inheritance)

클래스는 다른 클래스의 멤버를 승계받을 수 있다. 이것을 클래스의 상속이라고 한다. 물려주는 클래스를 슈퍼클래스(부모 클래스)라고 하고, 물려받은 클래스를 서브클래스(자식 클래스) 라고 한다. 서브 클래스는 여러클래스로 만들 수 있지만 부모클래스는 하나이다. 즉, 단일상속만을 허용한다.

자바가 C++과 같이 다중상속을 지원하지 않는이유는 같은 이름을 가진 멤버가 양쪽의 슈퍼클래스로부터 상속받았을때 모호성을 가지기 때문이다. 

상속을 받기 위해서는 extends 를 사용한다.

class Cat extends Animal {    // Cat 은 서브클래스, Animal 은 슈퍼클래스

}


오버라이딩

상속된 메소드와 동일한 이름, 동일한 인수, 동일한 리턴값의 형을 가지는 메소드를 정의하여 메소드 덮어쓰기를 하는 것이다. 서브 클래스 안에서 super를 사용하면 슈퍼클래스의 필드와 메소드를 참조한다. this는 기술된 오브젝트 그 자체를 나타낸다. 오브젝트 내의 필드와 메소드는 앞에 this라는 키워드를 붙이는데 생략해도 상관없다. 메소드의 인수명과 인스턴스의 필드명이 동일할때 쉽게 구분해주는 역할을 한다.

class Greeting {

void bye () { System.out.println("good bye");

}

class Insa extends Greeting {

void bye () {System.out.println("안녕히 계세요");

}



접근제한자

접근제한자는 클래스와 멤버의 성질을 지정한다. 

접근제한자 

오브젝트 안에서 이용 

동일 패키지내 이용

동일 패키지 상속 

외부 패키지 상속 

외부 패키지 이용 

public

protected 

없음 

private 


final 제한자는 필드나 클래스에 붙일 수 있다. final 을 붙이면 필드는 값을 변경할 수 없고, 클래스는 상속할 수 없다.

static  제한자는 필드나 클래스에 붙일 수 있다. static이 붙은 것은 이미 오브젝트가 생성되어 있는것이다. 때문에 따로 오브젝트를 생성하지 않고도 바로 사용할 수 있다. 같은 클래스에서 생성된 오브젝트들은 static을 붙인 필드의 값을 공유한다. static이 붙은 메소드는 어떤 오브젝트에서도 같은 동작을 하게 된다. static 메소드에서 동일 오브젝트내의 멤버를 이용하기 위해서는 멤버에게 static을 붙여야만 한다. static 메소드는 오버라이딩 할 수 없다. 


이 내용은 ANK Co.,Ltd. 저 김성훈 역의 Java가 보이는 그림책에서 요약 발췌하였습니다.

오버로딩

하나의 클래스 내에 인수의 개수나 형이 다른 동일한 이름의 메소드를 여러개 정의하여 메소드를 호출할때 인수의 개수나 형이 일치하는 메소드가 호출되는 것

class Calc {

int add(int a, int b){

return a + b;

}

int add(int a){

return a + 1;

}

double add(double a, double b){

return a + b;

}

}


생성 자

오브젝트 생성과 함께 자동으로 실행되는 메소드. 주로 필드 초기화에 이용된다. 생성자는 클래스와 같은 이름으로 정의한다.

class Book {

Book(){

price = 0;

num = 0;

title = "";

}

}

Book book1 = new Book(); // 오브젝트 생성과 동시에 생성자 메소드 Book() 이 실행된다.


디폴트 생성자

생성자를 기술하지 않을 경우, 인수가 없는 생성자가 자동으로 만들어진다.

class Book {

Book() {} // 디폴트 생성자

}


복제 생성자

동일한 클래스의 오브젝트를 인수로 받아서, 대응하는 필드에 값을 대입하는 생성자를 복제생성자라 한다. 복제 생성자는 전달받은 오브젝트를 복제한다.

class Book {

Book(Book copy) {      // 복제생성자

price = copy.price ;

num = copy.num;

title = copy.title;

}

}


main() 메소드

메인 메소드는 프로그램이 실행할 때 최초로 실행되는 메소드이며 하나의 클래스에 한개만 존재할 수 있다.

public static void main(String[] args)

위 메인 메소드는 String 배열의 인수를 터미널로부터 입력을 받아들입니다.

$ java Main orange apple grape <-- 커맨드 창에 입력

class Main {

public static void main(String[] args) {

for(int i;i<args.length; i++)

System.out.println((i+1) +":"+args[i]);

}

}

결과 : 1:orange

  2:apple

  3:grape


이 내용은 ANK Co.,Ltd. 저 김성훈 역의 Java가 보이는 그림책에서 요약 발췌하였습니다.

'SW > Java' 카테고리의 다른 글

추상클래스 인터페이스 다형성 오브젝트복제  (0) 2017.01.15
상속 오버라이딩 접근제한자  (0) 2017.01.15
클래스 Class  (0) 2017.01.15
반복문 for, while  (0) 2017.01.09
제어문 if, switch  (0) 2017.01.09

+ Recent posts