Study Web Development

10월 29일

이전으로

자바

3. 연산자

산술 연산자

  1. 새 클래스 OperatorMain03 생성
    • 클래스 오른쪽 클릭하여 Refactor-Rename... 선택시 클래스명 변경 가능
public class OperatorMain03 {
	public static void main(String[] args) {
		int korean = 90;
		int english = 95;
		int math = 88;
		
		// 총점 구하기
		int sum = korean + english + math;
		// 평균 구하기
		int avg = sum / 3;
		
		System.out.printf("국어 : %d점\n영어 : %d점\n수학 : %d점\n총점 : %d점\n평균 : %d점", korean, english, math, sum, avg);
	}
}

시프트 연산자, 비트 연산자

비교(관계) 연산자

연산자 의미 순위
> 크다 4순위
< 작다
>= 크거나 같다
<= 작거나 같다
== 같다
!= 같지 않다
  1. 새 클래스 OperatorMain04 생성
public class OperatorMain04 {
	public static void main(String[] args) {
		System.out.println("====비교 연산자====");
		boolean result;
		int a = 10;
		double b = 10.5;
		
		result = a < b; // int인 a가 double로 자동 형변환되어 a와 b의 연산이 수행되며, 연산 결과는 boolean
		System.out.println("a < b : " + result);
		
		result = a > b;
		System.out.println("a > b : " + result);
		
		result = a >= b;
		System.out.println("a >= b : " + result);
		
		result = a <= b;
		System.out.println("a <= b : " + result);
		
		result = a == b;
		System.out.println("a == b : " + result);
		
		result = a != b;
		System.out.println("a != b : " + result);
	}
}

논리 연산자

연산자 의미 순위
&& AND(논리곱) 6순위
|| OR(논리합)
! 부정 1순위
  1. 새 클래스 OperatorMain05 생성
public class OperatorMain05 {
	public static void main(String[] args) {
		System.out.println("====논리 연산자====");
		boolean a, b, result;
		a = true;
		b = false;
		
		result = a && b;
		System.out.println("a && b = " + result);
		
		result = a || b;
		System.out.println("a || b = " + result);
		
		result = !a;
		System.out.println("!a = " + result);
	}
}
  1. 새 클래스 OperatorMain06 생성
public class OperatorMain06 {
	public static void main(String[] args) {
		// 증감 연산자, 비교 연산자, 논리 연산자
		int a, b;
		a = b = 10;
		
		boolean c = a++ >= ++b && ++a > b++; // 전건은 10>=11 연산 후 a를 11로 변경하며, 논리곱의 전건이 false이므로 후건은 실행하지 않음

		System.out.println(a + ", " + b);
		System.out.println("c = " + c);
		
		int d, e;
		d = e = 10;
		
		boolean f = ++d > e++ || d++ >= ++e; // 전건은 11>10 연산 후 e를 11로 변경하며, 논리합의 전건이 true이므로 후건은 실행하지 않음
		
		System.out.println(d + ", " + e);
		System.out.println("f = " + f);
	}
}

조건(삼항) 연산자

연산자 의미 순위
?: 조건?참값:거짓값 7순위
  1. 새 클래스 OperatorMain07 생성
    • 이클립스에서 syso 입력 후 ctrl+space 입력시 System.out.println();이 자동 완성됨.
public class OperatorMain07 {
	public static void main(String[] args) {
		System.out.println("====조건(삼항) 연산자====");
		
		int x = 10, y = -10;
		
		int absX = x >= 0 ? x : -x; // 연산자 우선순위로 인해 소괄호 없어도 동작하지만, 가독성을 위해 소괄호 사용해도 관계없음
		int absY = (y >= 0) ? y : -y;
		System.out.println("x = " + x + "일 때 x의 절대값은 = " + absX);
		System.out.println("x = " + y + "일 때 y의 절대값은 = " + absY);
	}
}
  1. 새 클래스 OperatorMain08 생성
public class OperatorMain08 {
	public static void main(String[] args) {
		System.out.println("====조건(삼항) 연산자====");
		int a = 5, b = 10;
		int max, min;
		
		max = a > b ? a : b;
		min = a < b ? a : b;
		
		System.out.println(a + "와 " + b + "의 최댓값은 " + max);
		System.out.println(a + "와 " + b + "의 최솟값은 " + min);
	}
}

대입 연산자

