초록꼬마의 devlog
article thumbnail

2021.10.15(금)

🌿 강제 형 변환

    // 강제/명시적 형 변환 : 큰 바이트 -> 작은 바이트
    public void forceCasting() {
        // (바꿀 자료형)값

        // 1. double(8bytes) -> float(4bytes)
        float f1 = 4.0f;
        double d2 = 8.0;
        float f2 = (float)d2; // double형을 float형으로 저장하려면 강제형변환 필요
        System.out.println(f2);

        // 2. double(8bytes) -> int(4bytes)
        double d3 = 10.89;
        int i3 = (int)d3; // double형을 int형으로 저장하려면 강제형변환 필요
        System.out.println(i3); // 10 출력; 소수점 아래 부분(0.89)이 절삭됨 -> 데이터 손실됨

        int iNum = 10;
        double dNum = 8.89;
        System.out.println(iNum + dNum); // iNum + dNum 덧셈 결과는 double로 자동형변환(작은 -> 더 큰 자료형으로); 18.89 출력

        int result = iNum +(int)dNum; // int형 값을 저장할 메모리 공간을 할당받고, 그 이름을 result라는 식별자로 하겠다(=변수 선언) -> 대입연산자를 통해 우항의 int값(literal; 18)이 공간에 저장됨; 영역{} 안에서 계속 존재하며 사용됨
        System.out.println(result);

        result = (int)(iNum + dNum); // 130행과 연산 결과는 같으나, 연산하고자 하는 바를 나타내는 데에 조금 더 명확하고 좋은 표기 방법
                                     // 새로운 int형 저장 공간 마련하는 대신, 130행에서 만들어/선언해둔 공간/변수("result")를 사용함
        System.out.println(result);    

    }

🌿 연산자

(헷갈릴 만한 내용 위주 정리, 특별 학습 필요 = ✅)

🌱 2항 연산자

  • 산술 연산자
    • 문자열 + 기본 자료형 = 문자열
    • 정수 나눗셈 주의!
  • 비교/관계 연산자
    • 비교 연산의 결과는 true/false
  • 논리 연산자
    /* 진리표
     * &&: 두 개의 조건이 모두 true일 때 결과가 true
     * true && true -> true
     * true && false -> false
     * false && true -> false
     * false && false -> false
     * 
     * ||: 두 개의 조건 중 하나라도 true이면 결과가 true
     * true || true -> true
     * true || false -> true
     * false || true -> true
     * false || false -> false
     */

    public void method4() {
        int num = 10;
        boolean result = false && (num > 0); // Java의 shortcut 연산; "dead code" 경고msg
        // 첫번째 피연산자가 false니까 뒤의 비교 연산 구문(dead code)을 굳이 실행하지 않음
        // dead code: 실행 오류는 나지 않지만, 결과값이 false일텐데 굳이 왜 쓰지? -> 굳이 쓸 필요 없는 codes -> 안 좋은 codes
    }

 

🌱 단항 연산자

  • 논리부정 연산자
  • 증감 연산자 ✅
public class B_InDecrease {

    /* 증감연산자: 단항연산자; 한 번에 1씩 증가/더하거나 감소하는/빼는 연산을 함
     * -> 먼저 증감을 할건지, 나중에 증감을 할건지 연산자의 위치(피연산자의 앞 또는 뒤)에 따라 달라짐
     * 
     * 표현법
     * ++: 값을 1씩만 증가시키는 연산자
     * --: 값을 1씩만 감소시키는 연산자
     * 
     * 연산자의 위치
     * 전위 연산: ++값, --값 -> 먼저 값을 증감하고 그 값을 처리
     * 후위 연산: 값++, 값-- -> 값을 먼저 처리하고 나서 증가/감소함 
     */

    // 후위 연산
    public void method1() {
        int num = 10;
        System.out.println("num : " + num);

        num++; // line by line 처리 -> 세미콜론; = 논리적인 한 구절이 끝남 = ☆처리★; 여기까지 num = 10
               // -> 그 후에 'num 변수의 literal 값에 1을 증가시키겠다'; num + 1 -> 여기부터 num = 11
        System.out.println("☆처리★ num : " + num); // num = 11

        num--; // 세미콜론 = ☆처리★; 세미콜론까지는 num = 11
               // -> 그 후에 num - 1; num = 10
        System.out.println("☆처리★ num : " + num); // num = 10

        System.out.println("num : " + num++); // 세미콜론 ☆처리★ 전까지 num = 10
                                              // -> 그 후에 num + 1; num = 11
        System.out.println("num : " + num); // 11
    }

