[4주차] 자바 프로그래밍

Useful·2023년 3월 28일
0

Java

목록 보기
4/10
post-thumbnail

public class TypeConversion {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		byte b = 127;
		int i = 100;
		
		System.out.println(b+i);					// 결과 : 227
		System.out.println(10/4);					// 결과 : 2
		System.out.println(10.0-4);					// 결과 : 6.0
		System.out.println((char)0x12340041);		// 결과 : A
		System.out.println((byte)(b+i));			// 결과 : -29
		System.out.println((int)2.9 + 1.8);			// 결과 : 3.8
		System.out.println((int)(2.9 + 1.8));		// 결과 : 4
		System.out.println((int)2.9 + (int)1.8);    // 결과 : 3
	}
}

[위에 코드를 직접 쳐보고 결과가 어떻게 나오는지 직접 경험하는 것을 추천한다.]


1. Bool(부울)


Bool 타입은 2가지로 나누어짐

  • true(참)
  • false(거짓)

Bool 대수

  • 논리곱 (AND연산) : '&' 기호 사용
    • true & true = true
    • true & false = false
    • false & false = false

  • 논리참 (OR연산) : '||' 기호 사용
    • true || true = true
    • true || false = true
    • false || false = false

[위 사진 한장으로 요약할 수 있다]






2. 식과 연산자


연산이란 ? 주어진 식을 계산하여 결과를 얻어내는 과정

연산자의 종류는 다음과 같다..

  • 증감 연산자
  • 산술 연산자
  • 시프트(산술, 논리) 연산자
  • 비교 연산자
  • 비트 연산자
  • 논리 연산자
  • 조건 연산자
  • 대입 연산자

요건 알고 넘어가자

증감, 산술, 시프트 연산자 외에 연산자들은 모두 Bool값(true, false)을 return 한다. >

연산자 우선순위

  • 같은 우선순위의 연산자
    • 왼쪽에서 오른쪽으로 처리 ( -----→ )
    • 예외 ) 오른쪽에서 왼쪽으로 ( ←----- )
      • 대입 ( = )
      • 증감 ( ++, -- )
      • 부호 ( +, - )
      • 논리 ( ! )

  • 괄호 () 는 최우선순위!
    • 괄호가 다시 괄호를 포함한 경우 ( () ) 는 가장 안쪽의 괄호부터 먼저 처리함

위에 설명을 밑에 사진 한장으로 정리하자면


산술 연산자

사칙연산을 다루는 연산자로, 가장 기본적이면서도 가장 많이 사용되는 연산자

  • 더하기 (+), 빼기 (-), 곱하기 (*), 나누기 (/), 나머지 (%)
  • 피연산자들의 결합 방향은 왼쪽에서 오른쪽 ( -----→ )
  • /와 %의 응용
    • 10의 자리와 1의 자리 분리
      System.out.println(39/10);   // 39 / 10의 결과 : 3
      System.out.println(39%10);   // 39 % 10의 결과 : 9
      // (/) 연산자를 사용하면 몫을 return하고
      // (%) 연산자를 사용하면 나머지를 return 한다고 이해하자.
    • 홀수를 구하려면 ?
      n % 2 == 1 // <--숫자를 2로 나누어서 나머지가 1이면 홀수다.

    [산술연산자의 종류]

/와 % 산술 연산 예제

초 단위의 정수를 입력받고, 몇시간, 몇분, 몇초인지 출력하는 프로그램을 작성하라.

import java.util.Scanner;

public class ArithmeticOperator {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		
		System.out.print("정수를 입력하세요 : ");
		int time = sc.nextInt();			// 정수 입력
		int second = time % 60;				// 60으로 나눈 나머지는 초
		int minute = (time/60) % 60;		// 60으로 나눈 몫을 다시 60으로 나눈 나머지는 분
		int hour = (time/60) / 60;			// 60으로 나눈 몫을 다시 60으로 나눈 몫은 시간
		
		System.out.print(time + "초는 ");
		System.out.print(hour + "시간, ");
		System.out.print(minute + "분, ");
		System.out.println(second + "초입니다. ");
		
		sc.close();
	}

}

결과 :




증감연산자

1증가 혹은 감소 시키는 연산자

  • 증감 연산자는 해당 연산자가 피연산자의 어느 쪽에 위치하는가에 따라 연산의 순서 및 결과가 달라짐
  • 피연산자 앞에 붙으면 전위 연산자, 뒤에 붙으면 후위 연산자 라고 부름.

어렵게 생각하지말고 다음 예제를 살펴봅시다...

public class test {

	public static void main(String[] args) {
		int num1 = 3, num2 = 3;		// num1, num2 변수를 만들었음. 둘다 초기값은 3으로 동일
		int result1, result2;		// 결과값을 담을 변수임
		
		result1 = num1++;	// result1 변수에 후위연산으로 num1을 대입했음.
		result2 = ++num2;   // result2 변수에 전위연산으로 num2을 대입했음.
		
		System.out.println("result1의 값 : " + result1);
		System.out.println("result2의 값 : " + result2);
	}

}

