끝을 보는 용기

Spring 본캠프 Day 037 - [Java 문법 종합반] 1주차 완강, 2주차 수강 (1/2)

writingforever162 2024. 11. 12. 23:35

"오늘 꿈에서 200% 확률로 청기 백기 들 겁니다."

 

"근데 이제 청기가 true이고 백기가 false인……."

 

논리 연산자가 꼭 청기 백기 같다는 팀원분 말에 정말 공감했다. TIL을 작성하는 지금도 머릿속에 true와 false가 둥둥 떠다닌다. 과연 튜터님들께 질문다운 질문이나 할 순 있을까, 의구심이 들었는데 쓸데없는 생각이었다. 혼자 십여 분 동안 끙끙 앓다 보면 낯가림이고 어색함이고 죄다 사라졌다. 키보드를 두들긴다고 뇌가 의식할 때쯤엔 이미 직장인 자세로 각 잡고 앉아 메시지를 작성한 뒤였다. 오늘 드디어 계산기 만들기 실습 과제를 받았으니, 아마 내일은 더 많은 질문을 아침부터 할듯싶다.

 

진도가 안내받은 계획표보다 한참 느려서 지금도 걱정이 이만저만이 아니지만, 그렇다고 움츠러들진 않았다. 고민의 늪에 계속 있어 봤자 서 있는 곳은 그대로이니까. 다른 사람들보다 느리다고 낙담한들 해치워야 할 진도가 줄어들진 않으니까.

 

개인 프로젝트가 끝나면 베이식(Basic)<스탠더드(Standard)<챌린지(Challenge) 순으로 학습반에 들어가서 공부한다. 베이식 반에서는 변수의 활용을, 스탠더드 반에서는 인터페이스(Interface) 상속의 활용을, 챌린지 반에서는 멀티 스레드(Multi Thread) 성능 극대화하기를 배우는 식이다. 튜터님의 설명 덕분에 목표는 확실해졌다.

 

반드시 스탠더드(Standard) 반에 들어간다.

 

꼭 개발자가 되어야 한다는 절박함 하나로 과거와 현재 모두 여기에 쏟는 만큼, 표준은 되어보련다.

 

[습관 관련]

자고 일어나니 어제보다는 몸 상태가 많이 나아졌다. 쉬는 시간마다 허리 통증을 물리칠 겸 일어나서 따뜻한 물을 챙겨 먹은 덕도 좀 본 듯하다. 운동은 어제와 똑같이 했다. 과제를 좀 하면 운동에 시간을 10분 더 투자할 여유도 생기지 않을까 싶다. 짬짬이 책 읽기와 자바(Java) 문제 하나 풀기 또한 일상처럼 했다.

 

[학습 관련]

1. 래퍼 클래스(Wrapper Class)

ⓐ 기본형 변수를 클래스로 한 번 감싸는 변수

ⓑ 래퍼 클래스를 사용하면 객체 지향의 많은 기능을 쓸 수 있다.

ⓒ 박싱(Boxing): 래퍼 클래스로 변수를 감싸는 것

ⓓ 언박싱(Unboxing): 래퍼 클래스 변수를 기본형 변수로 가져오는 것

ⓔ 모든 기본형 변수에는 래퍼 클래스가 있다.

ⓕ 클래스(class)이므로 맨 앞 글자는 대문자로 쓰며, 줄임말 대신 풀어서 쓴다. ▶ 예를 들어, 실수형 float의 래퍼 클래스는 Float이다. 문자형 char의 래퍼 클래스는 Character이다. 정수형 int의 래퍼 클래스는 Integer이다.  

public class FirstWeekStudy {
    public static void main(String[] args) {
        int number = 440;
        // [1] 정수형 int 변수 number 선언 및 초기화

        Integer boxingNumber = new Integer(number);
        // [2] 박싱
        //     감싸려는 기본형 변수명을 소괄호 안에 넣는다.
        //     == Integer boxingNumber = number;
        //     new 래퍼 클래스보다 위의 방식을 더 추천한다.

        int unboxingNumber = boxingNumber.intValue();
        // [3] 언박싱

        System.out.println(unboxingNumber);
        // [출력문] 440
    }
}

 

2. 논리 연산자 ! (NOT 연산자)

