변수란 무엇인가
특정 데이터 타입을 저장할 수 있는 공간을 말한다
데이터 타입이란
숫자로는 byte int float double 등이 있으며
먼저 byte는 말 그대로 1byte의 데이터 타입을 가지고 있다
데이터 타입을 논할때 단위
1byte는 8bit와 같다
1bit란 무엇인가
컴퓨터는 0과1만 사용하는 이진법을 사용한다
그렇다면 1bit가 표현할 수 있는 정보의 개수는 2개 뿐인 것이다
그럼 2bit는 00,01,10,11 총 4개를 표현 할 수 있다
3비트는 000,001,010,011,100,101,110,111 -> 2^3 총 8개
4비트는 2^4 총 16개
8비트는 2^8 총 256개
.
.
.
그렇다면 byte가 표현할 수 있는 정보는 총 256개 이며
부호가 없을 경우(unsigned) 0~255개 표현이 가능하다
부호가 존재한다면 -128 ~ 127
정수 int는 가장 많이 사용되는 데이터 타입이며 기본타입이다
특히 숫자를 사용할 때 많이 사용되며 int는 4byte 타입에 해당된다
그러므로 32비트에 해당한다 2^32 대략 42억 9천만
float,double 또한 많이 사용된다
소수점 데이터의 경우 기본적으로 double을 사용한다
그러나 double은 성능 이슈로 인해 고성능을 요하는 시스템에서는 float를 사용하게 된다
즉 게임을 만든다는 가정하면 double 보다 float가 시스템에 무리가 적다
double로 만든다면 정밀도가 높다 그만큼 표현할 수 있는 범위가 넓다
float는 1byte double은 8byte를 사용한다
만약 강제로 float 변수로 강제 변환하고 싶으면 숫자 뒤에 f를 붙인다
ex)3.3f
변수 만들기
1.데이터 타입을 적는다
2.변수의 이름(공간의 이름)을 적는다
3.필요하다면 값을 할당한다
int num1; 변수 선언(값을 아직 할당받지 않았다)
=은 같다가 아닌 대입 연산자이다
int num2 = 3; 변수선언+값 할당
=대입 연산자를 잘 이해해야
==’같냐?’ 연산자와 혼동을 방지할 수 있다
우리가 작성한 값이 잘 들어가 있는지 확인해보겠다
int num1;
System.out.println(num1);
위 코드는 변수를 초기화하지 않았기 때문에 에러가 뜬다
그러므로
int num2 = 5;
System.out.println(“num2=”+num2)—>결과 num2=5
문자열과 숫자의 덧셈음
문자열 뒤에 숫자를 자동으로 문자열화하여 붙인다
결국 덧셈은 문자열끼리 붙이는 작업이 된다
double dnum1;
double dnum2 = 3.3;
System.out.println(“dnum2=” + dnum2);
필자는 num2(3)과 dnum(3.3)을 더하고 싶은데 어떻게 할까?
먼저 우리가 원하지 않는 숫자로 나올때의 방식이다(에러는 아님)
System.out.println(“num2+dnum2=” + num2 + dnum2);
이렇게 되면 연산을 왼쪽에서 오른쪽으로 진행하기 때문에 결과는
num2+dnum2=33.3
이 나온다
그렇다면 3+3.3은 6.3이 나오도록 하는 방법은 괄호를 붙여준다
System.out.println(“num2+dnum2=” + (num2 + dnum2));
결과
num2+dnum2=6.3
앞에 설명과 같이 소수점은 기본적으로 double 타입으로 출력을 하기 때문에
float타입으로 출력을 하려면 숫자 뒤에f를 붙여준다
float fnum = 3.3f;
System.out.println(“fnum=” + fnum);
//%d는 decimal의 약자로 정수를 출력한다
//%f는 float의 약자인데 소수점을 출력한다
System.out.printf(“num2=%d\n”, num2);
System.out.printf(“dnum2=%f\n”, dnum2);
System.out.printf(“fnum=%f\n”, fnum);
//소수점 3자리만 출력하겠다
System.out.printf(“fnum=%.3f”, fnum);
연습문제
/*
연습문제1
사과가 5개 있다
포도가 7개 있다
오렌지는 11개 있다
각각에 대해 변수로 만들고
각각의 변수가 몇 개 있는지 출력하도록 프로그래밍 하기
*/
public class FirstQuiz1 {
public static void main(String[] args) {
//데이터 타입이 같은 변수들은 ,를 이용하여 변수이름과 숫자를 기재하여 진행한다
int apple = 5;
int grape = 7;
int orange = 11;
String a = "사과";
String g = "포도";
String o = "오렌지";
System.out.printf("%s는 %d개,%s는 %d개,%s는 %d개", a, apple, g, grape, o, orange);
}
}
연산자
데이터 타입이 같은 변수들은 ,를 이용해서 변수이름과 숫자를 기재하여 진행한다
int apple.grape,orange;
변수는 한번 선언하면 두번 선언할 필요가 없다
만약 두번 선언하면 중복 오류가 발생한다
덧셈
int res = apple + grape;
System.out.println("apple+grape=" + res);
뺄셈
res = orange - grape;
System.out.println("apple+grape=" + res);
곱셈
res = apple * grape;
System.out.println("apple*grape=" + res);
나눗셈
res = orange / apple;
System.out.println("orange/apple=" + res);
나머지
res = orange % grape;
System.out.println("orange mod grape=" + res);
강제타입변환(Type Casting)
res2 = (float) orange / apple;//피연산자가 int로 선언이 되었는데 float로 강제 변환하면 결과값은 소수점으로 나온다
System.out.println(res2);
비트연산
10진수를 2진수로 바꾸는 방법
2진수로 변경
4 3 2 1 0
1 0 0 0 0
2^4 x 1 + 0 ===> 16
10진수 2진수로 바꾸는 방법
- 변환할 숫자를 지정한다(현재 케이스 5)
- 지정한 숫자보다 작은 2의 최대 승수를 찾는다.
- 지정한 숫자에서 찾은 숫자를 뺀다.
- 뺏으므로 현재 케이스에서 1이 남는다.
- 현재 케이스를 4를 뺏으므로 2번 자리에 1을 설정한다.
- 나머지 1을 표현할 수 있는 숫자는 2^0
그러므로 0번 자리에 1을 설정한다. - 최종적으로 나머지가 0이 될때까지 작업을 반복한다.
숫자 6을 2진수로 바꾸기
6-4 = 2
2-2 = 0
2^2 2^1 2^0
1 1 0
맞는지 확인할려면 2^2+2^1+0 ===>6
숫자 7를 2진수로 바꾸기
7-4 = 3
3-2 = 1
1-1 = 0
2^2 2^1 2^0
1 1 1
맞는지 확인하려면 2^2+2^1+2^0===>7
숫자 11을 2진수로 바꾸기
11-8 = 3
3-2 = 1
1-1 = 0
2^3 2^2 2^1 2^0
1 0 1 1
맞는지 확인하려면 2^3+2^1+1===>11
숫자 13을 2진수로 바꾸기
13-8=5
5-4=1
1-1=0
2^3 2^2 2^1 2^0
1 1 0 1
맞는지 확인하려면 2^3+2^2+1===>13
숫자 20을 2진수로 바꾸기
20-16=4
4-4=0
2^4 2^3 2^2 2^1 2^0
1 0 1 0 0
맞는지 확인하려면 2^4+2^2===>20
숫자 27을 2진수로 바꾸기
27-16=11
11-8=3
3-2=1
1-1=0
2^4 2^3 2^2 2^1 2^0
1 1 0 1 1
맞는지 확인하려면 2^4+2^3+2^1+1===>27
AND연산자
자릿수가 서로 1로 일치할때만 1이 되며
그외의 경우엔 모두 0이 된다
(여기서 1이란 참,0이란 거짓으로 봐도 무방하다)
0 0 1 0 1
AND 0 1 0 1 0
0 0 0 0 0
0 0 1 0 1
AND 0 1 1 1 1
0 0 1 0 1