- [Java 기본]메소드, 1차원 배열

Posted by 겨울에
2011. 5. 14. 15:46 scrap/ Java/JSP
출처 : http://cafe.naver.com/litave/357


//===========================================================================//
  본 내용은 2002년 제가 Java 강의를 수강하며 정리 했던 내용을
    기본으로 하여 정리하였습니다.
  - 마침 java 기초를 전파할 기회가 생겨 핑계김에 정리해 가려 합니다.
  작성자 : litwave
//---------------------------------------------------------------------------//
<목차>
1. Method
2. 1차원 배열

//---------------------------------------------------------------------------//

1. Java Method
  1.1 형식
     접근자제한자  지정어  결과형리턴값  Method명(매개변수들) [throws 예외클래스1, 예외클래스2...] {
       내용 정의부;
     }

    1) 접근자 : 
      a) private
      b) protected
      c) package = NONE = friendly
      d) public

    2) 지정어
      a) final
      b) static
      c) abstract
      d) synchronized
      e) native


    3) [] : 예외 처리부


  1.2 함수란?(java의 Method 는 C의 함수를 생각하면 된다.)
    ***
     *
    ***

    a) 프로그램의 특정 부분에서 위와 같은 * 들을 찍는 프로그램을 짠다고 가정하자.
    b) 필요시에 해당 프로그램 부분을 복사해서 붙여 넣을수도 있다. 
    c) 하지만 이것을 시도 때도 없이 사용할 경우가 생긴다면 사용하기가 너무 까다러워 진다.
    d) 그래서 이런 까다로운 작업에 이름을 지어둔다.(예: aaa라고..)
    e) 이와 같이 하나의 덩어리가 하나의 행위(특정기능)를 수행하도록 만드는 것을 함수라고 한다.

    1) 함수 : 어떤행위들의 묶음이다.

  1.3 자바의 메소드는 클래스를 벗어나 단독적으로 사용될 수 없다.

  1.4 public static void main(String [] ar)    //Method 선언의 예

    1) 접근자 : 외부에서 메소드를 사용할 수 있는가를 제한해줄 수 있는 접근자.
       - 절대 생락 불가하다.

      a) private
        - 클래스 내부의 메소드 끼리만 서로 사용이 가능하다.
        - 외부에서 접근이 절대 불가능하다.

      b) protected
        - 동일 클래스 내에서 사용가능
        - 하나의 파일 내에서 사용가능
        - 상속 관계의 하위 클래스에서 사용가능

      c) package = NONE = friendly
        - 접근자를 생략하면, 디폴트로 package 로 된다.
        - 동일 클래스 내에서 사용가능
        - 하나의 파일 내에서 사용가능.
        - 동일 package 상의 클래스들 끼리 사용가능하다.
          동일 package 상의 클래스 : 예) java.lang.* 의 모든 클래스 끼리 사용가능하다.

      d) public
        - 모든 곳에서 사용 가능하다.

    2) 지정어
      a) final  -> 상속에서 공부할 예정
      b) static -> class 에서 공부할 예정
        - static Method 에서 사용할 수 있는 Method 는 static 밖에 없다.
        - static Method 에서는 static 멤버들만 호출이 되지만 그건 자기 자신의 클래스를 말하는 것이고,
          스태틱 메인내에서
            Ho0109_1 ho = new Ho0109_1();
            ho.choiceMenu(mainMenu());
            이런식으로 사용 할 수 있다.

      c) abstract -> 추상클래스와 인터페이스 공부할 때 배울 예정
      d) synchronized -> Thread에서 동기화 공부할 때 배울 예정
      e) native -> 절대 안 배운다.(중 상급자이상..)


    3) 결과형 리턴값
      - Method가 실행된 다음에 되돌려 줄 값
      - 모든 Method는 프로그램 마지막에 return; 이 생략되었다고 생각해야 한다.
      - 되돌려줄 값이 없을 때는 return; 만하면 된다.
      - 되돌려줄 값과 형태를 적어주는 것이다.

    4) Method명 
      - 사용자 정의 메소드
      - main 메소드는 자바의 주 메소드 이다.

      a) C 언어의 예: 두개의 수를 받아서 덧셈 하는 함수
        int aaa(int a, int b) {
          int c = a + b;
          return c;
        }

    5) 예외 전가
      - 이 함수에서 입력과 출력에서 일어나는 것은 에러가 아니라고 알려주는 것.
      - 여러가지 예외(입출력, 네트웍...)를 동시에 적어서 사용이 가능하다.


  1.5 자바에서는 3가지 형태의 method 가 존재한다.
    1) Call by Name
      - 이름만 가지고 메소드의 역할을 수행하는 것
      - 예) System.out.println(); 

    2) Call by Value
      - 내용을 처리하기 위해서 내용을 값으로 보내는 것들
      - 원본 데이타의 값은 Method 실행 이후에 전혀 영향을 주지 않는다.
      - 예) System.exit(0);   -> 프로그램 종료하는 것.

    3) Call by reference 
      - C언어에서 Call by reference와 Call by point를 합쳐 놓은 형태이다.
      - 호출한 함수 측에서 데이터를 변경하면, 원본 데이터도 변경된다.
      - 예) 
        StringBuffer sb = new StringBuffer("ABC");
        demo.executeSimpleTest(sb);     // 원본 데이터를 변경시킨다.

      a) C언어에서 예)
        char * ch = "ABC";
        - "ABC"는 메모리 어딘가에 보관 되어 있고, ch에서는 해당 시작 주소를 보관하고 있다.
        - 자바에서도 " " 를 사용하면 주소로 인식한다.


  1.6 메소드의 예  -> Ex0106_01.java
    a) yon = (char)System.in.read();
      - 위의 코드에서 키보드가 입력 되었을 때는 프로그램이 완전히 종료된 상태를 의미 한다.
      - 하지만 프로그램이 계속 될 경우 인위적인 엔터 키 처리가 필요하다. System.in.read();
      - 여기서 문제는 엔터 키(\r\n)를  32비트로 처리하는 프로세서에서는 하나의 문자로 처리하지만.
        도스 모드에서는 16비트 처리를 하기 때문에... 2개의 문자로 처리한다.
      - 그래서 도스에서는 
          System.in.read();      // 엔터키 처리... \r -- Cmd
          System.in.read();      // 엔터키 처리... \n -- Cmd
        과 같이 처리해서 사용해야 한다.

      - 그래서 컴파일 사양을 알고 처리해야 한다.
        혹은 if(System.in.read() == '\r') System.in.read(); 같이 사용할 수도 있다.


