- [Java 기본]클래스, String, StringBuffer, static

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



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

<목차>
1. 클래스의 기본 구조
2. String & StringBuffer 클래스 API 확인
3. static

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

1. 클래스 구조
  - thissuper 는 모두 예약어 이다.
  - class 는 특정 목적을 수행하기 위해 모인 집합이다.

  1class 예

class A {                // 특정 점(point:좌표)을 관리하기 위한 class
  private int x;
  private int y;         // 사용자 정의형 자료형

  public A() {           // 생성자
    x = 0;
    y = 0;
  }

  public A(int a) {       // 생성자 오버로딩에 의해서 만듬
    this();
    x = a;
  }

  public A(int a, int b) {       // 오버로딩에 의해서 생성자 만듬
    this(a);
    y = b;
  }

  public void setXY(int a, int b) {
    x = a;
    y = b;
  }

  public void disp() {
    System.out.println("x = " + x);
    System.out.println("y = " + y);
  }
  
  public String toString() {    // Object의 toString() 메소드를 재정의 했다.
    return "aaa";               // 재정의를 하지 않으면 해시코드(A@aldf23) 값이 리턴된다.
  }
}

public class B {
  public static void main(String[] ar) {
    A ap = new new A();
    System.out.println(ap);       // -> A@aldf23  // 클래스이름@ + 해쉬코드 6자리
                                  // 사용자 정의 자료형을 출력하려고 하면 위와 같은 형태를 출력 하도록 약속 되어 있다.
    // System.out.println(ap); 은 자동적으로 ap.toString() 으로 바뀌고 위의 형태로 출력 된다.
                                  // 객체.  에서의 . 은 멤버를 의미한다.
                                  // A 라는 클래스 속에 ap.toString()이 있다는 것을 의미 한다.
                                  // api에서 java.lang -> Object -> toString() 를 찾을 수 있다.
    // 모든 클래스는 Object 클래스를 상속 받고, 자동으로 오브젝트 클래스의 메소드를 모두 사용할 수 있다.
    // 클래스도 메모리만 할당하면 자동적으로 초기값을 할당 한다.


  public String toString() {       // 재정의 하면..
    return "aaa";
  }
  가 A 클래스에 추가되었으므로, 
    System.out.println(ap);
  를 하면 aaa 가 출력 된다.
  이것은 자식 노드에서 메소드를 먼저 찾아 보고 있으면 그대로 실행하고, 없으면 부모 노드가서 메소드를 찾는 자바의 특징을 알 수 있다.


public class B {
  public static void main(String[] ar) {
    A ap = new new A();
    A bp = new A(1020);
    ap.disp();          // 여기서 . 은 해당 객체를 발생시킨 클래스로 부터 메소드를 찾는다.


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

2. String & StringBuffer 클래스
    - 문자열을 저장 하였다가 출력 하는 클래스
  String 은 '=' 이 오기 전에는 어떠한 메소드를 사용하여도 원본 데이타는 절대 변하지 않는다.
  StringBuffer 는 어떠한 메소드를 사용하더라도 원본 데이타의 내용이 바뀐다.

  도움말 -> java.lang -> String 클래스

  String str = "Java";        // str은 문자열 기억하는 4byte 객체
                              // 도움말을 보면.. 많은 오버로딩 메소드를 발견 할 수 있다.
  byte[] b = {(byte)'J', (byte)'a', (byte)'v', (byte)'a' };
  String str = new String(b);
  String str = new String("Java");

  String str = "Java";
  String str1 = "Java";

  String 에 존재하는 Method 들 설명
  1charAt(int)
    String str = "Java";
    char ch = str.charAt(2); // v를 ch에 넣을 수 있다.          // 위치를 알려주면 특정 문자 하나를 가져 올 수 있다.

    // 소스 코드는 Ex0108_01 에 모두 정리 되어 있음
    Ex1) System.in.read(); 에서 한문자씩 받아서 문제 되었던 것을 문자열로 받을수 있게 하시오.

  2concat("문자열");   // 문자열 뒤에 특정 문자열을 덧셈 시킬때 사용한다.
    String str = "ABC";
    String str1 = str + "DEF"// 다음을 계산할때.. 덧셈이 존재하는 순간.. 4개의 라인으로 변환 된다. 실행 시간을 느리게 만든다.
          = str.concat("DEF");

    Ex2) System.out.println("ABC" + "DEF"); 을 바꾸시오..

  3) getBytes()        //문자열 자체를 바이트 배열로 바꿔서 주는 Method
                       //네트웍에서 문자열 전송시 사용할수 있다.
    Ex3)
         String str = "Hello";
         byte[] b = str.getBytes();
         System.out.println(b.length);

  4indexOf
    indexOf (int)         // 해당 문자를 찾으면 끝난다.
    indexOf (intint)    //
    laseIndexOf(int)      //뒤에서 부터 찾아준다.
    indexOf (String)
    indexOf (String,int)

    int x = str.indexOf('a');        // a라는 문자를 앞에서 부터 찾아줌
    int x = str.indexOf('a', 2);     // 두번째 부터.. a를 찾아줌.
    int x = str.indexOf('ar', 문자위치);

    Ex4) 이메일 주소 맞는지 채크하기..

  5length()           //문자열의 길이를 리턴 받을 수 있다.
    int[] i = new int[4];
    System.out.println(i.length);
    String str = "Java";
    System.out.println(str.length());

  6substring(intint)      //특정(시작)위치에서 특정(끝) 위치까지 복사해 올수 있는 Method
     substring(int)           //시작 위치에서 끝 위치까지 복사해 오는 메소드
     String str = "Java";
     String str1 = str.substring(1,3);     // av 만 str1에 복사됨

    Ex) String str = "http://www.daum.net";
       위의 문자열이 있다고 가정하고, 다음의 결과가 출력되도록 프로그래밍 하라

       프로토콜 = http
       지역 = net

  7toUpperCase()         //문자열 전체를 대문자로 바꾸어 돌려줌
     toLowerCase()         // 문자열 전체를 소문자로 바꾸어준다.

      String str = "JaVa";
      String str1 = str.toUppperCase();

  8trim()
    1 ~ 32127 : white Character;
    글자열 시작 전이나 끝난 후에 문자열에 존재하는 화이트 캐릭터를 제거해주는 Method
      - 스페이스바를 제거해 줄때 많이 사용한다.
      이름 : l i t w a v e
      String str = "           l i t w a v e         ";
      str = str.trim();         // "l i t w a v e" 입력됨

  9valueOf()     // 모든 자료형이 된다. 오버로딩 되어 있어서.
    - static Method 로서 클래스 이름으로 접근 해야 하는 Method 이다.
      String.valueOf(?);        // ? - 특정 자료형
         숫자를 문자열로 변경 시킬때..
      String.valueOf(12);
         숫자 12를 문자열 "12"로 변경할 때 사용한다.


