관리 메뉴

거니의 velog

230706 자바 강의 본문

대덕인재개발원_Java

230706 자바 강의

Unlimited00 2023. 7. 12. 17:40

[Homework_02_02.java 문제풀이]

package ddit.chap02.sec03;

public class Homework_02_02 {

	public static void main(String[] args) {
		
		// 1년은 356.2422일이다. 이를 xxx일 xx시간 xx분 xx초로 환산하시오.
		
		// 모범 답안
		
		// 날수
		double year = 365.2422;
		int days = (int)year;
		
		// 시간
		double hours = (year - days) * 24;
		int hour = (int)hours;
		
		// 분
		double minutes = (hours - hour) * 60;
		int minute = (int)minutes;
		
		// 초
		double seconds = (minutes - minute) * 60;
		int second = (int)seconds;
		
		System.out.println("1년은 " + days + "일 " + hour + "시간 " + minute + "분 " + second + "초 입니다."); // 1년은 365일 5시간 48분 46초 입니다.
		
	}

}

operand + operand => 이항 연산자.

 

단항 연산자?(우선순위 가장 높음)

가장 많이 사용되는 연산자가 증감 연산자(++, --).

 

int res = 0;

int i = 10;

res = i++; 후위식 => i = 11, res = 10.

res = ++i; 전위식 => I = 11, res = 11.

 

System.out.println(i++); // 10

System.out.println(++i); // 11

 

! = not. 토글 기능

~ = 1의 보수. 음수를 구할 때 사용.

 

% 나머지 구하기

100의 나머지 경우의 수 : 100가지(0~99)

7의 나머지 경우의 수 : 7가지(0~6)


[달력 구하는 공식]

서기 111일부터 오늘 날짜까지 평년 윤년 다 계산해서 구함.

거기에 +1

7로 나눈 나머지 값으로 요일을 구함. 0(일요일) ~ 6(토요일)

[윤년 기준]

(year % 4 == 0 && year % 100 == 0) || year % 400 == 0

 

operand + operand => 연산자 오버로딩이 일어남.

문자열 + anytype => 하나의 문자열로 합쳐짐(concat).

 

!, <> 같지 않다.

 

instanceof. 자식 클래스가 부모 클래스의 이름으로 들어갈 때, 자식 클래스가 본연 클래스로 환원될 때, 부모와 자식의 클래스 타입이 같은가?

 

%, |, ^ : 비트 별 논리 연산자. 결과가 숫자값(0, 1 => 배타적 논리합). 비트별로 두 개가 서로 같으냐 다르냐 비교.


<시프트 연산자>

 

a << b  오른쪽 시프트.

- 데이터 ab 비트만큼 오른쪽으로 평행 이동. 빈 공간이 왼쪽에 발생.

부호 bit는 이동되지 않음. 0 양수, 1 음수.

왼쪽에 발생된 빈 공간은 부호 bit가 확장되어 들어감. padding.

결과. a2^b 값으로 나눈 몫.

17 >> 2 = 17/2^2 = 4, 나머지 1.
(부호비트)         00010001 = 17.
2비트 이동하면 00000100 = 4.

 

a << b  왼쪽 시프트.

a를 왼쪽으로 b 비트만큼 왼쪽으로 평행이동. 빈 공간이 오른쪽에 발생.

발생된 빈 공간은 ‘0’으로 채움

부호 비트는 이동되지 않음.

a * 2^b의 결과

17 << 2 = 17*4 = 68.
00010001 = 17.
01000100 = 68.

 

a >>> b => 로지컬 시프트.

ab비트만큼 오른쪽으로 평행이동.

부호비트도 같이 이동된다는 특징이 있음.

남는 기억 장소는 0으로 채워짐.

따라서 양수로 변함. 부호 비트가 0으로 바뀌므로.


[UnaryOperatorExample.java]

package ddit.chap03.sec01;

public class UnaryOperatorExample {