//---------------------------------------------------------------------------//

2. Java 배열
  1) 선언
    자료형[] 배열명;
    자료형 배열명[];

  2) 초기화
    배열명 = new 자료형[개수];
    배열명 = {값1, 값2, ... };
    배열명 = new 자료형[개수]{값1, 값2, ... };

  3) 자바배열의 특징
    a) 자바 배열의 배열명은 reference type으로 4byte의 크기를 가진다.
    b) length 개체로 배열의 길이 값 확인
    c) 배열명 reference는 run time Stack 에 할당되고
       Data 는 heap Memory 할당된다.
    d) 배열 초기화시 자동 Default Data 대입.
    e) 초기화 되지 않은 공간 사용시 NullPointerException 이 발생
    f) 정적 + 동적 Data 생성
    g) Java의 reference 변수는 무조건 1차원 배열명만 기억한다.  <-- 매우 중요..
      - 자바는 1차원 배열만이 존재 한다.

  4) 참고 사항
    a) 자바에서는 배열 파트가 아주 중요하다.
    b) 자바 배열은 내부적으로 포인터를 이용하고 있다.

  2.1 구체적 설명
    - 배열 : 동일한 자료형으로 선언된 변수 공간을 메모리 상에 연속적으로 나열하고, 관리상의 효율성을 기한 것.

    1) 선언
      자료형[] 배열명;    ex)  int[] a, b, c, d;
      자료형 배열명[];    ex)  int a, b[], c, d[];

      - int[][] a, b, c, d;
      - int[] a[], b, c[];   -> a,c는 2차원 배열 b는 1차원 배열로 선언 되어 있다.

      a) 자료형[] 의 형태는 전부 배열의 선언을 나타낸다.

      b)자료형
        - 자바 배열의 배열명은 reference type(참조타입)으로 4byte 이다.
          클래스의 reference type도 4byte이고 reference type은 무조건 4byte이다.
        - char[] ch = null;       -> 주소(reference type)는 null로 초기화 시킬 수 있다.

      2) 초기화 :
        배열명 = new 자료형[개수];
        배열명 = {값1, 값2, ... };
        배열명 = new 자료형[개수]{값1, 값2, ... };

        a) 자바에서 reference type의 초기화 방법은 동적 메모리 할당 방법 밖에 없다.
          -> 배열명 = new 자료형[개수];
            - heap 영역 상에 메모리를 할당 하십시요. 하는 것이 new 이다.

        b) quiz : 배열 50개를 선언한 변수는 어느것인가? 3
           1. String [50];
           2. String a[50];
           3. String[] a;

        c) 사용 예
           char[] ch = null;
           ch = new char[4];
           - ch는 요소 번호(0,1,2,3)를 갖게 된다.

        d) 배열 초기화시 자동으로 Default Data가 대입 된다.
          - boolean 은 falseString 은 null, refernce 는 nullint 는 0 등이 된다.

        e) 초기화 되지 않은 공간 사용시(run time 에러가 발생한다.)
           NullPointerException 발생
           - char[] ch = null; 만하고 ch를 사용하려고 하면 에러 발생

  2.2 String 배열
    - 특정 프로그램의 실행시 매개변수를 전달한 후 실행 시킬 수 있는가?
    - 지금까지 사용한 프로그램에서는 String [] ar = null 로 초기화 되어 있었다.

    a) java에 우리가 원하는 데이타를 넣을수 있는 방법
         java Ex0106_01 aaa, bbb, ccc
         와 같이 실행하면.. 처음 시작할때..

         String [] ar = new String[3]{"aaa""bbb""ccc"} 로 초기화 된다.

    b) 배열의 길이는 ar.length로 알 수 있다.
    c) 프로그램 실행시 매개변수 전달하는 법
       Ex0106_2.java 참고
    d) 매개 변수가 프로그래머 요구한 것 보다 적게 사용하였을 경우 다음 과 같이 처리 할 수 있다.
      if(ar.length != 4) {
          System.out.println("매개변수의 개수가 잘못 되었습니다.");
          System.out.println("Usage : java Ex0106_01 매개1 매개2 매개3 매개4");
          System.exit(0);    //프로그램 종료
      }
      를 넣어 주면 된다.


  2.3 우리가 선언한 배열을 사용해 보자.
    int kor = 0;
    int eng = 0;            =>   int[] sub = new int[3];      // 0:국어, 1:수학, 2:영어
    int math = 0;

    - 왼쪽과 같이 사용을 하면 
         kor = Integer.parseInt(br.readLine());
      와 같이 여러번 쓸수 밖에 없는 상황이 발생하지만,

    - 오른쪽 배열과 형태롤 사용을 하면
      for(int i=0; i < 100; i++) {
        sub[i] = Integer.parseInt(br.readLine());
      }        // 과 같이 한 문장을 여러번 사용도 가능 하다.

    1) 배열은 공통적인 것을 공통적으로 만들 수 있을 뿐만 아니라.
       공통적이지 않은 것도 공통적으로 만들어 주는 역할도 한다.
       ==> Ex0106_03 참조



