이번 시간에는
연산자들에 대해서 배웠습니다.
1. 대입연산자
A = B 와 같이
=> 오른쪽에 있는 값을 왼쪽에 있는 변수에 넣는것을 의미합니다.
변수에 값을 넣을 때 사용합니다.
예제를 하나 확인해 봅시다.
//x = 10, y = 4
System.out.println("x는 %d\n", x);//?
System.out.println("y는 %d\n", y);//?
x = y;
System.out.println("x는 %d\n", x);//?
System.out.println("y는 %d\n", y);//?
위 ?안에 들어갈 값은 얼마가 될까요?
첫번째 (x, y)는 (10,4 ) 그대로 출력 될 것입니다.
하지만 x = y;라는 대입연산자를 중간에 실행하면
x에 y값인 4가들어가고
y는 4가 그대로 있을 것입니다.
따라서 (x, y)는 (4, 4)가 될 것입니다.
2. 산술연산자
사칙연산의 4가지는 산술연산자라고 불립니다.
예제를 봅시다.
ublic class OMain1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("a의 값은 : ");
int a = sc.nextInt();
System.out.println("b의 값은 : ");
int b = sc.nextInt();
System.out.printf("%d + %d ="+ (a+b)+"\n",a,b);
System.out.printf("%d - %d = "+(a-b)+"\n",a,b);
System.out.printf("%d * %d = "+(a*b)+"\n",a,b);
System.out.printf("%d / %d = "+(a/b)+"\n",a,b);
}
}
△ 코드
a의 값은 :
4
b의 값은 :
5
4 + 5 =9
4 - 5 = -1
4 * 5 = 20
4 / 5 = 0
△ 출력
다음과 같이 사칙 연산을 수행하는 것을 산술 연산자라고합니다.
나누기 값을 실수형으로 나타내려면 어떻게 해야할까요?
double형으로 형변환(type casting)을 하면 될 것입니다.
그런데 여기서
실수형 혹은 정수형이 혼합되면 어떻게 될까요?
double ./ int = double
int / double = double
double / double = double
실수형이 식에 하나라도 존재하면
실수형이 됩니다.
따라서 어떤 값을 하나라도 실수값으로 바꾸면
실수값이 결과를 출력할 것입니다.
3. 복합연산자
다음은 대입연산자와 산술연산자를 복합연산자를 알아보겠습니다.
[ +=, -= , *= , /= , %= ]
복합연산자에 해당하는 연산자입니다.
복합연산자는 식을 줄인 형태인데
다음은 각각 이것을 의미합니다.
x += 1 => x = x + 1
x -= 1 => x = x - 1
x *= 1 => x = x * 1
x /= 1 => x = x / 1
x %= 1 => x = x % 1
또한 한 번 더 줄인 연산자가 있는데
++ 와 --가 있습니다.
++ 는 x += 1 과 같고,
-- 는 x -= 1과 같습니다.
4. 논리 연산자
논리연산자의 결과는 boolean(논리형) => (true / false) 로 나오며
> (초과), >= (이상), == (같음), !=(같지 않음), < (미만), <= (이하),
&&(~이고 ~이다), || (~이거나 ~이다.), ! (결과를 뒤집음), ^(XOR, 두 입력이 서로 다를 때 참)
와 같은 연산자들이 있습니다.
예제를 보겠습니다.
int age = 30;
System.out.println(age > 10); => 나이가 10살 이상인가?
System.out.println(age < 5); => 나이가 5살 미만인가?
System.out.println(age == 20); => 나이가 20살인가?
System.out.println(age != 1); => 나이가 1살이 아닌가?
System.out.println((age % 2) == 1); => 나이가 홀수인가?
각 질문에 해당하는 답이 맞으면 true 아니면 false를 반환합니다.
따라서 이렇게 출력됩니다.
true (30살은 10살 이상)
false (5살 이상)
false (20살 아님)
true (1살 아님)
false (나이는 짝수)
다음은 다른 논리 연산자도 살펴보겠습니다.
OR연산자 ||는
0이 false고 1이 true일때
0 / 1
1 / 0
1 / 1 같이 한개이상이 참일 때 참을 반환합니다.
AND 연산자 &&는
1 / 1 즉, 둘다 참이어야 참을 반환하고,
나머지 값은 false를 반환합니다.
NOT 연산자 !는
0 => 1 / 1 = > 0 과 같이
결과를 뒤집어서 반환합니다.
예제를 보겠습니다.
System.out.println("나이가 3살이 넘고 키가 2m가 넘는가"
+ "? " + (age > 3 && height > 200));
System.out.println("키가 1.9m가 넘거나 나이가 50살 미만인가"
+ "? " + (height < 190 || age < 50));
System.out.println("나이가 10살 이상이고 40살 미만인가"
+ "? " + (age > 10 && age < 40));
System.out.println("나이가 10살 이상이던지 키가 1.5m가 넘던지"
+ "? " + (age > 10 ^ height > 150));
System.out.println("ride9를 탈 수 있는 사람은 못타고"
+ "ride9를 탈 수 없는 사람만 탈 수 있음\n"
+ (!(age > 10 ^ height > 150)));
복잡하긴한데 문제를 차근차근 읽어보면
이해할 수 있습니다.
1. 나이가 3살이 넘고 키가 2m가 넘는가?
=> 둘다 참이어야 하므로 && 연산자를 사용합니다.
2. 키가 1.9m가 넘거나 나이가 50살 미만인가?
=> 하나만 참이면 참이므로 || 연산자를 사용합니다.
3. 나이가 10살 이상이고 40살 미만인가
=> 10살 이상이고, 40살 미만이어야 하므로 &&연산자를 사용합니다.
4. 나이가 10살 이상이던지 키가 1.5m가 넘던지
=> 둘 중 하나만 참이어야 참이므로 XOR(^) 연산자를 사용합니다.
5. ride9를 탈 수 있는 사람은 못타고
+ "ride9를 탈 수 없는 사람만 탈 수 있음
=> ride9는 질문 4번을 의미하는데 질문 4번식에 !(Not) 연산자를 사용하면 됩니다.
★ 여기서 메모리를 좀 더 효율적으로 사용하려면
age > 3 && height > 200
&&연산자에서 상대적으로 확률이 낮은 조건을 앞에다 배치하는 것이 좋습니다.
왜냐하면 확률이 높은 age > 3을 앞에 배치하게 되면
뒤에 있는 조건도 비교해야 하기 떄문에
height > 200을 앞에 배치함으로써
조건 탐색을 줄일 수 있습니다.
반대로 OR연산자 ||는 확률이 높은 조건을
앞에 두는 것이 효율적일 것입니다.
다음은 위 예제의 출력된 부분을 살펴보겠습니다.
키는 151.0cm이고 나이는 50세입니다.
나이가 10살이 넘는가? true
나이가 5살이 안넘는가? false
나이가 20살인가? false
나이가 1살이 아닌가? true
나이가 홀수인가? false
===============
나이가 3살이 넘고 키가 2m가 넘는가? false
키가 1.9m가 넘거나 나이가 50살 미만인가? true
나이가 10살 이상이거나 40살 미만인가? false
나이가 10살 이상이던지 키가 1.5m가 넘던지? false
ride9를 탈 수 있는 사람은 못타고 ride9를 탈 수 없는 사람만 탈 수 있음 true
△ 출력
옳게 출력된 모습입니다.
마지막으로 == (같음) 연산자를 사용할 때는
주의할 점이 있는데
참조형인 String을 비교할 때는
== (같음) 연산자를 사용하는 것이 아닌
.equals() 라는 기능을 사용해서
문자열의 주소가 아니라 문자열 그 자체를 비교해야
같은지 비교할 수 있습니다.
이번 게시글에서는
연산자에 대해서 깊게 다뤄봤는데요.
특히 논리 연산자는 추후에 다룰
if문에서 많이 쓰이기 떄문에
충분히 익혀서 제것으로 만들어야
조건문을 수월하게 쓸 수 있을 것 같습니다.
긴 글 읽어주셔서 감사합니다!
'Java > 이론' 카테고리의 다른 글
[Java] Random 기능 (0) | 2024.11.22 |
---|---|
[Java] 삼항 연산자 (6) | 2024.11.22 |
[Java] Shift 연산자 (0) | 2024.11.22 |
[Java] 자바 개발 효율을 높이는 단축키와 출력 방법 (0) | 2024.11.21 |
[Java] 자바 자료형의 이해: 기본형과 참조형, 그리고 메모리 구조 탐구 (2) | 2024.11.20 |