패키지 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 |