결과는 ?

  1. 둘다 초기값은 3으로 시작했다
  2. 근데 중간에 증감연산자(++)가 앞이나 뒤에 붙냐에 따라 결과값이 달라졌다.
  3. 왜일까?

그 이유는 앞에 붙으면 전위연산, 뒤에 붙으면 후위연산을 하기 때문이다.

  • 전위연산 : 먼저 값을 1 증가를 시키고, 그 후에 변수에 대입한다
  • 후위연산 : 먼저 변수에 대입을 하고, 그 후에 값을 1 증가를 시킨다.



대입 연산자

교수님 설명 : 연산의 오른쪽 결과는 왼쪽 변수에 대입

착한 설명 : 변수에 값을 대입할 때 사용하는 이항 연산자, 결합방향은 오른쪽에서 왼쪽

int a = 1, b = 3;
a = b;		// b 값을 a에 대입하여 a=3임. 오른쪽에서 왼쪽으로 결합됨.
a += b;		// a = a + b와 같음, a=6, b는 3 그대로임.

[대입 연산자의 종류]




비교연산과 논리연산

  • 비교 연산
    • 두 피연산자를 비교하여 true 또는 false의 논리 값을 내는 연산

      [비교 연산자의 종류]

  • 논리 연산

    • 논리 값으로 NOT, OR, AND, XOR 논리 연산. 논리 값을 내는 연산

      [논리 연산자의 종류]

    • 논리 연산이 어떻게 수행되는지 표로 이해하고 넘어가자

      [동작의 결과를 보여주는 진리표]

비교 연산과 논리연산의 복합 사례

(age>=20) && (age<30)		//나이(age)가 20대인 경우    ('>='가 비교연산자,'&&'가 논리연산자) 
(c >= 'A') && (c <= 'Z')	//문자(c)가 대문자인 경우



삼항 연산자

조건식 ? (조건이 true일때 수행) : (조건이 false일때 수행)

  • 세 개를 피연산자로 구성된 삼항 연산자
  • if-else 문을 간결하게 사용할 수 있다..

삼항 연산자를 이용한 조건 연산 예제는 아래와 같다.

int a= 3, b=5;
system.out.println("두수의 차는 " + ((a>b)?(a-b):(b-a)) );



비트 연산

비트연산자 : 논리 연산자와 비슷하지만, 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자

먼저 일단 비트를 알아야 하는데 내가 아는 개념을 먼저 정리해보겠다..

먼저, byte에 대한 이해

  • 1byte는 8bit이다. 1개의 바이트는 8개의 비트를 갖는 소리다.
  • 8bit는 256개의 값을 가질 수 있다.

아래 사진으로 설명하겠다.

4bit와 16진수

  • 4bit를 Nibble(니블) 이라고 하는데 이건 그냥 넘어가자
  • 4bit는 0부터 15까지의 숫자로 표현할 수 있다.
  • 문제는 10진수로 이것들을 어떻게 대응시킬 것인가이다
  • 0~9까지는 10진수의 한자리수와 대응이 되지만, 나머지 10~15까지 한자리수로는 10진수와 대응하기 어렵게 된다. (맞는말을 어렵게 쓰는 재주가 있음)

그래서! 알파벳을 대응시키기로 했음. 그게 16진수임.

  • 16진수는 0~15까지 16자리로 표현하는데, 10부터는 A로 표현함.
  • 따라서 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F 로 이루어져있다.
  • 16진수라는 것을 컴퓨터한테 알아먹게 시키려면 앞에 '0x' 라는 것을 붙인다.
  • 0xFF 라고 하면 FF는 11111111 을 의미하게 되는 것이다.
  • 16진수로 표현한 1자리는 무조건 Nibble(4bit)이므로.....
  • 그리고 이 8bit를 4bit | 4bit로 나누어서 사용할거임 나는

자 이제 한번 예시를 들어봅시다.

'0x5A' 를 8bit로 풀어서 표현해봅시다..

  • 0x는 이것이 16진수라는 것을 알려주는 것이기 때문에 뒤에 '5A' 만 살펴보면 된다.

그러면 이것의 답은 ' 01011010 ' 이고

10진수로 변환 시,

결과값은 90임을 알 수 있음.

비트 연산의 종류는 다음과 같습니다.

이게 지금 무슨 이상한 소리인지 이해가 안가겠지만, 설명 해드리겠읍니다.




1. AND 연산 ( & )

비교하는 값이 둘다 1이여야지만 참값(1)을 반환

int a = 5;
int b = 12;

System.out.println(a & b);  // 변수 a와 b를 AND 연산한 결과 출력
// 결과 : 4
  1. int형 변수 a에는 정수값 5가 있습니다. 2진수로 변환하면 0101 입니다.
  2. int형 변수 b에는 정수값 12가 있습니다. 2진수로 변환하면 1100 입니다.
  3. 그리고 AND 연산( & ) 으로 두 값을 비교하고 있습니다. 아래 사진 첨부했습니다.

  1. AND 연산은 비교하는 두 값이 둘다 1이여야지만, 1을 반환하는 연산자입니다. 결과값은 0100
  2. 0100을 10진수로 변환하면 정수 4입니다. 그래서 위의 결과는 정수 4를 반환하는 것입니다.



