2010/12/29 11:29

<7> 배열 ┢ Java

  • 배열은 많이 쓰이고, 그 performance가 좋다. 모든 배열은 참조타입이다.

 

  • 배열의 선언

    • int[] score;
      String[] name;
    • int score[];
      String name[];

 

  • 배열의 생성

    • int[] score;               // 배열의 선언
      score = new int[5];    // 배열의 생성
  • 배열의 초기화

    • String[] name = new String[3];
      name[0] = new String("Kim"); 
      name[1] = new String("Lee"); 
      name[2] = new String("Park");
    • String[] name = { "Kim", "Lee", "Park" };
    • String[] name = { new String("Kim"), new String("Lee"), new String("Park");                    // 선언과 초기화를 동시에 할 경우
    • String[] name = new String[] { new String("Kim"), new String("Lee"), new String("Park"); // 선언과 초기화를 따로 할 경우

      • 매개변수를 배열로 받을 때도 위와 같은 것이 필요하다.
      • int add(int[] arr) {            }
        int result = add( new int[] { 100, 90, 80, 70, 60 });
  •  배열의 활용

    • C언어의 문법으로는 (비록 아래는 C언어는 아니지만)
      int[] score = { 100, 90, 80, 70, 60 };
      for (int i=0;i<6;i++)
         System.out.println(score[i]);
    • 로 사용하였지만, Java에서는 배열의 멤버변수(필드변수)로 사용 가능하다. 
      int[] score = { 100, 90, 80, 70, 60 };
      for (int i=0;i<score.length;i++)
         System.out.println(score[i]);
  • 배열 예제를 하나 해보자.

  • 다차원 배열

    •  선언

      • int[][] score;
      • int score[][];
      • int[] score[];
    • 생성

      • int[][] score = new int[5][3];
    • 초기화

      • score[0][0] = 100;
        score[0][1] = 100;
        ...
        score[4][2] = 50];
    • 생성 & 초기화

      • int[][] score = new int[][] {    {100,100,100},       {20,20,20},         ...  ,{50,50,50}    };
    • for문을 사용한 2차원배열 초기화

      • for (int i=0;i<score.length;i++)
           for (int j=0;j<score[i].length;j++)
              score[i][j] = 0;
  •  가변배열

    • 길이가 서로 변하는 다차원 배열로
    • 생성

      • int[][] score = new int[5][];
        score[0]  = new int[3];
        score[1] = new int[4];
        ...
        score[4] = new int[2];
    •  생성 & 초기화

      • int[][] score = new int[][] {    {100,100,100,100},       {20,20},         ...  ,{50,50,50}    };
  •  배열의 복사

    • for문으로 복사할 수도 있고, ArrayEx11.java
    • System 클래스에서 제공하는 arraycopy()를 사용할 수도 있다.

      • System.arraycopy(arr1, 0, arr2, 0, arr1.length);
      • arr1[0]에서 arr2[0]으로 arr1.length 개의 데이터 복사
  • 배열 예제

    • 매개변수 배열 예제 ArrayEx13.java

      • 이클립스에서 매개변수는, Run - Runconfigurations에서 Argument 탭의 Program Argument를 통해 입력하도록 한다.
    • 숫자 맞추기 예제 ArrayEx16.java  

이 글은 스프링노트에서 작성되었습니다.


2010/12/29 11:28

<6> 자바 복습 (이후 Java의 정석 기반) ┢ Java

  • Java 언어의 특징

    • 운영체제에 독립적이다.
    • 객체지향형 언어이다.
    • 배우기 쉽다.
    • 자동 메모리 관리 (Garbage Collection)
    • 네트워크와 분산처리를 지원한다.
    • 멀티쓰레드를 지원한다.
    • 동적 로딩 (Dynamic Loading)을 지원한다.
  •  클래스

    • 클래스 명은 파일과 일치해야 한다. (대소문자 일치)
    • public class는 2개 이상 올 수 없다.
    • public class와 일반 class가 같이 올 수는 있으나, public class의 명이 파일명과 일치해야 한다.
  •  변수 : 값을 저장하는 공간

    • 선언위치에 따라

      • 멤버변수
      • 로컬변수
    • 타입에 따라서

      • 기본타입 - boolean, char, byte, short, int, long, float, double
      • 참조타입 - 클래스가 이미 구현되어 있어야 함. 기본형을 제외한 나머지

        • 참조변수 선언 및 초기화

          • Date today;
            Date today = null;   또는   Date today = new Date(); 
    • 변수 명명규칙

      • 대소문자가 구분되며 길이에 제한이 없다.
        (일반적으로 첫자는 소문자, 여러단어는 시작단어면 대문자  accountNumber)
        (상수의 경우는 모두 대문자. 여러단어는 _로 잇는다. MAX_NUMBER)
      • 예약어를 사용해서는 안된다.
      • 숫자로 시작해서는 안된다.
      • 특수문자는 _와 $만을 허용한다.

이 글은 스프링노트에서 작성되었습니다.


2010/12/29 11:28

<5> 객체와 클래스 ┢ Java

  객체와 클래스

  • 언어의 발전순서

    • 저급언어 (low-level language)
    • 고급언어 (high-level language)
    • 구조적 프로그래밍 (structured programming)
    • 객체 지향형 프로그래밍 (Object Oriented Programming)
  • 클래스와 필드 & 메소드

    • 아래는 계좌라는 클래스이다.
    • 이 계좌라는 클래스는 또다른 은행이라는 클래스에서, 사람별 계좌가 클래스로 지정되어서 사용될 수 있다.

클래스.jpg 

객체의 생성과 사용

  • 객체를 생성하는 방법

    • 예를 들어서,  StringBuffer이란 객체를 생성해보자. (문자열 관련)
      new StringBuffer("Hey, Java");

      • new 생성 키워드
      • StringBuffer 클래스 이름
      • "Hey, Java" 객체 생성에 사용되는 값
    •  보통 객체는 어딘가에 보관되어서 사용한다.
      StringBuffer obj;

      • 클래스 이름을 변수 타입으로 사용
    • obj = new StringBuffer("Hey,Java")

      • 위와 같이 사용된다.
  • API 규격서 (API Specification)가 개발자에겐 항상 참고가 된다.
    위에서 제시된 StringBuffer의 사용법을 살펴보자. (StringBuffer은 JAVA에서 제공되는 클래스이다.)

  • API는 자바 사용의 핵심이며 필수이다!!

    1. 먼저, 왼쪽에서 StringBuffer를 찾는다. (원래는 위에서부터 선택하지만, 일단 AllClasses에서 시작하자.)
    StringBuffer1.jpg

    2. 그러면, 오른쪽에 StringBuffer에 대한 설명이 나온다.
    StringBuffer2.jpg

    3. 본 내용은 StringBuffer 객체의 생성에 대한 내용이다.
    StringBuffer3.jpg

    4. 본 내용은 StringBuffer의 메소드에 관련된 내용이다.
    StringBuffer4.jpg

    5. 이제 deleteCharAt와 insert를 한번 사용해보자.
       각각 필요한 메소드를 Method Summary에서 찾아 클릭, 이동한다.
       내용을 보고 인자를 보면서 필요한 것들을 스스로 알아내어 찾아내도록 한다.
    StringBuffer5.jpg StringBuffer6.jpg
    6. 이제 찾은 메소드를 바탕으로 프로그램을 만들고 실행한다.

 public class ObjectExample1 {
     public static void main(String args[]){
          StringBuffer obj;
          obj = new StringBuffer("Hey, Java");
          obj.deleteCharAt(1);                // 1번 위치의 글자를 지운다. (e가 지워짐)
          obj.deleteCharAt(1);                // 1번 위치의 글자를 지운다. (y가 지워짐)
          obj.insert(1, 'i');                     // 1번 위치에 i를 삽입한다.
          System.out.println(obj);        // 결과 : Hi, Java
      }
}

 

 클래스 선언의 기초 문법

 goodsStock.jpg

ClassExample1.jpg

  • 실행 순서

    • 모든 Java프로그램은 main 메소드가 가장 먼저 실행된다.
    • ClassExample1의 메인 메소드에서, GoodsStock obj; 라는 변수가 호출된다.

      • obj는 GoodsStock 클래스 형태로 되는 것이다.
    • obj는 GoodsStock()라는 생성자에 의해, 객체 생성이 된다.

      • GoodsStock는 GoodsStock 클래스에는 없지만, 컴파일러가 자동으로 생성을 해주는 것이다. (기본생성자)
    • 이후, obj GoodsStock 객체에 값을 대입한다.

      • 필드값 변경은 위에 보는바와 같이, obj.goodsCode = "52135" 와 같은 식으로 한다.
    • 필드값을 사용한다. (println문 참고)
    • 이후, obj 객체가 메소드로 지닌 addStock를 실행한다.

      • addStock은 GoodsStock 클래스에 addStock(int amount)로 지정되어 있다.
      • 그러므로, obj 객체의 메소드에, int형의 amount 변수를 파라미터로 보내야 하는 것이다.
      • 즉, 위와 같은 obj.addStock(1000); 과 같은 형태가 나오게 된다.
    • 출력결과는 다음과 같다.
      상품코드 : 52135
      재고수량 : 200
      상품코드 : 52135
      재고수량 : 1200
  •  위에서 기본생성자를 언급하였다.

    • 위에서는 obj 객체를 만들고 변수를 지정하기 위해서,

      obj = new GoodsStock();
        
      obj.goodsCode = "52135";
      obj.stockNum = 200;

      와 같은 3줄을 사용하였지만, 사실상

      obj = new GoodsStock("52135", 200);

      과 같이 간략하게 사용할 수 있다.
    •  위에서의 기본생성자와 달리, 생성자를 새로 지정해 주면 되는 것인데, 즉, GoodsStock 프로그램이 다음과 같이 변하는 것이다.
      goodsStock2.jpg
    • 이렇게 되면, ClassExample1에 에러가 생긴 것을 볼 수 있다.

      • 왜냐하면, 기본생성자는, 아무런 생성자가 없을때만 자바컴파일이 생성하기 때문이다.
      • 다른 생성자가 있을 때, 기본생성자를 이용하려면, 기본생성자 역시 생성해야 한다.
    • ClassExample1을 바꾸어보자.
      ClassExample12.jpg
    •  최종 SourceFile  ClassExample1.java GoodsStock.java
  •  생성자는 여러가지가 올 수 있다.

    • 위의 예를 볼 때, 새로운 new GoodsStock 을 생성할 때, 위와 같이 상품코드와 수량을 모두 아는 경우도 있지만, 상품코드만 알 때도 있기 때문이다.
    • 즉, GoodsStock 파일에서, public (String code, int num) 말고도, public (String code) 만을 두면,
      상품 코드로만으로도 new GoodsStock 을 생성할 수 있는 것이다.
  •  생성자 만들 때, 변수명이 달라도 변수종류가 같으면 에러가 발생한다.

    • public GoodsStock (String a, int b) { }
    • public GoodsStock (String c, int d) { }
    • 이 둘은 사실상 같은 내용이기에, 에러가 발생한다. 위의 둘 중 하나만 지정 가능하다.
  •  생성자에서 생성자 호출하기

    • 생성자에서 생성자를 호출할 수 있다.
    • 위의 GoodsStock 클래스를 보자.
      public GoodsStock(String goodsCode, int stockNum) {
         super();
         this.goodsCode = goodsCode;
         this.stockNum = stockNum;
       }
    • 이 부분에서 this라는 변수명을 볼 수 있을 것이다.
    • this가 붙은 것은 이 클래스 내에서 라는 의미로,

      • this.goodsCode = goodsCode; 는, 이 goodsCode는 파라미터에서 넘어온 goodsCode를 의미한다.
    • 다음과 같은 변형도 가능하다.
      public GoodsStock(String goodsCode) {
         this.goodsCode = goodsCode;
      }
      public GoodsStock(String goodsCode, int stockNum) {
         this(goodsCode);
         this.stockNum = stockNum;
      }

      • 이것은 생성자 안에서 생성자를 사용하는 것으로, this(goodsCode)는 GoodsStock(goodsCode)를 의미하는 것이다.
      • 생성자 호출문은 반드시 생성자의 첫 명령문이어야 한다.
  •  필드의 사용범위

    • 필드는 같은 클래스 내에서라면 어디서든 사용이 가능하다.
    • 필드 앞에 private가 붙으면 외부에서 접근이 제한된다. (정보은닉)
    • 필드 앞에 final이 붙으면 값을 변경할 수 없는 상수이다.

      • 초기에 한번만 값 지정이 가능하다. 다만, 초기화는 반드시 해야 한다. 다음과 같이 선언, 사용한다.

        • private double radius;
        • final int sideLength = 10;
  •  메소드

    • 은행 계좌 클래스의 구현  Account.java MethodExample1.java

      • class Account

        public class Account {
           String accountNo;  // 계좌번호
           String ownerName;  // 예금주이름
           int balance;   // 잔액
         
           public Account(String accountNo, String ownerName, int balance) {
              super();
              this.accountNo = accountNo;
              this.ownerName = ownerName;
              this.balance = balance;
           }
         
           // 예금하다. 의 메소드
           void deposit(int amount) {
              balance += amount;
           }
         
           // 인출한다. 의 메소드
           int withdraw(int amount) {
              if (balance < amount)
              return 0;
              balance -= amount;
              return amount;
           }
        }
      • class MethodExample1

        public class MethodExample1 {
           public static void main(String[] args) {
              Account obj1 = new Account("111-222-33333333", "김영식", 200000);
              Account obj2 = new Account("555-666-77777777", "박진희", 1000000);
          
              obj1.deposit(1000000);
              obj2.withdraw(200000);
          
              printAccount(obj1);
              printAccount(obj2);  
           }

           private static void printAccount(Account obj) {
              System.out.println("계좌번호 : " + obj.accountNo);
              System.out.println("예금주이름 : " + obj.ownerName);
              System.out.println("잔액 : " + obj.balance);
              System.out.println();
           }
        }
      •  각각의 객체마다 deposit, withdraw의 기능을 수행할 수 있다.

이 글은 스프링노트에서 작성되었습니다.


2010/12/29 11:28

<4> 연산자 ┢ Java

 자바의 연산자

  • C와는 달리, 서로 다른 타입과도 연산이 가능하다.

    • 가령, int a + double b 일 때, (a가 1이고, b가 2.1이라면,)  a를 1.0의 double 형으로 바꾼 후에, 결과를 제공한다.
      그러므로 결과는 3.1, double 형이다. 다만 반대로 바뀌는 경우는 없다.
    • 강제 타입 캐스트는 주로 큰 범위에서 좁은 범위로 바꿀 때 사용된다.
      (int) 3.1 하면 3으로 된다.

 여러가지 연산자들

  • 다른 내용들은 <2> 자바의 기초문법을 참고한다.
  • 연산자 사용시 주의해야 할 점들

    • 부호연산자

      • 부호연산자는 형을 int로 바꾸고 실행한다.
        short num1 = 100;
        short num2 = - num1;
      • 위의 프로그램은 에러가 나는데, 왜냐하면, num1이 - 부호 연산자를 통해서 int 형이 되는데, 그 값을 short형인 num2에 대입했기 때문이다.
        그러므로, short num2 = (short) -num1 으로 나타나야 한다.
    • 문자열 연결 연산자

      • 이것은 직관적으로 이해하면 쉽겠다.
        String str1 = "num = " + 3 + 4 ;
        System.out.println(str1);                // 결과는 num = 7 이 된다.
    • 동등 연산자 == !=

      • 문자열 비교 연산자는 이것을 쓰지 않는다.
      • 부동 소수점 비교시, 이 방법을 쓰지 않을 것을 권장한다.
        double num1 = 1.1 + 2.2;
        double num2 = 3.3;
        if (num1 == num2)
           System.out.println("같음");
        if (num1 != num2)
           System.out.println("다름");       // 결과는 다름이 나온다. 마지막 한 비트까지 비교하기에 이런 결과가 나온다.
    •  논리연산자 & | ^ ! 와 조건연산자 && ||

      • && 와 &의 차이
           (1 > 2)   __  (3 < 4)
        &&는 왼쪽이 false이면, 더이상 실행하지 않고, false라는 결론을 내지만,
        &는 양쪽 모두 실행한 이후에 결론을 내린다.
      • 이것은 다른 결과를 초래할 수 있는데, 아래와 같은 경우가 그 대표적인 예이다.
        int num1 = 0, num2 = 0;
        if (++num1 > 0 || ++num2 > 0)
        System.out.println("num1이 0보다 크거나, num2가 0보다 큽니다.");
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2); 

        결과
        num1이 0보다 크거나, num2가 0보다 큽니다.
        num1 = 1
        num2 = 0
    • 비트연산자 & | ^ ~

      • int보다 좁은 범위일 경우, 자동으로 int형으로 전환한다.
        byte num1 = 1, num2 = 2;
        byte result1 = num1 & num2;      // 에러발생!!
    • 쉬프트연산자 >> << >>>

      • >> 주어진 비트수만큼 오른쪽으로 이동하고 빈 공간은 MSB와 같은 비트로 채웁니다.
      • >>> 주어진 비트수만큼 오른쪽으로 이동하고 빈 공간은 0으로 채웁니다. 