//---------------------------------------------------------------------------//

오늘의 과제 : 주민등록 검증기 만들기. 이것이 출력 되도록 프로그램을 만드시오.

주민번호 = 111111-1111118  //111111-1111118 입력

입력된 주민 번호 = 111111-1111118

1int[] 배열만 사용하세요.
2System.in.read() 만을 사용해서 만들 것.



*** 기본정보 ***

이름 = litwave                // litwave
주민번호 = 111111-1111111     //111111-1111111
주민번호가 올바르지 않습니다.
계속하시겠습니까?(y/n) yes    //yes

주민번호 = 1111111-1111118    //1111111-1111118
litwave 님 개인정보 입니다.

생년월일 : 1911년 11월 11일   // 1번 과제
출생지 : 경기.인천            // 2번 과제 // 숫자별 과제 찾아내서.. 입력
나이 : 93세                   // 3번 과제 <- Date 클래스 & Calendar 클래스 찾아서.. 둘중하나만 사용...(인터넷 찾아서 적을것.)
성별 : 남성



과제 5.
java Ho0106_04 5           //국어, 영어 수학만 입력 받아서.. 출력.. 사람수는 임의로 입력

1번째 사람 정보
이름 : aaa        //aaa
국어 : 90         //90
영어 : 80         //80
수학 : 100        //100

