반응형

출처:이것이 자바다 

변수와 타입

2.1 변수

2.1.1  변수란?

데이터를 메모리에 저장한다.

변수(Variable)는 값을 저장할 수 있는 메모리의 공간을 의미한다.

수시로 값이 변동될 수 있기 때문이다.

변수에는 복수 개의 값을 저장할 수 없고 , 하나의 값만 저장할 수 있다.

 

변수란, 하나의 값을 저장할 수 있는 메모리 공간이다.

 

2.1.2 변수의 선언

변수 선언은 어떤 타입의 데이터를 저장할 것인지 그리고 변수 이름이 무엇인지를 결정한다.

프로그램은 변수 이름을 통해서 메모리 주소에 접근하고 , 그곳에 값을 저장하거나 그곳에 있는 값을 읽는다.

 

같은 타입 변수 선언한 예:

int x,y,x ;

 

명명규칙(naming convention)

 

 

예약어:

 

 

가급적이면 한글을 포함하지 않는 것이 좋다.

 

2.1.3 변수의 사용

=>변수값 저장

변수에 값을 저장할 때는 대입 연산자(=)를 사용한다.

우측의 값을 좌측 변수에 저장한다는 의미

초기값: 변수를 선언하고 처음 값을 저장할 경우

변수에 초기값을 주는 행위를 변수의 초기화라고 한다.

 

 

int score ; //변수 선언

score = 90; //값 저장

 

 

 

 

 

int score = 90;

 

변수의 초기값은 코드에서 직접 입력하는 경우가 많은데 ,소스 코드에서 직접 입력된 값을 리터럴(literal)이라고 부른다. 리터럴은 값의 종류에 따라 정수 리터럴 , 실수 리터털, 문자 리터럴, 논리 리터럴로 구분된다.

리터럴 은 상수(constant)와 같은 의미이다. "값을 한 번 저장하면 변경할 수 없는 변수"로 정의

 

==>정수 리터럴

소수점이 없는 10진수 => 0, 75, -100

0으로 시작되는 리터럴 8진수 => 02, -04

0x또는 0X 16진수 => 0x5, 0xA, 0xB3, 0xAC08

정수 리터럴을 저장할 수 있는 타입은 byte, char, short, int ,long

==>실수 리터럴

소수점이 있는 10진수 =>0.25 , -3.14

대문자 E또는 소문자 e가 있는 10진수 => 5E7 , 0.12E-5

E -> 10

float, double

==>문자 리터럴

