2015년 10월 21일 수요일

java 강의 3일차 - 삼항연산자

java 강의 3일차 - 삼항연산자
삼항연산자
조건식 ? 처리 (참) : 처리(거짓)

===============================================

Build 관리 툴 - 컴파일과 실행을 자동으로 처리해주는 프로그램

ex) ANT 프로그램 http://ant.apache.org/ 

압축만 풀어서 준비해주시고,
제어판 - 시스템 및 보안 - 시스템 -고급시스템설정 에들어가줍니다.
환경변수의 시스템변수에 ant_home 이라는 변수를 하나 새로만들어 
ant프로그램의 상위폴더를 추가해줍니다.
ex) C:\Users\xxxx\Downloads\apache-ant-1.9.6-bin\apache-ant-1.9.6
그후 path 변수에 편집을눌러 %ant_home%\bin; 을추가해줍니다.

===============================================

ant프로그램을 테스트하기위해 노트패드에 한번 테스트를 해봅니다.

-------------------------------------------------------------------------------------

public class Antest{
public static void main(String args []){
System.out.println("***************테스트****************");
}
}

-------------------------------------------------------------------------------------

ant프로그램이 알아서 인공지능처럼일을할수는없습니다.
스크립트를 짜서 기본적인 명령을 작성해야합니다.
스크립트는 .xml 파일로 작성을해야합니다.

-------------------------------------------------------------------------------------

<?xml version="1.0"?>
<!-- build.xml-->

<project>                

</project>               

-------------------------------------------------------------------------------------

<> 를 하나의 태그라고 부릅니다.
반드시 시작태그와 마침태그가 있어야합니다.
project라는 태그를 만들었는데, 태그를마칠때는 /project 로 
프로젝트태그를 끝낸다는것을 명시하여야합니다.

-------------------------------------------------------------------------------------

<?xml version="1.0"?>
<!-- build.xml-->

<project default="" basedir="E:\serin\javase\03Control">

</project>


-------------------------------------------------------------------------------------

project 태그 안에 기본정보를 넣어줍니다..
basedirectory 에 내가 사용할 폴더 ; 자바파일들이저장되는폴더
를 지정해줍니다.

-------------------------------------------------------------------------------------
<?xml version="1.0"?>
<!-- build.xml-->

<project default="" basedir="E:\serin\javase\03Control">
<target name="compiler">
<javac></javac>
</target>
</project>

-------------------------------------------------------------------------------------

이 xml파일이 할역할을 타겟이름에 적당히 적어줍니다.
아무거나상관은없습니다.
이번의 목적은 컴파일이니 컴파일러 라고 적어놓고, 
컴파일을할떄 javac프로그램을 사용할거니깐 javac태그를 만들어줍니다.


-------------------------------------------------------------------------------------
<?xml version="1.0"?>
<!-- build.xml-->

<project default="" basedir="E:\serin\javase\03Control">
<target name="compiler">
<javac srcdir="" destdir=""></javac>
</target>
</project>

-------------------------------------------------------------------------------------

srcdir 은 내가 컴파일 할 파일이 있는경로,
destdir은 컴파일 한 파일이 보내질 경로를 지정할수있습니다.
지금은 따로 지정하지않고, basedir에 지정된 기존폴더를 사용하겠습니다.
-------------------------------------------------------------------------------------

<javac srcdir="${basedir}" destdir="${basedir}"></javac>

-------------------------------------------------------------------------------------

${ } 는 xml안에서 변수를 사용하겠다는 의미입니다.

-------------------------------------------------------------------------------------

<?xml version="1.0"?>
<!-- build.xml-->

<project default="compiler" basedir="E:\serin\javase\03Control">
<target name="compiler">
<javac srcdir="${basedir}" destdir="${basedir}"></javac>
</target>
</project>

-------------------------------------------------------------------------------------

<!-- --> 이부분에 주석을 달수 있는데, 혹시 주석을 한국어로 다시려면
최상위태그에
<?xml version="1.0" encoding="euc-kr"?> 로 인코딩을 추가해줍니다

