티스토리 뷰

  1. java 실행
    자바는 javac라는 자바 컴파일러를 통해 .class 바이트 코드를 만든다.
    다음의 바이트 코드를 java 명령어를 통해 실행가능하다.
    이는 인터프리터로서 jvm이 이해할 수 있도록 동작한다.
  1. 변수
    • 변수 : 변수는 값을 저장할 수 있는 메모리상의 공간을 의미한다.
    • 지역 변수는 반드시 초기화를 해야하지만, 클래스 변수와 인스턴스 변수는 초기화를 생략할 수 있다.
    • 변수의 이름 처럼 프로그래밍에서 사용하는 모든 이름을 식별자라고 한다. 예약어, 키워드는 식별자로 사용할 수 없다.
  1. 기본형과 참조형
    • 기본형 : 실제 값을 저장
    • 참조형 : 어떤 값이 저장된 주소를 지정한다. 즉, 객체의 주소를 저장한다. 4byte 주소 값을 갖게된다.
    • 정수형
      • byte(1byte), short(2byte), int, long, char(2byte -> c언어에서는 1 바이트이다.
  1. 상수와 리터럴

    • 상수형 : final 키워드를 타입 앞에 사용하면 된다.

       final int MAX_SPEED = 10;  
    • 리터럴 : 일반적으로 상수라고 부르지만, 앞서 우리가 선언한 상수와 차이를 두기위해 리터럴이라고 명명
      ex) 123, 32, 'A'

    • 리터럴의 타입 (접미사)

      • 정수형 : L 또는 l, 접미사가 없다면 int형
      • 실수형 : f, d, 접미사가 없다면 double이 기본형
    • 타입 불일치

      • 일반적으로 넓은 타입에 좁은 타입의 값을 저장하는 것은 가능하다.
        int i = 'A';  
        long i = 123;  
        double d = 3.14f;  
      • 단 큰 값이 작은 변수 값에 들어가는 것은 막힌다. 다만 byte와 short는 기본이 int형 이기 때문에 예외를 허용한다.
  1. 문자 리터럴과 문자열 리터럴

    • 초기화

      String str = "";  
      char alpha = ''; // 불가능 반드시 하나의 문자가 필요하다.  
      char alpah1 = ' '; // 가능  
    • 문자열 + antType은 문자열이다

      String name = "gyu";  
      String str = name + 8; // name8 이 된다.  

      따라서 정수에 아무것도 없는 "" 만 더해도 문자열로 변환이 자동으로 된다.

    • printf 를 통해 형식화된 출력도 가능하다.

  1. Scanner 로 입력받기

     import java.util.*;  
     Scanner scanner = new Scanner(System.in);  
     String input = scanner.nextLine(); // 입력받은 내용을 input에 저장  
     int num = Integer.parseInt(input) // 문자열로 입력을 받기 때문에 int로 형변환  

    nextLine이 아니라, nextInt로 받으면 정수형으로 받는다. nextFloat()로 받을 수도 있다.

  2. 2진수를 8진수로 변환, 16진수로 변환
    8진수는 2진수 3개를 하나의 값으로 표현이 가능하다. 16진수는 2진수 4개를 하나의 값으로 표현이 가능하다.
    따라서, 뒤부터 3개씩 묶어서 값을 표현하면 8진수가 되고, 16진수는 뒤에서부터 4개씩 묶어서 표현하면 된다.

  1. 10진수를 n진수로 만들기
    10진수를 2진수로 만든다고 한다면, 나누어서 나온 나머지를 쭉 맨 뒤부터써나가고, 맨 마지막에 나온 몫을 써주면 된다.
    가령 10진수 46을 2진수로 만든다면

    23 - 0
    11 - 1
    5 - 1
    2 - 1
    1 - 0

    더 이상 2로 안나누어지므로 몫 1부터 나머지를 아래서부터 위로 차례대로 써준다면 101110 이 된다.
    만약 8진수로 만든다면 8부터 나누어주면 된다.

  1. n진수를 10진수로 만드는 방법
    그냥 자리수에 맞게 다 더하면 된다.
    8진수 1468 = 1(8^3) + 4(8^2) + 6(8^1) + 8(8^0)
  1. 음수의 표현 2의 보수법
    만약 맨 처음비트를 음수로 표현한다고 하자, 그럼 4비트에서 다음과 같이 된다.
    0 1 2 3 4 5 6 7
    -0 -1 -2 -3 -4 -5 -6 -7

    문제는 0이 두 개라는 것과, 반대편 두 값을 더했을 때 이진수로 0이 안된다는 것이다.
    7 = 0111
    -7 = 1111
    더하면 0110 이 된다.

    따라서, 우리는 2의 보수법을 사용하는데, 2의 보수법은 2진수를 모두 뒤집고 +1 을 더하면 된다.
    이는 1의 보수를 취한 뒤(비트를 모두 뒤집기) + 1을 하면 2의 보수가 되기 때문이다.
    0 1 2 3 4 5 6 7
    -8 -6 -5 -4 -3 -2 -1
    이 된다.

    이는 합해서 0 이되는데
    -3 + 3 = 0 이고 이진수로 보면
    0011 + 1101 이기 때문에 더하면 0000이 된다.

    보수라는 말은 보충하는 수로 n의 보수는 더했을 대 n이 되도록 만드는 수라는 것이다.
    7의 10의 보수는 3이 된다. 7 + 3 = 10
    그렇다면 2의 보수라는 말은 2진수에서는 올림처리되어 자리수가 넘어가는 수를 말한다.
    따라서 2의 보수법으로 음수를 표현하면 더했을 때 0이 되는 것이다.

    2의 보수를 구하는 방법으로 1의 보수를 구한다음(비트 뒤집기) + 1을 해주면 2의 보수가 된다.
    0011 의 1의 보수는 1100 이 되고, 1을 더해주면 1101이 된다.
    0011과 1101을 더해주면 0000이 된다.

    왜 2진수의 1의 보수를 해서 1을 더하면 2의 보수가 되냐하면
    2진수의 1의 보수를 취한 값과 그냥 값을 더해보자
    가령 1100이 있고 1의 보수인 0011이 있다고 하자
    이들을 더하면 1111 이 된다. 즉, 이진수에 1의 보수를 한 값을 더하면 모두 1111이 되는 것이다.
    따라서 1을 더하면 0000이 된다.

  1. 인코딩과 디코딩
    'A'라는 문자를 인코딩하면 65가 되고, 디코딩하면 'A'가 된다.

    • 아스키 : 7비트로 128개의 문자를 표현가능

    • 확장 아스키 : 일반적으로 데이터는 byte단위로 이루어지므로 아스키는 1bit가빈다. 이 비트를 이용하여 문자를 추가로
      정의한 것이 확장 아스키이다. IBM에서 cp(코드 페이지)라고 하여 만들었다. CP949 는 한글 윈도우 , CP437은 영문 윈도우 이다.

    • 유니코드 : 전 세계의 모든 문자를 하나의 통일된 문자 집합으로 표현하고자 노력하였고, 그 결과가 유니 코드이다.
      처음에는 2byte를 사용하였으나, 부족하여 21bit로 확장되었다.

      • 유니코드는 먼저 유니코드에 포함시키고자 하는 문자들의 집합을 정의하였는데, 이것을 유니코드 문자 셋(또는 캐릭터 셋, character set)이라고 한다.그리고 이 문자 셋에 번호를 붙인 것이 유니코드 인코딩이다. UTF-8, UTF-16, UTF-32로, 자바는 UTF-16을 사용한다. UTF-16은 모든 문자를 2byte의 고정 크기로 표현한다. 그리고 모두 처음 128문자가 아스키와 동일하여 아스키를 그대로 포함하고 있다. UTF-8은 1byte~4byte로 가변 변환을 사용하므로 인터넷에서 많이 사용된다.
  1. JVM은 피연산자 스택(operand stack)이 피연산자를 4byte 단위로 저장하기 때문에 4byte 크기보다 작은 자료형의 값을 계산할 때 4byte로 변환하여 계산한다. 따라서, 그냥 int 형쓰는 것이 맘이 편하다.
  1. 실수형은 오버플로우 발생시에 무한대(inf)가 나오고, 너무 작은 값으로 표현이 불가능하면 언더플로우가 발생하여 0이 된다.
    float는 7자리, double은 15자리의 가수를 표현할 수 있다.
    실수형은 부호, 지수, 가수로 표현된다.
    float : 1 , 8 ,23 비트로 표현된다.
    double : 1, 11 , 52 비트로 표현된다.
  1. 형변환

    int a = (int) 'A';  

    큰 값에서 작은 값으로 형변환이 된다면 그 만큼 값이 잘려나간다.
    실수형에서 정수형으로 변환되면 소수점 값은 버려진다.

    • 자동 형변환
      변수의 형을 보고 컴파일러가 자동으로 형변환을 시켜준다. 가령 byte b = 1000이면 1000을 byte형으로 바꾸어준다.
      (byte) 1000과 같다. 다만, 이는 범위를 넘으므로 값 손실에 의한 에러가 발생한다.
      char a = 1000 이라고 써도 형변환이 된다. char a = (char) 1000 과 같다.
      단, 서로 다른 두 타입간의 덧셈에서는 두 타입 중 표현 범위가 더 넓은 타입으로 형변환이 이루어진다.
      int i = 1;
      double d = 1.0 + i; 이는 double d = 1.0 + (int) i 와 같다.
      이를 산술 변환이라고 한다.
      단 boolean은 형변환이 안된다.
  2. 배열

    • 선언 방법 2가지 방법이 있다. 타입에 []을 붙이던지, 변수에 []을 붙이는 방법이 있다.

      int[] arr;  
      int arr[];  
    • 생성
      선언은 단지 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고, 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다

      int arr[];  
      arr = new int[10];  

    이렇게 생성과 선언이 가능하고, 생성과 동시에 선언도 가능하다.

    • 배열의 길이 .length
      자바에서는 JVM이 모든 배열의 길이를 별도로 관리한다. 배열이름.length를 통해서 배열의 길이를 얻을 수 있다.
      그러나, .length로 길이를 변경시킬 수는 없다. 자바에서 배열은 고정 길이이기 때문이다.

    • 배열의 초기화

      int arr[] = new int[]{1,2,3,4};  
      int arr[] = { 1,2,3, 4};  

    가능하다.

    • 배열의 출력은 Arrays.toString(배열변수) 로 간단하게 출력이 가능핟.
      예외적으로 char배열은 println만 출력하면 모든 각 요소가 구분자 없이 그대로 출력가능하다.

      char charr[] = {'a', 'b', 'c'};  
      System.out.println(charr); //abc  
    • 배열의 복사
      System.arraycopy(기존 배열, 시작 인덱스, 새로운 배열, 시작 인덱스, 몇개를 복사); 로 간단하게 배열을 복사할 수 있다.
      이 배열의 복사를 통해 새로운 배열을 만들어서 기존 데이터들을 좀 더 넓은 자리로 이동시키는 것이다.

      public class Main {
        public static void main(String[] args) {
            // write your code here
            int arr[] = {1,2,3,4,5};
            int newArr[] = new int[arr.length * 2];
            System.arraycopy(arr, 0, newArr,0 , arr.length);
            for(int i = 0; i < newArr.length; i++){
                System.out.println(newArr[i]);
            }
            arr = newArr;
            for(int i = 0; i < arr.length; i++){
                System.out.println(arr[i]);
            }
        }
      }

    다시 arr = newArr에 넣어주면 arr는 배열을 참조하는 참조변수이므로 새로운 배열을 가리키게 된다.
    따라서 length도 변하게 된다.

    • string 배열
      일반적인 다른 선언 방법과 다르지 않다.
      String[] str = new String[3];  
      String str[] = new String[3];  
      String str[] = new String[3]{"kim", "hong"};   
      String str[] = {"kim", "hong"};  

    참고로, 배열의 참조 변수는 참조 변수이기 때문에 null이 기본 값이다.

    string 클래스는 char 배열에 기능(메서드)를 추가한 것이다.
    중요한 것은 char 배열과 String 클래스의 중요한 차이가 있는데, String 객체는 읽을 수만 있을 뿐
    내용은 변경할 수 없다. 이는 일반 배열의 길이를 변경하지 못하고 새로운 배열을 생성하는 것과 같은 논리이다.
    즉, String name = "gyu" 에서 name[1] = 'w'이렇게 바꾸지 못한다는 것이다.
    그러나 c++은 저렇게 바꾸는 것이 가능하다.
    만약, 변경가능한 문자열을 다루고 싶다면 StringBuilder를 사용하면 된다.

    • String 클래스의 주요 메서드

      1. charAt(int indeX) : 문자열에서 해당하는 위치에 있는 문자를 반환
      2. length() : 문자열의 길이 반환
      3. substring(int from int to) : from 에서 to까지의 문자열을 반환한다. 단, to는 포함하지않는다.
      4. equals(Object obj) : 문자열의 내용이 obj와 같은지 확인한다. 같으면 true, 다르면 false이다.
      5. toCharArray() : 문자열을 문자 배열로 변환하여 반환한다.
    • 다차원 배열

      int[][] value;  
      int value[][];  
      int[] value[];  
    • 가변 배열
      java에서 다차원 배열은 배열의 배열이라는 점을 이용하여 가변 배열을 만들 수 있다.

      int[][] score = new int[5][]; // 두번째 배열의 길이를 선언하지 않는다.  
      score[0] = new int[4];  
      score[1] = new int[3];  
      score[2] = new int[5];  
    • 라벨링
      라벨링을 통해서 break문으로 나갈 수 있다.

      outer:
      for(int i = 0; i < 10; i++){
        for(int j = 0; j < 10; j++){
            if(j == 2) break outer;
        }    
      }
      outer:
      for(int i = 0; i < 10; i++){
        for(int j = 0; j < 10; j++){
        if( j == 2) break outer;
        System.out.println("first time " + i + "and " + j);
        }
      }
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함