본문 바로가기
Backend

05월 16일 목 | OOP 03 - JAVA의 연산자

by 구라미 2019. 5. 16.

 

4. 자바의 연산자

연산자 연습하기

 

자바의 클래스 시작 대문자로

매일 날짜에 맞춰 새로운 패키지 만들어서 파일 정리

연산자 연습하기, 연산자가 종류가 많을 수록 다양한 형태의 개발 가능(이식성이 풍부하다고 함)

언어마다 연산자도 차이점이 있음

아까 이클립스에서 한줄복사 단축키가 안되길래 방법을 찾아보았더니 이런 해결책을 찾음

https://oewoew.tistory.com/61

 

연산자의 종류는

1)산술 연산자

2)비교 연산자

3)논리 연산자

가 있다. 이러한 연산자는 우선순위가 있는데,

 산술 -> 비교 -> 논리 

최우선 연산자라는 것이 있다. 그것은 () <-괄호 이다. 괄호의 연산을 가장 먼저 처리함.

후순위 연산자라는 것도 있다. 그것은 = <- 대입연산자이다. 우변의 값을 모두 연산한 후 가장 나중에 좌변에 저장 처리함.

 

산술연산자

사칙연산과 나머지 연산자가 있다.

프로그래밍할 때 나머지 연산자가 자주 사용된다.

package oop0516;

public class Test01_Operator {

	public static void main(String[] args) {
		System.out.println();
		//연산자 연습
		System.out.println(3+5-8); //결과 0
		System.out.println(2/4*6); //결과 0
		System.out.println(1+3/5); //결과 1
		System.out.println(5%3);  //결과 나머지인 2
		System.out.println(3%5);  //결과 앞의값인 3
		
	}//main()end
}//class end

나머지 연산시 앞의 숫자가 더 클 경우는 그냥 그 값이 출력됨

 

//강사님은 선박 에이전시 홈페이지를 개발한 적 있었다. 선적 계산을 했다고 함. 프로그래머는 업무분석을 잘해야한다.

 

비교(관계)연산자

맞다,틀리다값만 가질 수 있는 연산자 boolean이다.

boolean형 (true, false) 로 결과값이 반환된다.

 

>= //크거나 같다

<= //작거나 같다

== //같다

!= //다르다

package oop0516;

public class Test01_Operator {

	public static void main(String[] args) {
		System.out.println();
		//연산자 연습
		
		System.out.println(5<3);  //결과 false 
		System.out.println(5>3);  //결과 true
		System.out.println(5>=3);  //결과 true
		System.out.println(5<=3);  //결과 false
		System.out.println(5==3);  //결과 false
		System.out.println(5!=3);  //결과 true
		
		
	}//main()end
}//class end

연습문제 1) 임의의 정수가 짝수인지 확인하시오.

짝수의 개념을 알아야한다

*짝수란? 2로 나누었을때 나머지값이 0이 되는 수.

*홀수란? 2로 나누었을때 나머지값이 1이 되는 수.

짝수는 2의 배수

스크립트는 간결하고 깔끔하게 직관적으로 짜야한다.

n의 배수는 // n으로 나누었을 때 나머지가 0인 값.

int a = 4;
System.out.println(a%2==0);	//true 짝수 판별
int b = 5;
System.out.println(b%2==1);	//true 홀수 판별

1)임의의 정수를 선언한 후 값을 대입한다.

2)%연산자를 사용하여 2로 연산한 후 == 연산자로 0과 값이 같은지 판별함.

 

연습문제 2) 해당 연도가 윤년인지 알아보시오.

연도와 한 달의 개념을 알아야한다. 윤년은 4년마다 한번 -> 4의 배수인지 물어보기

4로 나누었을 때 나머지값이 0인 연도는 평년.

문제에서 어떤것을 물어보는지 어떤 개념을 필요로 하는지 파악하기. *문제의 의도를 파악하여야 한다. 어떤 기능을 사용해야하는지

int y = 2019;
System.out.println(y%4==0);

 

연습문제 3) 임의의 문자가 'R'인지 알아보시오.

char 변수 사용해서 판별하기.

소문자 'r'은 대문자'R'과 같지 않다.

*확인하기