//---------------------------------------------------------------------------//
오늘의 과제 1:
StringBuffer 로 위의 예제 처럼 모든 10개 정도의 메소드를 사용해 볼껏..

  StringBuffer sb = new StringBuffer("Java");
  sb.delete(1,3);
  System.out.println(sb);  -> // Ja     // 원본 값이 바뀐 것 확인

// 결과형 리턴 값이.. StringBuffer인 것은 원본 값이 변경 된다.

//---------------------------------------------------------------------------//
  String str = "ABC" + "DEF";
    를 실행 시 아래의 코드로 변경되어 실행 되므로 시간이 오래 걸린다.(하위버젼)

  Stringbuffer sb = new String("ABC");
  Stringbuffer sb1 = new String("DEF");
  sb.append(sb1);
  string imsi = sb.toString();
  return imsi;


//---------------------------------------------------------------------------//
** Static이 사용되는 영역 **
3. static
  3.1 Field -> static
   ex) static int i;
       static {
          i = 10;
       }
   - 하나의 클래스로 발생된 모든 객체가 공유하는 변수 공간     //static 선언의 목적(정의) : 공유 공간
   - 클래스 이름으로도 객체로도 접근 가능        // System.out(in,err) 클래스 이름이나 객체 이름으로 Method 접속이 가능하다.
   - this 예약어를 가지지 않는 Member Field      // static 변수는 클래스의 멤버라고 이야기 한다. static로 선언된 변수는 this를 가지지 않는다.
   - 초기화 :
       static {  초기문구  }
   - 프로그램 시작시 Constant 영역에 메모리 할당    //static Field는 void main() 보다 먼저 메모리가 할당 된다.
     프로그램 종료시 소멸
                                                    // void main보다 먼저 실행되는 것이 있고, 늦게 실행 되는 것이 있다.


  3.2 Method -> static
   - static Field 의 값을 변경시키거나 리턴 or display 하기 위한 목적      // static 필드를 사용하는 시기
   - 0 번째 매개변수를 가지지 않는 Method      // static 은 this 를 가지지 않기 때문이다.
    . Non-Static-Field와
      Non-Static-Method는
      Static-Method 내부에서 사용 불가     // this가 없으므로 Non-Static-Field와 Non-Static-Method는 사용할 수 없다.
                                           // static 메소드는 객체 생성에 상관 없이 메모리에 올라가지만 일반 메소드는 객체 생성 후에 메모리에 올라가므로
                                           // static 메소드에서 선언되지 않은 메소드를 사용하는 것은 불가능하다.
                      //그러나 Non-Static-Field와 Non-Static-Method는 Static-Method를 사용할 수 있다.
   - 클래스 이름이나 객체 이름으로 호출 가능

      // 아래와 같이 특정 메소드 안에서 A 클래스에 선언된 static field를 사용 가능하다.
      main(----) {
        System.out.---(A.x)
      }

      class A {
        static int x = 10;
      }

  3.3 class -> static    // 클래스 이름 앞에 static 가 붙을 수 있다.
    -> 정적 중첩클래스에서 static 멤버를 포함하는 Inner 클래스를 만들기 위해 사용

     static : 지정어로 사용된다.

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

