본문 바로가기

Java 기본 개념

자바를 잡아라 제 2장 - 길고 짧은 것은 대봐야 알 수 있는 법

728x90

[ 2022년 9월 21일 수요일 ]


형 변환(type casting)


  • 데이터의 크기
byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)
                      숫자                                          문자



** int형보다 작은 데이터타입의 연산을 진행할 경우 자동으로 int형으로 형 변환

public class TypeInteger {
	public static void main(String[] args) {
		
		//byte, short, int, long
		byte a = 127; //byte는 -128 ~ 127까지만 저장 가능
		byte b = -128;
		
		short c = 32767;
		short d = -32768;
		
		int e = 2147483647;
		int f = -214783648;
		
		long g = 1234567890567890L; //long은 L을 붙임
		
		/*
		 * 2진수로 저장할 때에는 0b를 붙임
		 * 8진수로 저장할 때에는 0을 붙임
		 * 16진수로 저장할 때에는 0x를 붙임
		 */
		
		int bin = 0b1010; //2진수
		int octa = 064; //8진수
		int hexa = 0xAC00;
		
		System.out.println("이진수 1010은:" + bin + "입니다.");
		System.out.println("팔진수 64는:" + octa +"입니다.");
		//System.out.println("십육진수 AC00은:" //hexa + "입니다." );
	
		
		System.out.println("-------------------------------------------------");
		
		float fl = 3.14F;//float을 나타낼 때는 F을 붙임
		double d1 = 3.14;
		
		float f2 = 3.1415923333F; //7자리까지 유효
		double d2 = 3.1415923333; //15자리까지 유효

		
		System.out.println(f2);
		System.out.println(d2);
		
		System.out.println("-------------------------------------------------");
		
		//e표기법
		float f3 = 314.15e-2F;// 10 -2승
		double d3 = 0.31415e2;// 10 2승
		System.out.println(f3);
		System.out.println(d3);
		
		System.out.println("-------------------------------------------------");
		boolean bool1 = true;
		boolean bool2 = false;
		
		System.out.println(bool1);
		
	}
	

}


크기가 작은 데이터 타입 - > 큰 데이터 타입으로 변환

컴파일러에 의해 자동으로 형 변환 발생
(자동 형 변환: Promotion)
크기가 큰 데이터 타입 - > 작은 데이터 타입으로 변환

캐스트 연산자를 사용하여 변환할 데이터 타입을 명시
(강제 형 변환: Type Casting)



  • 문자 타입 변수 ( char / string )

public class TypeTest {
	
	public static void main(String[] args) {
	
		//단일문자를 저장하는 char
		char c1 = 'A';
		char c2 = 65;
		
		System.out.println(c1);
		System.out.println(c2);
		//아스키코드 -> 유니코드의 등장으로 2바이트로 확장되고 부호없는 비트값 65536개의 문자를 표기
		
		
		char c3 = '가';
		char c4 = 44032;
		char c5 = '\uAC00';
		
		System.out.println(c3 + "-" + c4 + "-"+ c5);
		
		
		String s1 = "hello";
		String s2 = " world"; //공백도 문자로 인식

		//문자열은 + 로 연결하면 붙인 결과값 도출 
		System.out.println(s1 + s2);
		
		//문자열은 길이를 확인 length()
		System.out.println(s1.length());
		
		//문자열과 다른 타입의 + 연산
		System.out.println(100 + 200);//300
		System.out.println("100"+200);//문자열에 다른 타입이 붙으면 결과는 문자열(무조건)
		System.out.println(100 + 200 + "world");
		System.out.println("hello"+ 100 + 200);
		
		System.out.println("A" + 10);//A10
		System.out.println('A' + 10);//75
	}
}



연산자(Operator)
: 새로운 내가 될게



  • 단항 연산자(Unary Operator)

변수의 앞이나 뒤에 붙어서 변수 값을 하나 증가시키거나, 감소시키는 증/감 연산자(++, --)
양수와 음수를 나타내는 부호 연산자(+, -)
비트의 값을 바꿔주는 비트 반전 연산자(~)
논리대수의 값을 반전시켜주는 논리 반전 연산자(!)
데이터 타입을 바꿔주는 캐스트연산자 ( (type) )


public class OperatorEX01 {

	
	public static void main(String[] args) {
		
		//단항 연산자
		int i = -3;
		int j = -i;
		System.out.println(j);
		
		//++, --
		int k = 1;
		k++;
		System.out.println(k);
		k--;
		System.out.println(k);
		
		//증감연사자는 a++, ++a 의미가 다름
		k = 1;
		int h = k++; // 현재의 k값을 먼저 대입(저장)하고 이후에 증가
		System.out.println("k값:"+ k);
		System.out.println("h값:"+ h);
		
		k = 1;
		int g = ++k; // k값을 먼저 증가시키고 이후에 대입
		System.out.println("k값:"+ k);
		System.out.println("g값:"+ g);
		
		k = 1;
		System.out.println(k++);
		System.out.println(++k);
		
		System.out.println("--------------------------------------------");
		
		//~연산자 - 2진수값을 반대로
		byte b = 10; //0000 1010
		System.out.println(~b);//1111 0101
		System.out.println(~b + 1);
		
		
		System.out.println("--------------------------------------------");
		
		System.out.println(!true);//false	
		boolean bool = !false;
		System.out.println(bool);//true
		
		
	}
}


  • 2항 연산자(Binary Operator)


** 연산자가 int형(4byte)보다 작은 크기의 데이터 타입인 경우에
모두 int형으로 자동 형 변환되어 연산을 수행 (boolean형을 제외)

1. 산술 연산자 ( +, -, *, /, % )


