연산자
뭔가... 다 아는 내용이지만? 자세히 배우니까 색다른 파트였다. 각설하고 정리부터 하면
연산자에는 총 3가지 종류가 있다.
1. 단항 연산자
2. 이항 연산자
3. 삼항 연산자
/*
* 자바 연산자
*
* 1. 단항 연산자
* 2. 이항 연산자
* 3. 삼항 연산자
*
*/
public class 연산자_단항연산자 {
public static void main(String[] args) {
/*
* 1. 증감연산사 (++, --)
* +1, -1을 하는 연산자
* 전치연산자
* int a = 10;
* ++a; a+1
* a++; a+1
* ++a; a+1
* a++; a+1
* -> a == 14
*
* 후치연산자
* int a = 10;
* a++
*
* but) 결과 값은 똑같음
*
*/
/*
//메모리에 데이터 저장
int a = 10;
// 저장된 데이터를 출력한다 - 명령
System.out.println("a="+a);
//a값을 1개 증가시켜라
++a; // 전치연산자
// 저장된 데이터를 출력
System.out.println("a="+a);
a++;// 후치 연산자 a==12
System.out.println("a="+a);
*/
int a = 10; // 저장
int b = ++a;
/*
* b = ++a // a값을 증가한 다음에 b에 대입, ++(우선 적용), =(나중 적용)
* 전치 연산자는 1을 증가시키는게 우선 연산
*
* b = a++ //a값을 b에 대입을 하고 a값을 1개 증가시킴 =(우선 적용), ++(나중 적용)
* 후치 연산자는 b에 a를 대입하는 것이 우선적으로 계산됨
*
*/
System.out.println("a="+a+", b="+b);
int c = 10;
int d = c++;
System.out.println("c="+c+" , d="+d);
/*
* int a = 10;
* int b = ++a + a++ + ++a + a++
* === === === ===
* 11 11 13 13 ==> 48
*
*
*/
// 감소 ++, -- (한 개 증가, 한 개 감소) : 반복문 등장
int i = 10;
i--; // i = 9
System.out.println("i="+i);
--i;
System.out.println("i="+i);
// 대입하기 전까지는 후치, 전치 연산자의 결과 값은 똑같음
}
}
단항 연산자는 피연산자가 1개 있는거고, 이항은 2개, 삼항은 3개가 있다.
단항 연산자에서 젤 중요한 것은
++, -- 인데 1씩 증가, 1씩 감소 시키는 연산자이다.
단순하긴 하지만, 대입할때는 전치 하는지 후치 하는지에 따라 결과값이 달라진다.
b = a++ , b = ++a
두개의 계산 결과가 달라진다
전치일때는 1을 먼저 더해준 다음에 대입을 하고, 후치일때는 대입이 이미 된 상태에서 a의 값이 1 증가한다.
그래서 후치 일때는 a의 값만 증가하고 b의 값은 그대로 이다.
/*
* 부정연산자 (단항연산자)
* 연산자 기호 : !
* 사용하는 데이터형이 boolean
* true=>false
* false=>true
*
* -> 결과값이 boolean이면 조건문에 사용됨
*/
import java.util.Scanner; // 키보드로 입력값을 받는 경우 사용
public class 연산자_부정연산자 {
public static void main(String[] args) {
//Scanner 선언
/*
* 변수선언
* 데이터형 변수명=값
* int i = 10;
* 클래스 선언
* 클래스명 변수명(객체) = new 생성자() -> 클래스명과 동일
*
*
*/
Scanner scan = new Scanner(System.in); // System.in -> 키보드값을 읽어올때
System.out.print("true/false 입력 : ");
boolean bCheck=scan.nextBoolean();
System.out.println("bCheck="+bCheck);
// 변경
System.out.println("변경후 : " + !bCheck);
}
}
또 부정 연산자라는게 있다.
표현은 '!' 이렇게 해준다. boolean 앞에 붙으면 true는 false로, false는 true로 변환해준다.
2. 이항 연산자
/*
* 비트연산자 (&, |, ^)
* ======================
* &(*) |(+) ^(비트가 다르면 1, 비트가 같으면 0)
* ======================
* 1 1 1 1 0
* ======================
* 1 0 0 1 1
* ======================
* 0 1 0 1 1
* ======================
* 0 0 0 0 0
* ======================
*
* 10 & 8
* 1010
* 1000
* =====&
* 1000 ==> 8
*
* 17 & 9
* 10001
* 01001
* ===== &
* 00001 => 1
*
* 10 | 8
* 1010
* 1000
* =====|
* 1010 ==> 10
*
* 17 | 9
* 10001
* 01001
* ===== |
* 11001 => 25
*
* 10 ^ 8
* 1010
* 1000
* =====^
* 0010 ==> 2
*
* 17 ^ 9
* 10001
* 01001
* ===== ^
* 11000 => 24
*
*
*/
public class 연산자_비트연산자 {
public static void main(String[] args) {
System.out.println(Integer.toBinaryString(10&8)); // 1000
System.out.println(Integer.toBinaryString(10 | 8)); // 1010
System.out.println(Integer.toBinaryString(10^8)); // 0010
}
}
비트연산자...
&와 |
and or 이라고 생각하면 빠르다.
근데 비트 연산이라서 아예 *, + 라고 생각하니까 이해가 더 쉬웠다.
^ 는 비트가 같으면 0, 다르면 1이다.
이해는 그렇다 치고 그냥 이걸 어디에 쓸지가 궁금하다.
*
* <<왼쪽 이동
* >>오른쪽 이동
*
* 10<<2
* ==
* 1010
* 101000 -> 앞으로 2칸 이동후, 이동한 빈자리는 00으로 채워줌 = 40
*
* 13<<3
* ==
* 1101
* 1101000 -> 앞으로 3칸 이동후, 이동한 빈자리 00으로 채워줌 = 104
*
* 7<<2 => 28
* 111
* 11100 => 16+8+4 => 28
*
* 왼쪽 이동 오른쪽 이동
* << >>
* x<<y x>>y
* x*2^y x/2^y
*
*/
public class 연산자_비트이동연산자 {
public static void main(String[] args) {
System.out.println("10<<2="+(10<<2)); //40
System.out.println("7<<2="+(7<<2)); //28
System.out.println("10>>2="+(10>>2));//2
}
}
이걸 이렇게 빨리 배우게 될 줄 몰랐다.
혼자 엑스형 명대사 프로젝트하다가 발견했던 연산자인데 혼자 공부하려고 했을때는 애를 먹었다.
근데 기본 컨셉은 이미 알고 있던 터라 수업을 들을때는 괜찮았다.
일단 <<는 왼쪽 이동후 10진법으로 변환, >>는 오른쪽으로 이동후 10진법으로 변환
근데 이걸 2진법으로 바꿨다가 이동을 해서 다시 10진법으로 계산하는건 복잡해 보였는데
더 간단한 계산법이 있었다.
왼쪽 이동 오른쪽 이동
<< >>
x<<y x>>y
x*2^y x/2^y
2의 y승으로 곱하거나 나눠주면 된다. 나눌때는 몫을 가져온다.
/*
* 산술연산자 = 이항연산자 (연산대상이 2개가 필요)
* + (덧셈), -(뺄셈), *(곱셈), /(나눗셈), %(나눈 나머지)
*
* 2) 다른 데이터형이 연산이 된 경우 (가장 큰 데이터형으로 변경후에 연산)
* int + double
* ===
* double -> double+double (연산은 항상 같은 데이터형만 연산처리가 된다) 자동형변환
* ex) 10 + 10.5 = 10.0+10.5 = 20.5
*
*
* char + int
* ===
* int로 변환 -> int + int = int
* ex)
* 'A' + 100
* ===
* 65+100=165 (자동형변환)
*
* int + long
* ===
* long
* ex) 10+100L
* ==
* 10L + 100L ==> 110L
*
* char + byte = 결과값 (int)
* short + short = int
* int 이하 데이터형 (char, byte, short)는 연산시에 결과값 int로 자동변환됨
*
*
*
*/
public class 연산자_산술연산자 {
public static void main(String[] args) {
byte b1 = 10;
byte b2 = 20;
byte b3 = (byte) (b1+b2);
/*
* byte b3 (byte)(b1+b2)
* int b3 = b1+b2
*/
int a = 10;
double d = 10.5;
// a+d 한 결과값을 출력
int res = (int) (a+d);
// a = 10.0 d=10.5 -> 10.0+10.5=20.5 (자동형변환)
System.out.println(res);
double d1 = 10.5;
double d2 = 10.5;
//int res1 = (int)(d1+d2); d1+d2=21.0 -> (int) 21.0 -> 21
int res1=(int)d1+(int)d2; // (int)d1 = 10, (int)d2=10, 10+10=20
System.out.println(res1);
//뺄셈 (-)
int x = 10;
int y =6;
int z = x-y;
System.out.println(z);
//곱셈 (*)
//역시 동일
}
}
산술연산자
하... 진짜 오래걸리네 ㅋㅋㅋㅋ
간단하다. 말그대로 진짜 산수. 근데 이제 데이터 형에 따라서 결과 값이 달라질 수 있다는 걸 명심해야한다.
큰 데이터 + 작은 데이터 끼리 연산하면 기본적으로 무조건 큰 데이터형으로 저장된다.
char + int 는 데이터 크기가 같지만 자동으로 int
char + byte
short + short
등 int 이하 데이터형은 연산시에 결과 값이 int로 자동변환된다.
/*
* 산술연산자
* /, %
* 나눗셈 (/)
* 1. 0으로 나눌 수 없음 10/0 -> error
* 2. 정수/정수 = 정수
* 5/2=2.5(x) 5/2 = 2 (소수점 이하는 다 지워버림) ==> 5/2.0 = 2.5
* double d=5/2 => 2.0
* 따라서 나눗셈 할때는 기본적으로 실수로 나누는 것이 좋음
*
* % 나누고 나머지값
* 1. 주의점 : 결과 값은 왼쪽 편의 부호를 따라간다
* 5%2 === 1 (1+4/2)
* -5%2 === -1 (-1-4/2)
* 5%-2 === 1 (1+4/2)
* -5%-2 === -1 (-1-4/-2)
*
* ==> 자동 형변환
* ==> 프로그래머가 변경 (강제 형변환)
*
*/
//최적화
//에러를 예측 (오류 방지)
public class 연산자_산술연산자2 {
public static void main(String[] args) {
int a = 10;
int b = 3;
System.out.println(a/(double)b);
a=10;
b=0;
System.out.println(a/b);
}
}
나눗셈과 나머지 연산자
나눗셈 연산자는 데이터형이 중요하다. 정수로 나눠버리면 나머지가 소숫점이 나와도 소수점 밑으로는 다 지워버리기 때문이다. 마치 Math.floor를 쓴것과 같은 효과
그래서 나눗셈을 할때는 어지간해서 실수형 데이터 타입을 써줘야 한다. 그래야 소수점 자리까지 표시가 가능하다.
%는 내가 늘 헷갈려 하던 연산자이다.
나눴을때의 몫이 아니라 나머지 값을 알려주는 연산자 이다.
5%2 면 1이 출력된다.
다만 나눠지는 수의 부호를 따라가기 때문에 그 점은 인지를 하고 있어야 한다.
복습 끄읕...
다음 시간에는 아마 삼항 연산자 진도를 나가게 될것 같다.
수업 끝나고 산책 후 바로 그날 진도 복습 포스팅을 올리는 걸 습관 들여야지
다 지나고 하려니까 좀 힘들다
'programming > Gukbi' 카테고리의 다른 글
국비 교육 5일차 - 조건문 (0) | 2020.12.31 |
---|---|
국비 교육 4일차 - 연산자, 제어문 (0) | 2020.12.28 |
국비 교육 3일차 - 형 변환 (0) | 2020.12.26 |
국비 교육 2일차 (0) | 2020.12.23 |
국비 교육 1일차 (0) | 2020.12.22 |