------------------------------------------------------------------------------------
<?xml version="1.0" encoding="euc-kr"?>
<!-- build.xml-->

<project default="compile" basedir="E:\serin\javase\03Control">
<target name="compile">
<javac srcdir="${basedir}" destdir="${basedir}" includeantruntime="false"/>
</target>
</project>

-------------------------------------------------------------------------------------

<javac> 태그를보면 하나의 태그사이에 아무것도없습니다.
그러면 끝태그를 함축해서쓸수있습니다.

<   ><  /> 라는 태그가있을때, 중간에 아무태그도없으면 
<    />로 끝낼수도있습니다.

-------------------------------------------------------------------------------------
이제 소스파일과 클래스파일을 따로저장하는 방법을 알아보겠습니다.
폴더를 두개 만들어줍니다.
보통 관례적으로,
소스파일은 src폴더, 결과물파일은 bin폴더 라고 만듭니다.

cmd 에서 컴파일을할떄 지금까지는
javac 파일명 이라고하는데, 이제는
javac -d 라고 명령어를 적어줍니다. -d는 디렉토리를 지정하겠다는뜻입니다.

java -d E:\serin\javase\03Control\bin 라고 적을수도있지만,
java -d ../bin 파일명 이라고 적을수도있습니다.

. 은 현재폴더 .. 은 상위폴더를 의미합니다. 

이제 컴파일을 실행하는 스크립트가 완성됐습니다.
-------------------------------------------------------------------------------------

이제 컴파일 후 실행까지 하는 스크립트를 짜보겠습니다

<?xml version="1.0" encoding="euc-kr"?>
<!-- build.xml-->

<project default="run" basedir="."><!--현재위치를 . 으로 대체하여사용할수있음-->
<property name="src.dir" value="${basedir}/src" />
<target name="compile">
<javac srcdir="${src.dir}" 
destdir="${basedir}/bin" 
includeantruntime="false"/>
</target>
<target name="run" depends="compile">
<java classname="Antest">
<classpath>
<pathelement path="${basedir}/bin"/>
</classpath>
</java>
</target>
</project>

------------------------------------------------------------------------------------

베이스디렉토리의 이름을 간단하게 해주기위해

property태그를 만들어서 밸류값으로 ${basedir}/src 라는걸 src.dir 로 지정하도록 해줍니다.

궁극적으로 실행되어야 하는 목표가 run 이므로, 프로젝트 디폴트를 run으로 바꿔주고, 밑에도 비슷하게 짜줍니다.
실행할 class이름이 Antest이므로 지정해주시고, 
class경로를 지정합니다.
타겟의 이름을 run으로 만들었기떄문에 run이 실행되지만, 
컴파일이 필요하기떄문에 타겟태그에 depends="compile"을 덧붙여줍니다.

실행순서가 디폴트런-타겟런-디펜드 컴파일- 타겟컴파일- 런 으로진행되는겁니다.

===============================================

어제 에 이어 제어문을 배워보겠습니다.

제어문 ( Cpmtrol Statement )

1.조건문 if
a. if (조건식){             
문장;
문장;
}
-----------------------------

b.       if (조건식){
문장;
문장;
}
else{
문장;
}
------------------------------
c. if (조건식){
문장;
문장;
}
else if{
문장;
}
else{
문장;
}
-----------------------------------
d. nested if

if조건식을 포함하는 if조건식

if (조건식){
if(조건식)
문장;
else
문장;
}
else {
if(조건식)
문장;
else
문장;
}

-------------------------------------

