티스토리 뷰

Study/Java

[스터디 3주차] 연산자

나갱 2021. 12. 19. 23:57

[산술 연산자]

[비트 연산자]

1) x << y:

정수 x의 각 비트를 y만큼 왼쪽으로 이동시킨다. 빈자리는 0으로 채워진다. 

2) x >> y:

정수 x의 각 비트를 y만큼 오른쪽으로 이동시킨다. 빈자리는 정수 a의 최상위 부호비트와 같은 값으로 채워진다.

3) x >>> y:

정수 x의 각 비트를 y만큼 오른쪽으로 이동시킨다. 빈자리는 부호와 상관없이 0으로 채워진다. 앞자리가 0으로만 채워지기 때문에 결과값은 무조건 양수로만 나타난다. 

4) x & y:

- AND 논리

- 두 비트 모두 1일 경우에만 연산 결과가 1

5) x | y:

- OR 논리

- 두 비트 중 하나만 1일 경우에만 연산 결과가 1

6) x ^ y:

- XOR 논리

- 두 비트중 하나는 1이고 다른 하나가 0일 경우에만 연산 결과가 1

7) ~ x:

- NOT 논리

- 비트 반전(보수)

 

[관계 연산자]

- 관계 연산자는 boolean 값을 return 한다. 참인 경우 True, 참이 아닌 경우 False 

- 예

Result

[논리 연산자]

- 예

Result

 

[instanceof]

- instanceof는 객체 타입을 확인하는 연산자이다. 

- 형 변환 가능여부를 확인하며 true/false로 결과를 반환한다. 

- 주로 상속 관계에서 부모 객체인지 자식 객체인지 확인하는데 사용된다. 

- 즉, (1) 자기 자신의 클래스 객체인가? (2) 자식 클래스의 객체인가? 확인하기 위해 사용한다. 

- "객체 instanceof 클래스"를 선언함으로써 사용한다. 

 

[Assignment(=) operator]

- 대입 연산자는 '='를 이용해서 사용한다. 

- '=='는 '같다'를 의미, '='는 '대입'을 의미한다. 

 

[화살표(->) 연산자]

람다 표현식은 Java 8버전 부터 적용. 

- 화살표 연산자는 Java 에서 람다 표현식의 syntax 일부이다. 

- 메소드를 람다 표현식으로 표현하면, 클래스를 작성하고 객체를 생성하지 않아도 메소드를 사용할 수 있다. 

- (argument, ...) -> {expression}

// 메소드
int min(int x, int y) {
    retrun x < y ? x : y;
}

// 람다 표현식
// 3항연산자 예시
(x, y) -> x < y ? x : y;

 

[3항 연산자]

- 피 연산자의 개수가 3개인 것을 의미

- (피연산자1) ? (피연산자2) : (피연산자3)

- 피연산자 1의 값이 true 이면, 피연산자2가 반환되고 false이면 피연산자3이 반환된다. 

 

[연산자 우선순위]

- 단항, 이항, 삼항 연산자 순으로 우선 순위를 갖는다

- 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 갖는다. 

[Java13 switch 연산자]

- 기존의 switch/case 문을 좀 더 간결하게 사용

- switch 문에서 콜론(:) 을 화살표(->) 로 변경하여 사용할 수 있고, break문을 생략할 수 있다. 

-break로 반환하는 문법이 Java12에 있었지만, Java13에서는 yield로 변경되었다.

String result = switch(n) {
    case "A" -> {
        System.out.println("1");
        yield 1;
    }
    case "B" -> {
        System.out.println("2");
        yield 2;
    }
    case "C" -> {
        System.out.println("3");
        yield 3;
    }
    default -> {
        System.out.println("그 외의 숫자");
        yield 100;
    }
}

 

[HashCode의 의미]

- 객체를 식별하는 하나의 정수 값을 의미. 

- 해시 알고리즘에 의해 생성된 정수값.

- 해시코드 규약:

  • equals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메소드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다.(단, 애플리케이션을 다시 실행한다면 이 값이 달라져도 상관없다.)
  • equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다.
  • equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 없다. 단, 다른 객체에 대해서는 다른 값을 반환해야 해시테이블의 성능이 좋아진다.

- Object 클래스에 의해 정의된 hashCode() 방법은 별개의 개체에 대해 고유한 정수를 반환한다. (이것은 일반적으로 객체의 내부 주소를 정수로 변환하여 구현)

 

[자바 equals 와 ==의 차이]

- equals데이터 값을 비교하는 메서드이며, ==주소 값을 비교해주는 비교 연산자 이다. 

String s1 = "str";
String s2 = "str";
String s3 = new String("str");
String s4 = new String("str");


System.out.println(s1 == s2 )); // true
System.out.println(s1.equals(s2)); // true

System.out.println(s1 == s3 ); // false
System.out.println(s1.equals(s3)); // true

System.out.println(s1 == s4 ); // false
System.out.println(s1.equals(s4)); // true

System.out.println(s3 == s4 ); // false
System.out.println(s3.equals(s4)); // true

- String 변수를 생성할 때는 두 가지 방법이 있다. 

1. 리터럴을 이용한 방식 

2. new 연산자를 이용한 방식 

 

- 리터럴을 사용하게 되면 string constant pool이라는 영역에 존재하게 되고, new를 통해 string을 생성하면 Heap 영역에 존재하게 된다. 

- String을 리터럴로 선언할 경우 내부 적으로 String의 intern() 메서드가 호출하게 되고 intern() 메서드는 주어진 문자열이 string constant pool에 존재하는지 검색하고 있다면 그 주소 값을 반환하고 없다면 string constant pool에 넣고 새로운 주소값을 반환한다.

String str1 = "apple"; //리터럴을 이용한 방식
String str2 = "apple"; //리터럴을 이용한 방식
String str3 = new String("example"); //new 연산자를 이용한 방식
String str4 = new String("example"); //new 연산자를 이용한 방식

 - == 연산자는 비교하고자 하는 두개의 대상의 주소 값을 반환하는데 반해 String 클래스의 equals 메소드는 비교하고자 하는 두개의 대상의 값 자체를 비교한다. 

 

public class compare {
    public static void main(String[] args) {
        String s1 = "abcd";
        String s2 = new String("abcd");
		
        if(s1 == s2) {
            System.out.println("두개의 값이 같습니다.");
        }else {
            System.out.println("두개의 값이 같지 않습니다.");
        }
    }
}
// 두개의 값이 같지 않습니다.

 

- == 연산자의 경우 참조 타입 변수들 간의 연산은 동일한 객체를 참조하는지 다른 객체를 참조하는지 알아볼 때 사용한다. 따라서, 자바에서 문자열을 비교하려면 equals 라는 메소드를 활용하여 두개의 값을 비교해 줘야한다. 

 

public class compare {
    public static void main(String[] args) {
        String s1 = "abcd";
        String s2 = new String("abcd");
		
        if(s1.equals(s2)) {
            System.out.println("두개의 값이 같습니다.");
        }else {
            System.out.println("두개의 값이 같지 않습니다.");
        }
    }
}
// 두개의 값이 같습니다.

- String 클래스안에 있는 equals라는 메서드를 사용하면 두 비교대상의 주소 값이 아닌 데이터값을 비교하기 때문에 어떻게 String을 생성하느냐에 따라 결과가 달라지지 않고 정확한 비교를 할 수 있다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함