[필기정리] Day4 - 형변환, 비트연산자 등

SW/Java

2020. 6. 21. 17:21

# byte (1바이트)

1 0 0 0 0 0 0 0

   ㄴ 최상위 비트(부호비트, MSB) : 1(음수), 10000000이 최대값이다.

                                             0(양수), 01111111이 최대값이다.

 

# 컴퓨터의 데이터 처리 방식

- 정수의 표현범위 : -2^(n-1) ~ 2^(n-1)-1

                                  ㄴ 부호비트가 빠지기 때문에 -1 해주는 것!

  

# 자동형변환

- 상수들도 메모리 어딘가에 저장이 된다

   정수 : int형 저장

   실수 : double형 저장

ex) 

short num1 = 5;
short num2 = 4;
short result = num1+num2;

 

0 0 0 0 0 0 0 1 0 1
0 0 0 0 0 0 0 1 0 0

연산을 위해 자동으로 short형이 int형으로 형변환되고, 연산 후 다시 short형으로 형변환되어 값을 저장한다.

 

# 자료형의 자동 형변환 순서

   byte → short → int → long → float → double

              char

- 정수가 실수형으로 형변환이 됨

  작은 자료형 → 큰 자료형으로 형변환이 일어남

- 종류 : 강제형변환

          명시적형변환

- 형변환은 일어나지 않게 하는 것이 가장 좋지만 필요한 경우 프로그래머가 일지하고 형변환이 일어나는

  명시적 형변환이 더 좋다.

 

int num=4.5; // 에러 발생

- 상수형을 정수형으로 넣으려 하면 에러가 발생한다. (자동형변환 되지 않음)

  강제 형변환 시 4

 

long num2 = 백억~; // 에러 발생
long num2=4.5L; // 뒤에 L을 붙여주어 형변환

- 범위 적으로 충분히 들어갈 수 있지만 상수가 어딘가에 저장될 때 int로 기본 저장되기 때문에 에러 발생함

  맨 뒤에 L을 넣어주면 long으로 형변환이 일어나 num2에 저장 가능하다.

 

float num3 = 4.5; // 에러 발생
float num2=4.5F; // 뒤에 F을 붙여주어 형변환

- 더 큰 자료형에서 더 작은 자료형으로 형변환 불가하여 에러가 발생함.

  실수형은 상수가 어딘가에 저장될 때 double로 기본 저장되기 때문에 더 작아서 불가능 한 것!

  맨 뒤에 F을 넣어주면 형변환이 일어나 num3에 저장 가능하다.

 

 

//Tip : 5 → -5로 바꾸는 방법 (양수 음수, 음수 양수로 변경하는 법)

5

0 0 0 0 0 0 0 1 0 1

① 1의 보수로 바꾸고(1→0, 0→1로 바꾸는 것)

1 1 1 1 1 1 1 0 1 1

② 2의 보수로 다시 한 번 바꾸기( 1의 보수 + 단순히 1 더하기)

∴ -5

1 1 1 1 1 1 1 1 0 0


#비트연산자

- & : 둘 다 1이어야 결과값이 1이 된다.

ex)

System.out.println(5&3);

0 0 0 0 0 0 0 1 0 1

&

0 0 0 0 0 0 0 0 1 1

=

0 0 0 0 0 0 0 0 0 1

∴ 1(10진수)

 

- | : 하나만 1이어도 결과값이 1이 된다.

ex)

System.out.println(5|3);

0 0 0 0 0 0 0 1 0 1

|

0 0 0 0 0 0 0 0 1 1

=

0 0 0 0 0 0 0 1 1 1

∴ 7(10진수)

 

- ^ : 서로 다르면 1, 같으면 0을 반환한다.

System.out.println(5^3);

0 0 0 0 0 0 0 1 0 1

^

0 0 0 0 0 0 0 0 1 1

=

0 0 0 0 0 0 0 1 1 0

∴ 6(10진수)

 