2번째 사람 정보
.
.
.

5번째 사람 정보

번호 이름  국어 영어 수학 총점 평균 학점 석차       //출력
  1  aaa   ............................   1




=================================
주민번호 입력 받는 법.

int[] jumin = new int[14];       // 총 14개의 공간 할당.
System.out.print

주민등록번호 정보
년도 월  일  
11  11  11  -  1 2 3 4 5 6 7

1 : 몇년 파악
90
12
34

2 : 지역
34 : 구
56 : 동


마지막 수 : 검증 번호
계산 결과가 검증번호와 같지 않으면 잘못된 번호 이다.
3개의 float 공간 필요

float hap, temp, temp1
첫번째 자리수 * 2
두번째 자리수 * 3
세번째 자리수 * 4
네번째 자리수 * 5
다섯번째 자리수 * 6
여섯번째 자리수 * 7
일곱번째 자리수 * 8
여덟번째 자리수 * 9
아홉번째 자리수 * 2
열번째 자리수 * 3
열한번째 자리수 * 4
열두번째 자리수 * 5

hap = 58.0f; //가 나옴..
temp = 11.0* (int)(hap/ 11.0f) + 11.0- hap;
temp1 = temp - 10.0* (int)(temp/10.0f);
if(temp1 == jumin[13]) {
   올바른 주민 번호 입니다.
else
   틀린 주민 번호 입니다.

hap = jumin[0* 2 +
      jumin[1* 3 +
      jumin[2* 4 +
      .
      .
      .

int cre = 2;
for(int i=0; i <= 13; i++) {
//  hap += (jumin[?] * cre);
  if(i == 6continue;
     hap += (jumin[i] * cre);
     cre++;
     if(cre == 10) cre = 2;
}

//---------------------------------------------------------------------------//
//수업중 예제 소스

// Ex0106_01.java : 함수 테스트
import java.io.*;
public class Ex0106_01 {
    static BufferedReader br = new BufferedReader(
                                    new InputStreamReader(System.in));
    static int su1 = 0;
    static char yon = 0;
    static int su2 = 0;
    
    private static int hap(int a, int b) {
        int c = a + b;
        return c;
    }
    private static int cha(int a, int b) {
        int c = a - b;
        return c;
    }
    private static int gob(int a, int b) {
        int c = a * b;
        return c;
    }
    private static int na(int a, int b) {
        int c = a / b;
        return c;
    }
    private static int per(int a, int b) {
        int c = a % b;
        return c;
    }
    
    private static void input() throws IOException {
        
        System.out.print("Su1 = ");
        su1 = Integer.parseInt(br.readLine());
        do {
            System.out.print("Yon(+,-,*,/,%) = ");
            yon = (char)System.in.read();
            System.in.read();//엔터키 처리...\r--Cmd
            //System.in.read();//\n--Cmd
        } while(yon != '+' && yon != '-' && yon != '*&& yon != '/&& yon != '%');
        do {
            System.out.print("Su2 = ");
            su2 = Integer.parseInt(br.readLine());
        } while((yon == '/&& su2 == 0|| (yon == '%' && su2 == 0));
    }
    
    
    private static void output() {
        int tot =0;
        switch(yon){
        case '+':tot = hap(su1, su2); break;
        case '-':tot = cha(su1, su2); break;
        case '*':tot = gob(su1, su2); break;
        case '/':tot = na(su1, su2); break;
        case '%':tot = per(su1, su2); break;
        }
        System.out.println(su1 + " " + yon + " " + su2 + " = " + tot);
    }

    public static void main(String[] ar) throws IOException{
        input();
        output();
    }
}


// Ex_0106_2.java : 매개변수 전달 받기
import java.io.*;
class Ex_0106_2 {
    public static void main(String[] args) {
//      InputStreamReader is = new InputStreamReader(System.in);
//      BufferedReader br = new BufferedReader(is);
// ar = new String[4]{"KIM", "LEE", "PARK", "5"};   // 자동으로 들어가는 부분이다.

        if(args.length != 4) {
            System.out.println("매개변수의 개수가 잘못 되었습니다.");
            System.out.println("Usage : java Ex_0106_2 매개1 매개2 매개3 매개4");
            System.exit(0);    //프로그램 종료
        }
        for(int i=0; i < 4; i++) {
            System.out.println("ar[" + i + "] = " + args[i]);
        }
        int m = Integer.parseInt(args[3]);
        System.out.println("입력된 숫자 * 2 = " + m * 2);
    }
}


// Ex0106_03.java : 과목명 입력 후 점수 입력 받기
import java.io.*;
public class Ex0106_03 {
    public static void main(String[] ar) throws IOException{
        BufferedReader br = new BufferedReader(
                                new InputStreamReader(System.in));
                                
        //int kor = 0, eng = 0, math = 0;
        String[] subname = ar;
        int[] sub = new int[subname.length];//0:국어 1:영어 2:수학
        for(int i = 0; i < subname.length; i++){
            do{
                System.out.print(subname[i] + " = ");
                sub[i] = Integer.parseInt(br.readLine());
            }while(sub[i] < 0 || sub[i] > 100);
        }
    }
}


// Ex_0106_4 : 주민번호 입력 받기
import java.io.*;
class Ex_0106_4 {
    public static void main(String[] args) throws IOException {
        int[] idnumber = new int[14];
        System.out.print("주민번호 = ");
        for (int i=0; i < idnumber.length; i++) {
          idnumber[i] = System.in.read() - 48;
        }
        System.out.print("입력된 주민번호 = ");
        for (int i=0; i < idnumber.length; i++) {
          if(i==6) {
              System.out.print((char)(idnumber[i] + 48));
              continue;
            }
            System.out.print(idnumber[i]);
        }
    }
}

// Ex0106_04.java : 주민번호 검증
import java.io.*;
    public static void main(String[] ar) throws IOException {
        BufferedReader br = new BufferedReader(
                                new InputStreamReader(System.in));
        String name = null;
        int[] jumin = new int[14];
        System.out.print("이름 = ");
        name = br.readLine();
        System.out.print("주민번호 = ");
        for(int i = 0; i < 14; i++) {
            jumin[i] = System.in.read() - 48;
        }
        System.in.read();
        float hap = 0.0f, temp = 0.0f, temp1 = 0.0f;
        float cre = 2.0f;
        //hap = jumin[0] * 2 + jumin[1] * 3....;
        for(int i = 0; i < 13; i++) {
            if(cre == 10.0f) {
                cre = 2.0f;
            }
            if(i == 6){
                continue;
            }
            hap += (jumin[i] * cre);
            cre += 1.0f;
        }
        temp = 11.0* (int)(hap / 11.0f) + 11.0- hap;
        temp1 = temp - 10.0* (int)(temp / 10.0f);
        if(temp1 == jumin[13]) {
            System.out.println("올바른 주민번호 입니다.");
        }
        else{
            System.out.println("주민번호가 틀리군요...");
        }
    }
}


//===========================================================================//