자바 스터디 3주차 : 연산자

hwanse·2021년 2월 3일
0

Java

목록 보기
3/14

백기선님의 자바 라이브 스터디의 참여 및 학습 내용을 정리한 글입니다.




학습목표

자바의 다양한 연산자를 학습해보자.
1. 단항, 이항 연산자
2. 산술/비트/관계/논리 연산자
3. instanceof
4. assignment(=) operator
5. 화살표(->) 연산자
6. 3항 연산자
7. 연산자 우선 순위



연산자란?

수학적인 계산 처리를 수행하는 문자 또는 기호라고 할 수 있다. 자바에서 연산자는 크게 단항/이항/삼항/대입 연산자로 분류할 수 있고, 이항 연산자에서는 산술, 비트, 비교, 논리, 관계 연산자로 나누어 볼 수 있다.



연산자 관련 용어 개념

  • 연산(operation) : 데이터를 처리하여 결과를 산출하는 과정
  • 연산자(operator) : 연산에 사용되는 문자(기호)
  • 피연산자(operand) : 연산의 대상이 되는 데이터
  • 연산식(expressions) : 연산자와 피연산자로 연산의 과정 자체를 기술한 것



단항 연산자

피연산자가 1개인 연산자를 말한다.


  1. 부호 연산자(+, -) : 숫자의 부호를 의미
  • - 는 부호를 반대로 변경한다. (음수 => 양수, 양수 => 음수)

  1. 증감 연산자(++, --) : 값을 증가시키거나 감소시키는 연산
  • 전위형/후위형으로 사용 용도를 나눌 수 있다.
    • 전위형(prefix) : 값을 미리 계산함
    • 후위형(postfix) : 값을 나중에 계산함
int i = 5;
System.out.println(++i);  // 전위형, 결과는 6을 출력
System.out.println(i++);  // 후위형, 결과는 6을 출력, 이 코드 라인이 지나고 7로 증가됨
  1. 부정 연산자(!) : 현재 논리값을 부정하는 연산자.
System.out.println(!true);		// true
System.out.println(!false);		// false
  1. 비트반전 연산자(~) : 정수형의 피연산자에만 사용 가능하며, 피연산자의 2진수의 값을 반전시키는 연산자. (0 => 1, 1 => 0)
  • 주의사항: 비트반전 연산자의 결과 산출 타입은 int 타입이다. 피연산자는 연산 수행 직전에 int 타입으로 변환되고 비트반전이 일어나기 때문에 사용시 결과 타입에 대하여 주의가 필요.
// int 타입은 4byte 크기를 가진다. 따라서 32bit(4 * 8)의 2진수를 표현하면 아래와 같다.
int a = 8;   // 2진수: 0000 0000 0000 0000 0000 0000 0000 1000

// 2진수: 1111 1111 1111 1111 1111 1111 1111 0111
// -9 (10진수) 와 동일한 값
System.out.println(Integer.toBinaryString(~a));	

// 위 비트반전 연산 결과에 +1 을 해주어야만 정수형의 반대 부호 값을 구할 수 있다. (2의 보수)
// 2진수 : 1111 1111 1111 1111 1111 1111 1111 1000
// -8 (10진수)
System.out.println(Integer.toBinaryString(~a + 1));



이항 연산자

피연산자가 2개인 연산자.

산술 연산자

연산자 : +, -, *, /, %
보통 수학적으로 자주 사용되는 사칙 연산을 할 때 사용하는 연산자.

  • 주의사항: /, % 사용시 0으로 나눌 수 없다. 0으로 /연산을 하면 INF(Infinity)로 '무한대'라는 의미의 결과값이 나오고, 0으로 %연산을 하면 NaN(Not a Number) '숫자가 아님'와 같은 결과를 출력한다.

비트 연산자

연산자 : &, ^, |, ^(단항)

  • & (And) 연산자 : 두 피연산자(비트, 논리)의 값이 모두 1일 때 1을 반환, 그 이외에는 0을 반환한다.
  • | (Or) 연산자 : 두 피연산자(비트, 논리) 중 값이 하나만 1이면 결과로 1을 반환, 그 이외에는 0을 반환한다.
  • ^ (Xor) 연산자 : 두 피연산자(비트, 논리)의 값이 서로 다를 때(교차될 때) 결과로 1을 반환, 같은 경우에는 0을 반환한다. 즉, 배타적 논리합을 수행하는 연산자.

논리 연산자