	public static void main(String[] args) {
		
		// 단항 연산자 : (++, --) / (+, -) => 부호 연산자 / ! (not)
		incrementOperator();
		signOperator();
		
	}
	
	public static void incrementOperator() {
		
		int res = 0;
		int incre = 10;
		int decre = 10;
		
		res = incre++;
		System.out.println("res : " + res + ", incre : " + incre); // res : 10, incre : 11
		
		res = 0;
		res = --decre;
		System.out.println("res : " + res + ", decre : " + decre); // res : 9, decre : 9
		
		int[] arr = {10, 20, 30, 40, 50};
		for(int i=0; i<arr.length;) {
//			System.out.println(arr[++i]); // 오류. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
			System.out.println(arr[i++]); // 정상
		}
		
	}
	
	public static void signOperator() {
		
		// 음수(-)와 양수(+ 또는 생략)
		
		int sum = 0; // 결과값
		int sign = -1; // 부호
		int cnt = 1; // 시작 값(1,2,3...10)
		
		while(cnt <= 10) {
			
			sign = sign * (-1);
			sum = sum + (sign * cnt);
			
			if(sign > 0 && cnt != 1) {
				System.out.print("+" + cnt);
			}else {
				System.out.print(sign * cnt);
			}
			
			cnt++;
			
		}
		
		System.out.println("=" + sum); // 1-2+3-4+5-6+7-8+9-10=-5
		
	}

}

[BinaryOperatorExample.java]

package ddit.chap03.sec01;

import java.util.Scanner;

public class BinaryOperatorExample {
	
	public static void main(String[] args) {
		
//		arithmeticOperator();
//		relationalOperator();
//		relationalOperator2();
		logicalOperator();
		
	}
	
	public static void arithmeticOperator() {
		
		// +, -, *, /, %
		
		// 1~100 사이의 짝수의 합과 홀수의 합을 출력.
		
		int even = 0; // 짝수의 합
		int odd = 0; // 홀수의 합
		
		for(int i = 1; i < 101; i++) {
			if(i % 2 == 0) {
				even += i;
			}else {
				odd += i;
			}
		}
		
		System.out.println("짝수의 합 = " + even);
		System.out.println("홀수의 합 = " + odd);
		
	}
	
	public static void relationalOperator() {
		
		// 비교(관계)연산 : 크기 비교( >, <, =, >=, <=, !=(<>) )
		// 결과는 true / false 이고, 주로 조건문에 사용.
		
		// 키보드로 입력받은 점수가
		// 90-100 : A학점
		//  80-89 : B학점
		//  70-79 : C학점
		//  60-69 : D학점
		//  그 이하 : F학점을 출력
		
		String grade = "";
		Scanner sc = new Scanner(System.in);
		System.out.print("점수 : ");
		int score = sc.nextInt();
		
		if(score >= 90) {
			grade = "A학점";
		}else if(score >= 80 && score <= 89) {
			grade = "B학점";
		}else if(score >= 70) {
			grade = "C학점";
		}else if(score >= 60) {
			grade = "D학점";
		}else {
			grade = "F학점";
		}

		sc.close();
		
		System.out.println(score + "점은 " + grade + " 입니다.");
		
	}
	
	public static void relationalOperator2() {
		
		// 키보드로 나이(10세 이상)를 입력받아 그 사람이 어느 구간에 속하는지 출력
		// ex) 35세이면 -> "30대 입니다.", 56세이면 "50대 입니다."
		
//		String ageRange = "";
//		Scanner sc = new Scanner(System.in);
//		System.out.print("나이 : ");
////		int age = sc.nextInt();
//		int age = Integer.parseInt(sc.nextLine());
//		
//		if(age >= 60) {
//			ageRange = "60대 이상";
//		}else if(age >= 50) {
//			ageRange = "50대";
//		}else if(age >= 40) {
//			ageRange = "40대";
//		}else if(age >= 30) {
//			ageRange = "30대";
//		}else if(age >= 20) {
//			ageRange = "20대";
//		}else if(age >= 10) {
//			ageRange = "10대";
//		}else {
//			ageRange = "10대 이하(유년기)";
//		}
//		
//		sc.close();
//		
//		System.out.println(age + "세는 " + ageRange + " 입니다.");
		
		/////////////////////////////////////
		
		Scanner sc = new Scanner(System.in);
		System.out.print("나이 : ");
		int age1 = Integer.parseInt(sc.nextLine()); // 엔터키 입력 전까지 문자열을 입력받아 정수로 변환.
		int ageRange2 = (age1 / 10) * 10;
		String message = ageRange2 + "대입니다.";
		System.out.println(age1 + "세는 " + message);
		
	}
	