    public void method2() {
        int a = 10; // step1) 오른쪽의 '값'을 왼쪽(공간)에 넣음 -> 10을 a에 직접 대입
        int b = a++; // step2) 오른쪽의 '값'(a에 저장되어 있는 값 = 10)을 왼쪽(공간, b라는 변수)에 넣음/대입(= '대입'이라는 ☆처리★ 완료) -> 세미콜론;
        // -> step3) 그 다음/세미콜론 지나고 a의 값을 1만큼 증가시킴(a = 10 -> 11)

        System.out.println("a : " + a); // 11
        System.out.println("b : " + b); // 10

        int c = 20; // step1) 20 값을 변수/공간 c에 대입/저장
        int d = c--; // step2) c에 저장되어 있는 값(20)을 d에 대입하는 처리를 먼저 수행
        // -> step3) 그 다음 c의 값을 1만큼 감소시킴(c = 20 -> 19)

        System.out.println("c : " + c); // 19
        System.out.println("d : " + d); // 20
    }

    // 전위 연산
    public void method3() {
        int a = 10; // step1) 값 10을 변수 a에 저장
        int b = ++a; // step2) a의 값 1만큼 증가 연산 먼저 함( a = 10 -> 11)
        // -> step3) 그 다음 a의 값을 b에 저장/대입하는 처리 수행

        System.out.println("a : " + a); // 11
        System.out.println("b : " + b); // 11
        System.out.println("a : " + --a); // a의 값을 1만큼 감소시킴 -> a = 11 -> 10
    }

    public void method4() {
        // 후위 연산자
        int num1 = 20; // step1) 값 20을 변수 num1에 저장
        int result1 = num1++*3; // 처리 후 num1의 값을 1만큼 증가시킴 -> step2) 첫번째 처리 = num1에 3 곱함 = 60 -> step3) 60을 result에 대입
        // -> step4) 그 다음 num1의 값을 1만큼 증가시킴(num1 = 20 -> 21)

        System.out.println("num1 : " + num1); // 21
        System.out.println("result1 : " + result1); // 60

        // 전위 연산자
        int num2 = 20;
        int result2 = ++num2*3;
        System.out.println("num2 : " + num2); // 21
        System.out.println("result2 : " + result2); // 63

    }

}

 

🌱 복합(산술)대입 연산자

  • 다른 산술연산자(+ - * / %)와 대입연산자(=)가 결합한 것
  • 이항 연산자
  • 자기 자신과 해당 산술연산 후에 그 결과를 자기 자신에게 덮어씌우는 것

 

🌱 3항 연산자

조건식 ? 조건이 true일 경우의 결과값 : 조건이 false일 경우의 결과값

 

🌱 연산자 우선 순위 ✅

    int a = 5; // 5 -> 6 -> 7
    int b = 10; // 10 -> 9
    int c = (++a) + b; // 6 + 10 = 16 -> 15
    int d = c / a; // 16 / 6 = 2 -> 1
    int e = c % a; // 16 % 6 = 4 -> 5 -> 6
    int f = e++; // 4
    int g = (--b) + (d--); // 9 + 2 = 11 -> 10
    int h = 2; // 2
    int i = a++ + b / (--c / f) * (g-- - d) % (++e + h); // 연산자와 피연산자 띄어쓰기 -> 가독성 향상
    //    = 6 + 9 / (15 / 4) * (11 - 1) % (6 + 2)
    //    = 6 + 9 / 3 * 10 % 8
    //    = 6 + 30 % 8
    //    = 6 + 6
    //    = 12

📗 소감

  • 앞으로 기본이 되는 내용이니 숨쉬듯이 익숙하게 하자!

📗 homework: 변수

  1. 키보드로 정수 두 개를 입력 받아 두 수의 합, 차, 곱, 나누기한 몫을 출력하세요.
  2. 키보드로 가로, 세로 값을 실수형으로 입력 받아 사각형의 면적과 둘레를 계산하여 출력하세요.
  3. 영어 알파벳 문자열 값을 키보드로 입력 받아 문자에서 앞에서 세 개를 출력하세요.
  4. 키보드로 입력 받은 값들을 변수에 기록하고 저장된 변수 값을 화면에 출력하여 확인하세요.