연산자 의미 순위
= 연산자 오른쪽 값을 왼쪽 변수에 대입 8순위
+= 연산자 왼쪽 변수 값과 오른쪽 값을 덧셈하여 왼쪽 변수에 대입
-= 연산자 왼쪽 변수 값과 오른쪽 값을 뺄셈하여 왼쪽 변수에 대입
*= 연산자 왼쪽 변수 값과 오른쪽 값을 곱셈하여 왼쪽 변수에 대입
/= 연산자 왼쪽 변수 값과 오른쪽 값을 나눗셈하여 몫을 왼쪽 변수에 대입
%= 연산자 왼쪽 변수 값과 오른쪽 값을 나눗셈하여 나머지를 왼쪽 변수에 대입
  1. 새 클래스 OperatorMain09 생성
public class OperatorMain09 {
	public static void main(String[] args) {
		System.out.println("====대입 연산자====");
		int a = 5, b = 7;
		
		a += b; // a = a + b
		System.out.println("a = " + a);
		
		a -= b; // a = a - b
		System.out.println("a = " + a);
		
		a *= b; // a = a * b; a&=b는 a = a & b와 같으며, 비트 단위의 AND 연산을 수행함
		System.out.println("a = " + a);
		
		a /= b; // a = a / b
		System.out.println("a = " + a);
		
		a %= b; // a = a % b
		System.out.println("a = " + a);
	}
}
  1. 새 클래스 OperatorMain10 생성
public class OperatorMain10 {
	public static void main(String[] args) {
		/*
		 * [실습] 
		 * 534자루의 연필을 30명의 학생들에게 똑같은 개수로 나누어 줄 때,
		 * 학생 당 몇 자루를 가질 수 있고, 최종적으로 몇 자루가 남는지를 구하시오.
		 * 
		 * [출력 내용]
		 * 학생 한 명이 가지는 연필 수 : ?
		 * 남은 연필 수 : ?
		 */
		int pencils = 534, students = 30;
		System.out.printf("학생 한 명이 가지는 연필 수 : %d\n남은 연필 수 : %d\n", pencils/students, pencils%students);
	}
}
  1. 새 클래스 OperatorMain11 생성
public class OperatorMain11 {
	public static void main(String[] args) {
		/*
		 * [실습] 성적 처리
		 * 국어, 영어, 수학 성적을 입력받아서 총점, 평균(double)을 구하고 각각을 출력
		 * [출력 예시] 
		 * 국어 = 
		 * 영어 = 
		 * 수학 = 
		 * 총점 = 
		 * 평균 = (소숫점 아래 둘째 자리까지 표시)
		 */
		java.util.Scanner input = new java.util.Scanner(System.in); // 입력 시작
		
		System.out.print("국어 : "); // 입력시의 가이드 문자열; println을 쓰면 다음 줄에 입력하게 됨
		int kor = input.nextInt(); // 정수를 입력받는 함수로 값을 받아 변수에 대입
		System.out.print("영어 : ");
		int eng = input.nextInt();
		System.out.print("수학 : ");
		int math = input.nextInt();
		
		System.out.printf("국어 = %d\n영어 = %d\n수학 = %d\n총점 = %d\n평균 = %.2f", kor, eng, math, kor+eng+math, (kor+eng+math)/3d); // 만약 (kor+eng+math)/3으로 연산 후에 그 결과를 double로 형변환하게 되면, 연산은 정수끼리의 나눗셈으로 몫을 구했기 때문에 소숫점 아래 정보가 부정확해짐.
		
		input.close(); // 입력 끝
	}
}

4. 제어문

if

  1. 새 자바 프로젝트 ch03-operation 생성하고 새 클래스 IfMain01 생성
public class IfMain01 {
	public static void main(String[] args) {
		int n = 10;
		// 단일 if문
		if(n > 5) { // 소괄호 안에는 boolean 데이터가 들어감
			System.out.println("n은 5보다 크다");
		}
		
		// if문 블럭 내의 수행문이 한 줄이면 {} 블럭 생략 가능
		if(n < 5)
			System.out.println("n은 5보다 작다");
		
		System.out.println("프로그램 종료");
	}
}
  1. 새 클래스 IfMain02 생성
public class IfMain02 {
	public static void main(String[] args) {
		java.util.Scanner input = new java.util.Scanner(System.in); // 입력 시작
		
		System.out.print("정수형 데이터 한 개 입력 : ");
		int a = input.nextInt();
		
		// if~else문
		if(a % 2 == 1)
			System.out.println("홀수입니다!!");
		else
			System.out.println("짝수입니다!!");

		input.close(); // 입력 종료(메모리 자원 정리); if~else문 바로 위(입력 작업은 이미 종료됨)에 위치해도 관계없으나, 코드가 복잡해질 때의 오류를 방지하기 위해 가장 밑에 위치시킴
	}
}
  1. 새 클래스 IfMain03 생성