char ch ='r';
System.out.println(ch=='R'); //false

연습문제 4) 지폐갯수를 구하시오.

나머지와, 나누기 연산을 이용해서 계산하기.

출제자가 요구한 것이 무엇인지 잘 이해하고 문제를 풀기.

*어떤 자료형의 값을 요구하는지 잘 생각해보기.

//연습문제 4) 지폐갯수를 구하시오.
int money = 45630;
System.out.println("만원 "+ money/10000 + "장");
System.out.println("천원 "+ money%10000/1000 + "장");
System.out.println("백원 "+ money%10000%1000/100 + "장");
System.out.println("십원 "+ money%10000%1000%100/10 + "장");

/*
출력결과는 만원 4장 천원 5장 백원 6장 십원 3장
*/

int m, c, t, s;
m = money/10000; //4
money = money%10000; //money 변수에 값을 다시 넣어줄 수 있다.
c = money/1000; //5
money = money%1000;
t = money/100; //6
money = money%100;
s = money/10; //3

System.out.println("만원 "+ m + "장");
System.out.println("천원 "+ c + "장");
System.out.println("백원 "+ t + "장");
System.out.println("십원 "+ s + "장");

변수에는 새로운 값을 저장할 수 있다. 그래서 money에 새로운 값을 넣은 후 그 값으로 연산하였음.

 

논리연산자

논리연산자는 1 개 이상의 조건을 전체적으로 판단하는 것이다.

연산 결과가 Boolean형으로 반환된다.

1) AND

"그리고"

논리곱 연산자라고 한다. 기호는 &&

~~이면서 ~~하라 라는 경우에 쓰임.

주어진 조건이 모두 참일 경우, 전체조건이 참으로 해석된다.

주어진 조건 중 하나라도 거짓이면, 전체조건은 거짓으로 판별된다.

조건이 나올 때 헷갈리니까 괄호로 묶어야함.

 

연습문제 1) 임의의 정수가 2의 배수인 동시에 5의 배수인지 확인하시오.

2의 배수인지, 5의 배수인지 조건으로 물어볼 수 있다.

*10(2와 5의 최소공배수)의 배수인지 묻는 것으로 한번에 해결할 수 있긴함.

int a =5;
System.out.println((a%2==0)&&(a%5==0));
//전자  1==0 이라 false, 후자 0==0 이라 true
//전자가 false 라서, 전체 false

int b =30;
System.out.println(b%10==0); //10의 배수가 맞는지 물어볼 수도 있음.

두 항이 모두 참일 때만! 참.

 

2) OR

"또는"

논리합 연산자라고 한다. 기호는 ||

주어진 조건 중에 하나라도 참이면 전체판단은 참이 된다.

 

연습문제 2) 임의의 문자가 'R','r'인지 확인하시오.

char ch ='r';
System.out.println((ch=='R')||(ch=='r')); // 문자형변수 ch가 'R'또는 'r'이 맞나 확인. 결과는 true를 반환

전자가 'R'과 일치하지 않아 거짓이지만 후자가 'r'과 일치하였기 때문에 true를 반환하였다.

두 조건 중 하나라도 참이면 true이다.

 

3) NOT

"아님"

부정연산자라고 한다. 기호는 !

~가 아니라면,

boolean flag = false;
System.out.println(flag);
System.out.println(!flag);

 


 

연습문제 1)  1년: 365일은 ?시간 ?분 ?초 인가?

시간, 분, 초, 일 의 연산 때문에 헷갈리는 식이다.

반드시 다시한번 복습해봐야겠다.

double year = 365.2425;
int total=(int)(year*84600); //숫자가 잘못되었음
int yd,yh,ym,ys;
				
yd = total/86400;
total = total%86400;
		
yh = total/3600;
total = total%3600;
		
ym = total/60;
ys = total%60;

		
System.out.println(year);
System.out.println(yd);
System.out.println(yh);
System.out.println(ym);
System.out.println(ys);

차분하게 생각해보면서 차근차근 해보기

1년은 365일 하고 남는 시간, 남는 분, 남는 초를 구하는 문제였다.

1분   : 60초
1시간 : 60분     * 60초    = 3600초
1일   : 24시간   * 3600초  = 86400초
1년   : 365.2425 * 86400초 = 31556952초

 

