1. 변수 ( Variable)
-임시 기억(저장 ) 장소 (물리적으로는 램과 같음)
-변수는 반드시 선언해야 한다. (java script 는 안해도되지만 java는 필수)
데이터타입 변수명;
데이터타입 변수명 = 초기값;
-변수는 반드시 초기화를 해야한다. (c언어는 안해도되지만 java는 필수)
초기화는 변수가 시작되자마자 가장 처음 시작되는 값
초기화 - 기존의 값들을 지워버리고, 실수를 방지하여 안전한 프로그래밍을하겠다.
(ex : int pay = 100000)
-변수는 반드시 선언된 블럭 안에서만 사용가능하다 (유효범위)
기억장소 메모리 = 값
=의 뜻은 뒤의값을 앞의 메모리에 대입하겠다, 저장하겠다, 치환하겠다 뭐 이런뜻입니다
---------------------------------------------------------
cmd 에 [java] 프로그램이름만을 입력하고 엔터를누르면
자바프로그램에대한 명령어를 보실수있습니다.
[javac] 도 마찬가지입니다.
----------------------------------------------------------
예를 들어 급여관리 프로그램을 만든다고 합시다.
기본값들을 지정해주시고 기타사항들을 나열합니다.
"문자열"가 포함있는 + 합연산기호는 전부 문자열로 인식합니다.
그러므로 마지막 총급여의 연산에서는 숫자부분을 따로 ( )로 싸주셔야됩니다.
그러지않으면 - 연산자가 제대로 역할을 해내지못합니다.
------------------------------------------------------------
class VarTest1{
public static void main(String args []){
java.lang.System.out.println("***급여관리 프로그램***");
java.lang.System.out.println("기본급 : " + 100000);
java.lang.System.out.println("보너스 : " + 100);
java.lang.System.out.println("갑근세 : " + 1000);
java.lang.System.out.println("총급여 : " + (100000 + 100 - 1000));
}
}
------------------------------------------------------------
하지만 급여값이 바뀌게되면 10만 이라는 숫자를 전부 찾아 변환하여야됩니다.
나중의 변경될수도있는 값이 있을수있습니다.
그래서 int (integral 필수적인) 를 사용합니다.
int pay = 100000 ;
이라는 문장을 추가해줍니다.
그리고 기존의 10만에 해당하는 부분을 pay로 고쳐써줍니다.
그러면 int pay 의 값만 바꾸면 급여에해당하는부분이 모두 바뀝니다.
------------------------------------------------------------
class VarTest1{
public static void main(String args []){
int pay = 100000;
java.lang.System.out.println("***급여관리 프로그램***");
java.lang.System.out.println("기본급 : " + pay);
java.lang.System.out.println("보너스 : " + 100);
java.lang.System.out.println("갑근세 : " + 1000);
java.lang.System.out.println("총급여 : " + (pay + 100 - 1000));
}
}
-----------------------------------------------------------
int pay; 로 선언을해주고
pay=200000 으로 따로초기화를 해주셔도됩니다.
int pay = 100000; 처럼 쓰셔도상관없습니다.
------------------------------------------------------------------------
class VarTest1{
public static void main(String args []){
//int pay = 100000;
int pay;
pay = 200000;
java.lang.System.out.println("***급여관리 프로그램***");
java.lang.System.out.println("기본급 : " + pay);
java.lang.System.out.println("보너스 : " + 100);
java.lang.System.out.println("갑근세 : " + 1000);
java.lang.System.out.println("총급여 : " + (pay + 100 - 1000));
}
}
----------------------------------------------------------------------------
class VarTest3{
public static void main(String args []){
int a = 10;
java.lang.System.out.println(a);
{ int b = 20;
java.lang.System.out.println(b);
{
int c =30;
java.lang.System.out.println(c);
}
}
}
}
-----------------------------------------------------------------------------
지역변수와 전역변수 라는게 있습니다.
지역변수는 블럭으로 제한을두어 일정부분에서만 사용이 가능한 변수이고,
전역변수는 최상위 블럭에 선언하여 모든영역에서 사용이 가능한 변수입니다.
int 라는 변수를 세번이나사용했습니다
다만 { } 로 블럭을지어 서로구분지어주었습니다.
한블럭에선 선언된 변수만 사용이 가능하기때문에
대괄호의 단계의따라
변수c 변수b 가 각각 인식이안되는 부분이 있을겁니다.
변수a 는 어디서든 인식됩니다.
블럭의 구분없이, 변수가 중복되어들어가게되어도 컴파일은 됩니다만 이렇게 구분을 짓는 이유는
필요없는 데이터는 사용을 파기하고 메모리에 여유를주어 빠르게 연산하기위해서 입니다.
------------------------------------------------------------------
2. Data Type (어디에쓸지 에 대한 '용도' , 얼마나쓸지 에 대한 '크기')
용도 종류 크기
-정수형 byte 1byte
short 2byte
기본값 int 4byte
long 8byte
-실수형 float 4byte
기본값 double 8byte
-문자형 char
-논리형 boolean : true false 만 사용가능
1byte 는 8bit 입니다.
bit 는 0과 1로이루어진 최소단위의 이진수를 나타냅니다.
그러므로 8자리의 이진수 숫자가 1byte=8bit 의 데이터양입니다.
그러면 8자리 이진수라면 2^8 개의 10진수단위의 수가 나오므로
256가지의 값을 지정할수있습니다.
실제로는 255가지이고 그값을넘어가면 다시 처음으로 돌아옵니다
그 범위는 정수형 기준으로 음수 양수 를 포함 (-128~127) 까지입니다.
----------------------------------------------------------------
class VarTest2{
public static void main(String args[]){
byte var1;
var1 = 127;
java.lang.System.out.println(var1);
}
}
-------------------------------------------------------------------
최소값인 byte 를 사용하여 var 1 이라는 값을 지정, 컴파일하여 출력해봅니다.
127까지는 허용되는범위라 출력이되지만 128부터는 오류가나며 javac에서 컴파일이 되지않습니다.
----------------------------------------------------------------------
c언어는 한글자에 1byte이고 자바는 한글자에 2byte입니다
글자의 낭비라고 생각할수도있지만
ascII 코드 아스키코드 (아메리칸 스탠다드 코드 American Standard Code)
를 생각하면 이해가됩니다.
컴퓨터는 이진수를 알아듣지만 사람은 10진수로 변환해야 이해합니다.
키보드의 입력을 컴퓨터에게 인식시키기 위해 또는 그반대로하기위해 변환시킬 코드가 필요합니다.
그래서 10진수의 아스키코드를 개발했습니다.
알파벳과 여타다른 키 들을 합하여 총 128개의 값이 ascII 코드에 저장되어있습니다.
128개라면 2^7이니 1바이트가 안되죠
그래서 영어알파벳을 쓸때는 1바이트만 소요됩니다.
쉽게 핸드폰 문자메세지를 작성할때, 영어를입력하면 1바이트지만 한글이나 다른문자를 입력하면 2바이트가 올라가는걸 볼수가있습니다.
알파벳만을 위한 코드가 개발되어, 다른나라들도 통합적인 코드가 필요했습니다.
그게바로 유니코드 입니다.
1바이트와 1바이트를 더해 2바이트의 용량의 문자코드가 탄생한겁니다.
256*256 가지의 조합으로 전세계의 모든 문자를 표현할수있다고합니다.
---------------------------------------------------------------------------
class VarTest2{
public static void main(String args[]){
byte var1;
var1 = 127;
java.lang.System.out.println(var1);
char var2 = '가';
java.lang.System.out.println(var2);
}
}
----------------------------------------------------------------------
문자형 데이터타입 인 char를 입력하여 두번째값인 '가' 를 출력해봅시다.
오타가없다면 무리없이 출력될겁니다.
' ' 와 " " 는 다릅니다.
'는 한 글자를 묶을 때, " 는 글자열 을 묶을 때 사용합니다.
'는 한 글자 만 쓸수있고, "는 거의 메모리가허용하는 무한대의 글자를 묶을수있습니다.
---------------------------------------------------------------------
3. 연산자 (operator)
1 사칙연산자
+, -, *, /, %, ++, --
[ ++, -- ] 단항연산자, 증가(감소) 연산자
변수 에서만 사용가능 [ ex a++ , ++a ]
1씩만 값이 변화함
2 비교연산자
>, <, >=, <=, ==(같냐?), !=(같지않냐?)
3 논리연산자(단락회로연산자)
- 좌우변이 둘다 논리값이여야한다.
하나의 연산이 쓸데가없는 값이면 뒤의연산은 진행하지않는다.
&&의경우 하나가거짓이면 뒤의값은 계산안함
&& (and), 모두참 일때만 '참' 이라고 나옴
|| {or), 둘중 하나만 참이여도 '참'
!(not) 토글연산자, 단항연산자, 둘다 부정이여야 참
4 대입(치환)연산자
=, +=, *=, -=, /=,
연산을 할때는 연산순서를 외우려 하지말고,
먼저하거나 우선순위가 주어지는연산은 ( ) 로 묶어서 먼저계산해준다.
5 비트연산자
- 빠르고 가볍게 하드웨어에 데이터를전달해줌
비트단위로쪼개질때까지 나눠줌
16-> 00010000 10진수를 2진수로 치환해준다
1101-> 1*2(3) + 1*2(2) + 0*2(1) + 1 * 2(0)
치환된 값을 서로 비교 [ex 100111001 ]
001011101
& (and), | (or), ^ (xor), <<, >>, >>> (shift 곱셈 나눗셈 대신사용가능),
~(보수)
논리값이 2진수가아니더라도 2진수로 바꿔서 연산한다
a b a&b a|b a^b
-------------------------------------------
T T T T F
T F F T T
F T F T T
F F F F F
^익스클루시브 or
두가지를 비교하여 같은값이면 F 다른값이면 T로 인식함 (False=0 True=1)
[ex a=1011100101] a^b
[ b=0001001001]
[ TFTFTFTFTT]
[ 1010101011]
비트연산자와 논리연산자의경우 서로비슷하지만 장단점이 분명히나뉜다.
6 캐스팅연산자 (강제 형태 변환 연산자)
[(데이터타입)변수 ]의 형태
-명시적 방식 - 눈에보이게 직접 입력
-암묵적 방식 -
--------------------------------------------------------------------------
class OpTest1{
public static void main(String args []){
int var1 = 10;
var1 = var1 + 1;
var1++;
java.lang.System.out.println(var1);
}
}
-------------------------------------------------------------------
var1 값을 10으로 지정해주고
var1 = var1 + 1
이라는 문항을추가해주면 var1 값은 11로 치환됩니다.
증가연산자인 ++를 사용해서
var1++ 만 사용해도 11이됩니다.
두가지를같이쓰면 1씩증가해서 12가되겠죠
++는 붙어있는 값을 1 증가시킵니다.
a++ 나 ++a 는 똑같죠,
하지만 다른연산이 포함되면 조금 달라집니다.
---------------------------------------------------------------------
class OpTest1{
public static void main(String args []){
//int var1 = 10;
//var1 = var1 + 1;
//var1++;
//java.lang.System.out.println(var1);
int var1 = 10, var2 = 0;
var2 = ++var1;
System.out.println(var1 + "," + var2);
}
}
-------------------------------------------------------------------
여기서
var2 = ++var1;
var2 = var1++;
를 바꿔주면 값이 달라집니다.
기존코드값의 출력은 11 11일겁니다.
var2 = 증가된var1 이라는 뜻이니까요
하지만 증가연산자의 위치만 바꿔주면
var2 = var1 / var1 은 증가한 var1 이라는 뜻으로 바뀝니다.
그래서 출력값이 11 10 이됩니다.
작은차이지만 결과는 큰차이입니다.
그러므로 왠만하면 다른연산자랑 같이 사용하지마세요.
---------------------------------------------------------------------------
연산자들
class OpTest1{
public static void main(String args []){
/*int var1 = 10;
var1 = var1 + 1;
var1++;
java.lang.System.out.println(var1);
int var1 = 10, var2 = 0;
//var2 = ++var1;
var2 = var1++;
System.out.println(var1 + "," + var2);*/
//int var1=10, var2 =20;
//System.out.println(var1 == var2);
/*int var1 = 10 , var2 = 11;
System.out.println(var1>=10 || var2==11);*/
/*int var1=10;
var1 = 20;
var1 = 30;
var1 = 1;
System.out.println(var1);
var1 += 20; // var1 = var1 + 20;
var1 += 30; // var1 = var1 + 30;
System.out.println(var1);*/
int var1 = 10, var2 = 11;
//System.out.println(var1 && var2);
//System.out.println(var1 & var2);
System.out.println(var1>10 && ++var2==11);
System.out.println(var2);
}
}
사칙연산자를 이용한 값의 순차증가
비교연산자 를 이용한 값의 비교
대입연산자를 이용한 값의 연산
비트연산자 를 이용한 비트값 비교
단락회로차단을이용한 연산
연산자의 구조에따라 되는코드도 있고 안되는코드도있습니다.
순차적으로 한번씩 실습해보시면됩니다.
---------------------------------------------------------------------
^ 익스클루시브 (xor)
class OpTest2{
public static void main(String args []){
int data = 34897;
int key = 201599;
int enc = data^key;
System.out.println("암호화 된 값 :" + enc);
//데이터를받고 디코딩을함
int dec = enc ^ key;
System.out.println("복호화 된 값 : " +dec);
}
}
---------------------------------------------------------------------
데이터값과 키값을 ^ 로 비교하여 인코딩된 암호값을 얻고,
암호화된 값을 키값과 ^ 로 대조해 원본인코딩값을 되찾습니다.
--------------------------------------------------------------------------
캐스팅연산자( )
class OpTest3{
public static void main(String args []){
double d1=3.5, d2=2.0;
//int var1 = (int)d1 + (int)d2;
int var1 = (int)(d1+d2);
System.out.println(var1);
double d3 = var1;
System.out.println(d3);
}
}
---------------------------------------------------------------------------
double 이라는 데이터타입으로 이루어진 데이터를
int 라는 데이터 타입에 억지로 적용시키는 방법입니다.
(int) 라는 캐스팅연산자를 쓰지않으면 적용이되지않습니다.
수식의 데이터 앞에 ( ) 를 사용하여 int 라는 데이터타입을 억지로 적용시켰습니다.
double은 실수형이고 int 는 정수형이기때문에
계산값은 5.5 가아닌 정수 5 로출력됩니다.
더블 데이터타입으로 d3 라는값을지정하고
d3는 var1 =(int)(di+d2)
라고 해봅시다.
double 과 int 라는 데이터타입이 다른 수식이지만
수식인 int값이 결과값인 더블보다 작기때문에 포괄된다고볼수있습니다.
그래서 (double) 라는 캐스팅타입을 적어야하지만 생략하셔도됩니다.
------------------------------------------------------------------------
class OpTest3{
public static void main(String args []){
double d1=3.5, d2=2.0;
//int var1 = (int)d1 + (int)d2;
int var1 = (int)(d1+d2);
System.out.println("var1 : " + var1);
double d3 = var1;
System.out.println("d3 : " + d3);
byte b = (byte)var1;
System.out.println("b : " + b);
b = 100;
//b = (byte)(b + 5);
b+=5;
System.out.println("b : " + b);
}
}
----------------------------------------------------------------------------
정수형의 기본데이터타입은 int입니다.
byte라는 데이터타입의 을구하는데 수식이 int타입이면 포괄하질못해서 인식을못합니다.
byte b = (byte)var1; 이렇게 (byte)로 강제캐스팅해줍니다.
+=함수에는 어느 값을 합쳐서계산해야하므로 캐스팅이 이미들어가있다고보아도됩니다.
--------------------------------------------------------------------------
class OpTest3{
public static void main(String args []){
/*float f = 3.14;
System.out.println("f : " + f);
float f = (float)3.14;
System.out.println("f : " + f);*/
float f = 3.14f;
//f = f + 2.5;
f += 2.5;
System.out.println("f : " + f);
long var2 = 100;
var2 = var1 + 1000;
var2 = 25000000000L;
System.out.println(var2);
int i = 'a';
System.out.println(i);
char c = 95;
System.out.println(c);
}
}
----------------------------------------------------------------------------
f값을 구할때 f는 float이지만 3.14는 double로 인식되어있으므로,
3.14의 뒤에 f를 붙여서 캐스팅하거나 (float) 를 입력합니다.
var2는 long값 이고 100은 int값 입니다.
int는 2^32까지표현하므로 약 42억입니다.
터무니없는숫자인 250억을 표현하기엔 부족한단위 이므로 long로 캐스팅합니다.
알파벳인 a는 아스키코드에 의해 10진수로 입력되므로 정수로인식합니다.
정수의 데이터타입인 int로도 알파벳을 처리할수있습니다.
a값을 출력하면 a해당하는 10진수 인 97이 나옵니다.
char는 반대로 95라는 십진수에해당하는 문자를 출력합니다.
수고하셨습니다.
오늘의과제
1.
리터를 갤런으로 바꾸자
두개의 double변수를 이용해서 각각 갤런과 리터의 값을 저장하고 갤런값에 해당하는 리터값으로 바꿔보자
2.
달의 중력은 지구중력의 17% 정도이다.
달에서의 당신의 체중이 얼마인지 구하시오
3.
번개가 얼마나 먼곳에서 발생하였는지
피트로 계산하라
소리는 공기중을 약 1100f/s 의속도로 진행한다
번개를본시간과 천둥소리를 들은 시간 사이는 7.2초라고 한다
---------------------------------------------------------------
1.
class HW{
public static void main(String args []){
double liter = 1;
double gallon = 0.264172 * liter;
System.out.println(" 두개의 double 변수를 이용해서 각각 갤런과 리터값을 저장하고, \n갤런값에 해당하는 리터값으로 바꿔보자.");
System.out.println("리터와 갤런의 비율은 약 1:0.264172 이다 \n 3갤런의 물이있다고 할때 리터값은");
System.out.println(3*gallon);
}
}
-----------------------------------------------------------------
2.
class HW2{
public static void main(String args []){
float weight = 90;
float weight2 = weight*0.17f;
System.out.println(" 달의중력은 지구중력의 17%이다 \n내 몸무게가 90kg일때 달에서의 몸무게는?");
System.out.println("달에서의 몸무게 : " + weight2);
}
}
-------------------------------------------------------------------
3.
class HW3{
public static void main(String args []){
double SS = 1100;
double LD = 7.2;
System.out.println(" 번개가 얼마나 먼곳에서 발생했는지 구하라 \n소리는 공기중을 약 1100f/s 의 속도로 이동한다 \n 번개를 본 시간과 천둥소리를 들은 시간의 차이가\n약7.2초라고 할때 그 거리의 차이는? ");
System.out.println("소리의속도 : " + SS);
System.out.println("소리가들리기까지의 시간 : " + LD);
double TT = SS*LD;
System.out.println("번개로부터 떨어진 거리는 : " + TT);
}
}
----------------------------------------------------------------------
|
2015년 10월 21일 수요일
java 강의 2일차 - 변수 와 연산자
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기