작은 따옴표(') => 'A' , '' , ''\t' ,''\n'

역슬래쉬(\) 가 이스케이프문자

 

char

 

==>문자열 리터럴

큰 따옴표(")

"대한민국"

"탭 만큼 이동 \t 합니다."

"한줄 내려 쓰기 \n 합니다."

string

 

==>논리 리터럴

true , false

boolean

 

=>변수값 읽기

변수 선언하고 초기화가 되지 않을 경우 에러가 난다.

 

[VariableExample.java] 변수 선언과 초기화

public class VariableExample {

 

       public static void main(String[] args) {

               //10 변수 value 초기값으로 설정

               int value = 30;

               //변수 value값을 읽고 10 더하는 산술 연산을 수행

               //연산의 결과값을 변수 result 초기값으로 저장

               int result = value + 10;

               //변수 result 값을 읽겨 콘솔에 출력

               System.out.println(result);

       }

 

}

 

2.1.4 변수의 사용 범위

변수는 선언된 블록 내에서만 사용이 가능하다.

locla variable -메소드 블록 내에서 선언된 변수

[VariableScopeExample.java] 변수의 사용 범위

public class VariableScopeExample {

 

       public static void main(String[] args) {

               int v1= 15;

               if(v1 > 10) {

                      int v2 = v1 -10;

               }

               //int v3= v1+v2+5; //v2변수를 사용할 없기 때문에 에러가 발생

       }

 

}

 

2.2 데이터 타입

2.2.1 기본(원시 : primitive)타입

기본 타입이란 정수 ,실수 , 문자 , 논리 리터럴을 직접 저장하는 타입

 

메모리에는 01을 저장하는 최소 기억 단위인 비트가 있다.

그리고 8개의 비트를 묶어서 바이트라고 한다.

기본 타입은 정해진 메모리 사용 크기(바이트 크기)로 값을 저장

실수 타입일 경우 가수와 지수 부분에 사용되는 bit 크기에 따라서 값의 범위가 결정된다.

 

2.2.2 정수 타입(byte, char, short, int ,long)

 

자바는 기본적을 정수 연산을 int타입으로 수행한다.

주의 할점 :

메로리 사용량

잘못된 결과

 

=>byte타입

색상 정보 및 파일 또는 이미지 등의 이진(바이너리)데이터를 처리

 

만약 -128 ~ 127을 초과하는 값이 byte타입 변수에 저장 될 경우 컴파일 에러 ("Type mismatch: cannot convert from int to byte)가 발생한다.

 

[ByteExample .java] byte 타입 변수

public class ByteExample {

       public static void main(String[] args) {

               byte var1= -128;

               byte var2 = -30;

               byte var3 = 0;

               byte var4 = 30;

               byte var5 = 127;

               //byte var6 = 128;//컴파일 에러

              

               System.out.println(var1);

               System.out.println(var2);

               System.out.println(var3);

               System.out.println(var4);

               System.out.println(var5);

              

       }

}

 

 

 

자리수를 초과할 경우 - 로 변한다.

[GarbageValueExample.java] byte 타입 변수

public class GarbageValueExample {

 

       public static void main(String[] args) {

               byte var1 = 125;

               int var2 = 125;

               for(int i = 0; i < 5; i++) {

                      var1++;

                      var2++;

                      System.out.println("var1: "+var1+ "\t" +"var2: "+var2);

               }

       }

 

}

 

=>char타입

자바는 모든 문자를 유니코드로 처리한다.

0 ~ 65535범위의 2byte크기를 가진 정수값

자바는 하나의 유니코드를 저장하기 위해 2byte 크기인 char타입을 제공한다.

 

16진수 값

char c = 64;

char c = '\u0041';

int타입으로도 저장가능하다.

char c= 'A'

int uniCode = c;

[ CharExample.java] char 타입 변수

public class CharExample {

       public static void main(String[] args) {

               char c1= 'A';//문자를 직접 저장

               char c2 = 65; //10진수로 저장

               char c3 ='\u0041'; //16진수로 저장

              

               char c4 = '';//문자를 직접 저장

               char c5 = 44032; //10진수로 저장

               char c6 = '\uac00';//16진수로 저정

                            

               int uniCode = c1;//유니코드 얻기

              

               System.out.println(c1);

               System.out.println(c2);

               System.out.println(c3);

               System.out.println(c4);

               System.out.println(c5);

               System.out.println(c6);

               System.out.println(uniCode);

       }

}

 

String name = "홍길동";

String은 기본 타입이 아닌다. String은 클래스 타입이고 String변수는 참조 변수이다.

String 객체가 생성되고 ,String변수는 String객체의 번지를 참조하게 된다.

 

 

 

char c = '';//컴파일 에러 ->char c = ' ';

 

String str = "";

 

=>short타입

 

=>int타입

int number = 10;

int octNumber = 012;

int hexNumber = 0xA;

 

 

[ IntExample.java] int 타입 변수

public class IntExample {

 

       public static void main(String[] args) {

               int var1 = 10;

               int var2 = 012;

               int var3 = 0xA;

              

               System.out.println(var1);

               System.out.println(var2);

               System.out.println(var3);

       }

 

}

 

[ LongExample.java ]long타입 변수

public class LongExample {

 

       public static void main(String[] args) {

               long var1 = 10;

               long var2 = 20L;

               //long var3 = 1000000000000;//컴파일 에러

               long var4 = 1000000000000L;

              

               System.out.println(var1);

               System.out.println(var2);

               System.out.println(var4);

       }

 

}

 

범위를 넘어서면 오류가 난다.

 

2.2.3 실수 타입(Float, double)

메모리 사용크기에 따라 두가지로 나눈다.

 

 

실수는 정수와 달리 부동 소수점(floating -point)방식으로 저장된다.

 

 

 

자바는 실수 리터럴을 double로 간주한다.

 

 

 

               double var1 = 3.14;

               //float var2 = 3.14//컴파일 에러

               float var3 = 3.14F;

 

               int var6 = 3000000;

               double var7 = 3e6;

               float var8 = 3e6f;

               double var9 = 2e-3;

 

[FloatDoubleExample.java] float double 타입

public class FloatDoubleExample {

 

       public static void main(String[] args) {

               //실수값 저장

               double var1 = 3.14;

               //float var2 = 3.14//컴파일 에러

               float var3 = 3.14F;

              

               //정밀도 테스트

               double var4 = 0.1234567890123456789;

               float var5 = 0.1234567890123456789F;

              

               System.out.println("var1:" + var1);

               System.out.println("var3:" + var3);

               System.out.println("var4:" + var4);

               System.out.println("var5:" + var5);

              

               //e사용하기

               int var6 = 3000000;

               double var7 = 3e6;

               float var8 = 3e6f;

               double var9 = 2e-3;

               System.out.println("var6:" + var6);

               System.out.println("var7:" + var7);

               System.out.println("var8:" + var8);

               System.out.println("var9:" + var9);

       }

 

}

 

2.2.4 논리 타입(boolean)

[ BooleanExample.java]boolean 타입

public class BooleanExample {

 

       public static void main(String[] args) {

               boolean stop = true;

               if(stop) {

                      System.out.println("중지합니다.");

               }else {

                      System.out.println("시작합니다.");

               }

       }

 

}

 

2.3 타입 변환

2.3.1 자동 타입 변환

자동 타입 변환(Promotion)은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다.

 

 

 

               byte byteValue = 10;

               int intValue = byteValue;//자동 타입 변환이 일어난다.

byte 1byte 크기를 가진다.

int 4byte 크기를 가진다.

 

변환 이전의 값은 변환 이후에도 손실 없이 그래도 보존된다.

 

정수 타입이 실수 타입으로 변환하는 것은 무조건 자동 타입 변환이 된다. 실수 타입으로 변환된 이후의 값은 정수값이 아닌 .0이 붙은 실수값이 된다.

               int intValue = 200;

               double doubleValue = intValue;//200.0

char 타입의 경우 int타입으로 자동 변환되면 유니코드 값이 int타입에 저장된다.

               char charValue = 'A';

               int intValue = charValue; //64 저정

 

byte타입을 char타입으로 자동 변환시킬 없다.

               byte byteValue = 65;

               char charValue = byteValue;// 컴파일 에러

               char charData = (char)byteData;//강제 타입 변환(조금 후에 설명됨)

 

[PromotionExample] 자동 타입 변환

public class PromotionExample {

 

       public static void main(String[] args) {

               byte byteValue = 10;

               int intValue = byteValue;//int <- byte 자동 타입 변환이 일어난다.

               System.out.println(intValue);

              

               char charValue = '';

               intValue = charValue; //int <- char

               System.out.println("가의 유니코드 = " +intValue);

              

               intValue = 500;

               long longValue = intValue;//long <- int

               System.out.println(longValue);

              

               intValue = 200;

               double doubleValue = intValue; //double <-int

               System.out.println(doubleValue);

       }

 

}

 

2.3.2 강제 타입 변환

큰 크기의 타입은 작은 크기의 타입으로 자동 타입 변환을 할 수 없다.

강제적으로 큰 데이터 타입을 작은 데이터 타입으로 쪼개어서 저장하는 것을 강제 타입 변환(캐스팅:Casting)이라고 한다.

               int intValue = 103029770;

               byte byteValue = (byte)intValue;//강제 타입 변환(캐스팅)

byte만 남긴다.

               long longValue = 300;

               int intValue = (int)longValue ;//intValue 300 그대로 저장된다.

int타입은 char타입으로 자동 변환되지 않기 때문에 강제 타입 변환을 사용해야 한다.

               int intValue = 'A';

               char charValue = (char)intValue;

               System.out.println(charValue);

실수 타입은 정수 타입으로 자동 변환되지 않기 때문에 강제 타입 변환을 사용해야 한다. 소수점 이하 부분은 버려지고,정수 부분만 저장된다.

               double doubleValue = 3.14;

               int intValue = (int)doubleValue; //intValue 정수 부분인 3 저장된다.

[ CastingExample.java] 강제 타입 변환

public class CastingExample {

 

       public static void main(String[] args) {

               int intValue = 44032;

               char charValue = (char)intValue;

               System.out.println(charValue);

              

               long longValue = 500;

               intValue = (int)longValue;

               System.out.println(intValue);

 

               double doubleValue = 3.14;

               intValue = (int)doubleValue;

               System.out.println(intValue);

       }

 

}

 

강제 타입 변환에서 주의할 점은 사용자로부터 입력받은 값을 변환할 때 값의 손실이 발생하면 안된다는 것이다.

[CheckValueBeforeCasting.java] 변환으로 인한 테이터 손실이 발생되지 않도록 한다.

public class CheckValueBeforeCasting {

 

       public static void main(String[] args) {

               int i = 128;

              

               if((i<Byte.MAX_VALUE) || (i > Byte.MAX_VALUE)) {

                      System.out.println("byte 타입으로 변환할 없습니다.");

                      System.out.println("값을 다시 확인해 주세요");

               }else {

                      byte b = (byte)i;

                      System.out.println(b);

               }

       }

 

}

 

최대값 최소값을 벗어나는지 반드시 검사하고 , 만약 벗어난다면 타입 변환을 하지 말아야 한다.

 

 

강제 타입 변환에서 또 다른 주의점이 있다. 정수 타입을 실수 타입으로 변환할 때 정밀도 손실을 피해야 한다.

 

정수 타입을 실수 타입으로 변환할 때 정밀도 손실을 피한다.

[FromIntFloat.java] 정수 타입을 실수 타입으로 변환할 때 정밀도 손실을 피한다.

public class FromIntFloat {

 

       public static void main(String[] args) {

               int num1 = 123456780;

               int num2 = 123456780;

              

               float num3 = num2;

               num2 = (int)num3;

              

               int result = num1 - num2;

               System.out.println(result);

       }

 

}

이유는 int값을 float타입으로 자동 변환하면서 문제가 발생했기 때문이다.

 

 

int값을 손실 없이 float타입의 값으로 변환할 수 있으려면 가수 23비트로 표현 가능한 값이어야 한다.

해결책은 모든 int값을 실수 타입으로 안전하게 변환시키는 double타입을 사용하는 것이다.

 

int의 크기는 32비트이므로 double의 가수 52비트보다는 작기 때문에 어떠한 int 값이라도 안전하게 정밀도 손실 없이 double타입으로 변환될 수 있다.

 

정수 타입을 실수 타입으로 변환할 때 정밀도 손실을 피한다.

[FromIntToDouble.java] 정수 타입을 실수 타입을 변환할 때 정밀도 손실을 피한다.

public class FromIntToDouble {

 

       public static void main(String[] args) {

               int num1 = 123456780;

               int num2 = 123456780;

              

               double num3 = num2;

               num2 = (int)num3;

              

               int result = num1 - num2;

               System.out.println(result);

       }

 

}

 

2.3.3 연산식에서의 자동 타입 변환

연산은 기본적으로 같은 타입의 피연산자(Operand)간에만 수행되기 때문에 서로 다른 타입의 피연산자가 있을 경우 두 피연산자 중 크기가 큰 타입으로 자동 변환된 후 연산을 수행한다.

: int 타입 피연산자가 double타입으로 자동 변환되고 연산을 수행한다.

 

만약 int타입으로 꼭 연산을 해야 한다면 double타입을 int타입으로 강제 변환하고 덧셈 연산을 수행하면 된다.

 

자바는 정수 연산일 경우 int타입을 기본으로 한다. 그 이유는 피연산자를 4byte 단위로 저장하기 때문이다.

 

 

예를 들어 char타입의 연산 결과는 int타입으로 산출되므로 int타입 변수에 결과를 저장해야 한다. casting해야 한다.

               char ai = 'A';

               int result = ai +1;     //'A' 유니코드보다 1 유니코드가 저장

               char na = (char)result; //'B' 저장됨

 

만약 피연산자 중 하나가 long 타입이라면 다른 피연산자도 long 타입으로 자동 타입 변환되고 연산의 결과는 long 타입이 된다.

 

 

float 타입과 float 타입을 연산하면 연산의 결과는 float 타입으로 나오지만, 피연산자 중에 실수 리터럴이나 double 타입이 있다면 다른 피연산자도 double 타입으로 자동 타입 변환되어 연산되므로 결과는 double 타입으로 산출된다.

 

[OpreationsPromotionExample.java] 연삭식에서 자동 타입 변환

public class OpreationsPromotionExample {

 

       public static void main(String[] args) {

               byte byteValue1 = 10;

               byte byteValue2 = 20;

               //byte byteValue3 = byteValue1 + byteValue2;//컴파일 에러

               int intValue1 = byteValue1 + byteValue2;

               System.out.println(intValue1);

              

               char charValue1 = 'A';

               char charValue2 = 1;    

               //char charValue3 = charValue1 + charValue2;//컴파일 에러

               int intValue2 = charValue1 + charValue2;;

               System.out.println("유니코드="+intValue2);

              System.out.println("출력문자="+(char)intValue2);

              

               int intValue3 = 10;

               int intValue4 = intValue3 / 4;

               System.out.println(intValue4);

              

               int intValue5 = 10;

               //int intValue6 = 10 / 4.0; //컴파일 에러

               double doubleValue = intValue5 / 4.0;

               System.out.println(doubleValue);

       }

 

}

 

 

연습문제

1. 자바에서 변수에 대한 설명 중 틀린 것은 무엇입니까? (4)

 

1. 변수는 하나의 값만 저장할 수 있다.

2. 변수는 선언 시에 사용한 타입의 값만 저장할 수 있다.

3. 변수는 변수가 선언된 중괄호 ( {} ) 안에서만 사용 가능하다.

4. 변수는 초기값이 저장되지 않은 상태에서 읽을 수 있다.

 

2. 변수 이름으로 사용 가능한 것을 모두 선택하세요. (1,4,5)

 

1.modelName

2.class

3.6hour

4.$value

5._age

6.int

 

3. 다음 표의 빈칸에 자바의 기본 타입 (Primitive Type) 8개를 적어보세요.

크기/타입 1byte 2byte 4byte 8byte
정수타입 byte char
short
int long
실수타입     float double
논리타입 boolean      

 

4. 다음 코드에서 타입, 변수 이름, 리터럴에 해당하는 것을 적어 보세요.

 

int age;

age = 10;

double price = 3.14;

 

타입 : (int),(double)

변수 이름 : (age),(price)

리터럴 : (10),(3.14)

 

5. 자동 타입 변환에 대한 내용입니다. 컴파일 에러가 발생하는 것은 무엇입니까? (3)

 

byte byteValue = 10;

char charValue = 'A';

 

1. int intValue = byteValue;

2. int intValue = charValue;

3. short shortValue = charValue;

4. double doubleValue = byteValue;

 

6. 강제 타입 변환 (Casting) 에 대한 내용입니다. 컴파일 에러가 발생하는 것은 무엇입니까? (4)

 

int intValue = 10;

char charValue = 'A';

double doubleValue = 5.7;

String strValue = "A";

 

1. double var = (double) intValue;

2. byte var = (byte) intValue;

3. int var = (int) doubleValue;

4. char var = (char) strValue;

 

7. 변수를 잘못 초기화한 것은 무엇입니까? (3)

 

1. int var1 = 10;

2. long var2 = 10000000000L;

3. char var3 = ''; //작은 따옴표 두 개가 붙어 있음

4. double var4 = 10;

5. float var5 = 10;

 

8. 연산식에서의 타입 변환 내용입니다. 컴파일 에러가 생기는 것은 무엇입니까? (1)

 

byte bytebyteValue = 10;

float floatValue = 2.5F;

double doubleValue = 2.5;

 

1. byte result = byteValue + byteValue;

2. int result = 5 + byteValue;

3. float result = 5 + floatValue;

4. double result = 5+ doubleValue;

 

반응형

' > 이것이 자바다' 카테고리의 다른 글

06. 클래스  (0) 2020.09.28
05. 참조 타입  (0) 2020.09.27
04. 조건문과 반복문  (0) 2020.09.26
03. 연산자  (0) 2020.09.24
01. 자바 시작하기  (0) 2020.09.20

+ Recent posts