3주차 과제: 연산자

2020. 11. 22. 17:29백기선의 온라인 자바 스터디

반응형

- 목표

    - 자바가 제공하는 다양한 연산자를 학습하세요.


- 학습할 것

  • 산술 연산자
  • 비트 연산자
  • 관계 연산자
  • 논리 연산자
  • instanceof
  • assignment(=) operator
  • 화살표(->) 연산자
  • 3항 연산자
  • 연산자 우선 순위
  • (optional) Java 13. switch 연산자

● 산술 연산자

  • 사칙 연산자(+, -, *, /), 나머지 연산자( % )는 두 개의 피연산자를 가지는 이항연산자이며 산술 연산자는 피 연산자의 크기가 4byte보다 작으면 4byte(int)로 변환한 다음에 연산을 수행.
  • 연산하기 전에 데이터형 일치시키기. (둘 중 더 큰 자료형으로)
  • 정수와 정수 나눗셈시 정수로 나와야 하므로 소수는 버려지고 정수만 출력 된다.
  • 사칙연산자(+,-,*,/)

     - int형(4byte)보다 크기가 작은 자료형은 int형으로 형변환 한 후에 연산을 수행한다.
public static void main(String args[])
    {
        byte a = 10;
        byte b = 20;
 
//byte c = a + b; 일경우 a, b 모두 int 형으로 변환 되어 연산 되기 때문에 에러 발생.
        byte c = (byte)(a + b); 
// 형변환을 통해 byte 데이터 타입으로 바꿔주고 계산해야 한다. 
        
        System.out.println(c);
 
    }

      - 두개의 피연산자 중 자료형의 표현범위가 큰 쪽에 맞춰서 형변환 뒤 후 연산을 수행한다.

public static void main(String args[])
    {
        int a = 1000000;
        int b = 1000000;
        long c = a*b;
 
        System.out.println(c); //결과값은 -727379968.
//int형과 int형의 연산 결과는 int형이어야된다. 
//int형으로 계산된 결과값이 long형으로 형변환 되어이상한값이 대입된다.
//a,b를 long타입으로 먼저 바꾼 뒤 연산해야 한다.
    }

      - 정수형간의 나눗셈에서 0으로 나누는 것은 금지되어 있다.

  • 나눗셈 연산자( / ) 

    - 왼쪽의 피 연산자를 오른쪽 피 연산자로 나누고 난 나머지 값을 돌려주는 연산자이다.
    - 나머지 연산자는 주로 짝수, 홀수, 배수검사 등에 사용된다.
    - 3 / 2 의 결과는 1.5 또는 2가 아니라 소수를 완전히 버린 1이 된다.

● 비트 연산자(이동 or 논리)

  • 비트 연산자는 데이터를 비트 단위로 연산합니다. 0과1로  표현이 가능한 정수 타입만 비트 연산이 가능합니다.

  • 비트 이동 연산자(쉬프트 연산자)

    - 비트 이동 연산자는 정수 데이터의 비트를 왼쪽 또는 오른쪽으로 이동시키는 연산을 합니다.

    - 자바의 기본정수 타입은 반드시 부호(sign)가 있는 정수 값을 가짐.

    - 부호는 제일 왼쪽 한 비트에 표시, 이 비트를 MSB(Most significant Bit : 최상위 비트), 양수 0, 음수 1

    - 비트 단위 연산 수행, 기본 정수 타입인 byte, short, char, int, long에만 사용 할 수 있다.

비트 이동 연산자

  • 비트 논리 연산자

    - 정수형 기본형 데이터 타입의 각 비트를 개별적으로 조작.

    - 양쪽 피연산자의 대응되는 각 두 값을 비트단위로 나열한 뒤 각 자리수를 비트별로 부울 연산을 함.

    - 양쪽 피산잔자의 대상이 boolean타입일 경우에는 일반 논리 연산자로 활용.

    - 각 자릿수의 연산은 독립적이며 다른 자릿수에 영향을 주지 않음.

    - 참고) 10진수를 2진수로 변환시켜 테스트 해볼것! (integer 클래스 활용)
        - int i = 127;  String binaryString = Integer.toBinaryString(i);       > 출력 : 1111111

비트 논리 연산자 (연산과정 이미지는 맨 하단 출처!)

● 관계 연산자

  •  이항 연산자로 피연산자의 크기를 비교하는 연산자.
  • 연산의 결과는 treu 또는 false.
  • < , > , <= , >= : 두 피연산자의 크기를 비교.(boolean형의 값을 제외한 나머지 자료형  사용가능)
  • ==, != : 두 피연산자의 값이 같은지 비교.


    ※  == 과 equals() 의 차이점!!!

      - == 연산자는 비교하고자 하는 대상의 주소값을 비교.

      - equals()메소드는 비교하고자 하는 대상의 내용 자체를 비교.

      - Call By Value 형태는 일반적으로 int, double, float,char..과 같은 primitive type 임으로 주소값을 갖지 않음.
      - Call By Reference 형태는 String,객체(new 연산자)와 같은 클래스 타입이기 때문에 주소값을 갖음.

      - 이에 String(문자열) 같은 경우 ==연산자로 이용할때 값이 일치하지 않는 오류를 범할 수 있다.
      - (A.equals(B) 사용)

