ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
    	}
    }

    str1str2같은 데이터값(abc)를 가졌기 떄문에 str1.equals(str2)true

    str1str2같은 주소값을 가졌기 때문에 str1==str2true

    str1str3같은 데이터값(abc)를 가졌기 때문에 str1.equals(str3)true

    하지만 str3는 새로 new 연산자를 통해 객체를 새로 생성하였다. 그렇기 때문에 다른 주소값이 갖게 되어

    str1 == str3false가 나오게 된다.

     

     

    반응형

    '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

    댓글

Designed by Tistory.