package SecondWeekStudy;
public class SecondWeekStudy {
    public static void main (String[] args) {
        boolean firstFlag = false;
        boolean secondFlag = true;
        // [1] 논리형 boolean 변수 각각 선언 및 초기화

        System.out.println(!firstFlag);
        // true
        // [2] false의 반대 값이므로 true가 출력된다.

        System.out.println(firstFlag||secondFlag);
        // true
        // [3] firstFlag가 true이므로 true가 출력된다.
        // [복습 1] ||는 OR 연산자이다.
        // [복습 2] 둘 중 하나만 true이면 true가 된다.

        System.out.println(firstFlag||!secondFlag);
        // false
        // [4] secondFlag의 값은 true의 반대인 false가 된다.
        //     firstFlag의 값은 변하지 않으므로 false이다.
        //     둘 다 false이므로 false가 출력된다.

        System.out.println(!firstFlag&&secondFlag);
        // true
        // [5] firstFlag 값은 false의 반대인 true가 된다.
        //     secondFlag의 값은 변하지 않으므로 true이다.
        //     둘 다 true이므로 true가 출력된다.
        // [복습 3] &&는 AND 연산자이다.
        // [복습 4] AND 연산자는 모두 true여야 true가 출력된다.

        System.out.println(!(firstFlag||secondFlag));
        // false
        // [6] (firstFlag||secondFlag)는 true이다.
        //     이때, !가 있으므로 true의 반대인 false가 출력된다.
    }
}

 

3. 대입 증감 연산자

(1) 더할 때 

package SecondWeekStudy;
public class SecondWeekStudy {
    public static void main(String[] args) {
        int firstNum = 10, secondNum = 10;
        // [1] 정수형 int 변수 각각 선언 및 초기화

        int sum = ++firstNum + secondNum--;

        System.out.println(firstNum); // 11 출력
        System.out.println(secondNum); // 9 출력
        System.out.println(sum);
        // [2] 우리가 원한 결괏값: 20
        //     실제로 출력되는 값: 21
        //     firstNum은 ++가 먼저 수행되어서 11로 연산됨
        //     secondNum은 값이 먼저 변수 sum에 저장된 후 빼기가 이루어짐
        //     따라서 연산된 값 11과 연산 되기 전 값인 10이 더해진다!
        
        System.out.println(firstNum+secondNum);
        // [3] 20 출력
        //     -- 연산은 11번 코드 이후에 반영된다.
        //     따라서, 11 더하기 9로 20이 출력된다.
    }
}

 

(2) 곱할 때

package SecondWeekStudy;
public class SecondWeekStudy {
    public static void main(String[] args) {
        int firstNum = 10, secondNum = 10;
        int sum = ++firstNum + secondNum--;
        System.out.println(firstNum); // 11 출력
        System.out.println(secondNum); // 9 출럭
        System.out.println(sum); // 21 출력

        int thirdNum = firstNum--;
        System.out.println(firstNum); // 10 출력
        System.out.println(thirdNum);
        // [1] 11 출력
        //     -- 연산 전 firstNum 값인 11이 저장됐기 때문에!

        int fourthNum = ++secondNum;
        System.out.println(secondNum);
        // [2] 10 출력
        //     9에 1이 더해졌기 때문에
        // [복습] sum 이후에 -- 연산이 돼서 기본값이 9가 됐다.
        System.out.println(fourthNum);
        // [3] 10 출력
        //     ++ 연산 후 secondNum 값이 저장됐기 때문에!

        int multiplication = thirdNum-- * ++fourthNum;
        System.out.println(multiplication);
        // [4] 우리가 원한 결괏값: 110
        //     실제로 출력되는 값: 121
        //     thirdNum 값은 곱하기 후에 --가 이루어져서 11 그대로이다.
        //     fourthNum 값은 ++가 먼저 이루어져서 11이 된다.
        //     따라서 110이 아닌 121이 출력된다.
    }
}

 

4. 실습 결과 

'depreciate'는 '가치를 떨어뜨리다' 또는 '평가 절하되다'를 의미한다. 즉, 저 빨간 전구는 진짜 오류는 아니라 저 방식 말고 새로운 방식을 쓰라는 의미로 나온 셈이었다. 

시간이 좀 걸리긴 했으나, 대입 증감 연산자와 피연산자 위치에 따라 결과가 어떻게 달라지는지 오늘 이후로 헷갈리고 싶지 않았다. 지우고 쓰기를 반복한 이 시간이 내일부터 빛을 발하면 좋겠다.

 

[기타 사항]

내일은 꼭 2주 차 강의를 모두 들은 다음, 계산기를 10%만이라도 만들어보자.