public class IfMain03 {
	public static void main(String[] args) {
		java.util.Scanner input = new java.util.Scanner(System.in);
		
		System.out.print("정수 한 개 입력 : ");
		int a = input.nextInt();
		
		// 다중 if문
		if(a > 0)
			System.out.println(a + "는 양수입니다.");
		else if(a < 0)
			System.out.println(a + "는 음수입니다.");
		else
			System.out.println("0입니다.");
		
		input.close();
	}
}
  1. 새 클래스 IfMain04 생성
public class IfMain04 {
	public static void main(String[] args) {
		java.util.Scanner input = new java.util.Scanner(System.in);
		
		int score;
		char grade;
		
		System.out.print("성적 입력 : ");
		score = input.nextInt();
		
		if(score > 100 || score <0)
			grade = '?';
		else if(score >= 90)
			grade = 'A';
		else if(score >= 80)
			grade = 'B';
		else if (score >= 70)
			grade = 'C';
		else if (score >= 60)
			grade = 'D';
		else
			grade = 'F';
		
		System.out.printf("성적 : %d\n등급 : %c\n", score, grade);		
		
		input.close();
	}
}
  1. 새 클래스 IfMain05 생성
public class IfMain05 {
	public static void main(String[] args) {
		int a = 10;
		float b = 10.0f;
		
		if(a == b) { // a가 float으로 형변환됨
			System.out.println("10과 10.0f는 같다!");
		}
		
		char c = '0';
		int d = 0;
		
		if(c != d) { // '0'이 int로 형변환되면 48이 됨
			System.out.println("'0'과 0은 같지 않다.");
		}
		
		char e = 'A';
		int f = 65;
		
		if(e == f) { // A의 ASCII 코드 값(='A'의 int 형변환 결과 값)은 65임
			System.out.println("'A'와 65는 같다.");
		}
	}
}
  1. 새 클래스 IfMain06 생성
public class IfMain06 {
	public static void main(String[] args) {
		/*
		 * [실습]
		 * 정수 두 개를 입력받아서 변수에 저장하고 두 값 중 최댓값과 최솟값을 구하여 출력하시오.
		 * 단, 입력받은 두 수가 같을 경우 "두 수는 같다."라고 출력하시오.
		 */
		java.util.Scanner input = new java.util.Scanner(System.in);
		
		System.out.print("첫 번째 정수 : ");
		int a = input.nextInt();
		System.out.print("두 번째 정수 : ");
		int b = input.nextInt();
		
		input.close();
		
		if(a>b)
			System.out.printf("최댓값 : %d, 최솟값 : %d\n", a, b);
		else if(a<b)
			System.out.printf("최댓값 : %d, 최솟값 : %d\n", b, a);
		else
			System.out.println("두 수는 같다.");
	}
}

switch

  1. 새 클래스 SwitchMain01 생성
public class SwitchMain01 {
	public static void main(String[] args) {
		java.util.Scanner input = new java.util.Scanner(System.in);
		System.out.print("정수형 데이터 입력 : ");
		int a = input.nextInt();
		
		switch(a) { // int인 a를 인자값으로 사용
		case 1:
			System.out.println("1 입력");
			break; // {} 블럭 탈출; 생략시 다음 케이스의 수행문까지 실행함
		case 2:
			System.out.println("2 입력");
			break;
		case 3:
			System.out.println("3 입력");
			break;
		default: // if문에서의 else 역할; 마지막이므로 break 생략 가능
			System.out.println("1, 2, 3이 아닌 숫자가 입력됨");
		}
		
		input.close();
	}
}
  1. 새 클래스 SwitchMain02 생성
public class SwitchMain02 {
	public static void main(String[] args) {
		java.util.Scanner input = new java.util.Scanner(System.in);
		System.out.print("계절 입력 : ");
		String season = input.next(); // next() 함수로 문자열을 입력받아 season에 전달
		
		switch(season) { // String인 season을 인자값으로 사용
		case "봄":
			System.out.println("꽃이 피는 계절");
			break;
		case "여름":
			System.out.println("뜨거운 태양의 계절");
			break;
		case "가을":
			System.out.println("산들바람이 부는 계절");
			break;
		case "겨울":
			System.out.println("눈이 내리는 계절");
			break;
		default:
			System.out.println("계절을 입력하지 않았습니다.");
		}
		
		input.close();
	}
}
  1. 새 클래스 SwitchMain03 생성
