본문 바로가기
국비수업

[국비 Java 4일차] 연산자

by 박다비 2022. 10. 21.

아직 4일차 밖에 안됐지만 강사님 덕분에 둔둔하다

글고 담주에 깃허브도 알려주신다고해따...

글고 오늘 오늘 집으로갈때  버스를 타고 왔는데 전철과 도착하는 시간은 비슷하지만

환승구역에서 버스선택의 폭이 좁아져서 더 늦게 도착해따..

하지만 버스에서 오는 한시간 동안 정말 개 꿀 잠을 잤기에 만족...

하지만 전철로 오는것보다 천원 더 비싸고 더 늦게 도착하기 때문에 꿀잠자고싶을때 이용하도록해야겠다

 

 

오늘 배운거

 

연산자

-논리 부정 연산자 

-증감연산자 

-산술연산자 

-비교연산자

-논리연산자 

 

 

복습들어갑니다

 

일단 몰랐던거 아무도 안알려주는 꿀팁들

왜 이클립스에서 src 폴더에 소스파일을 넣냐?

이클립에서 소스파일은 어디다가 생성하냐? 할때 src안에 패키지 만들어서 클래스파일 생성하는거임

소스폴더라고해서 src였던거임. 소스파일은 이 안에 담으라는 뜻

 

이클립스파일 압축해서 zip 파일로 Import / Export 하는방법

이건 첫날인가 이튿날 알려줬는데 까먹고 안썼다

Export - 내보낼 java project 선택 - Browser버튼으로 위치랑 저장할 파일이름 정하기 - Finish

 

(압축파일그대로 가져오기 Import)

Import - Existing Projects into Workspace - 선택하고 finish

(압축파일이 import 안될때 )

대부분 같은 폴더명의 파일이 이미 안에 있는거임..이미 있는 파일을 delete하거나 이름바꾸기

압출은 밖에서 풀고 그 폴더 Navigator 창으로 드래그하기

 

 

import한 파일이 깨질때

Windows - enco 검색 - 뜨는 모든거 utf-8 로 변경해주기, 그리고 spel 쳐서 뜨는것도 utf 8 로 변경 

원래 이클립스 처음 시작할 때 해줘야하는거임 

이미 깨져버린 파일은 되돌릴 수 없나봄...? 

이클립스 다시 깔고 설정제대로하고 import 하면 왠지 될 것 같기도

 

이클립스파일 완전삭제하기

삭제할파일 딜리트하고 체크박스 있는거 체크하고 삭제하기 

 

 

1. 논리 부정 연산자  LogicalNegation

- 단항연산자이다

- 논리값을 반대로 바꾸는 역할을한다

- 표현식 : !(논리값)

-결과값도 논리값이다 

boolean b1 = true; //(논리값타입 b1 변수가 true 값임)
sysout ("b1의 부정 : " + !b1); // true값 나옴

이런식으로도 표현가능

boolean b2 = !(2>1);  // (2>1) -> true -> !(true) -> false
System.out.println("b2 : " +b2) // false 나옴

 

 

 

2. 증감연산자 Increase Decrease (중요도 ***********)

- 단항연산자임

 

표현법 : ++변수, 변수++   / --변수 , 변수--

ex) ++num; , num++;   /  --num; , num--;

++ : 변수의 담긴 값을 1 증가시켜주는 연산자

-- : 변수에 담긴 값을 1 감소시켜주는 연산자

 

증감연산자에는 전위연산 / 후위연산이 있음

 

전위연산 (++num;  /   --num;) - 증감연산자(++,--부호)가 변수 앞에 있는 경우

-> 먼저 증감 하고 나서 그 다음에 처리(출력이든 대입이든)가 진행된다

선증감 후처리

 

후위연산(num--;  / num--; ) - 증감연산자(++,--부호)가 변수 뒤에 있는 경우

-> 먼저 처리(출력이든 대입이든)를 진행 하고 나서  증감을 나중에 한다

선처리 후증감

 

이론이나 말로만으로는 이해하기 어려움, 실습으로 이해를 해야한다.

전위연산자 실습

int num1 = 10;
System.out.println(num1); //`10출력
System.out.println(++num1); // 11출력
System.out.println(++num1); //12출력
System.out.println(num1); //12 출력