2. 비교 연산자 ( <, <=, >, >=, ==, != )

비교 연산자의 결과 값은 크기 값을 비교하여 조건을 만족하면 true 그렇지 않으면 false를 반환
( If 비교되는 숫자의 데이터 타입이 다를 경우 기본적으로 크기가 큰 데이터 타입에 맞추어 비교 연산을 실행 )

3. 비트 연산자 ( &, |, ^ )

& (비트곱): 두 비트가 1일 때 1, 나머지는 0.
| (비트합): 두 비트 중 하나 이상이 1이면 1, 두 비트 모두 0이면 0.
^ (xor 배타적 논리합): 두 비트가 다르면 1, 같으면 0.

4. 비트 이동 연산자 ( <<, >> )

왼쪽 항의 값을 2진수로 변환하여 오른쪽 항의 값만큼 비트를 왼쪽(<<), 오른쪽(>>)으로 이동시키는 연산을 수행

ex) int a = 192;
00000000 00000000 00000000 11000000

a << 3
00000000 00000000 00000110 00000000 //1536


< 헷갈리기 쉬운 연산자 > % : 나머지를 구할 때 쓰는 연산자

/ : 을 구할 때 쓰는 연산자


public class OperatorEx02 {

	public static void main(String[] args) {
		
		//2항 연산자 - 항이 2개인 연산자
		int i= 7 / 3; // 몫 2
		int j = 7 % 3; // 나머지 1
		int k = 7 * 3; // 곱 21
		
		//비교 연산자
		System.out.println(i == j); //false
		System.out.println(i != j); //true
		System.out.println(i >= 1);//true
		System.out.println(i < j);//false
		System.out.println(k != 21);//false
		
		System.out.println(k % 2 != 0);
		System.out.println(k % 2 == 0);
		System.out.println(k % 7 == 0);//7의 배수
	
	
	}
}

5. 논리 연산자 ( &, |, &&, || )

& : 연산을 수행하여 양쪽 항이 모두 true일 때만 true를 반환 " and "

| : 연산을 수행하여 양쪽 항 중 한쪽만 true를 만족해도 true를 반환 " or "

&& : 만일 왼쪽 항이 false일 경우에는 오른쪽 항을 수행하지 않고 무조건 false를 반환

|| : 만일 왼쪽 항이 true일 경우에는 오른쪽 항을 수행하지 않고 무조건 true를 반환


  • 논리 연산자's Example

public class OperatorEx03 {
	
	public static void main(String[] args) {
	
		int x = 10;
		int y = 20;
		
		//if 뒤에는 조건이 온다. true라면 if문 실행, false라면 else문 실행
		//&&, ||는 앞항을 검사해서 결과가 정해지면, 뒤를 실행하지 않음
		if( x != 10 && ++y ==21 ) { //전자가 무조건적 거짓이기 때문에 후자를 실행 x (결과적으로 거짓이므로)
			System.out.println("참입니다.");
		} else {
			System.out.println("거짓입니다.");
		}
		
		System.out.println("x값:" + x + ", y값:" + y);
		
		if( x==10 || ++y == 21) { //전자가 무조건적 참이기 때문에 후자를 실행 x (결과적으로 참이므로)
			System.out.println("참입니다.");
		}else {
			System.out.println("거짓입니다.");
		}
		
		System.out.println("x값:" + x + ", y값:" + y);
		
	}
	
	
}

6. 대입 연산자(Assignment Operator) : +=, -=, *= , /= , %=

public class OperatorEx04 {
	
	public static void main(String[] args) {
		
		int a = 6;
		int b = 5;
		
		
		a +=3;// a= a + 3
		b =+3; // b = +3
		System.out.println(a);
		
		a -= 4;
		a *= 10;
		a /= 3;
		a %= 4;
		
		System.out.println(a);
		
		
	}
}


  • 3항 연산자


( 조건식 ? 연산식1 : 연산식2 )

: 조건식의 결과값이 이면 연산식 1, 거짓이면 연산식 2를 실행
" 조건식에는 boolean형 조건식 "


public class OperatorCondition {

	public static void main(String[] args) {
			
	//프로그램에서 랜덤한 값은 유효한 의미를 가짐
	//System.out.println( Math.random() ); // 0이상 ~ 1.0미만 랜덤값 출력
			
	//유효한 정수 랜덤값 1~10
			
	int num = (int) (Math.random() * 10) + 1;
	System.out.println(num); //1~10
			
			
	//랜덤값이 3의 배수인지 아닌지를 검사
	String result = num % 3 == 0 ? "3의 배수 " : "3의 배수가 아님";
	System.out.println(result);
			
	System.out.println("-----------------------------------------------------------");
			
	/*
	 * 1~100까지 랜덤한 정수를 생성
	 * 짝수 or 홀수인지 결과 출력
	 */
			
			
	int num1 = (int)( Math.random() * 100 ) + 1;
	System.out.println(num1);
			
	//String result2 = num1 % 2 == 0 ? "짝수" : "홀수";
	String result2 = num1 % 2 != 0 ? "홀수" : "짝수";
	System.out.println(result2);
			
	System.out.println("-----------------------------------------------------------");
				
	/*
	 * -5~5까지 랜덤한 정수를 생성 (0~10) - 5
	 * 어떤 정수가 나오든 절대값으로 출력
	 * 
	 */
			
			
	int a = (int)(Math.random() * 11)-5;
	System.out.println(a>=0 ? a : -a);
			
	//System.out.println(a<0 ? -a : a);
			
	}
}




계산 순서는 어떻게 될까?

소괄호 > 단항 > 이항 > 삼항 > 대입