1) 그러므로 가장 작은 단위인 초로, 1년이 몇 초인지를 구한 후

2) 날 = (1년의 초)/ 86400 // 하루24시간 * 3600초(1시간 = 60분)

3) 그 다음 86400로 나눠준 후의 나머지 값을 구한다

4) 그 값을 total 변수에 넣어준다.

5) 시간 = total / 3600초(시간 = 60분*60초)

6) total = total % 3600초 //total  변수에 다시 값을 넣어준다

7) 분 = total/60 //초에서 60을 나누면 분값이 나오므로

8) 초 = total%60 //나머지 초의 값을 구하기

 

*변수는 계속 새로운 값을 다시 넣어줄 수 있음을 이해하기.

코딩을 하기전에 차분하게 과정, 알고리즘에 대해 생각하기....

 

강사님 답안

double year=365.2425;
int total=(int)(year*86400);
        
int day, hour, min, sec;
     
day  =total/86400; //365
total=total%86400;
        
hour =total/3600;  //5
total=total%3600;
      
min  =total/60;
sec  =total%60;
        
System.out.println("1년: "+year);
System.out.println(day+"일");
System.out.println(hour+"시간");
System.out.println(min+"분");
System.out.println(sec+"초");    

 

연습문제 2) 국어점수가 80 ~ 89 사이인지 확인하시오.

&& 비교연산자를 사용하여 판별한다.

int kor = 85;
System.out.println(kor>=80 && kor <= 89);

결과는 둘다 참이기 때문에 true이다.

 

연습문제 3) 임의의 문자가 알파벳 대문자인지 확인하시오.

문자에 아스키코드값이 있기 때문에 문자로 크기를 비교해도 에러가 나지 않는다.

char ch = 'r';
System.out.println(ch >='A' && ch <= 'Z'); //아스키코드 때문에 성립됨.

결과는 저 범위에 없기 때문에 false이다. 

 

연습문제 4) 해당연도가 윤년인지 확인하시오.

연습하기 위한 산술적인 계산이므로 실제로 윤년을 구할 때는 권장하지 않는 방법이다.

자바에선 기본적으로 달력,시간 class를 제공됨.

윤년은 4년마다 한번 돌아오지만, 100년 마다 돌아오는 해는 평년으로, 400년으로 나눠떨어지는 해는 윤년으로 한다.

int year = 1987;
System.out.println(year%4==0 && year%100!=0 || year%400==0); 

위 와같은 조건식이 나왔다. 결과값은 1987년은 조건을 만족하지 않아 false이다.

산술적인 방법이라 윤년 구할 때 위 식을 사용하면 안된다.

 


 

 

삼항연산자

-> (조건) ? 참 : 거짓

의 형태를 가진 항이 3개인 연산자. *단항연산자 // 항이 1개, 이항연산자 // 항이 2개

조건은 boolean형으로 반환된다.

정보처리에서 signed(-)값은 음수이다. unsigned값은 양수이다. *문제를 많이 풀어봐야함

 

연습문제 1) 임의의 값이 양수, 음수인지 확인하시오.

양수, 음수, 0 인지 확인해보아야 한다.

//이런 것이 삼항연산자
int b=13;
String result = (b>0) ? "양수":"음수";
System.out.println(result); //양수
	
//음수를 먼저 묻는 경우
result = (b<0) ? "음수" : "양수";
System.out.println(b + ":" + result); //13은 양수

연습해서 손에 익게 하기. 

 

연습문제 2) 임의의 값이 짝수, 홀수인지 확인하시오.

2로 나누어 떨어지는지 1이 남는지 확인해보아야 한다. 

조건에 해당하는 결과가 첫번째에,

int a = 46;
String result = (a%2==0) ? "짝수" : "홀수";
System.out.println(a + ":"+ result); //결과 46:짝수
		
a=45;
result = (a%2==1) ? "홀수" : "짝수";
System.out.println(a + ":"+ result); //결과 45:홀수

연습문제 3) 절대값을 구하시오.

절대값의 정의를 알아야한다. 절대값이란 0으로부터 떨어진 거리이다. 예를 들면 3과 -3 모두 절대값이 3이다.

양수로 나오게.