	public static void logicalOperator() {
		
		// 논리 연산자 : !(not), &&(and), ||(or), 연산순위 나열 순.
		// 자신의 출생년도를 입력 받아 윤년과 평년을 판단하시오.
		// 윤년 : (4의 배수이면서 100의 배수가 아닌 해이거나) (400의 배수가 되는 해).
		Scanner sc = new Scanner(System.in);
		
		System.out.print("출생연도 : ");
		int year = Integer.parseInt(sc.nextLine()); // 엔터키 입력 전까지 문자열을 입력받아 정수로 변환.
		
		if((year%4==0 && year%100!=0) || (year%400==0)) {
			System.out.println(year + "년은 윤년입니다."); // 2020년 기준 윤년
 		}else {
			System.out.println(year + "년은 평년입니다.");
		}
		
		sc.close();
		
	}
	
}

[BinaryOperatorExample02.java]

package ddit.chap03.sec01;

public class BinaryOperatorExample02 {

	public static void main(String[] args) {
		
		bitwiserOperator();
		shiftOperator();
		assginmentOperator();

	}
	
	public static void bitwiserOperator() {
		
		// |, &, ^(exclusive-or, 배타적 논리합)
		// 연산결과가 숫자값.
		
		// 34 = 00100010;
		// 19 = 00010011;
		
		// &  = 00000010; - 2 => 두 수 사이 곱하기
		// |  = 00110011; - 51
		// ^  = 00110001; - 49
		
		int num1 = 34;
		int num2 = 19;
		
		System.out.println("& (비트별 AND) = " + (num1 & num2)); // & (비트별 AND) = 2
		System.out.println("| (비트별 OR) = " + (num1 | num2)); // | (비트별 OR) = 51
		System.out.println("^ (비트별 ex-OR) = " + (num1 ^ num2)); // ^ (비트별 ex-OR) = 49
		
	}
	
	public static void shiftOperator() {
		
		// >>(right shift), <<(left shift), >>>(logical right shift)
		int num1 = 17;
		int num2 = -17;
		
		System.out.println("num1>>2 : " + (num1>>2)); // num1>>2 : 4
		System.out.println("num1<<2 : " + (num1<<2)); // num1<<2 : 68
		System.out.println("num2>>>2 : " + (num2>>>2)); // num2>>>2 : 1073741819
		
	}
	
	public static void assginmentOperator() {
		
		// =
		// 결합 연산자 : +=, -=, *=, /=, %=
		// 연산식의 형태가 "변수1 = 변수1 연산자(+, -, *, /, %) 값"
		// -> 변수 1은 연산에 참여하고 결과가 기억되는 기억공간.
		
		// sum = sum + cnt;
		// sum += cnt;
		
		// sum = sum * (cnt + 1);
		// sum *= (cnt + 1);
		int sum = 0;
		for(int i=0; i<1000; i++) {
//			sum = sum + i;
			sum += i;
		}
		System.out.println("sum : " + sum);
		
	}

}

'대덕인재개발원_Java' 카테고리의 다른 글

230710 자바 강의  (0) 2023.07.12
230707 자바 강의  (0) 2023.07.12
230705 자바 강의  (0) 2023.07.12
230704 자바 강의  (0) 2023.07.11
230703 첫 자바 강의  (0) 2023.07.11