[ 김영한의 자바 입문 ] 섹션 3. 연산자
이 포스트는 인프런 "김영한의 자바 입문" 섹션 3 강의를 바탕으로 작성하였습니다 :)
[지금 무료] 김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음 강의 - 인프런
프로그래밍에 처음 입문하는 분들을 위한 자바 강의입니다. 코드를 따라하면서 손쉽게 자바를 배울 수 있습니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 자바 입문[사진][임베
www.inflearn.com
01. 산술 연산자
우리는 아래 코드의 '+' 와 같은 연산 기호를 '연산자'라고 칭하고,
3,4,a,b 와 같은 연산 대상을 '피연산자'라고 한다.
3 + 4
a + b
'+' 이외에도 자바에는 다양한 연산자가 있다.
* 산술 연산자 : +, -, *, /, % (나머지 연산자)
* 증감 (증가 및 감소) 연산자 : ++, --
* 비교 연산자 : ==, !=, >, <, >=, <=
* 논리 연산자 : &&(AND), || (OR), ! (NOT)
* 대입 연산자 : =, +=, -=, *=, /=, %=
* 삼항 연산자 : ? :
실무에서 자주 사용하는 연산자 위주로 나열하였는데,
우선 이중에서 "산술 연산자"에 대해 먼저 알아보겠다.
산술 연산자
산술 연산자는 주로 숫자를 계산하는 데 사용된다. 우리가 이미 잘 알고 있는 수학 연산을 수행한다.
+ (더하기), - (빼기), * (곱하기), / (나누기), % (나머지) 가 이에 해당된다.
#Operater1
package operator;
import java.util.Arrays;
public class Operator1 {
public static void main(String[] args) {
// 변수 초기화
int a=5;
int b=0;
// 덧셈
int sum=a+b;
System.out.println("a+b=" + sum); // 출력 a+b=7
// 뺄셈
int diff=a-b;
System.out.println("a-b=" + diff); // 출력 a-b=3
// 곱셈
int multi=a*b;
System.out.println("a*b=" + multi); // 출력 a*b=10
// 나눗셈
int div=a/b;
System.out.println("a/b=" + div); // 출력 a/b=2
// 나머지
int mod=a%b;
System.out.println("a%b=" + mod); // 출력 a%b=1
}
}
int div = a / b;
System.out.println("a/b=" + div);
부분에서 나눗셈 5 / 2 결과는 2.5가 되어야 하지만 결과는 소수점이 제거된 2가 나왔다.
자바에서는 같은 int 형끼리 계산하면 계산 결과도 같은 int 형을 사용하기에, 소수점 이하를 포함할 수 없다.
02. 문자열 더하기
문자열에 + 연산자를 사용하면 두 문자를 연결할 수 있다.
#Operater2
package operator;
public class Operator2 {
public static void main(String[] args) {
// 문자열과 문자열 더하기 1
String result1= "hello " + "world";
System.out.println(result1);
// 문자열과 문자열 더하기 2
String s1= "string1";
String s2= "string2";
String result2= s1+s2;
System.out.println(result2);
// 문자열과 숫자 더하기 1
String result3= "a+b=" +10; //10을 문자로 바꿔버림
System.out.println(result3);
// 문자열과 숫자 더하기 2
int num=20;
String str="a+b=";
String result4=str+num;
System.out.println(result4);
}
}
hello world
string1string2
a+b=10
a+b=20
자바는 문자열인 String 타입에 다른 타입을 더하는 경우 대상 타입을 문자열로 변경한다.
문자열에 더하는 것은 다 문자열이 된다고 이해하자.
03. 연산자 우선순위
#Operater3
package operator;
public class Operator3 {
public static void main(String[] args) {
int sum1= 1+2*3; //1+(2*3)
int sum2=(1+2)*3;
System.out.println("sum1 = " + sum1);
System.out.println("sum2 = " + sum2);
}
}
sum1 = 7
sum2 = 9
sum1은 연산자 우선순위에 의해 곱셈이 먼저 계산되어 출력 결과가 7이 나온 것을 알 수 있다.
연산자 우선순위를 변경하려면 괄호() 를 사용하면 된다.
이에 대한 예시가 sum2에 대한 내용이다.
#Operater4
package operator;
public class Operator4 {
public static void main(String[] args) {
int sum3=2*2+3*3; //(2*2)+(3*3)
int sum4=(2*2)+(3*3); //sum3 같다.
System.out.println("sum3 = " + sum3);
System.out.println("sum4 = " + sum4);
}
}
//연산자 우선순위가 애매하거나 조금이라도 복잡하다면 언제나 괄호를 칠것
연산이 복잡할 경우 sum4의 예시와 같이 괄호를 쳐서 표시하자.
명확하고 단순한 것이 유지보수 하기 더 좋다.
04. 증감 연산자
증감 연산자란
증가 및 감소 연산자를 줄여서 표현한 연산자이다.
증가 연산자는 ++
감소 연산자는 -- 로 표현하며,
이들은 변수의 값을 1만큼 증가시키거나 감소시킨다.
#OperatorAdd1
package operator;
public class OperatorAdd1 {
public static void main(String[] args) {
int a=0;
a=a+1;
System.out.println("a = " + a); //1
a=a+1;
System.out.println("a = " + a); //2
//증감 연산자
++a; //a=a+1
System.out.println("a = " + a);
++a; //a=a+1
System.out.println("a = " + a);
--a; //a=a-1
System.out.println("a = " + a);
}
}
a=1
a=2
a=3
a=4
a=3
++은 자기 자신에 1을 더하고 그 결과를 자신에게 다시 저장하며,
--는 자기 자신에 1을 빼고 그 결과를 자신에게 다시 저장한다.
++a, a++ 과 같이 증감 연산자는 피연산자 앞에 두거나 뒤에 둘 수 있으며,
연산자의 위치에 따라 연산이 수행되는 시점이 달라진다.
우리는 이러한 증감 연산자를 "전위 증감연산자" 혹은 " 후위 증감연산자"라고 부른다.
* ++a : 증감 연산자를 피연산자 앞에 두는 것을 전위 증감연산자라 한다.
* a-- : 증감 연산다를 피연산자 뒤에 두는 것을 후위 증감연산자라 한다.
#OperatorAdd2
package operator;
public class OperatorAdd2 {
public static void main(String[] args) {
// 전위 증감 연산자 사용 예
int a=1;
int b=0;
b= ++a; // a의 값을 먼저 증가시키고, 그 결과를 b에 대입
System.out.println("a = " + a+", b="+b);
// 후위 증감 연산자 사용 예
a=1; //a 값을 다시 1로 지정
b=0; //b 값을 다시 0으로 지정
b=a++; //a의 현재 값을 b에 먼저 대입하고, 그 후 a값을 증가시킴
System.out.println("a = " + a+", b="+b); // 결과:a=2, b=1
}
}
//ctrl + r? 내가 마지막에 실행버튼 눌렀던 것을 재실행하는 것
a = 2, b = 2
a = 2, b = 1
증감 연산자를 단독으로 사용하는 경우에는 다른 연산이 없기 때문에
전위이든 후위이든 둘 다 결과가 같지만, 위에 예시는 그렇지 않기 때문에 결과가 다르다.
05. 비교 연산자
비교 연산자는
두 값을 비교하는데 사용하며, 주로 조건문과 함께 사용된다.
* == : 동등성 (equal to)
* != : 불일치 (not equal to)
* > : 크다 (greater than)
* < : 작다 (less than)
* >= : 크거나 같다 (greater than or equal to)
* <= : 작거나 같다 (less than or equal to)
이러한 비교 연산자를 사용하면 참(true) 또는 거짓(false)이라는 결과가 나온다.
참 거짓은 boolean형을 사용한다.
cf) = , ==
= 는 대입 연산자이며, 변수에 값을 대입할 때 사용한다.
== 는 값이 동등한지 확인하는 비교 연산자이다.
#Comp1
package operator;
public class Comp1 {
public static void main(String[] args) {
int a=2;
int b=3;
System.out.println(a==b); // false. a는 b와 같지 않다
System.out.println(a!=b); // true. a는 b와 다르다
System.out.println(a>b); // false. a는 b보다 크지 않다
System.out.println(a<b); // true. a는 b보다 작다
System.out.println(a>=b); // false. a는 b보다 크거나 같지 않다
System.out.println(a<=b); // true. a는 b보다 작거나 같다
// 결과를 boolean 변수에 담음
boolean result = a==b; // a==b : false
System.out.println(result); // false
}
}
문자열 비교
문자열이 같은지 비교할 때는 == 이 아니라 ".equals() 메서드"를 사용해야 한다.
물론 == 를 사용해서 성공할 때도 있지만, 실패할 때도 있기에 .equals() 사용 습관을 붙이자.
#Comp2
package operator;
public class Comp2 {
public static void main(String[] args) {
String str1="문자열1";
String str2="문자열2";
boolean result1="hello".equals("hello"); //리터럴 비교
boolean result2=str1.equals("문자열1"); //문자열 변수, 리터럴 비교
boolean result3=str1.equals(str2); //문자열 변수 비교
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
}
}
//ctrl+d -> 문자열 복사
//ctrl+shift+엔터키 -> 명령어 완성. 자동 세미콜론 붙이게 해줌
//메소드? 6분대
result1=true
result2=true
result3=false
06. 논리 연산자
논리 연산자는
boolean 형인 true, false를 비교하는데 사용한다.
* && (그리고) : 두 피연산자가 모두 참이면 참을 반환, 둘중 하나라도 거짓이면 거짓을 반환
* || (또는) : 두 피연산자 중 하나라도 참이면 참을 반환, 둘다 거짓이면 거짓을 반환
* ! (부정) : 피연산자의 논리적 부정을 반환. 즉 참이면 거짓, 거짓이면 참을 반환
#Logical1
package operator;
public class Logical1 {
public static void main(String[] args) {
System.out.println("&&: AND 연산");
System.out.println(true && true); //true
System.out.println(true && false); //false
System.out.println(false && false); //false
System.out.println("||: OR 연산");
System.out.println(true || true); //true
System.out.println(true || false); //true
System.out.println(false || false); //false
System.out.println("! 연산"); //반대로 뒤집는 부정 논리 연산자
System.out.println(!true); //false
System.out.println(!false); //true
System.out.println("변수 활용");
boolean a = true;
boolean b = false;
System.out.println(a && b); //false
System.out.println(a || b); //true
System.out.println(!a); //false
System.out.println(!b); //true
}
}
#Logical2
package operator;
public class Logical2 {
public static void main(String[] args) {
int a = 15;
// a는 10보다 크고 20보다 작다
// boolean result = a>10 && a<20; //(a>10)&&(a<20)
boolean result = 10 < a && a < 20; //(a>10)&&(a<20)
System.out.println("result = " + result);
}
}
result=true
범위를 나타내는 경우에는
boolean result = 10 < a && a < 20 ; 와 같이 코드를 작성하는 것이 조금 더 읽기 좋다.
07. 대입 연산자
대입 연산자(=)는
변수에 값을 할당하는 연산자이다.
+=, -=, *=, /=, %= 와 같이 산술 연산자와 대입 연산자를 한번에 축약해서 사용할 수 있는데,
이를 '축약(대입) 연산자'라 한다.
#Assign1
package operator;
public class Assign1 {
public static void main(String[] args) {
int a = 5;
a += 3; //8 (5+3): a=a+3
a -= 2; //6 (8-2): a=a-2
a *= 4; //24 (6*4): a=a*4
a /= 3; //8 (24/3): a=a/3
a %= 5; //3 (8%5): a=a%5
System.out.println(a);
}
}
08. 문제와 풀이
문제1 - int와 평균
# OperationEx1
package operator.ex;
public class OperationEx1 {
public static void main(String[] args) {
int num1 = 10, num2 = 20, num3 = 30;
int sum = num1 + num2 + num3;
int average = (num1 + num2 + num3) / 3; // int 끼리의 나눗셈은 자동으로 소수점 이하를 버림
System.out.println("sum = " + sum);
System.out.println("average = " + average);
}
}
sum = 60
average = 20
>> average 변수 선언하는 부분에서 불필요한 과정을 sum 변수를 사용하여 최소화하기
int average = sum / 3; 으로 바꿔서 사용하기
문제2 - double과 평균
# OperationEx2
package operator.ex;
public class OperationEx2 {
public static void main(String[] args) {
double val1 = 1.5;
double val2 = 2.5;
double val3 = 3.5;
double sum = val1 + val2 + val3;
double average = sum / 3;
System.out.println(sum);
System.out.println(average);
}
}
7.5
2.5
문제3 - 합격 범위
#OperationEx3
package operator.ex;
public class OperationEx3 {
public static void main(String[] args) {
int score = 89;
boolean result = score >= 80 && score <= 100;
System.out.println("result = " + result);
}
}
result = true