# 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;
}
}
'SW > Java' 카테고리의 다른 글
[필기정리] Day6 - 카멜케이스, 생성자 (0) | 2020.06.21 |
---|---|
[필기정리] Day5 - return, 재귀메소드 등 (0) | 2020.06.21 |
[필기정리] Day3 - 난수, 진법, 예시문제 (0) | 2020.06.19 |
[필기정리] Day2 - 연산자, 반복문 등 (0) | 2020.06.19 |
[필기정리] Day1 -변수 선언, 예시 문제 (0) | 2020.06.19 |