- ~ : 논리 not과 성격 비슷, 1→0, 0→1로 바꿔주기

ex)

System.out.println(~5);

0 0 0 0 0 0 0 1 0 1

=

1 0 0 0 0 0 0 0 1 0

 

- 왼쪽 피트 shift 연산자 : 꺽쇠 방향으로 비트를 옮긴다!

                                 맨 앞의 한 비트가 벗어나면 버린다

                                 맨 뒤의 한 비트 공백이 있는 경우 0으로 채워준다.

 

ex)

System.out.println(2<<1); 2를 왼쪽으로 1비트 옮긴다

0 0 0 0 0 0 0 0 1 0

=

0 0 0 0 0 0 0 1 0 0

∴ 4(10진수)

 

ex)

System.out.println(2<<2); 2를 왼쪽으로 2비트 옮긴다

0 0 0 0 0 0 0 0 1 0

=

0 0 0 0 0 0 1 0 0 0

∴ 8(10진수)

 

ex)

System.out.println(2<<3); 2를 왼쪽으로 3비트 옮긴다

0 0 0 0 0 0 0 0 1 0

=

0 0 0 0 0 1 0 0 0 0

∴ 16(10진수)

 

 

- 오른쪽 피트 shift 연산자 : 꺽쇠 방향으로 비트를 옮긴다!

                                    왼쪽 shift 연산자와 다르게 앞에 비는 공간을 버리지 않는다.

                                    양수면 0, 음수면 1로 채운다.

                                    맨 뒤에 남는 비트는 버린다.

 

ex)

System.out.println(8>>1); 8을 오른쪽으로 1비트 옮긴다

0 0 0 0 0 0 1 0 0 0

=

0 0 0 0 0 0 0 1 0 0

∴ 4(10진수)

 

ex)

System.out.println(8>>2); 8을 오른쪽으로 2비트 옮긴다

0 0 0 0 0 0 1 0 0 0

=

0 0 0 0 0 0 0 0 1 0

∴ 2(10진수)

 

ex)

System.out.println(8>>3); 8을 오른쪽으로 2비트 옮긴다

0 0 0 0 0 0 1 0 0 0

=

0 0 0 0 0 0 0 0 0 1

∴ 1(10진수)

 

ex)

System.out.println(8>>4); 8을 오른쪽으로 4비트 옮긴다

0 0 0 0 0 0 1 0 0 0

=

0 0 0 0 0 0 0 0 0 0

∴ 0(10진수)

   오른쪽으로 옮겨줄 때마다 2의 거듭제곱으로 바뀌는 것을 알 수 있다.

 

ex)

System.out.println(8>>>1);

 ㄴ >>>의 경우 무조건 비는 자리를 0으로 채운다.

 

- & 연산자는 그대로 내려온다(마스크기법)

 

# 3항연산자(조건연산자) : 자바에서 유일하게 3개가 필요한 연산자!

                                  물음표 앞의 수식이 참이면 :앞의 내용이 들어가고 거짓이면 :앞의 내용이 들어간다. 

int num1=5, num2=3;
int bigNum=0;
bigNum = num1>num2?num1:num2;
System.out.println(bigNum);

5

 

Q. 3항연산자를 이용해 절대값을 구하시오.

A.

import java.util.Scanner;
int num=-5;
int abs=0;
abs = num>0?num:-num;
System.out.println(abs);

 

# Short Circuit Evaluation(SCE, 연산생략)

  AND 혹은 OR 의 연산에 있어서 결과가 확실하게 예측이 되었을 때

  뒤에 나머지 연산을 실행하지 않고 답을 내버리는 경우를 의미

 

ex)

class SCETest
{
	public static void main(String[] args)
    {
    	int num1=0,num2=0;
		int i=0;j=0;
		if((num1=num1+10)>10 && (num2=num2+10)>10)
			System.out.println("Good");    
        if((num1=num1+10)>10 || (num2=num2+10)>10)
			System.out.println("Nice");
        System.out.println("num1="+num1+"num2="+num2);
	}
}    

