JAVA

DAY 3-1 연산 (2024.07.05)

summ.n 2024. 8. 13. 17:51

int a; 정수형 변수 → 현재 쓰레기 값 들어가있음

int b = 20;

double c; 실수형 변수

String d = "apple"

클래스형 타입이 들어옴 → 클래스형 변수다 말하는게 맞음

→ but, 객체라고 부름(클래스의 주소값을 가지고 있다.)

→ 객체는 "apple"의 주소를 가지고 있다.


d도 변수 / 방이 생김 /

"apple"은 heap이라는 영역에 / 주소는 d변수가 담고있음.(언제든지 "apple"에 찾아갈 수 o)

방 안에 주소가 들어간 것.

 

a,b,c는 변수(방이 잡히면서 초기값이 들어가거나 쓰레기값이 들어감)

a.b.c는 Stack영역에 잡힘

 


연산자

1. 최우선 연산자

( ) ++ --

 

 

2. 산술연산자

+ - * / % (나머지 - 항이 반드시 정수형이어야 함.)

 

 

3. 관계연산자

> 크다

< 작다

>=

<=

==

!=

 

 

 

4. 논리연산자

- 조건이 2개 이상일 때

 

① && (AND) - 모든 조건이 참일 때 참

② || (OR) - 조건 중에서 1개라도 참이면 참

 

③ & (AND) - 모든 조건이 참일 때 참 (조건 두 개 다 해봐야해서 처리속도 차이 남)

④ | (OR) - 조건 중에서 1개라도 참이면 참

 

 

5. 조건연산자 (삼항 연산자)

[형식]

조건 ? 참 : 거짓 ;

 

 

6. 증감 연산자

++

 

 

7. 대입 연산자

+=

-=

*=

/=

%=

 

a=a+1 -> a+=1 -> ++a, a++

a=a-1 -> a-=1 -> --a, a--

선행 후행

 

ex)

int b = a++;

1. int b=a; b → 22

2. a++; a → 23

 

int c = ++a - b--;

1. ++a a → 24

2. a- b 24 -22

3. b-- b → 21

 

 

 

8. 부정(NOT) 연산자

!

 

true -> false

false -> true


bit 연산자 => 0 또는 1

1. ~ (bit NOT, 1의 보수)

0 -> 1

1 -> 0

 

2. bit 논리 연산자

① & (AND) - 모두 1일 때 1

② | (OR) - 1개라도 1이면 1

③ ^ (XOR) - 입력이 같으면 `0`, 다르면 `1`의 출력

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가
  • 4행 선택4행 다음에 행 추가
셀 전체 선택
열 너비 조절
행 높이 조절

&
(AND)
|
(OR)
^
(XOR)
0 0
0
0
0
0 1
0
1
1
1 0
0
1
1
1 1
0
1
0
  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

 

3. bit 이동연산자 - Shift 연산자

① <<

② >>


Scanner scan = new Scanner(System.in);

변수 scan Scanner

500번지

(주소가지고 있음)

 


[문제] 동전 교환

현금을 입력하여 천, 백, 십, 일의 개수를 구하시오

 

[실행결과]

현금 입력 : 5723

천원 : 5장

백원 : 7개

십원 : 2개

일원 : 3개

 

Operator01.java

package operator;

import java.util.Scanner;

public class Operator01 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in); //키보드를 통해서 입력할 수 있는 클래스 생성
		
		System.out.print("현금 입력 : ");
		int money = scan.nextInt();
		
		System.out.println("천원 : " + (money / 1000) + "장");
		System.out.println("백원 : " + ((money%1000) / 100) + "개");
		System.out.println("십원 : " + ((money%1000%100) / 10) + "개");
		System.out.println("일원 : " + ((money%1000%100%10) / 1)  + "개");
	}
}
 
현금 입력 : 5723
천원 : 5장
백원 : 7개
십원 : 2개
일원 : 3개
 

[문제] 점수를 입력하여 합격인지 불합격인지 판별하는 프로그램

점수가 80~100 사이면 합격으로 한다.

 

Operator02.java

package operator;

import java.util.Scanner;

public class Operator02 {
	
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		System.out.print("점수 입력 : ");
		int score = scan.nextInt();
		
		System.out.println(score >= 80 && score <=100 ? "합격" : "불합격");
	}
}
 
점수 입력 : 50
불합격

점수 입력 : 90
합격
 

Operator03.java

package operator;

public class Operator03 {

	public static void main(String[] args) {
		int a = 5;
		a += 2; // a = a + 2
		a *= 3; // a = a * 3
		
		System.out.println("a=" +a); //a=21

		a++;
		System.out.println("a=" +a); //a=22
		
		int b = a++;
		System.out.println("a=" + a + " b=" + b); //a=23 b=22
		
		int c = ++a - b--;
		System.out.println("a=" + a + " b=" + b + " c=" + c); // a=24 b=21 c=2
		
		System.out.println("a++=" + a++); // a++=24
		System.out.println("a=" +a); //a=25
	}

}
 
a=21
a=22
a=23 b=22
a=24 b=21 c=2
a++=24
a=25
 

Operator04.java

package operator;

public class Operator04 {

