IT/JAVA (17.12.18~)

2일차 JAVA (2)

만두토끼 2017. 12. 19. 12:34

1. 컴퓨터에 데이터가 저장되는 방법: 컴퓨터는 2진수로 저장

2진수: 10진수를 2로 나누어 몫과 나머지를 기재 -> 몫이 0이 아니면 다시 2로 나눔 (반복) -> 더이상 나눌 수 없으면 나머지 포함 역순으로 기재 



2. 실수: 10진수의 소수를 2진수의 소수로 변경할 때는 소수 부분에 2를 곱해서 정수 부분을 순서대로 표기 

예시)

0.625 X 2 = 1.25, 1을 끌고 와서 0.1 표기

1을 뺀 0.25 X 2 = 0.5, 0을 끌고 와서 0.10 표기

0을 뺀 0.5 X 2 = 1.0, 1을 끌고 와서 0.101 표기


* 0.6 을 계산해보면 0.1001 까지 나오고 계속 반복하게 된다. 

  0.1001100110011001.... 고로 실수를 계산을 하게 되면 잘못된 결과가 종종 나오기도 한다. 

* 0.1 을 1000번 더하면 100이 아니라 99.9999999 ... 가 나오게 된다.

  정수는 정확하게 계산하므로 이 경우에는, 1을 1000번 더하고 나누기 10을 하면 정확한 계산이 나온다. 



3. 음수 표현: 2의 보수를 이용해서 저장

1의 보수: 0->1 / 1->0

2의 보수: 1의 보수 +1

뒤에서 가장 가까운 1을 찾고, 그 앞부분은 1의 보수를 취하며, 찾은 1부터 뒷부분은 놔둔다. 

* 컴퓨터는 -3을 알지 못한다. (음수를 알지 못한다.) 3의 2의 보수를 알고 있는 것. 



4. byte: 파일 입출력이나 통신에 사용된다. 



실습) 번호와 키를 저장하고 출력

public class numheight {

public static void main(String[] args) {

int num = 4;

double height = 156.6; 

System.out.println("나의 번호는 "+num+"번 이고, "+"내 키는 "+height+"cm 입니다.");

}

}


5. 작은 자료형의 데이터는 큰 자료형의 변수에 대입 가능 


6. 형 변환(Type Casting): 데이터의 모양을 변경하는 것 

1) 자동형 변환 -> 작은 자료형의 데이터를 큰 자료형의 변수에 대입할 때 자동으로 큰 자료형으로 변환해서 대입

   -> int 보다 작은 자료형의 산술연산은 int로 변환되어 수행 


2) 강제형 변환 -> 강제 데이터의 크기를 변환

                    -> 숫자는 숫자로만 변환 

   -> 원하는 연산의 결과를 얻기위해서 수행

   -> 실수는 정수로 변환 될때, 소수를 버려야함


package java1219;

public class TypeCasting {

public static void main(String[] args) {

//자동 형 변환

double d = 10;

System.out.println("d: "+d);

//Test 

double test1 = (int)10.9;

System.out.println("test1: "+test1);;

//강제 형변환

int x = (int)10.9;

System.out.println("x: "+x);

//반올림

int y = (int)(10.9+0.5);

System.out.println("y: "+y);;

}

}


예시)

short는 2byte (숫자형)

char는 2byte (문자형)


char c = 10; 

short s = c; (에러발생) 



7. 자료형
문자열 자료형 String 입니다.
문자열을 변수에 저장하고자 할 때는 아래처럼 합니다.
String 변수이름 = "문자를 나열";

* 자료형의 종류
1.값을 저장하는 기본형(primitive type)
1)boolean: 1byte로 true 나 false만 저장
2)숫자 자료형
정수
byte 1byte
short 2byte
char 2byte
int 4byte - 기준형
long 8byte
실수
float 4byte
double 8byte - 기준형

=>숫자 자료형은 위에서 아래로 내려올 수록 크기가 큰 것으로 간주합니다.
=>작은 자료형의 데이터를 큰 자료형에 대입이 가능하지만 큰 자료형의 데이터는 작은 자료형의 공간에 대입이 불가능합니다.
=>큰 자료형의 데이터를 작은 자료형의 공간에 대입하려면 강제 형변환을 해서 대입합니다.

2.주소를 저장하는 자료형(reference type)
=>데이터가 저장된 곳의 주소를 저장하는 자료형 


