본문 바로가기
programming language/JAVA

01_변수와 타입

by cariño 2023. 12. 24.
728x90
반응형

컴퓨터 메모리 (RAM)은 수많은 번지들로 구성된 데이터 저장 공간이다. 

프로그램은 데이터를 메모리에 저장하고 읽는 작업을 빈번히 수행한다. 

 

변수는 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름을 의미한다. 

변수에 값이 처음 저장될 때 메모리 번지를 참고한다. 초기값을 주지 않으면 메모리 번지를 참조할 수 없다. 

 

자바의 변수는 다양한 타입의 값을 저장할 수 없다. 

정수형 변수에는 정수값만, 실수형 변수에는 실수값 타입에 맞는 값만 저장할 수 있다. 

 

[변수를 생성하는 방법]

선언을 통해 변수를 생성하는데, 변수 선언은 어떤 타입과 어떤 데이터를 저장할 것인지 그리고 변수 이름은 무엇인지 결정한다. 변수를 통해

이름은 가급적이면 값을 표현할 수 있는 이름을 카멜케이스 스타일을 적용해 생성한다. 

또한 변수명은 소문자로 시작하는 것이 관례이고 만일 다른 글자가 붙게되면 대문자로 붙여준다.

변수의 이름의 길이와 성능은 상관이 없다. 

ex)

자동차의 종류

carKind

studentNum

memberId

 

변수에 최초로 값을 대입하는 행위를 변수 초기화라고 한다. 

변수 선언과 동시에 대입할 수도 있다. 