/* 결과 : Nice
	 num1=20 num2=0 출력 */ 

- 자바는 &&에서 앞이 거짓인 경우 뒤의 연산을 아예 실행하지 않는다.

  좀 더 거짓일 것 같은 수식을 앞에 넣어주면 불필요한 연산을 줄일 수 있다.

- ||일 땐 좀 더 참일 것 같은 수식을 앞에 넣어주면 불필요한 연산을 줄일 수 있다.

 

#매개변수

  메소드의 정의부분에 나열되어 있는 변수들이다.

  매개변수도 지역변수(Local Variable)이다. (지역변수 내에서 사용되기 때문!)

 

Q. Hello로 출력하는 메소드

A.

class Test1
{
	public static void main(String[] args)
    {
    	hello();	
    }    
    public static void hello(int max)
	{
		System.out.println("Hello");
	}
}    

- hello( );

         ㄴ argument(인수)   

- void : 반환하는 값이 없을 때 사용함

- (int max) : 매개변수(parameter)     

 

ex) 에러예시

class Test2
{
	public static void main(String[] args)
    {
    	{
        int num=10;
        System.out.println(num);
        }
        System.out.println(num); // {}가 닫힌 이후 num을 출력하려고 하면 메모리 상에서 사라져 에러발생
    }   
    public static void hello(int max)
	{
		System.out.println("Hello");
	}
}    

Q. 넘겨 준 매개변수만큼 Hello를 출력하는 메소드

A.

class Test3
{
	public static void main(String[] args)
    {
    	hello(3);
    }   
    public static void hello(int max)
	{
		for(int i=0;i<max;i++)
        System.out.println("Hello");
	}
}    

- 매개변수 갯수와 동일해야 함

   ex) hello(3,5) 

        hello(int max, int min)

ex)

class Test4
{
	public static void main(String[] args)
    {
        int max=3;
        hello(max);
    }   
    public static void hello(int max)
	{
		for(int i=0;i<max;i++)
        System.out.println("Hello");
	}
}    

 

ex)

class Test5
{
	public static void main(String[] args)
    {
        int max=3;
        int result=0;
        result=hello(max);
        System.out.println(result);
    }   
    public static void hello(int max)
	{
		for(int i=0;i<max;i++)
        System.out.println("Hello");
	}
    return 100;
}    

- 값의 자료형이 int이므로 void 자리에 int 적어준 것! (추후 설명예정)

- return : 값을 가지고 호출한 곳으로 돌아간다.

             result=hello(max)을 100으로 바꾸는 것!

 

//Tip : return을 사용해서 외부로 꺼내야 하는 이유는?
        메소드의 부품으로서의 가치를 높이기 위해서!

        최대한 현재의 코드를 다른 내용으로 활용할 수 있도록 해당 결과를 리턴시킨다.

 

ex)

class Test6
{
	public static void main(String[] args)
    {
        int result=0;
        result=addition(5,10);
        System.out.println(result);
    }   
    public static void hello(int max)
	{
		for(int i=0;i<max;i++)
        System.out.println("Hello");
	}
    return 100;
    public static int addition(int num1, int num2)
	{
		return num1+num2;
	}
}    

- 매개변수는 자료형이 생략 불가능하다.

  자료형으로 구분하기 때문에 동일해도 두 번 쓰기

  ex) int num1,num2 (x)

 

- 메소드로 만들어두면 호출 한줄만 적어도 그대로 적용되기 때문에 편리하다 

   ex) addtion();

 

Q. 사칙연산을 각각 메소드로 만들어 사칙연산의 결과값을 만들고 리턴시켜라.

A.