● 논리 연산자

  • 논리 연산자는 피연산자로 boolean형 또는 boolean형 값을 결과로 하는 조건식만을 허용한다. (반복문에서도 사용)
  • 결과가 true 또는 false로 반환된다.

논리 연산자.
논리 연산자 반환값.

● instanceof

  • 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용.
  • 주로 조건문에 사용, instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치.
  • 연산의 결과로 boolean값인 true, false 중의 하나를 반환.
  • instanceof를 이용한 연산결과로 true를 얻었다는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 뜻.
  • 값이 null인 참조변수에 대해 instanceof 연산을 수행하면 false를 결과로 얻는다.
  • 주로 상속 관계에서 부모객체인지 자식객체인지 확인하는데 사용.

/**
 * instanceof : 객체 타입을 확인하는데 사용한다. 속성은 이항연산자이고 형변환 가능여부를 가능하면 true 불가능하면 false로 리턴해준다. 
 * 주로 상속 관계에서 부모객체인지 자식객체인지 확인하는데 사용한다.
 */
public class InstanceofExam {
	public static void main(String[] args) {
		
		A a = new A();
		B b = new B();
		
		
		//객체 a는 자기 자신의 객체이기 때문에 형변환 가능.
		System.out.println(a instanceof A);  //true 출력
		
		//객체 b는 A의 자식객체이기 때문에 A로 형변환 가능.
		System.out.println(b instanceof A);  //true 출력
		
		
		//객체 a는 B의 부모객체이기때문에 형변환 불가능.
		System.out.println(a instanceof B);  //false 출력
		
		//객체 b는 자기 자신의 객체이기때문에 형변환 가능.
		System.out.println(b instanceof B);  //true 출력
		
	} // end of main 
} // end of class


class A{
	
}

class B extends A{
	
}
//출처: https://zzdd1558.tistory.com/124 [윤들윤들]

 

● assignment(=) operator (대입 연산자)

  • 대입 연산자는 변수에 값을 대입할때 사용하는 이항 연산자.
  • 피연산자들의 결합 방향은 오른쪽에서 왼쪽.
  • 자바에서는 대입 연산자와 다른 연산자를 결합하여 만든 다양한 복합 연산자 제공.

대입 연산자. 출처 이미지 클릭.

● 화살표 (->) 연산자

  • = 람다 표현식. 메소드를 하나의 식으로 표현한 것.
  • 단 하나의 객체만을 생성할 수 있는 클래스를 익명 클래스 라고 함.
  • 자바에서 람다 표현식은 익명클래스와 같다고 할 수 있음.

람다 표현식 예제.

  • 람다 표현식은 메소드의 매개변수로 전달될 수도 있으며, 메소드의 결괏값으로도 반환될 수 있다.
  • 기존의 불필요한 코드를 줄여주고, 작성된 코드의 가독성을 높여준다.
  • JAVA SE 8부터 자바에서도 함수형 프로그래밍 가능.
  • (매개변수목록) - > {함수 몸체}

    - 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있습니다.
    - 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있습니다.
    - 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있습니다. (이때 세미콜론(;)은 붙이지 않음)
    - 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없습니다.
    - return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결괏값이 됩니다. (이때 세미콜론(;)은 붙이지 않음)
  • 직접 사용 해봐야 파악이 가능할것!!

● 3항 연산자

삼항 연산자의 예( 출처 이미지 클릭 )

  • if/else 문과 비슷하지만 심플한 분기문을 처리하는데 특화되어 있는 연산자.
  • if/else로 처리했을때보다 라인수를 획기적으로 줄여줌. 가벼운 로직에서 자주 쓰인다.
  • 다만, 삼항연산자를 사용하여 코드의 라인이 줄어들었다고 컴파일 속도가 빨라지는것은 아니다.
  • 삼항연산자의 중복사용은 가독성이 떨어질 수 있으므로 가급적 피한다.(if/else 사용)
//IF ELSE
int a;
if(5<4) {
    a = 50;
}else {
    a = 40;
}
System.out.println(a); //결과 = 40 
		
        
//삼항연산자
int b = (5 < 4) ? 50 : 40; 
System.out.println(b); //결과 = 40


//출처 : https://coding-factory.tistory.com/266


● 연산자 우선순위

