본문 바로가기

JAVA/기본다지기

JAVA 3일차 필기

패키지 ch02datatype에 새로운 클래스 L04Casting.java 생성


Casting(선언적 형변환)

package com.javalesson.ch02datatype;

public class L04Casting {
    public static void main(String[] args) {
        double d = 100.001;
        int i = 50;
        //i = (int)d;

   //System.out.println(i);

   d=i;

   System.out.println(d);

        int c = 140;
        byte b = (
byte)c;//byte의 최대 범위는 127
        System.out.println(b);
        //b의 값은?? -116 이유는?

        //(아래에서 설명)
           
        System.out.println(d);
        //casting 없이 형변환 가능한 도식도를 (->)로 표현하시오
        //저장가능한 메모리 크기에 따라서 형 변환 도식도가 그려진다.
        //long, short, int, byte, float, double
        //byte->short->int->long->float->double
    }//main end
}//class end


1byte는 8bit이다.

int 형의 비트 구조

0

0000000

00000000

00000000

00000000

byte 형의 비트 구조

0

0000000

 

 

 


비트 구조에서 맨 첫 자리는 부호를 나타내는 자리수이며 나머지 자리수를 이용하여 숫자를 표현한다.


int형 140을 byte로 형변환 하는 경우 -116이 되는데 그 이유는 아래와 같다.

int형 

 0

0000000

00000000

00000000

10001100

 값:140

byte형

 1

0001100

 

 

 

 값:-116


노란 색으로 표시된 부분이 그대로 옮겨 오게 되기 때문에


부호 자리수가 0(+)에서 1(-)로 바뀌게 되고 128(1111111)에서 12(0001100)를 뺀 값인 116이 된다.

따라서, 1 0001100 = -116이 되는 것이다. (컴퓨터가 음수를 표현할 때는 2의 보수로 표현한다)

ex) 116 -> 128x0+64x1+32x1+16x1+8x0+4x1+2x0+1x0 = 01110100이므로

     01110100의 2의 보수를 구하면

     10001011에 +1을 하면 되므로(1의 보수+올림수)

     10001100이다. 따라서 1은 부호값(-)이 되고 0001100(116의 2의보수)가 된 것.

컴퓨터의 음수표현법 링크글


컴퓨터에서 굳이 2의 보수를 사용하는 이유


뺄셈을 계산할 때, 우리는 보통 그냥 뺄셈을 하지만

컴퓨터의 경우에는 감산기가 없기 때문에 덧셈을 이용하여 뺄셈을 계산한다.


이 경우 1의 보수를 사용하는 경우에는 계산을 2번해야하나,

2의 보수를 사용하는 경우 1번의 계산으로 답을 구할 수 있기 때문에

자원을 효율적으로 사용할 수 있다.


또 하나의 이유로는, 0을 표현하는 방법이 고유하다는 점이 있다.

1의 보수의 경우에는 +0와 -0 두가지의 표현이 존재하나

2의 보수는 0이라는 값이 고유한 값이기 때문이다.



간단한 다른 예로 설명하면,

0 

0000000

00000000

00000000

10000000

 값:128

1

0000000

 

 

 

 값:-128


int형의 128(10000000)이 그대로 byte로 옮겨 오면서 -128(1 0000000)이 되는 것이다.



패키지 ch02datatype에 새로운 클래스 L05Boolean.java 생성

package com.javalesson.ch02datatype;

public class L05Boolean {
    public static void main(String[] args) {
        //boolean -> 기본데이터 타입 -> 부울, 불리언 -> 참, 거짓을 표현
        boolean flag = true;
                flag = false;
                //비교 연산자를 수행 후 나타난다.
                System.out.println( 2<1 );
        String a = "일";
        String b = "일";
                System.out.println(a==b);
        String c = new String("일");
                System.out.println(c);
                System.out.println(a==c);
                System.out.println("a==c: "+(a==c));
                //==은 값(value)을 비교하는 것이 아니라 주소값(memory 위치)을 비교한다.
                //비교연산자에는 어떤 것들이 있을까?(=!, ==, <, >, <=, >=)
                System.out.println("a.equals(c): "+a.equals(c));
                //equals()는 값(value)을 비교한다.
    }//main end
}//class end


String 은 '기본 데이터 타입' 이면서 '클래스'이다. (매우 특별한 case)


스택(stack) 

 힙(heap)

 static은 모두 stack영역에 들어온다.

 기본 데이터 타입.(int, double, String…)

 정적(static)이면서 빠르다.(RAM)

 상대적으로 용량이 작다.

 JVM이 돌아가는 영역(main함수)

 참조 자료형 = 객체(Class) =

 Instance 객체 ( 쉽게 만들어지고 쉽게 삭제된다.)

 동적(dynamic)이면서 상대적으로 느리다.(Hard)

 용량이 크다.

String a = "일"; String b = "일"; - 기본 데이터 타입

String c = new String("일"); - 참조 자료형

String d = new String("일");

 "일"(주소 : @1234)

 a(@1234), b(@1234)

 "일"(@5678)

 c(@5678)

 "일"(@0000)

 d(@0000)


GC(Garbage Collection) : 동적(dynamic)영역에서 선언되고 사용되지 않는 것들(Garbage)를 수집(Collection)하여 없앤다.


char c = '일'; (2byte)

