[JAVA.05] 연산자의 모든 것(Operator) 그리고 디버그(debug) 모드🙄

Kama_Code·2023년 6월 17일
1

JAVA

목록 보기
10/20
post-thumbnail
post-custom-banner
  • 드디어 5강 : 자바 안에서의 연산을 배우게 된다.

<Step.1> 연산자란?

주어진 식을 계산하여 결과를 얻어내는 과정을 연산이라고 하며,
연산을 수행하는 기호를 연산자라고 한다.

  1. 산술 연산자 😎 :
    ※ 나눗셈은 몫 구하는 식과 나머지 구하는 식이 따로 존재한다

▼▽ 산술 변환 ( 형변환 일치 )🤗 :

  1. 형변환이 다른 것을 연산했을 때 더 큰 타입으로 자동형변환한다.
    ▼▽ 연산을 하면 결과는 큰 놈 기준으로 항상 따라간다고 기억하자! ▼▽
    예시:
    long + int -> long
    long + long -> long
    float + int -> float
    floar + float -> float

  2. int보다 작은 타입으로 연산하면 결과값은 int로 변환한다.
    ※ 정수형 계산기는 int만 있으므로
    byte + short -> int

  1. ⭐복합 대입 연산자 😎 :
    ※ 좌측 변수에 결과값을 누적해야 할 때 주로 사용 (주로 반복문에서 많이 쓰임)
    ※ 좌측항과 우측항을 연산한 결과값을 좌측에 대입한다.
    ※ 기존 변수의 자료형을 그대로 유지하는 특성 -> 연산의 결과는 정수
    ㄴ그래서 복합 대입 연산자를 사용하면 형변환을 안해도 되는 최고의 장점이 있다.
  1. ⭐증감 연산자 😎 :
    ※ ++x : 전위 증가 -> +1을 하고 연산을 한다.
    ※ x++ : 후위 증가 -> 연산을 하고 +1을 한다
    ※ --x : 전위 감소 -> -1을 하고 연산을 한다.
    ※ x-- : 후위 감소 -> 연산을 하고 +-을 한다
  1. ⭐비교 연산자 😎 :
    ※ 결과값 true, false를 반환
    ※ == <깉은지 비교> / != <다른지 비교>
// ★ 만약 x,y를 아래와 같이 선언 후 초기화를 한다면?
int x = 2;
int y = 1;

▶ 응용식

  • 20 이상 30이하에 있는지 판단
    : x >= 20 && x <= 30

  • 20 초과 30미만에 있는지 판단
    : x > 20 && x < 30

  1. ⭐논리 연산자 😎 :
    ※ && (논리and) : 앰퍼샌드(ampersand)라고 하며, 모두 참이여야 참을 반환한다
    ㄴ하나라도 거짓이면 거짓! (교집합과 같다)
    ※ || (논리or) : 파이프(pipe)라고 하며, 하나만 참이면 참을 반환한다
    ㄴ모두 거짓이여야 거짓! (합집합과 같다)
    ※ ! (논리not) : 아니다(not)이라고 하며, 반대의 논리를 반환하는 연산자.
    ㄴ참이면 거짓을 반환, 거짓이면 참을 반환한다.

▶ 응용식

  • 2의 배수 또는 3의 배수를 판단(y)
    : y % 2 == 0 || y % 3 == 0
    ㄴy를 2 또는 3으로 나누었을 때 1개라도 나머지가 0이면 됨

  • 2의 배수와 3의 배수를 판단(z) = 2와 3의 공배수 = 6의 배수
    : y % 2 == 0 && y % 3 == 0
    ㄴy를 2 그리고 3으로 나누었을 때 모두 나머지가 0이어야 함
    ㄴ6의 배수를 구하는 식

  • f가 알파벳인지 아닌지 판단
    : ('a'<=f && f<='z') || ('A'<=f && f<='Z')
    ㄴf가 소문자 범위를 비교하고 대문자 범위를 비교해서 하나라도 일치하면 알파벳

  1. ⭐조건 연산자(삼항 연산자) 😎 : 웹 또는 앱에서 많이 사용한다
    ※ 형식: 조건식 ? 값1 : 값2
    : 조건식이 참(true)일 경우 값1가 출력된다.
    : 조건식이 거짓(false)일 경우 값2가 출력된다.
  1. ⭐ SCE(Short-Circuit Evaluation) : 단락회로평가
  • 논리And의 경우 앞의 조건이 false 이면 뒤의 식은 실행조차 하지 않고
    무조건 fasle를 반환한다.
int num1 = 0, num2 = 0;
boolean result;

result = (num1 += 10 ) < 0 && (num2 += 10) > 0;

&& = 둘 다 일치해야 참이다. 하지만 num1부터 false이기에 num2는 보지도 않고
false를 반환한다.
  • 논리Or의 경우 앞의 조건이 true 이면 뒤의 식은 실행조차 하지 않고
    무조건 true를 반환한다.
    결과는 뒷 부분의 코드는 실행되지 않는다. (쓰레기 코드가 된다.)
    ※ 그러므로 쓰레기 코드가 발생하지 않도록 잘 짜야 한다.