public class SwitchMain03 {
	public static void main(String[] args) {
		/*
		 * [실습]
		 * 정수 2개를 입력 받고 산술 연산자(+,-,*,/,%)를 입력받아 연산을 수행한 결과를 출력하시오.
		 * [출력 예시]
		 * 첫 번째 수 : 7
		 * 연산자 : +
		 * 두 번째 수 : 5
		 * 7 + 5 = 12
		 */
		java.util.Scanner input = new java.util.Scanner(System.in);
		
		int result = 0;
			
		System.out.print("첫 번째 수를 입력하세요 : ");
		int first = input.nextInt();
		System.out.print("연산자를 입력하세요 : ");
		String operator = input.next();
		System.out.print("두 번째 수를 입력하세요 : ");
		int second = input.nextInt();
		
		switch(operator) {
		case "+":
			result = first + second; break; // 줄바꿈은 세미콜론으로 구분하기 때문에 수행문과 break가 한 줄이어도 됨
		case "-":
			result = first - second; break;
		case "*":
			result = first * second; break;
		case "/":
			if(second==0) { // 0으로 나누는 연산을 수행하려 하면 자바에서 오류가 발생하므로, 이를 안내하고 정상 종료시키기 위함
				System.out.println("\n0으로 나눌 수 없습니다.");
				System.exit(0); // 프로그램을 종료하지 않으면 출력문 수행시 변수 초기화가 안 되어 오류가 발생함
			}
			result = first / second; break;
		case "%":
			if(second==0) {
				System.out.println("\n0으로 나눌 수 없습니다.");
				System.exit(0);
			}
			result = first % second; break;
		default:
			System.out.println(); // 단순 줄바꿈
			System.out.println("연산자를 잘못 입력하였습니다.");
			System.exit(0); // 프로그램 종료; 잘못된 연산자 입력한 경우에 출력문이 수행되지 않도록 하기 위함
		}

		System.out.printf("\n%d %s %d = %d\n", first, operator, second, result);

		input.close();
	}
}

for

  1. 새 클래스 ForMain01 생성
public class ForMain01 {
	public static void main(String[] args) {
		for(int i=1;i<=5;i++) {
			System.out.println(i);
		}
		
		System.out.println("========");
		
		// for문 블럭 내 수행문이 한 줄이면 {} 블럭 생략 가능; 조건문은 생략하는 것이 일반적이나, 반복문은 생략하지 않는 것이 일반적임
		for(int i=1;i<=5;i++)
			System.out.println(i);
		
		System.out.println("프로그램 종료");
	}
}
  1. 새 클래스 ForMain02 생성
public class ForMain02 {
	public static void main(String[] args) {
		for(int i=5;i>=1;i--) {
			System.out.print(i + "\t");
		}
		
		System.out.println("\n========");
		
		for(int i=0;i<=10;i+=2) {
			System.out.print(i + "\t");
		}
		
		System.out.println("\n========");
		
		for(int i=0;i<=10;i++) {
			if(i%2==0) {
				System.out.print(i + "\t");
			}
		}
	}
}
  1. 새 클래스 ForMain03 생성
public class ForMain03 {
	public static void main(String[] args) {
		int sum = 0;
		for(int i=1;i<=100;i++) {
			// if(i%2==0) // 짝수의 합 구하기
			sum += i; // sum = sum + i
		}
		System.out.println("1부터 100까지의 합 = " + sum);
	}
}
  1. 새 클래스 ForMain04 생성 올바른 입력을 계속 요청하도록 개선된 구구단
public class ForMain04 {
	public static void main(String[] args) {
		java.util.Scanner input = new java.util.Scanner(System.in);
		System.out.print("단을 입력하세요 : ");
		int dan = input.nextInt();
		
		System.out.println(dan + "단");
		System.out.println("========");
		
		if(dan<=9&&dan>=1) {
			for(int i=1;i<=9;i++) {
				System.out.println(dan + " * " + i + " = " + dan * i); // 곱셈은 덧셈보다 우선순위가 높기 때문에 소괄호 없어도 곱셈 먼저 실행하고 문자열로 연결함
			}
		}
		else if(dan>9){
			for(int i=1;i<=dan;i++) {
				System.out.println(dan + " * " + i + " = " + dan * i);
			}
		}
		else {
			System.out.println("양의 정수를 입력하세요.");
		}
		input.close();
	}
}

다음으로