이 글은 스프링노트에서 작성되었습니다.


2010/12/29 11:28

<3> 프리미티브 타입 ┢ Java

자바의 타입 분류 체계와 프리미티브 타입

  • 변수에도 있는 데이터 타입 <자바 데이터 타입>

    • 프리미티브 타입(primitive type)

      • 수치 타입(numeric type)

        • 정수 타입(integral type) - byte, short, int, long, char  // 오른쪽으로 갈수록 더 넓은 범위, 더 큰 메모리
        •  부동 소수점 타입(float point type) - float, double
      • 불리언 타입(boolean type) - boolean
    • 레퍼런스 타입(reference type)

      • 클래스 타입(class type)
      • 인터페이스 타입(interface type)
      • 배열 타입(array type)
      • 열거 타입(enum type)
  • 이전에도 언급했지만, C 언어와는 다르게, if (1) 이런 문장은 성립되지 않는다. if (true)로 해야 한다.

 

프리미티브 타입 데이터의 내부 표현

  • 데이터간의 오류에 주의해야 한다.

    • 범위 상에서의 오류 (int는 4바이트로 아래의 수를 담기에는 그릇이 작다)
         int num;
         num = 1000000000 + 2000000000;
         System.out.println(num);            // 결과 : -1294967296
    • 데이터 표현상의 오류 (3.14의 2진수 표현은 무한순환소수인데, 이것을 메모리 안에 담으려면, 뒷부분을 잘라내야 한다.)
         double num;
         num = 3.14 + 1;
         System.out.println(num);             // 결과 : 4.140000000000001
    • 기타 공부하면 좋을 내용들 : 2진수, 2의 보수, 부동소수점 내부 표현 IEEE754표준, 고정소수점
  • 문자의 내부 표현 : Unicode

    •  기본적으로 문자는 Unicode로 표현된다.
    • http://www.unicode.org 에 유니코드의 값에 대해서 나와있다.

 