int num1 = 0, num2 = 0;
boolean result;
result = (num1 += 10) > 0 || (num2 += 10) > 0;

|| = 둘 중 하나만 일치하면 참을 반환한다. 하지만 num1부터 true이기에
num2는 보지도 않고 true를 반환한다.
  1. ⭐ 연산자 우선순위😎
  • 과거 인터넷을 뜨겁게 달군 식이 있다.
    48÷2(9+3) = 무엇일까?
  • 어떤 사람은 288 어떤 사람은 2 라고 대답을 한다.
    과연 무엇이 정답일까?
  • 이는 대수학을 공부하는 사람에게는 2가 정답이라고 하지만
    일반적인 경우는 288이 정답이다.
    그리고 프로그래밍에서 역시 288을 정답이라고 한다.

이 갈등은 2(9+3) 이것을 먼저 푸느냐? 48÷2 이것을 먼저 푸느냐에 달려있다.
일반적인 계산에서는 48÷2를 먼저 푸는 것을 정답으로 보고 있다.
이와 같이 연산자에도 우선순위가 있다.

  1. ⭐ 심화: 비트 연산자 😎
  • 비트 단위(2진수)로 연산을 한다.
  • <비트 연산자를 사용하는 이유> : 일반적으로 숫자를 곱하거나 나누게 되는 것보다
    10진수보다 컴퓨터랑 친한 비트 연산이기 때문에 속도가 더 빠르다.

X = 00001101 (13)
Y = 00000101 (5)

  • |(OR연산자) : 하나라도 값이 1이면 1의 결과, 그 외는 0을 얻는다
    답: (2진수) 00001101 (13)이 된다.
  • &(AND연산자) : 모두 1일 경우면 1로 표현된다.
    답: (2진수) 00000101 (5)가 된다.
  • ^(XOR연산자) : 하나가 1, 다른 하나가 0일 경우 결과가 1로 표현된다
    답: (2진수) 00001000 (8)이 된다.
  • ~(비트 전환연산자) 0은 1로, 1은 0으로 바꾼다.<논리 부정 연산자 '!'과 비슷하다>
    문제 : (2진수) 00001010 (10)
    답 : (2진수) 11110101 (245)가 된다.

★ 참고 자료01 : 진수에 대한 용어 정리
Hex : 16진수 ( hexadecimal )
Dec : 10진수 ( decimal )
Oct : 8진수 ( octal )
Bin : 2진수 ( binary )

★ 참고 자료02: 10진수를 2진수로 바꾸는 방법

(10진수) 11 = (2진수) 1011이다.

★ 참고 자료03 : 2진수를 10진수로 바꾸는 방법

(2진수) 01011000을 10진수로 바꾸면?
자리마다 2^X 제곱을 나열하고 1이 있는 것만 더해주면 된다.
64+16+8 = 88 (10진수)

★ 참고 자료04 : JAVA에서는 10진수를 2진수로 바꾸는 함수가 존재한다.

		int x = 10;
		System.out.println(Integer.toBinaryString(x));
        //결과 10을 2진수로 변환한 값이 출력된다.
  1. ⭐ 심화: 쉬프트 연산자 😎

x = 0000001101 (13)
x >> 1 = 0000000110 (6)
x >> 2 = 0000000011 (3)

y = 0000000101 (5)
y << 1 = 0000001010 (10)
y << 2 = 0000010100 (20)

왼쪽 쉬프트(<<n)은 2^n을 곱한 결과와 같다.
오른쪽 쉬프트(>>n)은 2^n으로 나눈 결과와 같다.

<Step.2> 디버그(debug) 하는 법

  • 자바(JAVA)에서 디버그는 오타를 찾는 코드를 검사하거나 코드 분석기를 사용한다.
    정말 중요하며 로그를 분석하는 것과 비슷하다.
    정말 많이 사용합니다.
  1. 메인 왼쪽 줄을 숫자로 표시한 곳에 마우스 우클릭
    ㄴToggle Breakpoint를 찍는다.
  1. F11을 누르고 Swich를 클릭하면 디버그 모드로 전환된다.

  2. 위쪽에 step into와 step over 버튼이 있다.

  • step over(F6) : 한줄을 실행합니다. 함수가 있다면 건너 띄어버립니다.
  • step into(F5) : 함수 내부로 들어갑니다.
    <다음이 메소드 진입 부분이라면 이 버튼을 눌러야 함>