public class IfTest1{
public static void main(String args[]) throws java.io.IOException{
/*System.out.print("숫자 입력 : ");
int num = System.in.read()-48;
*/
/*if((num%2)==0) //넘에붙은 조건문이 0과같다 + if 는 -과같냐?
System.out.println("짝수입니다." );
if((num%2)!=0)
System.out.println("홀수입니다.");
*/
/*if((num%2)==0)
System.out.println("짝수입니다");
else
System.out.println("홀수입니다");
*/
/*
int avg = 78;
char point = ' ';
if(avg >= 90)
point = 'A';
else if(avg >= 80)
point = 'B';
else if(avg >= 70)
point = 'C';
else if(avg >= 60)
point = 'D';
else 
point = 'F';
System.out.println("학점 : " + point);
*/
/* int num1=10, num2=7, num3=8;
if(num1>num2){
if(num1>num3)
System.out.println("num1이 제일크다");
else //num1<num3
System.out.println("num3이 제일 크다");
}
else{//num1<num2
if(num2 > num3)
System.out.println("num3이 제일 크다");
else
System.out.println("num2가 제일 크다");
}
*/
//id:x , pw:7
/* System.out.print("ID : ");
char id = (char)System.in.read();
System.out.print("Password : ");
char pw = (char)System.in.read();
if(id != 'x'){
if(pw != '7')
System.out.println("둘 다 틀림");
else 
System.out.println("아이디 만 틀림");
}
else{
if(pw !='7')
System.out.println("패스워드 만 틀림");
else
System.out.println("로그인 성공");
}
*/
}
}

-----------------------------------------------------------














2. switch