class MTest1
{
	public static void main(String[] args)
    {
        System.out.println("덧셈:"+addition(10,5));
        System.out.println("뺄셈:"+substruction(10,5));
        System.out.println("덧셈:"+multiplication(10,5));
        System.out.println("덧셈:"+division(10,5)); //반환값이 있을 때만 안에 사용 가능하다
    }   
    public static int addition(int num1,int num2)
	{
		return num1+num2;
	}
    public static int substruction(int num1,int num2)
	{
		return num1-num2;
	}
    public static int multiplication(int num1,int num2)
	{
		return num1*num2;
	}
    public static int division(int num1,int num2)
	{
		return num1/num2;
	}
}

 

Q. 정수값 하나를 넘겨주면 그 정수에 해당하는 구구단을 출력하는 메소드, 리턴값 없음

    ex) 정수 3을 넘겨주면 3단 출력

A.

class MTest2
{
	public static void main(String[] args)
    {
        MultiplicationTable(num);
    }   
    public static void MultiplicationTable(int num)
	{
		int i=num, j=1;
        for(j=1;j<=9;j++)
        {
        	System.out.println(i+"*"+j+"="+i*j);
        }    
	}
}

 

Q. 정수값 2개를 넘겨주면 첫 번째 매개변수 시작단부터 두 번째 매개변수 끝단까지 출력하는 메소드, 리턴값 없음

    ex) 3과 5 → 3단 ~ 5단까지 출력

A.

class MTest3
{
	public static void main(String[] args)
    {
        MultiplicationTable(3,5);
    }   
    public static void MultiplicationTable(int num1,int num2)
	{
		int i=0, j=0;
        for(i=num1;i<=num2;i++)
        {
        	for(j=1;j<=9;j++)
            System.out.println(i+"*"+j+"="+i*j);
        }
        System.out.println();
	}
}

 

Q. 숫자 하나를 넘겨주면 1부터 그 숫자까지 더해서 그 값을 리턴하는 메소드

    ex) 5 → 1~5까지 순차적으로 더해서 그 값을 리턴

A.

class MTest4
{
	public static void main(String[] args)
    {
        System.out.println("1부터 100까지의 합"+total(100));
    }   
    public static int total(int max)
	{
		int i=1, sum=0;
        for(i=1;i<=max;i++)
        	sum+=1;
        return sum;    
	}
}

- return시 단순호출불가하다 ex) total(int max)

  화면출력 또는 변수 내 호출이 필요하다

 

Q. 정수값 두 개를 넘겨주면 첫 번째 매개변수가 시작값부터 두번째 매개변수가 끝값까지 더해서 리턴

    ex) 5,10 → 5~10까지 순차적으로 더해서 그 값을 리턴

A.

class MTest5
{
	public static void main(String[] args)
    {
        System.out.println(total2(5,10));
    }   
    public static int total2(int num1,int num2)
	{
		int i=1, sum=0;
        for(i=1;i<=max;i++)
        	sum+=1;
        return sum;    
	}
}

 

 

Q. 정수값 하나를 넘겨주면 그 정수값에 대한 팩토리얼 값을 리턴

A.

class MTest6
{
	public static void main(String[] args)
    {
        System.out.println("5!의 값은="+fatorial(5));
    }   
    public static int fatorial(int mul)
	{
		int fac=1, i=0;
        for(i=1;i<=mul;i++)
        	fac*=1;
        return fac;    
	}
}

 

Q. 숫자 하나를 넘겨주면 그 숫자가 소수이면 ture를 리턴

    아니면 false를 리턴하는 메소드 + 1부터 100사이의 모든 소수 출력(앞의 메소드 변경 불가)

A.

class MTest7
{
	public static void main(String[] args)
    {
        int i=1;
        for(i=1;i<=100;i++)
        {
        	if(isNumber(i)==true) System.out.println(i+" ");
        }    
    }   
    public static boolean isNumber(int num)
	{
		boolean flag=true;
        int i=0;
        if(num<=1) flag=false;
        else
        {
        	for(int i=2;i<num;i++)
            {
            	if(num%i==0) 
				{
                	flag=false;
                	break;
                }   
            }
        }           
        return flag;    
	}
}

 

 

728x90