<Step.3> 발전을 위한 문제풀이 (kama_code 출제)

  1. 정수 2개를 입력받아 사칙연산을 출력하는 프로그램을 만드시오.
  2. 국어(kor): 75점 영어(eng): 53점 수학(mat): 81점 사회(sco): 38점
    과학(sci): 62점 → 5가지의 과목의 합계 평균을 출력하시오.
  3. 현이의 주민등록번호(891009-1577829)이다. 주민등록번호의 앞자리와
    뒷자리를 잘라서 따로 출력하는 프로그램을 만드시오.
    → substring(index시작 , index끝);
  4. 사용자로부터 시급이 얼마? 하루 근무시간? 한달 근무일수? 인센티브(보너스)?를
    입력받아 세금과 지급액을 출력하는 프로그램을 만드시오.
    ※ 지급액은 월급에서 세금 3.3%를 빼고 출력한다.
    (월급 x 0.967) < 100에서 0.033을 뺀 값
  5. 사용자로부터 입력값을 받아서 사다리꼴의 면적을 구하는 프로그램을 만드시오
    사다리꼴 면적: (윗변 + 아랫변) * 높이 / 2
  6. 철수와 영희와 민수는 함께 외식을 하고 똑같이 더치페이를 하기로 했다
    삼겹살 3인분 된장찌개 2인분 사이다 5개 물냉면 2그릇 돼지껍데기 5인분을 먹었다.
    1인당 내야 할 금액을 출력하는 프로그램을 만드시오.
  • 삼겹살(1인분) 18750원 / 된장찌개(1인분) 7500원 / 사이다(1개) 1280원
    물냉면(1그릇) 9300원 / 돼지껍데기(1인분) 10780원
  1. x의 반환형이 정수(int)로 선언과 동시에 값을 1234567로 초기화하고
    삼항연산자를 이용해서 x가 3의 배수이면서 7의 배수라면 '야호' 아니면
    '아니여따' 를 출력하는 프로그램을 만드시오.
  2. num01~04는 반환값이 int면서 7로 초기화한다.
    num2는 전위증가, num3은 전위감소
    num4는 후위증가, num5은 후위감소를 출력하는 프로그램을 만드시요.
  3. 사용자로부터 문자 하나를 입력하는 값을 받고 삼항연산자를 이용해서
    첫번째 문자가 알파벳인지 아닌지 판단하는 프로그램을 만드시오
    알파벳이라면 알파벳이다. 아니면 알파벳이 아니다라고 출력되어야 한다.
  4. 시프트 연산자를 사용해서 22를
    2배, 0.5배, 4배, n/2의2승배, 8배, n/2의3승배한 값을 출력하시오

★ 정답 및 해설 ☆

  1. 정수 2개를 입력하면 아래처럼 사칙연산을 한다.
    ※ 나눗셈은 /는 몫만 구하며 %는 나머지만 구한다는 것을 주의하자 !

  2. 문제에 국영수사과: 과목에 대한 변수를 정해주었다.
    아래 사진처럼 ,(쉼표)를 통해 한꺼번에 선언과 초기화도 해줄 수 있다.

  3. 문자열(String)을 인덱스(index)에 맞춰 자르는 subString()
    주민 앞자리는 첫번째부터 7번째 전까지 끊어준다.
    주민 뒷자리는 8번째부터 끝까지 끊어준다.

  4. 세금은 0.033 으로 소수가 들어가므로 int 정수형으로 표현할 수 없다.
    그래서 강제형변환이 필요하다.
    ※ 바로 이 경우가 강제형변환이 필요할 때이며
    강제형변환할 때 데이터 손실이 발생하므로 개발자가 판단하여
    데이터 손실이 발생해도 상관없다! 한다면 강제형변환을 진행한다.

  5. <센스> '3'으로 나누었을때 나머지가 0이면 3의 배수이다.
    이는 21의 배수를 묻는 식이다. 1234567은 21로 나누어 떨어지지 않으므로
    false로 "아니여따" 라는 뒤의 결과가 출력된다.

  6. 정~말 중요한 증감 연산자이다.
    앞으로 배울 반복문에서 단골처럼 나온다.
    앞에 연산이 붙으면 연산하고 대입해서 출력!
    뒤에 연산이 붙으면 출력하고 그 다음 연산을 한다.
    num4와 num5는 대입을 먼저 하기에 연산 전의 프린트가 출력되고
    실제는 +1,-1이 된 상태이다. ( 보이진 않지만.. )

  7. Scanner는 ※ 문자형(char)을 반환할 수 없다.
    그래서 String(문자열)로 받고 그 다음에
    문자열을 문자(char) 형식으로 바꿔주는 것이다.
    그리고 0번째 인덱스(첫번째) 문자를 담아서 저장하는 것이다.
    아래와 같은 결과가 나온다.
    그리고 print는 '싱글쿼테이션과 "더블쿼테이션을 출력할 수 없기에
    (백슬래쉬)를 넣어서 실체화하여 출력한다.

  8. 비트연산자를 사용하는 이유는 속도가 더 빠르기 때문이다.

  • << 2의 배수로 숫자가 커진다는 것을 알 수 있으며
    +>> 2의 배수로 숫자가 작아진다는 것을 알 수 있다.

직접 문제를 만들어오면서 정말 긴 포스팅이 되었다.
연산자까지 5분의 1까지 왔다.
앞으로도 꿀 떨어지는 포스팅을 많이 기대해주길 바란다.
^^

profile
[Java SQL HTML CSS JS Studying] 발전을 꿈꾸며 이상을 실현합니다
post-custom-banner

0개의 댓글