String d = "일일일일"(2x4 = 8byte)

String e = "일 일일일"(2x5 = 10byte) = (char x 갯수 byte)


그러나 String의 갯수가 많아서 값이 너무 크면 용량문제로 인하여 스택영역에 저장될 수 없기 때문에, 그런 경우에는 힙으로 자동으로 이동시킨다.

이런 이유로 String을 주소값으로 비교하는 경우(==)에 같지 않다고 나오게 되며, equals( )로 비교하는 것을 권장한다.


ex> c의 주소값(@5678) 과 d의 주소값(@0000)은 같지 않다.(false) [ == 비교 ]

      c의 값(일)과 d의 값(일)은 같다(true) [ equals( ) 비교 ]

ch02datatype 패키지에 새로운 클래스 L06Char.java 생성

package com.javalesson.ch02datatype;

public class L06Char {
    public static void main(String[] args) {
          char c1 = 'A';
        char c2 = 97;//ASCII Code -> 문자표 -> 표의 번호
        char c3 = '\u0061';//UniCode
        System.out.println("c1 :"+c1);
        System.
out.println("c2 :"+c2);
        System.
out.println("c3 :"+c3);
       
       
char c4 = 'a';
        int code = c4;//char 타입을 int 타입으로 형 변환시 아스키코드 값으로 변한다.
        System.out.println(code);
       
        for(int i = 0; i<26; i++){
            System.
out.print((c1++)+" ");
        }//for end
    }//main end
}//class end


ch02datatype 패키지에 새로운 클래스 L07String.java 생성

package com.javalesson.ch02datatype;

public class L07String {
    public static void main(String[] args) {
        System.out.println("Hello");//5*2=10byte
        System.out.println("1234567890");//10*2=20byte
       
        String a = "hello"; //기본
        String b = "hello"; //기본
        String c =
new String("hello");//참조
        String d = new String("hello");//참조
       
        System.out.println("a==b: "+(a==b));
        System.out.println("a==\"hello\": "+(a=="hello"));
        System.out.println("a==c: "+(a==c));
        System.out.println("c==d: "+(c==d));
        System.out.println("a.equals(c): "+a.equals(c));/.은 *와 연산 우선순위가 동일하다


        String e ="Hello Java1 Lesson";
        System.out.println(e.indexOf("h"));//-1(존재하지 않는다)
        System.out.println(e.indexOf("H"));//0(0번째에 존재한다)
        System.out.println(e.indexOf("a"));//7(가장 앞의 문자 index를 반환)
       
        System.out.println(e.substring(6,11));//Java1을 return함
        //index 6번째 부터 11번째 까지의 문자열을 반환
       
        System.out.println(e.toUpperCase());//전부 대문자
        System.out.println(e.toLowerCase());//전부 소문자

    }//main end
}//class end
//String 특별한 이유!!!
//1.저장 방식
//2.비교 방식
//3.기본데이터 타입이자 참조형데이터타입(class)인 이유


ch02datatype 패키지에 새로운 클래스 L08Array.java 생성

package com.javalesson.ch02datatype;

public class L08Array {
    String name; //전역변수
    public L08Array(){}//default 생성자 -> 생성자를 만들지 않으면 컴파일 시 자동 생성
    public L08Array(String name){
        this.name = name;
    }//Overload
   
    public static void main(String[] args) {
        int[] odds = {1, 3, 5, 7, 9};
        String[] weeks={"월", "화", "수", "목", "금", "토", "일"};
        String     week1 = "월", week2 = "화", week3 = "수",
                week4 = "목", week5 = "금", week6 = "토", week7 = "일";
       
        System.out.println("오늘은"+weeks[2]+"요일입니다.");
        System.out.println(weeks.length);//index(차례)와 length(길이)의 차이
       
        //weeks[7] = "공휴일";//(대입)배열은 초기 index 값이 변하지 않는다.->오류
        try{
            System.out.println(weeks[8]);//(호출)
        }catch(ArrayIndexOutOfBoundsException e){
            e.printStackTrace();//로 받아와도 되고
            System.out.println(e.toString());//로 받아와도 된다.
            }
        //컴파일 시 발견되지 않는(심각한 오류) -> 오류가 발생한 시점에서 프로그램이 종료됨
        //컴파일 시 생기는 오류 -> 문법상 오류
        //Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
        //at com.javalesson.ch02datatype.L08Array.main(L08Array.java:13)
        System.out.println("프로그램 종류");

       
        L08Array[] array = {new L08Array("월"), new L08Array("화"), new L08Array("수")};
        //1.배열은 dataType과 동일한 객체를 배열로 가진다.
        //2.초기값으로 선언된 index 길이는 변하지 않는다.
           
    }//main end
}//class end

tip.

프로그래머가 프로그램 작성 단계에서 예외처리를 하거나, 시스템상(try&catch)으로 예외처리를 할 수 있다.


Class는 단순한 설계도, new Class() 생성자로 호출해주면 비로소 객체가 된다.


'JAVA > 기본다지기' 카테고리의 다른 글

JAVA 5일차 필기  (1) 2016.08.05
JAVA 4일차 심화  (0) 2016.08.04
JAVA 4일차 필기  (0) 2016.08.04
JAVA 2일차 필기  (1) 2016.08.02
JAVA 1일차 필기  (0) 2016.08.01