[Java] 다시 정리하는 "변수와 타입"

rara_kim·2022년 11월 15일
0

Java

목록 보기
31/39

변수(variable)

  • 변수는 값을 저장할 수 있는 메모리의 특정 번지에 붙이는 이름이다.
  • 프로그램은 변수를 통해 메모리의 특정 번지에 값을 저장하고 읽을 수 있다.
  • 정수 타입 변수에는 정수값만 저장할 수 있고, 실수 타입 변수에는 실수값만 저장할 수 있다.
  • 하나의 변수에 하나의 값만 저장할 수 있다.

변수의 선언과 값 저장

  • 변수를 사용하기 위해서는 먼저 변수를 선언해야 한다.
  • 변수에 값을 저장할 때에는 대입 연산자(=)를 사용한다.
  • 변수에 최초로 값이 저장될 떄 변수가 생성되는데, 이것을 변수 초기화라고 한다.
// 변수의 선언
int age;       
double value;

// 값 저장
age = 30;
valute = 0.5;

//변수의 선언과 저장
int score = 90;

변수의 명명 규칙

작성 규칙
첫 전째 글자는 문자이거나 $,_이어야 하고 숫자로 시작할 수 없다.(필수)가능 : price, $price, _companyName
불가능 : 1v, @speed, $#value
영어 대소문자를 구분한다.(필수)firstname과 firstName은 다른 변수
첫 문자는 영어 소문자로 시작하되, 다른 단어가 붙을 경우 첫 문자를 대문자로 한다.(관례)maxSpeed, firstName,carBodyColor
자바 예약어는 사용할 수 없다.(필수)-----------------------------------------------
기본타입(char, int, double)
접근 제한자(private, public)
클래스와 관련된 것(class, abstract, interface)
객체와 관련된 것(new, instanceof, this, super, null)
메소드와 관련될 것(void,  return)
제어문과 관련된 것(if, else, switch, for, while)
논리값(true, false)
예외처리와 관련된 것(try, catch, finally, throws)
기타(package, import, static, final)

변수 사용

  • 변수는 출력문이나 연산식 내부에서 변수에 저장된 값을 출력하거나 연산할 때 사용한다.
  • 산술 연산식에 변수를 사용하면 저장된 값으로 연산을 수행한다.
int hour = 3;
int minute = 5;

int totalMinute = (hour * 60) + minute;
int totalMinute = (3 * 60) + minute;
int totalMinute = 180 + 5;
int totalMinute = 185;
  • 변수는 또 다른 변수에 대입하여 값을 복사할 수 있다.
int x = 10;   // 변수 x에 10을 저장
int y = x;    //x에 저장된 값을 변수 y에 복사(저장)

변수 사용 범위

자바의 모든 변수는 중괄호 {} 블록 내에서 선언되고 사용된다.
메소드 블록 내에서 선언된 변수를 로컬 변수라고 부르는데, 로컬 변수는 메소드 블록 내부에서만 사용되고 메소드 실행이 끝나면 메모리에서 자동으로 없어진다.

public class VariableExample{
	public static void main(String[] args) {
    	int value = 10;          // 로컬 변수
        int sum = value + 20;    // 로컬 변수
        System.out.println(sum);
    }
}

변수는 블록 내 어디에서는 선언할 수 있지만, 변수 사용에는 제한이 따른다.
변수는 자신이 선언된 위치로부터 자신이 속한 블록 내부에서만 사용할 수 있다.

메소드 블록 내에는 다른 중괄호 {} 블록들이 작성될 수 있다.
예를들어 조건문에 해당하는 if(){}, 반복문에 해당하는 for(){}등이 중괄호 블록을 가질 수 있다.
이러한 중괄호 {} 블록 내에서 선언된 변수는 해당 중괄호 {} 블록 내에서만 사용이 가능하고 밖에서는 사용할 수 없다.

public static void main(String[] args) {
	int var1;
    
    if() {    //var1과 var2 사용가능
    	int var2;   
    }
    
    for() {   //var1과 var3 사용가능, var2는 사용못함
    	int var3;
    }
    
    //var1 사용가능
    //var2와 var3는 사용못함
}

💡변수를 선언할 때의 주의사항
  1. 변수가 어떤 범위에서 사용될 것인지를 생각하고, 선언 위치를 결정해야 한다.
  2. 메소드 블록 전체에서 사용하고 싶다면 메소드 블록 첫머리에 선언한다.
  3. 특정 블록 내부에서만 사용된다면 해당 블록 내에 선언한다.


기본 타입(primitive type)

자바는 정수, 실수 ,논리값을 저장할 수 있는 기본 타입을 총8개 제공한다.

