CLASS lcl_test DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      func_meth
        IMPORTING
          i_param TYPE i
        RETURNING
          VALUE(r_res) TYPE char1.
ENDCLASS.

l_res = lcl_test=>func_meth( 1 ).

* you could also call it like this
l_res = lcl_test=>func_meth( i_param = 1 ).

* also this variant is possible
l_res = lcl_test=>func_meth( EXPORTING i_param = 1 ).

* the traditional CALL METHOD syntax would be like this
CALL METHOD lcl_test=>func_meth
  EXPORTING
    i_param = 1
  RECEIVING
    r_res = l_res.


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

YSOURCEDOWN  (0) 2024.03.28
YFILESHARING  (0) 2024.03.27
SAP HANA Studio 설치, ADT 설치(ABAP Development tools) 설치  (0) 2023.06.23
picture 조회 안되는 현상 조치  (0) 2017.06.05

load_picture_from_url method 를 사용하여 screen 에 이미지를 출력한다
이미지가 화면에 나타나지 않는 경우가 있는데 아무리 구글링을 해봐도 로컬에 있는 이미지파일을 sap 에 업로드하고 create url function을 사용해 조회하라는 가이드밖에 찾지 못했다 내 상황은 이미지서버가 별도로 존재하여 그 많은 이미지파일을 다 업로드 할수가 없었다 비슷한 async 도 사용해보고 flush 도 다 해봤지만 별수가 없었다 결국 원인을 찾았는데 sapgui 730 버전에서 이미지조회가 불안정했고 740 버전에서 잘 나타났다 이런 버그패치는 잘 알려졌으면 좋겠는데... 몇일을 고생한것보다 원인을 찾았음에 더 기쁘다 패치 배포해보면 확실히 밝혀질듯

SAPGUI 730 -> SAPGUI 740 패치후 이미지 파일이 나오지 않는 문제가 해결되었다.

역시 패치문제였던 것이다. 추가영향성분석이 끝나는대로 배포할 계획 ㅎ

이외 유용한 참고
http://abap-explorer.blogspot.kr/2008/08/html-through-abap.html?m=1


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

YSOURCEDOWN  (0) 2024.03.28
YFILESHARING  (0) 2024.03.27
SAP HANA Studio 설치, ADT 설치(ABAP Development tools) 설치  (0) 2023.06.23
ABAP OOP method 호출방법  (0) 2017.08.08

프로그램을 잘 설계 개발하는것도 중요하지만 완성된 프로그램이 목적대로 잘 수행하는지 테스트해보는 것도 중요하다.

대부분의 사고는 충분한 테스트가 되지 않은 상태에서 릴리즈되고 숨어있던 사고가 터진다.

하지만 당장 개발하기도 빠듯한데 테스트에 시간을 투자하기가 매우 부담스러운것은 사실이다. 제한된 시간에 효과적으로 테스트하기 위해 고민을 많이 하신 분들의 테스트 기법중 몇가지를 나열한다.


명세기반 기법(Specification based)

강한 동등 분할 : 입력가능한 경우의 수에 대한 모든 조합을 테스트. input 변수가 5개이고 각각 3,5,4,2,10 가지의 입력변수를 가질경우 3 X 5 X 4 X 2 X 10 = 1200가지 경우의 수를 테스트 해보는 방법. 모든 경우의 수에 대한 테스트가 가능하지만 경우의 수가 엄청나게 많아질 수가 있다. 


약한 동등 분할 : 입력가능한 경우의 수 중 가장 많은것 기준으로 조합 테스트. input 변수가 5개 이고 각각 3,5,4,2,10 가지의 입력변수를 가질경우 가장 많은 10개 기준으로 테스트해보는 방법. 10개보다 적은 3,5,4,2 가지의 변수는 10개 이내에서 반복하여 input표를 채운다. 적은 횟수의 테스트가 가능하지만 테스트 누락되는 경우의 수가 존재함


조합테스팅(Pair wise Testing) : 강한 동등 분할과 약한 동등 분할의 중간 방법으로 테스트를 하는데 필요한 값들이 다른 파라미터의 값과 최소한 한번씩은 조합을 이룬다. 조합은 약한 동등 분할과 흡사하게 시작하지만 다른 입력파라미터와의 짝이 겹치지 않게 바꿔주는데 다른 파라미터의 값과 최소한번씩 조합이 없을경우 횟수를 늘려서 약한 동등 분할보다는 테스트횟수가 늘어난다. 하지만 모든 경우의 수를 전부 테스트하지는 않기 때문에 강한 동등 분할보다는 적은 횟수를 테스트한다. 테스트 파라미터 조합을 만드는 것이 어렵기 때문에 종종 tool을 활용한다.


경계값 분석 : 범위값을 테스트하는데 범위중간의 값보다 경계의 값을 위주로 테스트한다. 즉 이상, 초과, 이하, 미만과 같이 >, >=, <, <= 처럼 의미가 모호할 수 있는 부분을 테스트한다. 입력 파라미터에 경계에 해당하는 값을 넣어 테스트해 본다. 사람들의 대화에서 흔히 전달오류가 발생하는 부분을 확인하는 기법이다.