int score = 90

 

 
public class VariableInitialization {

public static void main(String[] args) {
System.out.println("hello");

// 변수 선언
int age;
 
// 변수에 값 저장
age = 15;
// 메모리 특정 위치에 변수 age가 저장된다.
// age = 15.5 는 저장할 수 없다. int가 정수에 대한 변수 선언이기 때문
 
System.out.println(age);

// 변수선언과 동시에 초기 값을 저장
int score = 90;
System.out.println(score);

 

 

초기화를 하지 않고 사용을 하게 되면 에러가 난다.

int value;
int result = value +10; //error

 

 

변수는 또 다른 변수에 대입되어 메모리 간에 값을 복사한다. 

int x = 3;
int y = 5;
System.out.println("x:" + x + ", y:" + y);
// x:3, y:5


int temp = x;
x = y;
y = temp;
System.out.println("x:" + x + ", y:" + y);
// x:5, y:3

 

 

2. 정수타입

 

정수타입은 총 5개고, byte의 수가 늘어나는데 메모리의 크기가 늘어난다. (값의 크기도 커진다는 의미)

각 타입에 허용되는 메모리 할당 크기 정도는 알고 있는것을 추천.

최상의 비트는 0과 1이다.

 

정수 타입 메모리 사용 크기 순

종류 byte short int long
메모리 사용 크기 단위(bit) 8 16 32 64

 

 

 

직접 입력한 값(정수, 실수, 문자)을 리터럴이라 부른다. 변수에 대입할 정수 리터럴은 진수에 따라 작성하는 방법이 다르다.

일반적으로 알고 있는 숫자는 10진수이다. 0x 시작하는 숫자, 

public static void main(String[] args) {
int var1 = 0b1011;
int var2 = 0206;
int var3 = 365;
int var4 = 0x83;

System.out.println("var1:" + var1); //11
System.out.println("var2:" + var2); //134
System.out.println("var3:" + var3); //365
System.out.println("var4:" + var4); //179

byte var11 = -128;
System.out.println(var11); //-128
}

 

 

long타입

수치가 큰 데이터를 다루는 프로그램에서 사용된다.

int타입의 허용 범위를 벗어나는 리터럴은 'l', 'L' 붙여서 long타입 값임을 컴파일에게 알려줘야 한다.

public static void main(String[] args) {
long var1 = 10;
long var2 = 10L;
long var3 = 100000000; //int로 간주하게 된다.
long var4 = 100000000L;

System.out.println(var1);
System.out.println(var2);
System.out.println(var3);
System.out.println(var4);
}

 

 

3. 문자타입

하나의 문자를 작은 따옴표('')로 감싼 것을 문자 리터럴이라고 한다. 

문자타입이 별도로 있는데  정수타입에 char들어가있을까?

문자 리터럴은 유니코드로 변환되어 저장되기에 문자도 정수타입이다. 자바는 유니코드를 저장할 수 있도록  char타입을 제공한다. 

char타입은 음수로 맵핑되지 않고 문자 한자만 가능하다. 문자 2자이상일 경우 문자 열이 된다.

 

실제로 저장되는 것은 'a' '' 해당되는 코드값이 저장된다.

char var1 = 'A';
char var2 = 65;

char var3 = '가'; //가
char var4 = 44032; //가

System.out.println(var1); //A
System.out.println(var2); //A
System.out.println(var3); //가
System.out.println(var4); //가

 

 

만일 단순히 초기화를 할 목적으로 빈 문자를 대입한다면 컴파일 에러가 난다. 이럴 경우는 공백을 하나 포함해서 초기화 시켜야한다. 

char txt = '';
char txt = ' ';

 

 

4. 실수타입

실수 타입에는 float과 double이 있고 메모리 할당 크기와 저장되는 값의 범위를 가지고 있다. 

double타입이 float타입보다 큰 실수를 저장할 수 있고 정밀도도 놓지만,  float보다 double 가용할  있는 수가 많기 때문에 굳이 float과 double을 나눠서 쓰지 않고 double만을 사용하는 추세 .

 

  float: 4byte

  double: 8byte

 

만일 타입을 대입하고 싶으면 리터럴 문자 뒤에 소문자 'f' 대문자'F'를 붙여서 컴파일러가 float타입임을 알 수 있도록 한다.

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

float var = 3.14f;
float var = 3E6F;

 

 

5. 논리타입

참과 거짓을 의미하는 논리 리터럴은 boolean타입 변수에 대입할 수 있다. 

주로 두가지 상태값을 저장할 필요가 있을 경우에 사용된다. 연산식 중에도 비교, 논리 연산의 산출값은 true, false로 타입 변수에 같이 대입할 수 있다. 

boolean stop = false;

if(stop){
System.out.println("중지");
}else{
System.out.println("시작");
}

int x = 10;
boolean result2 = (x == 20);
boolean result3 = (x != 20);
 
System.out.println(result2); //false
System.out.println(result3); //true

 

 

6. 문자열 타입

작은따옴표로 감싼 한 개의 문자는 char타입이지만, 큰 따옴표로 감싼 여러 개의 문자들은 유니코드로 변환되지 않는다. 

만일 문자열을 변수에 저장하고 싶다면 String 타입을 사용해야 한다. String타입은 자바 기본 타입에 속하지 않는 참조 타입니다.

 

텍스트 블록 문법 또는 이스케이프 문자를 활용해서 문자열 그대로 출력 할 수 있다. 

(텍스트 블록 문법은 Java 13부터 제공됨)

// 이스케이프 문자
System.out.println("가나다\n라마바\n사");
System.out.println("가나다\"라마바\"사");
// 텍스트 블록 문법
String str1 = """
{
"id": "winter",
"name": "눈송이"
}
""";
System.out.println(str1);

 

 

 

자동 타입 변환

자동 타입 변환은 값의 허용 범위가 작은 타입이 < 허용 범위가 큰 타입으로 대입될 때 발생한다. 

byte < short, char < int < long < float < double

 

int 타입이 byte타입보다 허용 범위가 더 크기 때문에 자동으로 타입이 변환 된다.

정수 타입이 실수 타입으로 대입될 경우는 무조건 자동 타입 변환이 된다. (정수타입 허용 범위 <실수타입  허용 범위)

 

예외케이스)

byte타입은 char타입으로 자동 변환될 수 없다. char타입의 허용 범위는 음수를 포함하지 않기 때문

(byte타입은 음수를 포함)

byte byteValue = 65;
char charValue = byteValue;

 

 

평균을 구하는 예제

// 총점 355점
// 총인원 7명
// 평균을 구해보세요.
 

// 정수끼리 나누면 소수점을 무시하기 때문에 (int타입에 맞춘 결과가 나옴)
// 타입캐스팅을 이용
int totalScore = 355;
int totalPerson = 7;

// 타입캐스팅
double result = (double) totalScore / totalPerson;
System.out.println(result);  //50.714285714285715

 

 

강제 타입 변환

큰 범위에서 작은 범위로 자동타입변환이 될 수 없다. 큰 허용 범위 타입을 작은 허용 범위 타입으로 쪼개어서 저장하는 것을 강제 타입 변환 (캐스팅) 이라고 한다.  캐스팅 연산자로 괄호를 사용한다. 괄호 타입은 쪼개는 단위로 사용된다. 

int var1 = 10;
byte var2 = (byte) var1;
System.out.println(var2); //10

long var3 = 300;
int var4 = (int) var3;
System.out.println(var4); //300

int var5 = 65;
char var6 = (char) var5;
System.out.println(var6); // 'A'

double var7 = 3.14;
int var8 = (int) var7;
System.out.println(var8); //3

 

 

연산식에서 자동 타입 변환

자바는 실행 성능을 향상시키기 위해서 컴파일 단계에 연산을 수행한다. 

 

byte 변수 x, y가 피 연산자로 사용된다면 변수 값은 int타입으로 변환되어 연산된다. 결과도 int타입으로 생성된다.

따라서 결과 값은 byte에 저장할 수 없고, int 변수에 저장해야 한다. 

byte x = 10;

byte y = 20;

byte result =  x + y; //컴파일 에러

int result = x + y;

 

 

특별한 경우가 아니라면 정수 연산시 int 타입으로 변수를 선언하는 것이 타입 변환이 발생하지 않기 때문에 실행 성능에 도움이 된다. 

int x = 10;

int y = 20;

int result = x + y;

 

int타입과 double타입을 연산하는 경우 int타입 피연산자가 double타입으로 자동 변환되고 연산을 수행한다. 

자바에서 정수 연산의 결과는 항상 정수가 된다. 

int value = 10;
double doubleValue = 5.5;
// value가 double타입으로 변환이 된다.
double result2 = value + doubleValue;
System.out.println(result2); //15.5

 

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

int intValue2 = 10;
double doubleValue2 = 5.5;
int result3 = intValue2 + (int) doubleValue2;

 

 

자바에서 + 연산자는 두 가지 기능을 갖고 있다. 

피연산자가 모두 숫자일 경우에는 덧셈 연산을 수행하고 , 피연산자 중 하나가 문자열일 경우에는 나머지 피연산자도 문자열로 자동 변환되어 문자열 결합 연산을 수행한다. 

int value10 = 3 + 7;
System.out.println(value10); //10

String str2 = "3" + 7;
System.out.println(str2); //37

String str3 = (3 + 2) + "7";
System.out.println(str3); //57

 

 

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

// 문자열 기본 타입 변환
String str11 = "10";
byte value11 = Byte.parseByte(str11);
System.out.println(value11);

String str12 = "200";
short value12 = Short.parseShort(str12);
System.out.println(value12);

String str13 = "300000";
int value13 = Integer.parseInt(str13);
System.out.println(value13);

String str14 = "400000000";
float value14 = Float.parseFloat(str14);

System.out.println(value14);
String str15 = "12.345";
float value15 = Float.parseFloat(str15);

System.out.println(value15);
double value16 = Double.parseDouble(str15);
System.out.println(value16);

String str16 = "true";
boolean value17 = Boolean.parseBoolean(str16);
System.out.println(value17);

 

 

728x90

댓글