저장되는 값에 따른 분류타입의 종류
정수 타입byte, char, short, int, long
실수 타입float, double
논리 타입boolean

정수 타입

자바에서 정수 타입은 총 5개로, 메모리 사용 크기와 저장되는 값의 범위가 서로 다르다.

타입메모리 사용크기저장되는 값의 허용범위
byte1byte(8bit)27-2^7 ~ (271)(2^7 - 1)-128 ~ 127
short2byte(16bit)215-2^{15} ~ (2151)(2^{15} - 1)-32,768 ~ 32767
char2byte(16bit)      00 ~ (2161)(2^{16} - 1)0 ~ 65535(유니코드)
int4byte(32biy)231-2^{31} ~ (2311)(2^{31} - 1)-2,147,483,648 ~ 2,147,483,647
long8byte(64bit)263-2^{63} ~ (2631)(2^{63} - 1)-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

char타입은 음수 값을 가질 없으며, 나머지 정수 타입이 저장할 수 있는 값의 범위는 2(n1)-2^{(n-1)} ~ (2n11)(2^{n-1}-1)이다.
여기서 n은 메모리 bit수이다. 정수 타입으로 선언된 변수에는 정수 리터럴을 대입해서 정수를 저장할 수 있다.

long 타입

long타입은 수치가 큰 데이터를 다루는 프로그램에서 주로 사용된다.
기본적으로 컴파일러는 정수 리터럴을 int타입으로 간주되기 때문에, long의 경우 컴파일러에게 따로 알려주어야 한다.

long balance = 30000000000;     //컴파일 에러
long balance = 30000000000L;    //소문자l 혹은 대문자L을 붙여주어야 한다.

char 타입

하나의 문자를 작은 따옴표('')로 감싼 것을 문자 리터럴이라고 한다.
문자 리터럴은 유니코드로 변환되어 저장된다. 유니코드는 세계 각국의 문자를 2byte로 표현할 수 있는 숫자(0~65535)로 매핑한 국제 표준 규약이다.

예를 들어 'A','B','가','각' 문자를 char변수에 저장할 경우 변수에 저장되는 유니코드 값은 아래와 같다.

char var1 = 'A';    //유니코드: 65
char var2 = 'B';    //유니코드: 66
char var3 = '가';    //유니코드: 44032
char var4 = '각';    //유니코드: 44033

유니코드는 정수이므로 char도 정수 타입에 속한다. 그래서 char변수에 작은따옴표('')로 감싼 문자가 아니라, 10진수 또는 16진수 형태로 유니코드를 저장할 수 있다.

💡문자 리터럴을 int타입에 저장할 경우
 작은따옴표('')로 감싼 문자 리터럴은 유니코드로 변환되기 때문에 int타입 변수에도 저장할 수 있다.
 char타입 변수에 저장하면 자동으로 문자로 매핑되어 출력되지만, int타입 변수에 저장하면 유니코드가 출력된다.

char var1 = 'A';
int var2 = 'A';
System.out.println(var1);    //A를 출력
System.out.println(var2);    //65를 출력

실수 타입

소수점이 있는 실수 리터럴을 저장할 수 있는 타입에는 floatdouble이 있다.

타입메모리 사용크기저장되는 값의 허용범위(양수기준)정밀도(소수점 이하 자리)
float4byte(32bit)(1.4 x 104510^{-45}) ~ (3.4 x 103810^{38})7자리
double8byte(64bit)(4.9 x 1032410^{-324}) ~ (1.8 x 1030810^{308})15자리

자바는 실수 리터럴을 기본적으로 double 타입으로 해석하기 때문에 double 타입 변수에 저장해야 한다.
실수 리터럴을 float 타입 변수에 저장하면 컴파일 에러가 발생한다.

float var = 3.14;     //컴파일 에러 발생
float var = 3.14f;

double var = 3.14;
double var = 314e-2;

double 타입은 float 타입보다 2배 정도 정밀도가 높기 때문에 좀 더 정확한 데이터 저장이 가능하다.

논리타입

자바는 참과 거짓을 의미하는 논리 리터럴로 truefalse를 사용한다.

boolean stop = true;
boolean state = false;

타입 변환(type conversion)

두 변수의 타입이 동일할 경우, 한쪽 변수값을 다른 쪽 변수에 복사해서 저장할 수 있다.

byte a = 10;    //byte 타입 변수 a에 10을 저장
int b = a;      //변수 a에 저장된 10을 int 타입 변수 b에 복사해서 저장

원래 10은 byte 타입의 값이었으나, 복사해서 저장할 때 int 타입의 값으로 변환되었다.
자바에서는 이것을 타입 변환이라고 한다.