int a=-3;

int a = -3;
		
String result = (a%3==0) ? "절대값이 3이다." : "절대값이 3이 아니다";
System.out.println(result); //절대값이 3이다.

강사님 답안

int a=-3;
int abs=(a<0) ? -a : a;
		// -3<0  -1*-3
System.out.println(a+"절대값: "+abs); -3절대값: 3

 

연습문제 4) 윤년, 평년을 출력하시오.

확실히 안다면 굳이 다시 치치않고 복사해도 된다. 편집 능력도 중요하다.

int y =2019;

int y = 2019;
String result1 = (y%4==0) ? "윤년" : "평년";
System.out.println(result1);

강사님 답안

int y = 2019;
String result1 = (y%4==0 && y%100!=0 ||y%400==0) ? "윤년" : "평년";
System.out.println(y+"년:"+result1);

 

연습문제 5) 세개의 수중에서 최대값을 구하시오.

int p=5, q=7, r=9;

int p=5, q=7, r=9;

String result2 = (p>q && p>r && q>r) ? "최대값이다" : "최대값이 아니다";
String result3 = (r>q) ? "최대값이다" : "최대값이 아니다";
System.out.println(result2);
System.out.println(result3);

강사님 답안

int p=5, q=7, r=9;
int max = (p<q) ? q : p;		
max = (r<max) ? max:r; //변수는 재활용 가능하다.
System.out.println(p + "," + q+","+ r+"," +"중 큰값:"+ max); //은 r값인 9	

int 변수로 삼항연산자를 만들수 있는 지 몰랐고, ()안에 여러 조건을 넣을 수 있는 지 몰랐음.

결과값을 String이 아닌 int로 되게 할 수도 있다.

음의 정수일때도 맞는 값인지 확인해보기.

 

연습문제 6) 대소문자를 서로 바꿔서 출력하시오.

char ch ='r' -> 'R'

char ch ='R' -> 'r'

대문자인지 소문자인지 판별한 후 바꿔서 출력함.

내가 만든 코드에서는 저 부분이 누락되었다.

char ch ='r', cc = 'R';
System.out.println((char)(ch-32)); //R
System.out.println((char)(cc+32)); //r

강사님 답안

char ch ='r';
char alpha=(ch >='A' && ch <= 'Z') ? (char)(ch+32) : (char)(ch-32);
System.out.println(ch+":"+alpha); //R이 출력되었다.

 

대입연산자

다음주까지 배열을 마무리하고, 클래스 문법 시작

값을 대입해주는 연산자.

int a= 3;
a = a+2; //변수는 값을 다시 대입할 수 있다.
System.out.println(a); //5
		
a += 2; //a = a+2 a를 선언한 후 2를 더해준 것을 바로 변수에 다시 넣어주는 것.
System.out.println(a);//7

a = a-3;
System.out.println(a); //4

a-=2;
System.out.println(a); //2
		
a *= 20;
System.out.println(a); //40
	
a /= 2;
System.out.println(a); //20
		
a %= 2;
System.out.println(a); //0

변수는 계속 다시 값을 대입할 수 있다. a = a+2 를 a +=2 로 쓸 수 있음

마찬가지로 a = a-2를 a-=2로 쓸 수 있음.

 

증감연산자

1증감연산자는 계산식, 대입연산자와 함께 사용되는 경우 주의해야한다!!

 

1) 증가연산자

증가시켜주는 연산자

// 증가연산자
int a=3;
a = a+1;
a+=1;
System.out.println(a); //5
		
a++; //1씩 증가하는 연산자
System.out.println(a); //6
		
++a; //1씩 증가하는 연산자
System.out.println(a); //7

++ 하면 1씩 증가하게 된다.

 

2) 감소연산자

감소시켜주는 연산자 

int a=3;
a = a-1;
a-=1;		
a--; //1씩 감소하는 연산자
System.out.println(a); //0

--a; //1씩 감소하는 연산자
System.out.println(a); //-1

--하면 1씩 감소하게된다. **와 //는 없다 **는 파이썬에는 있고, //는 주석표현이다.

 

3) 주의해야하는 경우

1증감연산자는 계산식, 대입연산자와 함께 사용되는 경우 주의해야한다!!