과제 2. 단일 선형 링크드 리스트 사용하면 됨.
출력 값:
** 은행 시스템 가동 **
1. 신규 사용자 등록
2. 사용자 전체 보기
3. 이율 변경
4. 시스템 종료
-----------> 1       // 1 입력
o 신규 사용자를 등록 합니다.
이름 = litwave
저축할 금액 = 1000
2003년 1월 8일 21시 50분에 litwave님의 계좌가 개설 되었습니다.
현재 적용이율은 0.05% 입니다.

1. 신규 사용자 등록
2. 사용자 전체 보기
3. 이율 변경
4. 시스템 종료
-----------> 2       // 2 입력
o 등록된 사용자 정보
이름    원금    이율    총금액
litwave  1000    0.05     1050

1. 신규 사용자 등록
2. 사용자 전체 보기
3. 이율 변경
4. 시스템 종료
-----------> 3       // 3 입력
현재 적용 이율은 0.05% 입니다.
변경할 이율 = 2
0.05 -> 0.02 이율 변경을 하시겠습니까(y/n)? y    // y 입력
2003년 1월 8일 21시 55분 부로 적용 이율이 0.02%로 변경 되었습니다.

1. 신규 사용자 등록
2. 사용자 전체 보기
3. 이율 변경
4. 시스템 종료
-----------> 2       // 2 입력

o 등록된 사용자 정보
이름     원금    이율    총금액
litwave  1000    0.02     1050

1. 신규 사용자 등록
2. 사용자 전체 보기
3. 이율 변경
4. 시스템 종료
-----------> 4       // 4 입력
** 시스템을 종료합니다. **



//---------------------------------------------------------------------------//
// Ex0108_01.java
class A {
    static int x;
    int y;
    static {
        x = 320;
    }
    A(int y) {
        this.y = y;
    }
    public static void setX(int x) {
        A.x = x;
    }
}

public class Ex0108_01 {
    public static void main(String[] ar) {
        A ap = new A(10);//x = 320, y = 10;
        A bp = new A(100);//x =320, y = 100;
        A.setX(100);
        System.out.println("ap x = " + ap.x + ", ap y = " + ap.y);
        System.out.println("bp x = " + bp.x + ", bp y = " + bp.y);
        
    }
}


//---------------------------------------------------------------------------//
// Ex0108_02.java
import java.io.*;

public class Ex0108_02 {
  public static void main(String [] ar) throws IOException {
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[] num = new int [14];
        String jumin = null;
        System.out.print("주민번호 = ");
        jumin = br.readLine();
        
        for(int i=0; i < 14; i++) {
          if(i == 6continue;
          num[i] = (int)jumin.charAt(i) - 48;
        }
        
        for(int i=0; i < 14; i++) {
          if(i == 6continue;
          System.out.print(num[i]);
        }
        System.out.println();

//Ex2
// System.out.println("ABC".concat("DEF"));
/* Ex3
    String str = "Hello";
      byte[] b = str.getBytes();
        System.out.println(b.length);
*/
/* Ex4
    String str = "sellephoenix@dreamwiz.com";
        if(str.indexOf('@') == -1 || str.lastIndexOf('.') == -1) {
          System.out.println("잘못된 이메일 주소 입니다.");
        } else
          System.out.println("올바른 이이메일 주소 입니다.");
*/
/* Ex6
    String str = "http://www.daum.net";
    System.out.println("프로토콜 = " + str.substring(0,(str.indexOf("://"))));
        System.out.println("지    역 = " + str.substring(str.lastIndexOf('.')+1));
*/
        
        
    }
}


//---------------------------------------------------------------------------//
// Calculator.java
import java.io.*;
public class Calculator {
    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);
    }
    
    Calculator() throws IOException {
        input();
        output();
    }
}

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