8. 연산자
1) 최우선 연산자: ( ) - 연산의 우선 순위를 변경하는 연산자
      [번호] - 여러 개의 데이터가 있을 때 그 데이터의 순번을 이용해서 하나의 데이터를 가리키기 위한 연산자
2) 단항 연산자(unary): 하나의 데이터를 가지고 연산을 수행하는 연산자
      • ~ (틸드): 정수 데이터에만 사용이 가능한 연산자로 1의 보수로 리턴, 그래픽 프로그램에서 반전에 이용
      • ! (not): boolean 데이터에만 사용, true -> false / false -> true 
      • 부호(+,-)
      • ++, --: 정수 변수에만 사용가능한 연산자로 변수의 값을 1 증가 시키거나 1 감소 시키는 연산자, 변수에 앞에 사용하면 증감을 하고 명령문을 수행하고 뒤에 사용하면 명령문을 수행하고 증감
3) 산술 연산자 
=>숫자 데이터끼리 연산을 사용하는 연산자
*, /(나누기), %(나머지), +, -
=>산술 연산을 할 때 int 작은 데이터타입으로 연산을 하면 int로 변경해서 연산을 수행합니다.
=>동일한 자료형의 데이터를 연산하면 결과는 동일한 자료형으로 리턴합니다.
=>서로 다른 크기의 자료형의 데이터를 연산하면 더 큰 자료형으로 리턴합니다.
=>%는 나머지를 구해주는 연산자인데 이 연산자는 데이터의 범위를 한정짓거나 숫자 데이터에서 한자리 오류를 검출할 때 사용하는 연산자 입니다.

public class Unary {

public static void main(String[] args) {
int a = 10;
System.out.println(a++);
System.out.println(++a);;

}

}




package java1219;


public class Arithmetic {


public static void main(String[] args) {

short s1 = 20;

short s2 = 10;

short s3 = s1+s2;

System.out.println("s3: "+s3);

}


}


+와 같은 연산을 할때에는 int 형으로 변경되어 연산을 하게 된다. 
고로 에러가 발생한다.

에러를 없애기 위해서는 2가지 방법이 있다.
int s3 = s1+s2; 로 변경하거나 short s3 = (short)(s1+s2); 로 변경해도 된다.



(Test 실습) 

Q. 위의 예제를 char 로 바꾸게 되면 어떻게 될까? 


public class Arithmetic {


public static void main(String[] args) {

short s1 = 20;

short s2 = 48; //0의 ASCII code

short s3 = (short)(s1+s2);

char s4 = (char)(s1+s2);

char s5 = (char)s2;

System.out.println("s3: "+s3);

System.out.println("s4: "+s4);

System.out.println("s5: "+s5);

}

}






9. Shift 연산자

-> 비트 단위로 밀어내는 연산자

-> 정수 데이터에서만 사용 가능 

-> 첫번째 비트는 제외하고 작업

-> 32보다 크거나 같은 횟수는 32로 나눈 나머지 만큼만 수행 

 X >> Y : X를 Y만큼 오른쪽으로 shift 



10. 관계연산자

-> 크기비교연산자

-> 동일한 자료형의 크기를 비교해서 boolean 으로 리턴하는 연산자

1) >, >=, <=

2) == (같다) !=(다르다)



11. 논리연산자

1) 조건 논리 연산자 -> boolean 데이터를 가지고 연산을 수행한 후, 결과를 boolean으로 리턴하는 연산자

&& :and

|| :or 

! :not 

don't care : &&의 연산의 앞부분이 false면 뒷부분 까지 가지 않고 false로 리턴하고 종료




<윤년 구하기>

public class Leafyear {


public static void main(String[] args) {

int year = 2400;

boolean leaf;

//leaf 조건은? 2가지 조건중 하나를 만족하면 윤년 -> 1) 4의 배수이고 100의 배수가 아닌 경우 2) 400의 배수 

leaf = ((year%4==0)&&(year%100!=0))||(year%400==0);

System.out.println(leaf);

}


}



<시간, 분, 초 구하기>
public class TimeCount {
public static void main(String []args) {
int time = 57643;
//time이 몇시간 몇분 몇초인지 출력 
int hour = time/3600; 
int minute = (time-hour*3600)/60;
int seconds = time%60;      /*(time-hour*3600)%60;*/ 
System.out.println(hour+"시간 "+minute+"분 "+seconds+"초");
}

}