int num2 = 10;
System.out.println(num2); //`10출력
System.out.println(--num2); // 9출력
System.out.println(--num1); //8출력
System.out.println(num1); //8 출력

여기 까진 전혀 어렵지않음 

문제는 후위연산

후위연산자실습

int num1 = 10;
System.out.println(num1); //10출력
System.out.println(num1++); //10 출력
//먼저 변수의값을 출력을 하고나서 증가를해서 현재 num2의 실제값은  11
System.out.println(num1++); //11출력
//실제값 11을 출력하고나서 증가를해서 현재 num2의 실제값은 12
System.out.println(num1); //12출력 -> 실제값(현재변수의실제값,현재값) 출력



int num2 = 10;
System.out.println(num2); //10출력
System.out.println(num2--); //10 출력
//먼저 변수의값을 출력을 하고나서 가감을해서 현재 num2의 실제값은 9
System.out.println(num2--); //9출력
//실제값 9을 출력하고나서 가감을해서 현재 num2의 실제값은 8

System.out.println(num2); //8출력 -> 실제값(현재변수의실제값,현재값) 출력

전위연산보다 후위연산을 더 많이 사용한다고한다

후위연산은 약간....옆사람이 알려줬는데

만나이를 생각하는것도 좋은것 같다.

내 출력되는 나이는 10이지만 내 실제나이는 9...

 

변수에대입을 하는걸로 해서 실습을 해보겠음 

전위연산
int num1 = 2;
int result1 = ++num1 *3;  //num1을 하나 증가시키고 그다음에 연산해서 대입(선증감후처리)
//num1이 하나 증가되서 3 , 3*3해서 그 값이 result1에 저장
System.out.println(num1 , result1); // 3, 9


int a = 10;
int b = a++;
sysout(a,b) // a=11, b=11


후위연산
int num2 = 2;
int result2 = num2++ *3;  // 
//num2값은 아직 그대로인채  2*3 하고 그 값이 result2에 대입되고나서 마지막에 num1이 증가됨(선처리후증감)
System.out.println(num2 , result1); // 3, 6
//result2에 값이 대입처리되고 나서 증가가 이루어저 num2값이 하나 올라가서 실제값 3이나오는게 맞음.
//result2 값은 증가가되기전 2값으로 연산되어 6 나오는게 맞음

int c = 10;
int d = c++;
sysout(c,d) // c=11, d=10

 

결론 후위연산자는  출력값과 실제값은 다를 수 있다

도대체 이런걸 어따쓰냐~ 하면 조회수같은거 누적해서 올라갈때 같은 상황에서 쓰인다고함

 

3. 산술연산자 Arithmetic 

- 이항 연산자임 (값이 2개 이상)

+ - * / %  (5개)

 

산술연산 우선순위? ***

() * / % > + -     

=>각종 연산자들이 같은 라인에 있을경우 왼쪽에서 오른쪽 순서대로 먼저 연산을 진행해야함

우선순위 : 괄호 - 곱하기 나누기 - 퍼센트 - 덧셈뺄셈 

 

산술연산을 할 때 주의할 점?

int num1 = 10;

int num2 = 3;

sysout ("num1 + num2=" +num1 + num2);

의 출력값은?

 

-> num1과 num2를 더한 값을 출력하고 싶었는데 출력값은 103

why? 같은 라인에 연산자가 같이 있을 때는 앞에 순서대로 처리가되기 때문에 +num1 까지 먼저 처리되어 문자열로 처리가 된다. 그 다음에 +num2가 처리되고 이 역시 문자열로 출력

결론!!! 연산을 할땐 가독성과 정확한 결과를 위해 

괄호로 값을 묶어주고 쓰도록하자

sysout("num1 + num2 = " + (num1 + num2));  //13출력

 

산술연산자는 별로 어렵지않은데 여기서 젤 중요한건 % 퍼센트연산자임

%연산자는 나눗셈을 하고나서 나머지 값을 구해줌 

int num1 = 10; 
int num2 = 3;

