-
Java - 연산자Java/java study 2021. 12. 19. 19:33반응형
- 산술 연산자
- 비트 연산자
- 관계 연산자
- 논리 연산자
- instanceof
- assignment(=) operator
- 화살표(->) 연산자
- 3항 연산자
- 연산자 우선 순위
- (optional) Java 13. switch 연산자
- hashCode의 의미는 무엇인가요?
- 자바 equals와 ==의 차이는 무엇인가요?
산술 연산자
종류
연산자 연산 결과 + 덧셈 A + B - 뺄셈 A - B * 곱셈 A * B / 나눗셈 A / B % 나머지 A % B 특징
- 피연산자들의 타입이 동일하지 않는 경우, 자동 타입 변환을 하여 피연산자들의 타입을 일치 시킨 후 연산을 수행한다.
- 연산시 데이터가 손실되지 않는 타입으로 자동 타입 변환을 시행한다.
연산 예제 1
public class Main { public static void main(String[] args) { int A = 32; int B = 10; System.out.printf("%d + %d = %d \n", A, B, A+B); System.out.printf("%d - %d = %d \n", A, B, A-B); System.out.printf("%d / %d = %d \n", A, B, A/B); System.out.printf("%d %% %d = %d \n", A, B, A%B); } }
결과
연산 예제 2 (자동 형변환)
public class Main { public static void main(String[] args) { int A = 32; double B = 10.1; char c = 'a'; String str = "10"; System.out.printf("%d + %f = %f \n", A, B, A+B); System.out.printf("%d + %c = %d \n", A, c, A+c); System.out.printf("%d + %s = %s \n", A, str, A+B); } }
결과
비트 연산자와 논리연산자
구분 연산자 연삭식 설명 AND 비트 - &
논리 - &&A & B 같은 자리의 비트가 모두 1일 경우 결과 값 1 OR 비트 - |
논리 - ||A | B 같은 자리의 비트중 둘중 1개가 1일 경우 결과 값 1 XOR ^ A^B 같은 자리의 비트가 1개는 1이고 1개는 0일때 결과 값 1 NOT ~ ~A A의 보수 연산 예제
public class Main { public static void main(String[] args) { int a = 10; // 1010 int b = 7; // 0111 System.out.println(a&b); System.out.println(a|b); System.out.println(a^b); System.out.println(~a); } }
결과
더보기더보기더보기a 1010 1010 1010 1010
b &0111 |0111 ^0111 ~
---------------------------------------------------
0010 1111 1101 0101
---------------------------------------------------
값 2 15 13 -11
~a가 -11인 이유
~a를 하게 되면 부호비트가 음수(1) 가 된다.
그러므로 음수값을 구할려면 보수+1을 해줘야 한다
0101
--------------
보수 1010
+ 0001
--------------
1011
--------------
값(음수) 11
관계 연산자
연산을 만족하면 boolean 값인 true가 나오고, 만족하지 않으면 false가 나온다.
연산 기능 a < b a가 b보다 작은가? a > b a가 b보다 큰가? a <= b a가 b보다 작거나 같은가? a >= b a가 b보다 크거나 같은가? a == b a와 b가 같은가? a != b a와 b가 같지 않은가? 연산 예제
public class Main { public static void main(String[] args) { int a = 10; // 1010 int b = 7; // 0111 System.out.println(a < b); //false System.out.println(a > b); //true System.out.println(a <= b); //false System.out.println(a >= b); //true System.out.println(a == b); //false System.out.println(a != b); //true } }
결과
- instanceof
instanceof
- 객체가 특정 클래스 / 인터페이스 유형인지 확인한다.
- 반환 값은 boolean 타입이며, 주로 참조변수 형변환이 가능한지 확인할 때 쓰인다.
- 조상과 객체 클래스만 true값을 리턴한다.
예제
class Person{} class Student extends Person{} class Researcher extends Person{} class Professor extends Researcher{} public class Main { public static void main(String[] args) { Person p = new Professor(); if(p instanceof Person) System.out.println("참조변수 p는 Person의 자손"); if(p instanceof Researcher) System.out.println("참조변수 p는 Researcher의 자손"); if(p instanceof Professor) System.out.println("참조변수 p는 Professor 클래스"); //p instanceof Student 는 false값 반환하므로 출력이 안된다. if(p instanceof Student) System.out.println("참조변수 p와 Student는 관계가 없다"); } }
assignment(=) operator 할당 연산자
화살표(->) 연산자 : 람다식
람다식 이란?
- 이름을 가질 필요가 없는 익명 함수이다.
- 규칙에 맞게 함수를 간단하게 표현하는 방법이다.
- 멀티스레드를 이용하여 병렬처리를 사용 할 수 있다.
- 불필요한 코드를 줄이고, 가독성을 높일 수 있다.
- 람다식 내에서 사용되는 지역변수는 final이 붙지 않아도 상수로 간주된다.
- 람다식으로 선언된 변수명은 다른 변수명과 중복될 수 없다.
- 함수를 만드는 과정없이 한번에 처리할 수 있어 생산성이 높아진다.
람다식은 나중에 모던 자바 인 색션 책을 공부할 때 내용을 추가하겠다. 후에 람다식을 많이 쓴다는데
그때 제대로 공부할 생각이다.
3항 연산자
- (조건문) ? (조건문이 참일때 실행) : (조건문이 거짓일때 실행)
- 간단한 if 조건문을 3항 연산자로 쓸 수 있다.
- 여러개의 if 조건문도 3항 연산자를 중복 사용하여 표현 할 수 있다.
요세 백준 알고리즘을 푸는데 썼던 예시를 가져오겠다.
if(score>=90) System.out.println("A"); else if(score>=80) System.out.println("B"); else if(score>=70) System.out.println("C"); else if(score>=60) System.out.println("D"); else System.out.println("F");
System.out.println( (Score>=90)? "A": (Score>=80)? "B": (Score>=60)? "D": "F");
다음과 같이 3항 연산자를 3번 중복작성하여 더 쉽게 작성하였다.
연산자 우선 순위
연산자 우선 순위는 자바 프로그래밍하다 보면 저절로 익혀지니 굳이 꼭 외울려고 하지 말자.
아직 우선 순위가 잘 안잡히면 괄호 연산자를 사용하면 된다.
(optional) Java 13. switch 연산자
- 20년 3월에 Java 14부터 개선된 switch 문을 지원한다.
- 기존 switch문의 불편한 점을 개선
- case 라벨, 다중 case 라벨, switch 연산식, yield 예약어 등의 기능 추가
enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } public class Main { public static void main(String[] args) { Day day = Day.TUESDAY; int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; }; System.out.println(numLetters); //7 출력 } }
yield 예약어 사용시
enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } public class Main { public static void main(String[] args) { Day day = Day.TUESDAY; int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY: yield 6; case TUESDAY: yield 7; case THURSDAY, SATURDAY: yield 8; case WEDNESDAY: yield 9; }; System.out.println(numLetters); //7 출력 } }
hashCode와 equals, ==
hashCode 란?
객체를 식별하는 하나의 정수값을 말한다. 즉, 객체의 메모리 번지를 이용해서
hashCode를 만들기 때문에 같은 클래스라도 객체 마다 다른 값을 가지고 있다.
다음 예시를 보자
class Person{ String name; public Person(String name) { this.name = name; } } public class Main { public static void main(String[] args) { Person p1 = new Person("JO"); Person p2 = new Person("JO"); Person p3 = p1; System.out.println(p1.equals(p2)); //false 출력 System.out.println(p1.equals(p3)); //true 출력 } }
위 코드를 보면 Person 클래스 객체 p1, p2, p3를 생성하였다. p1, p2 는 new 연산자를 통해 객체를 생성 했기때문에 각기 다른 hashCode값을 가지게 된다.
그러나 p3는 대입 연산자를 통해 p1값을 대입하였다. 즉 새로 객체를 생성하지않고 원래 있던 객체를 대입 연산자를 통해 데이터를 대입해 줬으므로 같은 메모리 주소를 참조하게 된다. 따라서 p1, p3는 같은 메모리 주소를 참조하기 때문에 같은 hashCode값을 갖게 된다.
equals와 ==
equals 메소드는 객체의 내용(데이터)을 비교한다.
== 은 대상의 주소값을 비교한다
간단한 예시를 보자.
public class Main { public static void main(String[] args) { String str1 = "abc"; String str2 = "abc"; String str3 = new String("abc"); System.out.println(str1.equals(str2)); //true System.out.println(str1==str2); //true System.out.println(str1==str3); //false System.out.println(str1.equals(str3)); //true } }
str1과 str2는 같은 데이터값(abc)를 가졌기 떄문에 str1.equals(str2) 는 true
str1과 str2는 같은 주소값을 가졌기 때문에 str1==str2 는 true
str1과 str3는 같은 데이터값(abc)를 가졌기 때문에 str1.equals(str3) 는 true
하지만 str3는 새로 new 연산자를 통해 객체를 새로 생성하였다. 그렇기 때문에 다른 주소값이 갖게 되어
str1 == str3 는 false가 나오게 된다.
반응형'Java > java study' 카테고리의 다른 글
Java - LinkedList, Stack, Queue 구현하기 (0) 2022.01.02 JUnit 5 (0) 2022.01.02 Java - 제어문 (0) 2022.01.01 Java - 프리미티브 타입과 레퍼런스 타입 (0) 2021.12.10 Java - JVM에 대하여 (0) 2021.12.03