연산자 우선순위. (초록색 표시는 자주 헷갈리는 부분이니 짚고 넘어가자!)

  •  단항, 이항, 삼항 연산자 순으로 우선순위를 갖는다.
  • 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 갖는다.
  • 단항과 대입 연산자를 제외한 모든 연산 방향은 왼쪽에서 오른쪽이다.(>>)
  • 복잡한 연산식에는 () 괄호 사용해서 우선순위를 정해준다. (연산이 복잡해질때는 괄호를 사용하는것을 추천!)
  • 연산자 우선순위가 같으면, 연산 방향에 따라 달라진다.

● Java 13. switch 연산자

  •  :  대신 - > 를 사용할 수 있다. ( ★꼭 한번 써보기!!)
static void howMany(int k) {
    switch (k) {
        case 1  -> System.out.println("one");
        case 2  -> System.out.println("two");
        default -> System.out.println("many");
    }
}

public static void main(String[] args) {

	howMany(1);   //출력값 : one
	howMany(2);   //출력값 : two
	howMany(3);   //출력값 : many
}
  • full through가 없기 때문에 break를 쓰지 않아도 된다.

  • switch가 expression으로 사용될 수 있다.(?)
static void howMany(int k) {
    System.out.println(
        switch (k) {
            case  1 -> "one"
            case  2 -> "two"
            default -> "many"
        }
    );
}

//즉, 다음과 같이 변수 할당을 할 수 있다.

T result = switch (arg) {
    case L1 -> e1;
    case L2 -> e2;
    default -> e3;
};

 

  • yield 키워드가 추가되었다. (일종의 return의 용도로 해석)
int j = switch (day) {
    case MONDAY  -> 0;
    case TUESDAY -> 1;
    default      -> {
        int k = day.toString().length();
        int result = f(k);
        yield result;   // 일종의 return문 같은 느낌
    }
};


//yield는 : 를 사용한 전통적인 switch 문에서도 쓸 수 있다.

int result = switch (s) {
    case "Foo": 
        yield 1;
    case "Bar":
        yield 2;
    default:
        System.out.println("Neither Foo nor Bar, hmmm...");
        yield 0;
};

 

 

 

*************************************************출처*****************************************************

coding-factory.tistory.com/521

 

[Java] 비트(Shift) 연산자 사용법 & 예제

비트 연산자는 데이터를 비트 단위로 연산합니다. 그러므로 0과 1로 표현이 가능한 정수 타입만 비트 연산이 가능합니다. 비트 연산자는 기능에 따라 비트 이동연산자, 비트 논리연산자로 구분

coding-factory.tistory.com

velog.io/@foeverna/Java-%EC%97%B0%EC%82%B0%EC%9E%90-%EA%B4%80%EA%B3%84-%EB%85%BC%EB%A6%AC-%EC%A1%B0%EA%B1%B4-%EB%B9%84%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90

 

[Java] 연산자 - 관계, 논리, 조건, 비트 연산자

비교 연산자라고도 하며 우리가 수학시간에 배웠던 부등호를 생각하시면 됩니다. 관계연산자의 결과는 true 혹은 false 값인 boolean 자료형으로 반환이 됩니다. 뒤에서 배울 제어문에서 많이 사용

velog.io

programmer-seva.tistory.com/7

 

[스터디_자바 기본] 7. 산술 연산자

산술 연산자는 사칙 연산자(+, -, *, /), 나머지 연산자(%), 쉬프트 연산자(<<, >>, >>>)는 모두 두개의 피연산자를 취하는 이항 연산자이다. 이항 연산자는 피연산자의 크기가 4 byte보다 작으면 4 byte(in

programmer-seva.tistory.com

programmer-seva.tistory.com/9

 

[스터디_자바 기본] 9. 논리 연산자

1. 논리 연산자 (&&, ||) 논리 연산자는 피연산자로 boolean형 또는 boolean형 값을 결과로 하는 조건식만을 허용한다. '&&'가 '||' 연산보다 우선순위가 높으므로 한 조건식에 '&&'와 '||' 가 함께 사용될

programmer-seva.tistory.com

www.tcpschool.com/java/java_lambda_concept

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

johngrib.github.io/wiki/jdk13/

 

JDK 13 둘러보기

 

johngrib.github.io

*****참고 페이지******

10진수 -> 2진수 

dpdpwl.tistory.com/92

 

[Java]자바 진수변환(10진수->2진수,8진수,16진수)

10진수를 2진수,8진수,16진수로 변환 할 때, Integer 클래스의 함수를 사용하면 쉽게 변환이 가능합니다. Integer 클래스의 toBinaryString, toOctalString, toHexString 함수를 사용하면 각각 2진수,8진수 16진..

dpdpwl.tistory.com

instanceof 

mine-it-record.tistory.com/120

 

[JAVA] 자바_instanceof (객체타입 확인)

instanceof - instanceof는 객체 타입을 확인하는 연산자이다. - 형변환 가능여부를 확인하며 true / false 로 결과를 반환한다. - 주로 상속 관계에서 부모객체인지 자식객체인지 확인하는데 사용된다. ins

mine-it-record.tistory.com

 

반응형