System.out.println( (num1 % num2)); // 1 (10과3을 나누기했을때 나머지값)
		//% 퍼센트연산자가 나머지를 구하는 연산자 
		//나머지를 어따씀??????
		
		//값 % 2 == 0 (2로 나눴을 떄 나머지가 0)---->짝수
		//값 % 2 == 1 (2로 나눴을 떄 나머지가 0)---->홀수 
		// 짝수, 홀수를 구할 때 자주자주자주 씀 
		
		//값 %5 ==0 (5로 나눈 나머지가 0) ----> 5의 배수란 소리 
		//배수를 구할 때 퍼센트 연산자를 쓴다~
		//값 %3 ==0 (3으로 나눈 나머지가 0)---> 3의 배수란 소리

//% 퍼센트연산자가 나머지를 구하는 연산자 
//나머지를 어따씀??????

//값 % 2 == 0 (2로 나눴을 떄 나머지가 0)---->짝수

//값 % 2 == 1 (2로 나눴을 떄 나머지가 0)---->홀수 

or  !(값%2==0) //값을 2로 나눴을때 0이 아니라면? 으로도 표현할수있겠음 (논리부정연산)


// 짝수, 홀수를 구할 때 자주자주자주 씀 

 

ex) 4 %2 == 0

4를 2로 나눴을 때 딱 떨어지니까 나머지값은 0임 -> 

4 / 6/ 8/ 10 등 짝수 수가 들어오면 나머지는 0이니 출력되는 값은 짝수란 소리

값 부분에 사용자의 입력값이 들어온다면 사용자가 입력한 숫자가 짝수인지 아닌지 알려줄수있음


//값 %5 ==0 (5로 나눈 나머지가 0) ----> 5의 배수란 소리 
//배수를 구할 때 퍼센트 연산자를 쓴다~
//값 %3 ==0 (3으로 나눈 나머지가 0)---> 3의 배수란 소리
e

 

 

 

 

정리하자면 %연산자는 나머지값을 구해주는 연산자인데

활용은 짝수와 홀수 및 배수를 구할 때 사용한다~'

 

 

 

이걸 하고 나서 아주 퀄리티높은 증감연산자와 우선연산자순위를 이용한 쪽지시험을 봤는데

a~i 까지 총 9개의 변수를 각각 다양한 증감연산자를 이용해서 누적?해서 값이  나오고  마지막 변수에 각종 산술연산자와 8개와 변수가 혼합되어 값을 출력해내는거였다. 증감연산자의 테스트와 우선순위 연산 순서를 테스트할수있는 문제였다.  나는 9개 중 마지막 우선순위연산계산하는 값을 틀렸는데 산술연산자 우선순위가 이래서 중요한거구만...완전 깨달았다!

우리반에서 만점자는...한...6~8명 나왔던거같다..자세히 못봄. 원래 반에 한두명나오는거라는데 우리반이 똑똑하다고한다. 천재들아니여?  

 

 

 

 

4.비교연산자  Comparison

- 이항연산자임 (두개의항을 비교)

- 두 값을 비교해서 만족(맞으면)하면 true(참), 만족하지않으면 false(거짓)을 반환한다

(즉 두개 값을 비교하면 출력해 내는 값이 true, 아니면 false 라는소리, 결과가 저 두개 밖에 안나온다는 소리)

- 대소비교 연산자  :  <    >     <=     >=

- 동등비교 연산자 : ==(같다)   !== (같지않다)    

 

주의** 값이 서로 같냐고 물어볼때 = 가 아닌 == 다. java에서 = 는 대입연산자로 쓰인다

 

ex)

int a =10; 

int b =20;

sysout(a==b);  //a랑 b랑 같냐? 

sysout(a>b); //a가 b보다 크냐?

sysout(a<=b);  //a가 b보다 작거냐 같냐?

boolean result = (a<b);  //a가 b보다 작냐? 그 결과값을 result 변수에 저장

sysout(result);

 

각 출력값은?

false  false  true  true (한줄씩 줄바꿈하고 출력되는건데 걍 합쳐놓음)

 

실습

