ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Study] 자바 3주차 과제
    JAVA 2020. 11. 28. 14:11
    반응형

    3주차 과제 입니다.

     

     


     

    산술 연산자

     

    산술 연산자는 사칙연산을 다루는 기본적이면서도 가장 많이 사용되는 연산자로 총 5가지가 있습니다.

    모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산들의 결합 방향은 왼쪽에서 오른쪽입니다.

    산술 연산자 설명
    + 왼쪽의 피연산자에서 오른쪽의 피연산자를 더함
    - 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺌
    * 왼쪽의 피연산자에서 오른쪽의 피연산자를 곱함
    / 왼쪽의 피연산자에서 오른쪽의 피연산자를 나눔
    % 왼쪽의 피연산자에서 오른쪽의 피연산자를 나눈 후, 그 나머지를 반환

     

    int a = 10;
    int b = 4;
    
    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);
    System.out.printf("%d + %f = %f%n", a, (float)b, a/(float)b);
            
            //출력
    //        10 + 4 = 14
    //        10 - 4 = 6
    //        10 * 4 = 40
    //        10 / 4 = 2  (소수점 이하는 버려진다) 0으로 나누면 에러 발생
    //        10 + 4.000000 = 2.500000 (정수형이 실수형으로 자동 형변환)

     

     

     

    비트 연산자

     

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

     

     

    비트 이동연산자

     

    연산식 설명
    x << y 정수 x의 각 비트를 y만큼 왼쪽으로 이동시킵니다. (빈자리는 0으로 채워집니다.)
    x >> y 정수 x의 각 비트를 y만큼 오른쪽으로 이동시킵니다. (빈자리는 정수가 양수일 경우 0으로, 음수일 경우 모두 1로 채워집니다.)
    x >>> y 정수 x의 각 비트를 y만큼 오른쪽으로 이동시킵니다. (빈자리는 0으로 채워집니다.)

     

    System.out.println("8 << 2 = " + (8<<2));
    System.out.println("8 >> 2 = " + (8>>2));
    System.out.println("-8 >> 2 = " + (-8>>2));
    System.out.println("-8 >>> 2 = " + (-8>>>2));
            
            //출력
    //        8 << 2 = 32
    //        8 >> 2 = 2 
    //       -8 >> 2 = -2
    //        -8 >>> 2 = 1073741822

     

     

    비트 논리연산자

     

    연산자 논리 설명
    & AND 두 비트 모두 1일 경우에만 연산 결과가 1
    | OR 두 비트 중 하나만 1일 경우에만 연산 결과가 1
    ^ XOR 두 비트 중 하나는 1이고 다른 하나가 0일 경우에만 연산 결과가 1
    ~ NOT 비트 반전 (보수) - 이진수로 표현된 피연산자의 값을 반전시켜줍니다

     

    System.out.println("10 & 20 = " + (10&20));
    System.out.println("10 | 20 = " + (10|20));
    System.out.println("10 ^ 20 = " + (10^20));
    System.out.println("~10 = " + (~10));
    
            //출력
    //        10 & 20 = 0
    //        10 | 20 = 30
    //        10 ^ 20 = 30
    //        ~10 = -11

     

     

     

    관계 연산자

     

    비교 연산자라고도 하며 두 피연산자를 비교하는데 사용되는 연산자입니다.

    주로 조건문과 반복문의 조건식에 사용되며, 연산 결과는 오직 true와 false 둘 중 하나입니다.

    관계 연산자 역시 이항 연산자이므로 비교하는 피연산자의 타입이 서로 다를 경우에는 자료형의 범위가 큰 쪽으로 자동 형변환하여 피연산자의 타입을 일치시킨 후에 비교한다는 점에 주의해야 합니다.

     

    비교 연산자 연산 결과
    > 좌변 값이 크면 true 아니면 false
    < 좌변 값이 작으면 true 아니면 false
    >= 좌변 값이 크거나 같으면 true 아니면 false
    <= 좌변 값이 작거나 같으면 true 아니면 false
    == 두 값이 같으면 true 아니면 false
    != 두 값이 다르면 true 아니면 false

     

    System.out.println("10 > 8 " + (10>8));
    System.out.println("10 < 8 " + (10<8));
    System.out.println("10 >= 10 " + (10>=10));
    System.out.println("10 <= 8 " + (10<=8));
    System.out.println("10 == 8 " + (10==8));
    System.out.println("10 != 8 " + (10!=8));
    
            //출력
    //        10 > 8 true
    //        10 < 8 false
    //        10 >= 10 true
    //        10 <= 8 false
    //        10 == 8 false
    //        10 != 8 true

     

     

     

    논리 연산자

     

     

    논리 연산자는 둘 이상의 조건을 '그리고(AND)'나 '또는(OR)'으로 연결하여 하나의 식으로 표현할 수 있게 해줍니다.

    피연산자로 boolean형 또는 boolean형 값을 결과로 하는 조건식만 허용합니다.

    그리고 true를 false로 false를 true로 바꾸는 논리 부정 연산자 '!'가 있습니다.

     

    더보기

    || (OR 결합)       피연산자 중 어느 한 쪽이 true이면 true를 결과로 얻는다.

    && (AND 결합)  피연산자 양쪽 모두 true이어야 true를 결과로 얻는다.

     

    ! (부정)             단항 연산자입니다. true인 경우 false로, false인 경우 true로 바꿉니다.

     

    int x = 11;
    char c = 'b';
    
    //x는 10보다 크고, 20보다 작다
    if(x > 10 && x < 20) {
    }
    
    //x는 2의 배수 또는 3의 배수이다
    if(x % 2 == 0 || x % 3 == 0) {
    }
    
    //x는 2의 배수 또는 3의 배수지만 6의 배수는 아니다
    //괄호를 사용한 이유는 &&가 ||보다 우선순위가 높다
    if((x % 2 == 0 || x % 3 == 0) && x % 6 != 0) {
    
    }
            
    //문자 ch는 소문자가 아니다
    if(!('a' <= c && c <= 'z')) {
    }

     

     

     

     

     

    instanceof

     

    instanceof는 객체 타입을 확인하는데 사용하는 연산자입니다. 주로 조건문에 사용되며, 형변환이 가능한지 여부를 true 또는 false로 반환해줍니다. 간단하게 말하면 부모 객체인지 자식 객체인지 확인하는데 사용된다고 생각하면 됩니다.

     

    참조변수 + instanceof + 타입(클래스명) 의 형식으로 사용이 가능합니다.

     

    class Parent{}
    class Child extends Parent{}
    
    public class Example2 {
        public static void main(String[] args) {
            Parent p = new Parent();
            Child c = new Child();
    
            System.out.println("p instanceof Parent : " + (p instanceof Parent));
            System.out.println("c instanceof Parent : " + (c instanceof Parent));
            System.out.println("p instanceof Child : " + (p instanceof Child));
            System.out.println("c instanceof Child : " + (c instanceof Child));
            
            //출력
    //        p instanceof Parent : true
    //        c instanceof Parent : true
    //        p instanceof Child : false
    //        c instanceof Child : true
        }
    }
    

     

    조상 타입의 참조 변수로 자손 타입의 인스턴스를 참조할 수 있으나 그 반대는 불가능하기에

    p instanceof Child는 false로 반환됩니다.

     

     

     

     

     

    assignment(=) operator

     

    assignment operator는 할당 연산자 또는 대입 연산자라고 하며 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용됩니다.

    오른쪽 피연산자의 값 (식이라면 평가값)을 왼쪽 피연산자에 저장합니다. 그리고 저장된 값을 연산결과로 반환합니다.

     

    대입 연산자는 연산자들 중에 가장 낮은 우선순위를 가지고 있기 때문에 식에서 제일 나중에 수행됩니다.

     

    더보기

    대입 연산자의 왼쪽 피연산자를 'lvalue (left value)', 오른쪽 피연산자를 'rvalue (right value)'라고 합니다.

    x (lvalue) = 3 (rvalue)

    rvalue는 변수뿐만 아니라 식이나 상수 모두 가능한 반면, lvalue는 반드시 변수처럼 값을 변경할 수 있는 것이어야 합니다. 그래서 리터럴이나 상수같이 값을 저장할 수 없는 것들은 lvalue가 될 수 없습니다.

    int i = 0;
    3 = i + 3; //에러. lvalue가 값을 저장할 수 있는 공간이 아니다.
    i + 3 = i; //에러. lvalue의 연산결과가 리터럴 (i+3 -> 0+3 -> 3)
            
    final int MAX = 3; //final을 붙여서 상수 처리
    MAX = 10;          //에러. 상수에 새로운 값 저장 불가

     

     

    복합 대입 연산자

     

    대입 연산자는 다른 연산자와 결합하여 'op='와 같은 방식으로 사용될 수 있습니다. 결합된 두 연산자는 반드시 공백없이 붙여 써야 합니다.

     

     

    출처 : http://m.blog.daum.net/qowlscjf23/51

     

     

    살표(->) 연산자

     

     

    화살표 연산자는 람다 표현식을 작성할 때 사용하는 것으로 Java SE 8부터 람다 표현식이 추가가 되었습니다.

    람다 표현식은 간단히 말해 메소드를 하나의 식으로 표현한 것입니다.

    //메소드
    int min(int x, int y) {
    	return x < y ? x : y;
    }
    
    //람다 표현식
    (x, y) -> x < y ? x : y;

     

    위 예제처럼 메소드를 람다 표현식으로 표현하면, 클래스를 작성하고 객체를 생성하지 않아도 메소드를 사용할 수 있습니다. 이런 식으로 표현하면 기존의 불필요한 코드를 줄여주고, 작성된 코드의 가독성을 높여줍니다. 그리고 람다 표현식을 사용하여 자바에서도 함수형 프로그래밍을 할 수 있게 되었습니다.

     

    더보기

    람다 표현식 문법

    (매개변수 목록) -> {함수 몸체}

    람다 표현식의 경우는 후에 람다 파트를 스터디하게 될 때 좀 더 자세히 알아보도록 하겠습니다.

     

     

     

    3항 연산자

     

     

    if문을 사용하여 조건문을 코딩을 할 경우 코딩 라인이 의미없이 길어지는 경우가 많은데 이를 줄여주는 방식이 있습니다. 바로 3항 연산자입니다.

     

    더보기

    문법

    (조건문) ? 참일 때 : 거짓일 때

    int num = 10;
    String result;
    
    //if else문
    if(num % 2 == 0) {
        result = "짝수 입니다.";
    }else {
        result = "홀수 입니다.";
    }
    System.out.println(result); //출력: 짝수 입니다.
    
    //3항 연산자
    result = (num % 2 == 0) ? "짝수 입니다." : "홀수 입니다.";
    System.out.println(result); //출력: 짝수 입니다.

     

    다만 3항 연산자를 사용하여 코드의 라인이 줄어들었다고 하여 컴파일 속도가 빨라지는 것은 아닙니다.

    또한 3항 연산자를 중복해서 처리할 경우, 가독성이 떨어질 수 있으므로 중복처리는 피하는 것이 좋습니다.

     

     

    연산자 우선 순위

     

     

    연산자에는 기본적으로 우선 순위가 있습니다.

    괄호가 제일 높고, 산술 > 비교 > 논리 > 대입의 순서이며, 단항 > 이항 > 삼항의 순서입니다.

    연산의 진행방향은 왼쪽에서 오른쪽으로 수행되며, 단항 연산자와 대입 연산자의 경우에는 오른쪽에서 왼쪽으로 수행됩니다.

    출처 : https://toma0912.tistory.com/66

     

     

    (optional) Java 13. switch 연산자

     

     

    기존의 switch문의 break 키워드가 yield 키워드로 변경되었습니다.

    또한 단일 표현식을 나타낼 때는 yield도 생략해서 화살표 방식으로 사용 가능합니다.

     

    //기존의 switch문
    int result1;
    switch (s) {
        case "a" : result1 = 1;
        break;
        case "b" : result1 = 2;
        break;
        default: result1 = 3;
        break;
    }
            
    //yield로 변경된 switch문
    int result2 = switch (s) {
        case "a" : 
             yield 1;
        case "b" :
             yield 2;
        default:
             yield 3;
    };
            
    //화살표 방식 switch문
    int result3 = switch (s) {
        case "a" -> 1;
        case "b" -> 2;
        default -> 3;
    };

     

     

    References

    - 자바의 정석 (남궁성 지음)

    - coding-factory.tistory.com/521

    - www.tcpschool.com/cpp/cpp_operator_arithmetic

    - www.tcpschool.com/java/java_lambda_concept

    - improver.tistory.com/140

    - coding-factory.tistory.com/266

    - toma0912.tistory.com/66

    - meetup.toast.com/posts/240

    728x90

    'JAVA' 카테고리의 다른 글

    [Study] 자바 5주차 과제  (0) 2021.01.10
    [Study] 자바 4주차 과제  (1) 2020.12.08
    [Study] 자바 2주차 과제  (0) 2020.11.21
    [Study] 자바 1주차 과제  (0) 2020.11.17
    [JAVA] 제네릭(Generic) 이란?  (0) 2020.11.15

    댓글

Designed by Tistory.