리터럴의 표기 방법

  • 리터럴이란?

    • 소스코드 내 데이터 값 그대로 쓴 상수
  • 리터럴의 종류

    • 기본 정수형
      int num = 1;                                      // int 타입 (10진수)
      int num = 024;                                  // int 타입 (8진수)
      int num = 0x30A1;                            // int 타입 (16진수)
      double sum = num + 0.5;                   // double 타입 (소수<부동소수>는 일단 double 타입)
      12.                                                   // double 타입
      .025                                                  // double 타입
      12e100                                               // double 타입 (부동소수점 리터럴)
      0.25E-20                                            // double 타입 (부동소수점 리터럴)
      0xA1.27p5                                          // double 타입 (16진수 부동소수점 리터럴)
      .025F                                                // float 타입
      12e10f                                              // float 타입
      0xA1.27p5f                                        // float 타입 (16진수 부동소수점 리터럴)
      long num = 120L;                              // long 타입
      long num = 120l;                               // long 타입
      long num = 0x30A1L;                        // long 타입
      System.out.println("sum = " + sum);  // String 타입
      System.out.println('끝');                    // char 타입 (하나의 문자)
    • 문자 리터럴
      \b      백스페이스      0x0008
      \t       탭문자            0x0009
      \n      개행문자         0x000a
      \f       새 페이지 문자 0x000c
      \r       리턴문자         0x000d
      \"       큰 따옴표        0x0022
      \'       작은 따옴표     0x0027
      \\      백슬래쉬        0x005c
      \8진수  8진수 해당 유니코드 0x0000 ~ 0x00ff

      \8진수는 범위가 제한되나, 다음과 같은 방법으로 char 타입의 러터럴이 사용 가능하다.
          '\uC790' 이런식으로 사용 가능. '자'

이 글은 스프링노트에서 작성되었습니다.


1 2 3