public void method(){

// 사용자가에게 값 2개를 입력받아 1값이 2보다 큰지, 짝수가 맞는지 출력하는 메소드
// 둘쨋날 배운 Scanenr 클래스 복습 겸 비교연산자, 짝수값 구하는 거 복습

Scanner sc = new Scanner(System.in);  //java.util 임포트


System.out.println("첫번째정수: ");
int num1 = sc.nextInt();

System.out.println("두번째정수: ");
int num2 = sc. nextInt();

sysout("첫번째가 두번째보다 크니? " + (num1>num2)); 
sysout("첫번째 값이 짝수니? "  +(num1 %2==0));

//뽀나스 
sysout( num2 <'A'); 
//어제배운 아스키 코드, char 와 int는 서로 형변환없이 와리가리가능
// A는 아스키코드로 65이다.
// ( num2 <'A');   두번째 입력한 값이 65보다 작니?
}

//어제배운 아스키 코드, char 와 int는 서로 형변환없이 와리가리가능
// A는 아스키코드로 65이다.
// ( num2 <'A');   두번째 입력한 값이 65보다 작니?

 

 

 

5. 논리연산자 Logical

- 이항연산자 (값이두개, 항이 두개 필요하단소리)

-  논리연산자로는 두가지가 있음

&&(엔드엔드 ANDAND)            /              || (오아오아 OROR)

- 두개의 논리값을 연산해주는 연산자이다

-결과값도 논리값(boolean, true 혹은 false 둘중에 하나)

 

 

&& (ANDAND 엔드엔드) - 

표현식 :   논리값 && 논리값 
 * -> 왼쪽값과 오른쪽값 둘다 true일 경우 결과값은 true이다  

둘 다 만족해야 true

(AND == ~이고, 그리고,~이면서)

int num = 65;
boolean result = (num >= 1 ) && (num <= 100);
// num값이 1이상 "이고" "그리고 " 100이하   -> true 값 출력

**&& 연산자를 기준으로 앞의 결과가 false일 경우 뒤의 조건은 굳이 실행하지 않는다!! **

 

|| (OROR 오아오아) 

표현식 논리값 || 논리값 
 * -> 왼쪽값과 오른쪽값 둘중에 ""하나라도 true""""일 경우 결과값은 true

둘중 하나만 만족해도 true

(OR == 또는,~이거나)

 

**|| 연산자 기준으로 앞의 결과가 true 일경우 뒤의 조건은 굳이 실행하지앟는다!! **

입력한 값이 y 또는 Y일때 

boolean result = (ch == 'y') || (ch == 'Y');

둘중에 하나만 입력해도 true(참) 값 저장

 

 

 

//사용자가 입력한 정수값이 1~100사이 값이 맞는지? 실습 

 

Scanner sc = new Scanner(System.in);
System.out.print("정수하나입력 :");
int num = sc.nextInt();


// boolean result =  (1<= num <=100);//이케표현불가
boolean result = (num >=1 ) && ( num <=100);

System.out.println("사용자가 입력한 값이 1이상 100이하 입니까? " +result); 

//출력 => 사용자가 입력한 값이 1이상 100이하 입니까?  true

Scanner sc = new Scanner(System.in);

System.out.print("정수하나입력 :");

int num = sc.nextInt();

// boolean result =  (1<= num <=100);//이케표현불가

boolean result = (num >=1 ) && ( num <=100);

System.out.println("사용자가 입력한 값이 1이상 100이하 입니까? " +result); 

출력 => 사용자가 입력한 값이 1이상 100이하 입니까?  true

 

-num값이 1 과 같거나 이상 num값이 100이랑 같거나 작을경우 true 값 반환 

=> 둘다 만족해야 ture 반환 

&& -> ~이고~ , 그리고~ , ~하면서 (이런 문장 나오면 &&)

두 개의 조건 모두가 true 여야 && 연산의 결과값이 최종적으로 true
/둘 중에 하나라도 false가 있을 경우 && 연산의 결과값은 false다 

 

 

// oror 실습

// 사용자에게 성별을 입력받은 후 여자인지 확인해보기

 

 

Scanner sc = new Scanner(System.in);
System.out.print("성별을 입력해주세요 (M/F) : ";
int num = sc.nextInt();

boolean result = (gender=='F')||(gender =='f');
System.out.println("사용자가 여자입니까? "+result);

 

boolean result = (gender=='F')||(gender =='f');
//둘 중 하나라도 만족하면 true 
// || 의미: ~이거나, ~또는

 

아니...근데 이런 예제들 선생님이 만든건데 이케 다 써도 됨...?

그냥 노션에 정리해야하나