switch(변수 또는 수식){
case 값 또는 '값:
문장;
문장;
case 값 또는 '값
문장;
case 값 또는 '값:
문장;

해당 변수에 스위치가 들어간다고생각하면됩니다.
case의 마무리마다 break; 를 써주면,
해당케이스에 도달하는순간 그다음은 넘겨버리기때문에
변수에 해당하는 값 만 출력할수있습니다.


-------------------------------------------------------------------------------------

public class Switch
{
public static void main(String args [])throws java.io.IOException
{
System.out.println("과일코드 : ");
char num = (char)System.in.read();
switch(num) //정수형만 가능
{
case '1' :
System.out.println("사과");break;
case '2' :
System.out.println("배");break;
case '3' :
System.out.println("포도");break;
case '4' :
System.out.println("감");break;
default:
System.out.println("해당없음");break;
}
}

}


--------------------------------------------------------------------------------------

도스창에 숫자를 입력하고 그숫자에맞는 과일 이름이 나오도록 만든 코드입니다.
스위치타입문장에, 글자를 입력할수 있게하고 글자를 글자그대로 인식하도록 (char)를 씌워줬습니다.
밑의 예제에는 ' 홑따옴표 를 써서 글자하나로 인식하도록 했습니다.


===============================================
out print 는 모니터에 출력되는 값만 나옵니다/
in read 를 써서 문자를 입력할수있는 간단한 방법입니다.
다만 read를 써서는 한글자 씩 밖에 인식하지 못합니다.

-------------------------------------------------------------------------------------
public class InputTest{
public static void main(String args []){
System.out.println("한 문자 입력 : ");
int data = System.in.read();
}
}

-------------------------------------------------------------------------------------
시스템아웃풋 만 쓰다가 이제 인풋을 해보겠습니다.
read 라는 명령어는 키보드의 키 하나만 읽어드릴수있습니다.

-------------------------------------------------------------------------------------

public class InputTest{
public static void main(String args []) throws java.io.IOException{
System.out.print("한 문자 입력 : ");
int data = System.in.read();
System.out.print("당신이 입력한 문자는 " + data + "입니다");
}
}

-------------------------------------------------------------------------------------
throws java.io.IOException 는 입력을 할때는 무조건쓴다고보셔도됩니다.
자바프로그램에서 스크립트를 검수해주는 명령입니다.
입력값에 int data를 쓴 이유가있습니다.
키보드 알파벳이 아스키코드로 10진수처리되기때문에 int로 처리한겁니다.
-------------------------------------------------------------------------------------
char data = (char)System.in.read();
-------------------------------------------------------------------------------------
이렇게  캐릭터타입으로 만들고 뒤쪽을 캐스팅해줘도됩니다.

비슷한 예로
------------------------------------------------------------------------------------
System.out.print("한 숫자 입력 : ");
int num = System.in.read();
System.out.print("당신이 입력한 숫자는 " + (char)num + "입니다");
-------------------------------------------------------------------------------------
이렇게 적어줘도 됩니다.

뒤쪽에 (char)로 캐스팅을 안해주시면 아스키코드로 출력되니 주의하세요




수고하셨습니다.




연습문제

1.if else 예제 (짝수 홀수)
를 삼항연산자 로 바꿔서 처리


2.데이터를 입력받아 그 값이
'a','b','c', 이면 정답 이라고 출력하고 그렇지않으면 오답 이라고 출력하라


3.입력받은 값이 문자 이면 문자라고 출력하고, 그외의 데이터는 기타 라고 출력한다.


4.입력받은 값이 소문자 이면 소문자 라고 출력하고, 대문자이면 대문자 라고 출력하고, 숫자 라면 숫자라고 출력하고, 그외의 데이터는 기타 라고 출력한다.


5.간단한 전자계산기 프로그램
연산자 +-*/
숫자1 : 3
숫자2 : 2
결과 3+2=5








1.
public class HW1
{
public static void main(String args[]) throws java.io.IOException
{
System.out.println("if else 예제 (짝수 홀수)를 삼항연산자 로 바꿔서 처리하시오.");
System.out.println("숫자 입력 : ");
char num = (char)System.in.read();
System.out.println(num + "은(는)" + (num % 2 == 0 ? "짝수" : "홀수") + "입니다." );
}
}



2.


public class HW2
{
public static void main(String args[]) throws java.io.IOException
{
System.out.println("데이터를 입력받아 그 값이 'a','b','c', 이면 정답 이라고 출력하고 그렇지않으면 오답 이라고 출력하라.");
System.out.println("알파벳을 입력하세요 : ");
int data = System.in.read();
if(data=='a'||data=='b'||data=='c')
System.out.print("정답");
else 
System.out.print("오답");

}
}


3.
public class HW3
{

public static void main(String args[]) throws java.io.IOException
{
System.out.println("입력받은 값이 문자 이면 문자라고 출력하고, 그외의 데이터는 기타 라고 출력해보자.");
System.out.println("문자를 입력하세요 : ");
int data = System.in.read();
//System.out.print(data);

if((data >= 65 && data <= 90)||(data >= 97 && data <= 122))
System.out.print("문자");
else 
System.out.print("기타");
}
}

4.

public class HW4
{

public static void main(String args[]) throws java.io.IOException
{   
System.out.println("입력받은 값이 소문자 이면 소문자, 대문자이면 대문자, 숫자 라면 숫자라고 출력하고, 그외의 데이터는 기타 라고 출력해보자.");
System.out.println("문자를 입력하세요 : ");
int data = System.in.read();
//System.out.print(data);

if(data >= 65 && data <= 90)
System.out.print("대문자");
else if(data >= 97 && data <= 122)
System.out.print("소문자");
else if(data >= 48 && data <= 57)
System.out.print("숫자");
else 
System.out.print("기타");
}
}

5.

public class HW5
{
public static void main(String args[]) throws java.io.IOException
{
System.out.println("x값이 3이고, y값이2 라고 할 때 x 와 y의 사칙연산을 구하여라.\n +, -, *, /, 중 선택하세요.");
char C = (char)System.in.read();
System.out.println("사칙연산 기호 : " + C );
System.out.println("해당 기호의 수식은");
switch(C)
{
case '+' :
System.out.println(" 3 + 2 = " + (3+2));break;
case '-' :
System.out.println(" 3 - 2 = " + (3-2));break;
case '*' :
System.out.println(" 3 * 2 = " + (3*2));break;
case '/' :
System.out.println(" 3 / 2 = " + (3.0/2.0));break;
default:
System.out.println("올바른 수식이 아닙니다.");
}
}
}

java 강의 2일차 - 변수 와 연산자

java 강의 2일차 - 변수 와 연산자 

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);
}
}

----------------------------------------------------------------------