	public static void main(String[] args) {
		int num1=0, num2=0;
		boolean result;
		
		result = ( (num1+=10) < 0 && (num2+=10) > 0 ); //앞에가 거짓이므로 뒤에 수행 x
		
		System.out.println("result = "+result); //result = false
		System.out.println("num1 = "+ num1 + " num2 = "+ num2); // num1 = 10 num2 = 0
		System.out.println();
		
		result = ( (num1+=10) > 0 || (num2+=10) > 0 ); //결과가 뻔하면 뒤에꺼 수행x
		System.out.println("result = "+result); //result = true
		System.out.println("num1 = "+ num1 + " num2 = "+ num2); //num1 = 20 num2 = 0
	}
}
 
result = false
num1 = 10 num2 = 0

result = true
num1 = 20 num2 = 0
 

★ && → 둘다 참일 때 참

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

이 경우는 앞에가 이미 거짓이므로 뒤에꺼를 수행하지 않음.

num1 = 10 num2 = 0

 

★ || → 둘 중 하나라도 참이면 참

(num1+=10) > 0 || (num2+=10) > 0

이 경우는 앞에가 이미 참이므로 결과가 뻔해서 뒤에꺼를 수행하지 않음.

num1 = 20 num2 = 0


Operator05.java

package operator;

public class Operator05 {
	public static void main(String[] args) {
		boolean a = 25 > 36;
		System.out.println("a = " + a); // false니까 a에는 0 들어감
		System.out.println("!a = " + !a); // false니까 a에는 0 들어감
		System.out.println();
		
		String b = "apple"; // 변수 -> 객체  문자열은 메모리에/ 주소(시작위치)는 변수에 담김. 
		                    // b에는 apple이라는 글자가 아니라 주소를 주는 것
		
		String c = "apple"; // 메모리에 문자열 잡히지 x 이미 똑같은거 있으므로
		                    // b가 가리키는 주소 똑같이 가리킴.  
		                    // ex) tv가 한 대인데 리모콘이 두 개
		
		String d = new String("apple"); // new라는 연산자를 쓰면 메모리에 계속 새로 만듦.  
		                                // String 안에 "apple" / d는 주소를 가짐.
		
		
		//주소 비교 !! 문자열 비교아님.
		System.out.println("b == c : " + (b == c ? "같다" : "다르다")); 
		//주소 비교
		System.out.println("b == d : " + (b == d ? "같다" : "다르다")); 
		System.out.println();
		
		
		//문자열 자체 비교
		System.out.println("b.equals(c) : " + (b.equals(c) ? "같다" : "다르다"));
		//문자열 자체 비교
		System.out.println("b.equals(d) : " + (b.equals(d) ? "같다" : "다르다")); 
		System.out.println();
		
		
		//문자열 자체 비교 -> 부정
		System.out.println("!b.equals(c) : " + (!b.equals(c) ? "같다" : "다르다"));
		//문자열 자체 비교 -> 부정
		System.out.println("!b.equals(d) : " + (!b.equals(d) ? "같다" : "다르다")); 
		System.out.println();
	}
}
 
a = false
!a = true

b == c : 같다
b == d : 다르다

b.equals(c) : 같다
b.equals(d) : 같다

!b.equals(c) : 다르다
!b.equals(d) : 다르다
 

[문제] 월급 계산 프로그램

이름, 직급, 기본급, 수당을 입력하여 합계, 세금, 월급을 출력하시오

 

합계 = 기본급 + 수당

세금 = 합계 * 세율

월급 = 합계 - 세금

 

[조건]

1. 세율 - 조건 연산자 이용

합계가 5,000,000원 이상이면 3% (0.03)

3,000,000원 이상이면 2% (0.02)

아니면 1% (0.01)

2. 숫자는 3자리마다 , 표시

3. 소수이하는 표시하지 않는다. (정수형)

4. Scanner 클래스 사용

 

[실행결과]

이름 입력 : 홍길동

직급 입력 : 부장

기본급 입력 : 4900000

수당 입력 : 200000

 

*** 홍길동 부장 월급 ***

기본급 : 4,900,000원

수당 : 200,000원

합계 : 5,100,000원

세금 : 153,000원

월급 : 4,947,000원

 

 

Salary.java

package operator;

import java.text.DecimalFormat;
import java.util.Scanner;

public class Salary {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		DecimalFormat df = new DecimalFormat();

		System.out.print("이름 입력 : ");
		String name = scan.next();
		System.out.print("직급 입력 : ");
		String job = scan.next();
		System.out.print("기본급 입력 : ");
		int basic = scan.nextInt();
		System.out.print("수당 입력 : ");
		int extra = scan.nextInt();

		int tot = basic + extra;
		double rate; //세율
		rate = tot >= 5000000 ? 0.03 : tot >= 3000000 ? 0.02 : 0.01;		
		
		int tax = (int)(tot * rate);
		int salary = tot - tax;

		System.out.println("*** "+ name + " " + job + " 월급 ***");
		System.out.println("기본급 : " + df.format(basic) + "원");
		System.out.println("수당 : " + df.format(extra) + "원");
		System.out.println("합계 : " + df.format(tot) + "원");
		System.out.println("세금 : " + df.format(tax) + "원");
		System.out.println("월급 : " + df.format(salary) + "원");

	}

}
 
이름 입력 : 홍길동
직급 입력 : 부장
기본급 입력 : 4900000
수당 입력 : 200000
*** 홍길동 부장 월급 ***
기본급 : 4,900,000원
수당 : 200,000원
합계 : 5,100,000원
세금 : 153,000원
월급 : 4,947,000원