연산자 : &&, ||, &, |, ^

  • && (And) 연산자 : 두 피연산자의 값이 모두 true일 때 true를 반환. 그 이외에는 false를 반환한다.
  • || (Or) 연산자 : 두 피연산자의 값이 하나만 true면 결과로 true를 반환. 그 이외에는 false를 반환한다.
  • ^ (Xor) 연산자 : 두 피연산자의 값이 다를 때(교차) 결과로 true를 반환하고, 같을 경우에는 false를 반환한다. 배타적 논리합을 수행
  • 여기에 비트 연산자의(&, |, ^)를 포함한다.

관계 연산자

연산자 : >, <, >=, <=, ==, !=
피연산자들이 숫자 형식일 때, 두 피연산자들의 크기 관계를 비교해 결과로 boolean형의 true, false를 반환하는 연산자.


instanceof

객체 타입을 확인하는데 사용한다. 이 연산자를 통해 형변환의 가능 여부를 boolean 타입의 true/false로 결과를 반환한다. 주로 참조형 타입에서 부모 클래스의 자식 관계인지를 파악하기 위해서 사용하며, 또한 비교하려는 대상 객체가 특정 인터페이스를 구현화 시킨 것인지 파악하는 용로 사용 가능하다.

class Parent {}
class Child extends Parent {}

public Test {

	public static void main(String[] args) {
    	Parent p = new Parent();
        Child c = new Child();
        
        System.out.println(p instanceof Parent); // true
        System.out.println(p instanceof Child);  // false, p 객체는 Child의 부모이기 때문에 
        System.out.println(c instanceof Parent); // true
        
        // 아래와 같은 형태로도 객체 타입 확인이 가능
        System.out.println((Integer)5 instanceof Integer);	// true
        System.out.println("b" instanceof String) // true
        
    }
    
}

assignment(=) operator

연산자 : ==, !=, +=, -=, /=, %=, <<=, >==, &=, ^=, |=
대입 연산자라고 부르기도 한다. ==!=를 제외한 나머지 연산자들은 복합 대입 연산자=전위에 붙은 연산자로 먼저 피연산자와 변수를 계산한 뒤에 다시 변수에 대입하는 연산이다.
여기서 값 대입과 주소 대입 차이가 있는데 다르게 말하면 깊은 복사, 얕은 복사라고 부르며 앞서 말한 두 방식의 차이점에 대해서는 아래 링크를 참고하는 것이 좋을 것 같다.

참고 : https://kils-log-of-develop.tistory.com/336

(백기선님의 자바 스터디를 참여하시는 어떤 분의 블로그 내용에서 깊은 복사와 얕은 복사에 대한 내용이 너무 좋아서 참고하게 되었습니다. 감사합니다!!!🙏)


연산자 정리


위 표는 아래 글을 참고했습니다. https://medium.com/@katekim720/%EC%97%B0%EC%82%B0%EC%9E%90%EB%B6%80%ED%84%B0-%EC%A1%B0%EA%B1%B4-%EB%B0%98%EB%B3%B5%EB%AC%B8%EA%B9%8C%EC%A7%80-3d5cec6513d4



화살표(->) 연산자

자바8에 람다가 생기면서 추가된 연산자이다. 화살표 연산은 좌항에 함수형 인터페이스의 메소드의 사용 할 매개 변수를 나열하고, 우항에 실제 처리 로직을 작성한 블록을 기술하면 된다.
다음 예시를 보자


// Functional interface인 Function 인터페이스의 apply 메소드를 람다식으로 다음과 같이 재정의했다.
// 람다식 사용 시 다음과 같이 화살표 연산자가 쓰인다.
Function<String, String> messsage = (s) -> {
	s.toUpperCase();
};



3항 연산자

형태 : (조건식) ? (조건이 true일 때 실행할 결과) : (조건이 false일 때 실행할 결과)
3항 연산자는 항이 3개라서 3항 연산자라 부른다. 위와 같은 형태로 쓰이기 때문에 가독성 측면에서 호불호가 갈린다고 들었다. 개인적으로는 간단한 if-else를 사용할 때에는 3항 연산자를 사용해서 코드 라인을 줄이려고 하는편이다.

int a = 10;
int temp = 0;

// a가 15보다 크면 a 를 그대로 return하고, 반대일 경우는 a에 5를 더한 값을 return
temp = (a > 15) ? a : a + 5;



연산자 우선 순위

위 표는 아래 글을 참고했습니다. https://medium.com/@katekim720/%EC%97%B0%EC%82%B0%EC%9E%90%EB%B6%80%ED%84%B0-%EC%A1%B0%EA%B1%B4-%EB%B0%98%EB%B3%B5%EB%AC%B8%EA%B9%8C%EC%A7%80-3d5cec6513d4






참고

profile
만사가 귀찮은 ISFP가 쓰는 학습 블로그

0개의 댓글