2. OR 연산 ( | )

비교하는 값 중 하나라도 1이면 참값(1)을 반환

int a = 5;
int b = 12;

System.out.println(a | b);	// 변수 a와 b를 OR 연산한 결과 출력
// 결과 : 13
  1. int형 변수 a에는 정수값 5가 있습니다. 2진수로 변환하면 0101 입니다.
  2. int형 변수 b에는 정수값 12가 있습니다. 2진수로 변환하면 1100 입니다.
  3. 그리고 OR 연산( | ) 으로 두 값을 비교하고 있습니다. 아래 사진 첨부했습니다.

  1. OR 연산은 비교하는 두 값 중 하나라도 1이면, 참값(1)을 반환하는 연산자입니다. 결과값은 1101
  2. 1101을 10진수로 변환하면 정수 13입니다. 그래서 위의 결과는 정수 13를 반환하는 것입니다.




3. XOR 연산 ( ^ ) 잌쓰클루씨브 오알

비교하는 값이 서로 다르면 참값(1)을 반환

int a = 5;
int b = 12;

System.out.println(a ^ b);	// 변수 a와 b를 XOR 연산한 결과 출력
// 결과 : 9
  1. int형 변수 a에는 정수값 5가 있습니다. 2진수로 변환하면 0101 입니다.
  2. int형 변수 b에는 정수값 12가 있습니다. 2진수로 변환하면 1100 입니다.
  3. 그리고 XOR 연산( ^ ) 으로 두 값을 비교하고 있습니다. 아래 사진 첨부했습니다.

  1. XOR 연산은 비교하는 값이 서로 다르면, 참값(1)을 반환하는 연산자입니다. 결과값은 1001
  2. 1001을 10진수로 변환하면 정수 9입니다. 그래서 위의 결과는 정수 9를 반환하는 것입니다.




4. NOT 연산 ( ~ )

비트를 전부 반전시킨다 (비트 반전 연산자)

int a = 5;

System.out.println(~a);	// 변수 a에 NOT 연산을 적용한 결과
// 결과 : -6
  1. int형 변수 a에는 정수값 5가 있습니다.
  2. 그리고 NOT 연산( ~ ) 으로 비트를 반전시켰습니다.
  3. int는 4byte 자료형이라, 4byte = 32bit 이므로 32자리를 표현해야 합니다.
  4. 그건 너무 귀찮으니 8bit로 충분하기 때문에, 8bit로 표현 하겠습니다.

  1. a 값은 0000 0101 입니다.

  2. 위 코드에서 ~a는 'a변수의 비트를 반전시켜라' 는 의미로, 반전시킨 결과값은 1111 1010 입니다.

  3. 이 때, 2진수에서 가장 왼쪽 비트가 1은 음수를 나타내는 것입니다.
    따라서 1111 1010 은 음수를 나타내는 것임을 알 수 있습니다.

  4. 1111 1010은 10진수로 -6에 해당합니다. 그래서 결과값은 -6 입니다.





5. Shift 연산 (<<, >>)

지정한 수만큼 비트를 왼쪽, 오른쪽으로 이동

5-1. << 연산자

이진수의 각자리를 왼쪽으로 N칸 밀고 제일 첫째자리는 0으로 채워주는 연산.

int a = 5;
System.out.println(a<<3);	// '비트 각 자리를 왼쪽으로 3칸씩 옮겨라'
// 결과 : 40

'5 <<3' 즉, '비트를 왼쪽으로 3칸씩 옮겨라' 라는 의미로 결과는 40 이 나온다.


5-2. >> 연산자

이진수의 각자리를 오른쪽으로 N칸 밀고 제일 첫째자리는 0으로 채워주는 연산.

int a = 38;
System.out.println(a>>2);	// '비트 각 자리를 오른쪽으로 2칸씩 옮겨라'
// 결과 : 9

'38 >> 2' 즉, '비트를 오른쪽으로 2칸씩 옮겨라' 라는 의미로 결과는 9가 나온다.





조건문은 추후에 정리..

if, if-else, if-else if-else, switch-case

case 문의 값

  • 문자, 정수, 문자열 리터럴만 허용
  • 실수 리터럴은 허용되지 않음.

switch-case 문 예제

import java.util.*;

public class CodeQuestion {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("어떤 음식 드릴까요? : ");
		String order = sc.next();
		int price = 0;
		
		switch(order) {
		case "곰탕":
		case "순대국":
		case "설렁탕":
			price = 7000;
			break;
		case "피자":
		case "햄버거":
			price = 5000;
			break;
		case "김밥":
		case "컵밥":
			price = 3000;
			break;
		default:
			price = 0;
			break;
		}
		
		if(price == 0) {
			System.out.println("그런 메뉴는 없습니다");
		} else {
			System.out.println(order + " 는(은) " + price + " 원 입니다.");	
		}
	}

}

사진 출처 ( http://www.tcpschool.com/java/ )
비트 연산 ( https://vmpo.tistory.com/106 )

profile
1 commit = 1 life

0개의 댓글