int a =10, b=20;
int c = a++; //나중에 a변수값이 증가하는 후증가연산자이므로
			 //int c = a 를 수행후 a=a+1 연산
int d = --b; //먼저 b변수값을 감소시키는 선감소연산자이므로
			 //b=b-1 를 수행후 int d=b 연산
		
System.out.println(a); //11
System.out.println(b); //19
System.out.println(c); //10
System.out.println(d); //19

++a //선증가

a++ //후증가

1증감이 이루어지는 때에 따라 결과값이 달라지기 때문에 반드시 꼼꼼히 살펴봐야 한다.

 

형변환

패키지는 한번만 선언하고 또 해야할 경우 import를 사용한다.

형변환은 

1)자동형변환

 byte < short < int < long 

 float < double 

정수형이 실수형을 따라간다.

작은 집이 큰 집 들어가는 것은 가능하지만 반대는 X

byte a = 3;
int b = a;
System.out.println(a);
System.out.println(b); 
// byte a가 int b 에 들어갔다.

long c = 5;
int d = c; // long이 더 큰 범위기 때문에 오류가 생김	

float e =1.2f;
double w = e; //자동형변환 //e=w; 에러

double g = 3; //자동형변환
System.out.println(g); //3.0 실수화된다.

 

2)강제형변환 (cast 연산) * 더 자주 쓰임

필요시 강제로 일시적으로 변환하는 것이다.

  (자료형)값  

int와 double을 강제형변환 해보았다.

System.out.println(3.5); //따로 정의를 안했을 시 java는 double이라고 생각한다.
System.out.println(5); //따로 정의를 안했을 시 java는 int라고 생각한다.
System.out.println((int)3.5); //
System.out.println((double)4); //
System.out.println((int)2.6+(int)5.7); //각각 정수값으로 만든 후 연산
System.out.println((int)(2.6+5.7)); //연산후 정수값으로 변환

int형와 chag형을 강제형변환 해보았다.

//int형과 char형과의 형변환
System.out.println(65);
System.out.println((char)65); //'A'

정수 65가 char형변환 하였을 때 A를 출력한다.

반대로 A를 int형변환 하였을 때 65를 출력한다.

왜 이런 현상이 발생할까?  ASCII 코드, ASCII 문자이기 때문이다. 

System.out.println((int)'+'); //'43'
System.out.println((int)' '); //'32'
System.out.println((int)'\r'); //'13'

공백과 엔터도 ASCII 코드값이 있음

문자,방향키와 같이 노출되는 키와 ESC와 NumLock같이 보여지지 않는 키

키보드의 모든 자판은 다 ASCII 코드값이 있다.

https://ko.wikipedia.org/wiki/ASCII

참고1) 위키피디아 ASCII 항목

 

System.out.println('A'-'a'); //-32
System.out.println("#" + (char)('b'-'B') + "#"); //# #

그렇기 때문에 위와 같은 것도 성립한다.

'A'와 'a' ASCII코드값이 32 차이가 난다. 

두번째 라인은 32의 값인 공백이 출력된다.

 

int a=3, b=5;
char op='+';
	
//3+5=8 을 출력해보자.
System.out.println(a + op + b + "=" + (a+b)); //51=8 이라는 이상한 값이 나옴 왜일까?
				// 3 + '+' + 5 + "=" + 8 이 왜 아닐까? 
				// '+'이 43으로 인식되어서, 3+43+5와 같은 값이 됨.  

어떤 자료형인지 확인하고 주의해야한다. ASCII 코드값이 나올 수 있기 때문에

공백은 아무것도 안보이지만 공백 문자열이다.

 


오늘의 과제

증감연산자 살펴보기

증감연산자의 연산이 어떻게 이루어지는지 살펴보기. 

int x=2,y=6;
int z= ++x * y--;
		
System.out.println(x); //3
System.out.println(y); //5
System.out.println(z); //18

결과값을 확인하고 분석해보기.

 

*이해하기 쉽게 코딩하기.

++x 는 전증가 이다 때문에

x=x+1

int z = x*y;

그 다음에 모든 걸 처리한 후,

후증가인 y=y-1;

그래서 z 값은 18이 나온다.

 

 

 

댓글