자동 타입 변환(Promotion)

자동 타입 변환은 말 그대로 자동으로 타입 변환이 일어나는 것을 의미한다.
자동타입 변환은 값의 허용 범위가 큰 타입으로 저장될 때 발생하는데, 기본 타입을 허용 범위 크기순으로 정리하면 아래와 같다.

byte < short < int < long < float < double

아래의 코드는 int 타입이 byte 타입보다 허용 범위가 더 크기 때문에 자동 타입 변환이 일어난다.

byte byteValue = 10;
int intValue = byteValue;    //자동 타입 변환됨

정수 타입이 실수 타입으로 저장될 경우, 실수 타입의 허용 범위가 더 크기 때문에 무조건 자동 타입 변환이 일어난다.

long longValue = 5000000000L;
float floatValue = longValue;     //5.0E9f로 저장됨
double doubleValue = longValue;   //5.0E9로 저장됨

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

char charValue = 'A';
int intValue = charValue;    //65가 저장됨

💡자동 타입 변환에서의 예외
 char 타입보다 허용범위가 작은 byte 타입은 char 타입으로 자동 타입 변환될 수 없다.
 왜냐하면 char타입의 허용범위는 음수를 포함하지 않는데, byte 타입은 음수를 포함하기 때문이다.

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

강제 타입 변환

큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장하는 것을 강제 타입 변환(castiong)이라고 한다.
강제 타입 변환은 캐스팅 연산자 괄호()를 사용하는데, 괄호 안에 들어가는 타입은 나누는 단위이다.

int intValue = 10;
byte byteValue = (byte) intValue;

int intValue = 10;
char charValue = (char) intValue;
System.out.println(charValue);     //'A' 출력

실수 타입(float, double)은 정수 타입(byte, short, int, long)으로 강제 타입 변환을 사용해야 한다. 이 경우 소수점 이하 부분은 버려지고, 정수 부분만 저장된다.

double doubleValue = 3.14;
int intValue = (int) doubleValue;   //3

정수 연산에서의 자동 타입 변환

정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환되어 연산을 수행한다.

byte reulst1 = 10 + 20;
System.out.println(result);

byte x = 10;
byte y = 20;
int result2 = x + y;
System.out.println(result2);    

정수 연산식에서 모든 변수가 int 타입으로 변환되는 것은 아니고, 두 피연산자 중 허용 범위가 큰 타입으로 변환되어 연산을 수행한다.
예를 들어 int 타입보다 허용 범위가 더 큰 long 타입이 피연산자로 사용되면 다른 피연산자는 long 타입으로 변환하고 연산을 수행한다. 따라서 연산 결과는 long 타입 변수에 저장해야 한다.

byte value1 = 10;
int value2 = 100;
long value3 = 1000L;
long result = value1 + value2 + value3;
System.out.println(result);

실수 연산에서의 자동 타입 변환

실수 타입 변수가 산술 연산식에서 피연산자로 사용될 경우, 피연산자 중 하나가 double 타입이라면 다른 피연산자도 double 타입으로 자동 타입 변환되어 연산을 수행한다. 따라서 연산 결과는 double 타입이 된다.

int 타입과 double 타입을 연산하는 경우에도 int 타입의 피연산자가 double 타입으로 자동 변환되고 연산을 수행한다.
만약, int 타입으로 연산을 해야하는 경우에는 강제 변환을 해주어야 한다.

int intValue = 10;
double doubleValue = 5.5;
int result = intValue + (int) doubleValue;   //15

+ 연산에서의 문자열 자동 타입 변환

연산식에서 +연산자가 연이어 나오면 앞에서부터 순차적으로 + 연산을 수행한다.
만약 먼저 수행된 연산이 결합 연산이라면 이후 + 연산은 모두 결한 연산이 된다.

int value = 1 + 2+ 3;       //6
String str = 1 + 2+ "3";    //"33"
String str = 1 + "2" + 3;   //"123"
String str = "1" + 2 + 3;   //"123"

문자열을 기본 타입으로 강제 타입 변환

변환타입사용 예
String ➡️ byteString str = "10";
byte value = Byte.parseByte(str);
String ➡️ shortString str = "200";
short value = Short.parseShort(str);
String ➡️ intString str = "300000";
int value = Integer.parseInt(str);
String ➡️ longString str = "40000000000";
long value = Long.parseLong(str);
String ➡️ floatString str = "12.345";
float value = Float.parseFloat(str);
String ➡️ doubleString str = "12.345";
double value = Double.parseDouble(str);
String ➡️ booleanString str = "true";
Boolean.parseBoolean(str);
profile
느리더라도 꾸준하게

0개의 댓글