본문 바로가기

JAVA

변수

// 변수
// 변수란 무엇인가?
// 안의 값이 변할 수 있는 공간
// 변수 만들기
// 데이터타입 이름
// 데이터타입이란? 자료형
// 해당 공간에 어떠한 종류의 값이 들어갈 수 있는지를 적어주게 된다. 

// 자료형은 크게 2가지로 나뉜다.
// 기본형과 참조형
// 기본형: 해당 공간에 값이 곧장 들어가있는 형태
// 기본형에는 8가지가 있다.
// byte short int long float double char boolean
// byte, short, int, long: 정수형 데이터타입
// 8비트, 16비트, 32비트, 64비트
// float, double: 실수형 데이터타입
// 소숫점이 달려있는 숫자를 실수라고 한다.
// 자바는 숫자를 우리가 코드에 적어주면
// 정수는 자동으로 int라고 생각하고, 실수는 double이라고 인식한다.
// 그래서 float myFloat = 3.12; 라고 하면 에러가 난다.
// 왜냐면 double이 float보다 더 큰 데이터 타입이기 때문이다.
// 작은컵 속 물을 큰물통에 옮기는것과 큰물통의 물을 작은컵에 옮겨담는것과 동일
// 따라서 더 큰 데이터 타입의 내용을 더 작은 곳으로 옮길 때에는 명시적으로 직접 지시해야 한다.
// 이렇게 데이터 타입을 바꾸는 것을 타입캐스팅 혹은 형변환이라고 한다.

// char: 문자형 데이터타입
// boolean: 논리형 데이터타입  


// 참조형: 해당 공간에  주소값만 적혀있고 실제 어떤 값이 들어있는지는 그 주소값을 따라가서 다른 공간으로 가야 그 값을 볼 수 있는 형태

public class Ex02Variable {
public static void main(String[] args) {
//변수를 선언해 봅시다.
int number;
//초기화는 초기화 연산자인 =을 써서 한다.
//수학에서 =은 왼쪽과 오른쪽이 같다는 의미이지만 
//프로그래밍에서 =은 오른쪽의 값으로 왼쪽 공간을 초기화 하겠다라는 뜻이 된다.
number = 20;
System.out.println(number);
//우리가 초기화를 해줄 때 마다 number에는 새로운 값이 초기화 된다.
//즉 내용이 변할 수 있기 때문에 변수인 것이다.
number = 890;
System.out.println(number);

//그러면 우리가 double에 실수를 넣어보고 float에 실수를 넣어보자
double myDouble = 3.14;
System.out.println(myDouble);

//아래 코드는 에러가 난다.
//근데 사실 3.14는 정말 작은 크기의 실수로서
//float에 문제가 없이 들어갈 수 있는데 왜 에러가 날까?
//크기가 어떻든 간에 자바에서는 아무 실수를 보면
//자동으로 double이라고 생각하고 따라서
// double 보다 작은 크기인 float에 넣으려고 하면
// 에러가 나게되는 것이다.
//따라서 여러분들이 실수를 써야한다면
//double을 쓰는게 편하고 
//혹시라도 반드시 float을 써야한다면
//초기화 되는 값이 float이라고 자바에게 말해줘야 한다
//float myFloat = 3.14;

//실수가 float이라고 표시하려면
//실수의 맨 끝에 f를 붙여주면 된다.
float myFloat = 3.14f;

//우리가 자료형을 장제로 바꿔 줄 수도 있다.
//즉 타입캐스팅이 가능하다.
//타입캐스팅을 하는 방법은 2가지 방법이 있다.
//1. 암시적 형변환(implicit typecasting)
//암시적 형변환의 경우 더 큰 데이터타입에 더 작은 데이터타입의 값을 넣어줄때 발생한다.
//예시: 데이터타입이 long인 변수에 int값을 넣을때
//2. 명시적 형변환(explicit typecasting)
//명시적 형변환의 경우에는 더 작은 데이터타입에 더 큰데이터 타입의 값을 넣어줄때
//우리가 명시적으로 ""괜찮아 옮겨담아!"라고 말을 해주어야 한다.
//명시적 형변환을 하는 방법은
//(바꿀 데이터타입)바꿀 값이라고 적어준다.

// 형 변환 자체에도 여러분들이 조심하셔야 할 것은 
//호환 가능한지를 봐야한다는 것이다.
//숫자끼리는 바꿀 수 있지만
//"abcde 조재영 38점"을 숫자로 바꿀 수 없다.
//즉 자료형이 호환 가능해야 한다!

//또 다른 문제는 더 큰 데이터타입의 값을 더 작은 데이터 타입에 넣을때
//표현 범위를 벗어나는 문제가 있다.

//바이트의 경우 -128 ~127까지 표현 할 수 있다.
byte myByte = 127;
//근데 만약 128을 byte로 표시하라고 하면?
//128을 표현 할 수 있는 최대 범위를 넘어서 버리기 때문에
//버그가 터진다.
//128이 아니라 -128이 나온다
//왜냐
//컴퓨터에서 맨 앞자리는 0이면 +, 1이면 -이기 때문이다.
// 127은 0111 1111이다.
// 128은 1000 0000 이다.
// 근데 바이트는 8비트이다.
// 즉 부호가 바꼈고 값도 음의 최소값이 된다.
// 즉 -128로 바뀌는 것이다.

//즉 어떤 자료형의 최대 범위를 벗어나서 오히려 최소 범위로 빠지는 것을 우리는
//overflow라고 한다!

//반대로 최소 범위를 벗어나서 오히려 최대 범위로 가버리는 것을 우리는
//underflow라고 한다!

//명시적 형변환은 이 overflow, underflow가 발생 할 수 있기 때문에 
//여러분들이 해당 값이 절대 그 범위를 안 넘어설 때에만 써주는 것이 맞다.
//더 간단한 방법은 아싸리 처음부터 "제법 숫자가 크겠는데?"-> long, "평범하겠는데?"->int
//참고로 int는 플러스 마이너스 19억쯤 된다.

//자료형을 넉넉히 잡아버리면 된다.

System.out.println((byte)(myByte+1));

// boolean
// 논리형이라고도 하는데
// 값이 딱 2개다
// true/false
// 우리가 연산자를 배우면 
// 연산자에 따라서 참 혹은 거짓이 나올 때가 있는데
// 이럴 때는 기본적으로 결과값이 boolean이 나오게 되는 것이다.

}
}

'JAVA' 카테고리의 다른 글

논리 연산자  (0) 2020.04.23
비교 연산자  (0) 2020.04.23
증감 연산자  (0) 2020.04.23
연산자  (0) 2020.04.23
네이밍, 기본지식  (0) 2020.04.23