결정테이블(decision table) : 테스트수행에 필요한 입력의 조합을 구하기 위해 사용한다. 결정 명세를 분석하여 원인과 효과를 활용하여 하나의 테이블에 작성한다. input 파라미터가 3개이고 각각 boolean 타입을 가지고 있을 경우 2^3 = 8가지 조합이 나오는데 이에 따른 원인(cause)에 의미가 없는 효과(effect)는 테스트해 볼 필요가 없기 때문에 8가지 조합에서 필요없는 테스트를 제외하면 더 적은 수의 테스트만 할 수 있다.  


상태전이 기법(state transition testing) : 이벤트, 액활동상태상태전이 사이의 관계를 검증하는 테스팅 기법이다시스템의 소프트웨어에서 상태기반 행위가 설계 내용과 일치하는지 검증하는 것이다단순 상태전이도(State transition Diagram)를 도식화하고 스위치레벨(Switch Level)이 얼마나 되는지 확인한다. 주로 임베디드에서 많이 사용하는 기법이나 일반 비즈니스 시스템에서도 화면끼리의 영향을 주는데 파악이 용이하여 활용되고 있다.


구조기반 기법(Structure based)

제어흐름 테스트(Control flow test) : 프로세스 흐름을 도식화한 flow chart 에 따라 모든 flow 경로에 대한 프로그램이 수행하도록 하여 프로그램이 설계된 대로 동작하는지 확인하는 방법이다.


데이터 흐름 테스트(Data flow test) : 제어흐름 뿐 아니라 데이터의 사용도 에러를 유발할 수 있다는 가능성에서 나타난다. 데이터는 정의되거나 사용되거나 삭제된다. 또한 서브루틴에 들어가거나 빠져나온다. 이런 데이터의 흐름조합에 따라 오류가 발생할 수 있는 패턴을 점검한다.


최소비교 테스트(Elementary comparison test)


경험기반 기법(Experience based)

에러추정 기법(Error guessing) : 경험 많은 테스터가 프로그램의 어느 부분에 에러가 많이 나는지 예측하고 테스트 케이스를 도출한다.

LinkedList 연결리스트


배열과 같이 메모리공간이 열결된 것이 아니라 다음 데이터를 레퍼런스하는 주소값으로 연결된 형태라 메모리공간이 불규칙하게 분산되어 있습니다. 데이터 탐색에는 시간이 오래 걸리지만 데이터 추가 및 삭제는 빠릅니다.

import java.util.Iterator;

import java.util.LinkedList;


public class ExamLinkedList {

public static void main(String[] args) {

  int index;

  LinkedList<String> list = new LinkedList<>();

  LinkedList<String> list2 = new LinkedList<>();

  list.add("A");

  list.add(0, "B");

  list.addFirst("C");

  list.addLast("D");

  System.out.println("list 를 처음부터 index 와 값을 출력");
  for(String str:list){

   index = list.indexOf(str);

   System.out.println("index:"+index+" value:"+str);

  }


  System.out.println("list 에 B값이 있는지 : ");
  boolean boo = list.contains("B");
  System.out.println(boo);

  System.out.print("list 에 처음값 : ");  
  System.out.println(list.getFirst());
  System.out.print("list 에 마지막값 : ");
  System.out.println(list.getLast());

  System.out.println("list 를 처음부터 index 와 값을 출력");
  for(String str:list){
   index = list.indexOf(str);
   System.out.println("index:"+index+" value:"+str);
  }

  list2.add("A"); list2.add("C"); list2.add("A"); list2.remove(1);

  System.out.print("list2 의 값이 list에 모두 포함되었는지 : ");
  boo = list.containsAll(list2);
  System.out.println(boo);

  System.out.println("list2 를 처음부터 index 와 값을 출력");
  for(String str:list2){

   index = list2.indexOf(str);

   System.out.println("index:"+index+" value:"+str);

  }

  System.out.print("list2 가 비었는지 : ");
  System.out.println(list2.isEmpty());

  Iterator<String> iter = list.iterator();

  System.out.println("iterator 를 사용해 다음값 출력");
  System.out.println(iter.next());

  System.out.println(iter.next());

  System.out.println(iter.next());

  System.out.println(iter.next());

  System.out.print("iter 에 다음값이 존재하는지 : ");
  System.out.println(iter.hasNext());

 

  list.clear();
  System.out.print("list 를 clear : ");
  System.out.println(list.isEmpty());

 }

}

 

출력

 

list 를 처음부터 index 와 값을 출력
index:0 value:C
index:1 value:B
index:2 value:A
index:3 value:D
list 에 B값이 있는지 :
true
list 에 처음값 : C
list 에 마지막값 : D
list 를 처음부터 index 와 값을 출력
index:0 value:C
index:1 value:B
index:2 value:A
index:3 value:D
list2 의 값이 list에 모두 포함되었는지 : true
list2 를 처음부터 index 와 값을 출력
index:0 value:A
index:0 value:A
list2 가 비었는지 : false
iterator 를 사용해 다음값 출력
C
B
A
D
iter 에 다음값이 존재하는지 : false
list 를 clear : true


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

ArrayList 어레이리스트  (0) 2017.01.23
Arrays 배열  (0) 2017.01.23

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가 보이는 그림책에서 요약 발췌하였습니다.

+ Recent posts