본문 바로가기

Java

변수와 타입

2.1 변수

2.1.1 변수란?

프로그램은 작업을 처리하는 과정 중 데이터를 메모리에 저장한다.
변수(Variable)는 값을 저장할 수 있는 메모리 공간을 의미한다. 이름이 변수인 이유는? 값이 변할 수 있기 때문

 

 

2.1.2 변수 선언

변수를 쓰려면 먼저 변수를 선언해야한다. 데이터 타입과 변수 이름을 정해준다.

int age; //정수(int)값을 저장할 수 있는 age 변수 선언
double value; //실수(double)값을 저장할 수 있는 value 변수 선언

 

같은 타입의 변수는 , (콤마)를 이용해서 한꺼번에 선언할 수도 있다.

int x, y, z;

 

변수 명명 규칙

java에서 정한 명명 규칙

 

규칙 1) 첫 글자는 문자이거나 $, _여야하고 숫자로 시작할 수 없다. * price, $price, _company / 1v, @speed, #value

규칙 2) 영어 대소문자 구분 * firstname, firstName은 다른 변수

규칙 3) 첫문자는 영어로 시작하되, 다른 단어가 붙을 경우 첫 문자는 대문자 * maxSpeed, firstName, carBodyColor (카멜 표기법) - max_speed, first_name, car_body_color (스네이크 표기법)

규칙 4) 수 길이 제한 없다

규칙 5) 자바 예약어 사용 불가능

 

예약어는 자바에서 기본적으로 사용하고 있는 이름인데 변수이름을 예약어와 같게 선언하면 컴파일 에러가 발생한다.

 

예약어 종류 일부

 

개발을 여러명이서 하기 때문에 변수이름은 다른 사람이봐도 대충 어떤 값을 저장하고 있는지 알 수 있도록 정하는 게 좋다. 또한 한글보다는 영어를 사용하기를 추천한다.

 

2.1.3 변수의 사용

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

수학은 같다(=)는 표시이지만 자바에서는 오른쪽 값을 왼쪽 값에 저장한다는 의미이다.

 

방법 1) 선언하고 값 저장

int score; // 변수 선언 score = 90; // 값 저장 (오른쪽 값을 왼쪽 값에 저장한다)

방법 2) 선언과 동시에 값 저장

int score = 90; // 변수 선언과 동시에 값 저장

 

소스 코드 내에서 직접입력된 값을 리터럴(literal)이라고 부른다. 앞의 코드에서 숫자 90도 리터럴이라고 볼 수 있다.

 

  • 정수 리터럴 0, 75 ( 10진수 ) 02, -04 ( 8진수 ) 0x5, 0xA, 0xB3 ( 16진수 )
  • 실수 리터럴 : 소수점 0.25, -3.14 ( 10진수 ) 5E7, 0.12E-5 // 5x 10^7, 0.12x 10^-5
    ( 대문자 E나 소문자 e가 있는 리터럴 )
  • 문자 리터럴 작은 따옴표(')로 묶은 텍스트는 하나의 문자 리터럴로 간주한다 'A', '한', '\t', '\n'
    역슬래쉬(\)가 붙은 문자 리터럴은 이스케이프 문자라고도 부른다.

     

  • 문자열 리터럴 "말그대로 문자", 큰 따옴표(")로 감싼다.
  • 논리 리터럴 true와 false는 논리 리터럴로 간주한다.

 

변수값 읽기

변수는 초기화 되어야 읽을 수 있다. 초기화되지 않았다? 당근 읽을 수 없다. 초기화 : 초기 값 설정해준다는 말.

int value; //변수 value 선언 (초기화 안됨)
int result = value + 10; // 컴파일 에러 발생. value 값 없다.

 

2.1.4 변수의 사용 범위

변수는 {} 중괄호 블록 내에서 선언되고 사용된다. 중괄호 블록을 사용하는 곳은 클래스, 생성자, 메소드인데, 일단 모든 변수는 메소드 블록 내에 존재한다고 생각하자. 메소드 블록 내에 선언된 변수는 local variable(로컬변수 혹은 지역변수)라고 부른다.

 

특징은 메소드 실행 끝나면 로컬변수도 메모리에서 자동으로 없어진다.

public class VariableExample{
	public static void main(String[] args){//여기 중괄호 부터
    	int value= 10;
        int sum = value + 20;
        System.out.println(sum);
    }// 여기 중괄호까지 메소드 블록
}

중요한 포인트는 변수는 선언된 블록 내에서만 사용할 수 있다는 점..

 

public class VariableScopeExample{
	public static void main(String[] args){
    	int v1 = 15;
        if(v1> 10){
        	int v2= v1- 10;
        }
        int v3 = v1 + v2 + 5 ; // 에러남 왜냐하면 int v2는 if {} 밖에서 쓸 수 없기 때문에
    }
 }

 

에러는 이클립스 하단에 생긴 창에서 확인할 수 있다.

 

 

 


2.2. 데이터 타입

모든 변수에는 타입(type)이 있다. 선언할 때 주어진 타입은 변수 사용 도중 변경할 수 없다는 걸 알아두자.

 

2.2.1 기본(원시: primitive) 타입

데이터 자체를 직접 저장하는 타입

메모리에는 0과 1을 저장하는 최소 기본 단위인 비트(bit)가 있다 이 비트 8개를 묶으면 1바이트(byte)가 된다. 메모리에서 사용할 공간을 정하는 것이라고 생각하면 되겠다.

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

byte 타입

색상 정보 및 파일 또는 이미지 등의 이진 데이터를 처리할 때 주로 사용된다. 00000000 → 0

00000001 → 1

00000011 → 2

11111111 → -1

11111110 → -2

ㄴ 최상위 비트 0, 1은 양수냐 음수냐를 정한다. ... 2^7 총 256개를 저장할 수 있다. 실제는 -127 ~+ 128인데 숫자 0이 있기 때문이다.

 

public class ByteExample{
	public static void main(String[] args){
    	byte var1 = -127;
        byte var2 = -30;
        byte var3 = 0;
        byte var4 = 128;
        // byte var5 = 129 // 컴파일 에러 발생
        var4 = var4 + 1;
        System.out.println(var4); // -> 127에서 +1 되면 다시 -128부터 시작한다
        // 의도치 않은 엉터리 값;; 쓰레기값이라고 한다. 주의해야함
    }
 }

 

char 타입

자바는 모든 문자를 유니코드( Unicode )로 처리한다 유니코드? 세계 각국의 문자들을 코드값으로 매핑한 국제 표준 규약이다.

 

0~127까지 ASCI문자 (특수기호 및 영어 알파벳) 할당, 44032~55203까지 한글 11172자 할당

 

char (2byte)안에 이 유니코드를 제공할 수 있게 해준다.

작은 따옴표(')를 사용해서 문자를 나타낸다.

public class CharExample{
	public static void main(String[] args){
    	char c1 ='A'; // 문자로 저장
        char c2 = 65; // 10진수로 저장 
        char c3 = '\u0041'; // 16진수로 저장 
        
        int Unicode = c1;
        System.out.println(c1); //=> A
        System.out.println(c2); //=> A
        System.out.println(c3); //=> A 
        System.out.println(Unicode); //=> 65
    }
 }

 

char 타입은 단 하나의 문자만 저장한다.

 

만약 문자열을 저장하고 싶다면? String 타입을 써야한다.

String name ="홍길동";

String 변수 선언하고, 큰 따옴표(")로 감싼 문자열 리터럴을 대입한다.

String은 기본타입이 아니다. String은 클래스 타입이고, 변수는 참조 변수이다. 이에 대한 자세한 내용은 참조 타입에서 설명할 예정

 

🤔
char c=''; //컴파일 에러 난다. char c = ' '; 공백을 넣어주자. String str="" 빈 문자를 대입해도 괜찮다.

 

short 타입

2byte로 표현되는 정수값을 저장할 수 있는 데이터 타입이다 -32,768~32,767 C언어와의 호환을 위해 사용되며 비교적 자바에서는 잘 안 쓴다.

int 타입

자바에서 많이 쓴다. 자바에서 정수 연산을 4byte로 처리하기 때문.. 기본 값이다. 범위는 -2,147,483,648~2,147,483,647이다. byte 타입 short타입의 변수를 + 연산하면 int 타입으로 변환해서 연산하고, 결과 역시 int 타입이 된다

 

byte나 short써서 쬐끔 메모리 아낀다고 별 차이 없으니까

일반적으로 int 타입 쓰면 된다.

 

int var1 = 10; // 10진수 
int var2 = 012; // 8진수
int var3 = 0xA; // 16진수

뭘로 써도 메모리엔 2진수로 저장된다

long 타입

-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,805 범위까지 저장할 수 있다.

대용량 데이터를 다룰 때 쓴다. 은행 이나 우주 관련 산업에서 쓰는 프로그램들..

 

long 타입 쓰려면 꼭 숫자 뒤에 L을 붙여야 한다. l은 숫자랑 혼돈하기 쉬우므로 대문자 L로

long var1 = 10;
long var2 = 20L;
long var3 = 1000000000000; // 컴파일 에러 발생!
// ( The literal 100000000000000 of type int is out of range ) long var4 = 1000000000000L;

에러나는 이유? 앞서 얘기했듯이 java는 int 타입이 기본 값이다. 4byte아닌 8byte란 걸 알려줘야 한다.

2.2.3 실수(float, double) 타입

소수점이 있는 실수 데이터를 저장할 수 있는 타입. float : 4byte double: 8byte

실수는 같은 바이트 크기의 int와 long보다 큰 범위의 값을 저장할 수 있다. 부동 소수점 방식을 사용하기 때문!

+ m x 10^n

1.2345는 + 0.12345 x 10¹

 

float : 부호(1bit)+ 가수(23bit) + 지수(8bit) = 4byte double : 부호 (1bit) + 가수(52bit)+지수(11bit) = 8byte/

 

 

자바는 실수 리터럴 기본 타입을 double로 간주한다. float타입 쓰려면 리터럴 뒤에 f나 F를 붙여야 함

double var = 3.14;
float var2 =3.14; //컴파일 에러 발생
float var3 = 3.14F; 

 

정밀도 테스트

double var4 = 01234567890123456789; 
float var5 = 0.1234567890123456789f; 
System.out.println(var4); //0.123456789012345678 정확히 표현됨 
System.out.println(var5); //0.12345679

 

2.2.4 논리타입

참인 true와 거짓인 false를 나타내는 타입

boolean stop = true;
if(stop) {
	System.out.println("중지합니다");
} else {
	System.out.println("시작합니다"); 
} // stop은 true이므로 "중지합니다" 출력

 

2.3. 타입 변환

타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것을 말한다.

2.3.1 자동 타입(형) 변환

작은 크기 타입 ⇒ 큰 크기 타입 자동 변환이 일어난다.

byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)

주의 : float보다 long이 큰 이유는 표시하는 범위가 더 크기 때문이라고 한다.

 

작은 걸 큰 거에 담으니까 무리 없이 변환이 일어나는 것이다.

int intValue = 200; 
double doubleValue = intValue; //200.0 

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

byte byteValue = 65; 
char charValue = byteValue; //에러. char는 2byte인데? 0~65535범위 음수면 어째? 자동변환x 

char charData = (char) byteValue; // 강제 형 변환 해주도록 한다.

2.3.2 강제 타입(형) 변환

그럼 자동으로 안바뀌면 어떻게 하나? 강제로 바꿔준다. 작은 크기 타입 = (작은 크기 타입) 큰 크기 타입

int intValue = 103029770;
byte byteValue = (byte) intValue; //강제 타입변환

위의 경우 값이 보존되지 않을 수 있다. 데이터 손실의 위험이 있다는 걸 주의하자.

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

데이터 손실에 대한 내용을 이런 식으로 확인할 수 있다.

int i = 128;
if( (i<Byte.MIN_VALUE) || (i>Byte.MAX_VALUE) ) {
	System.out.println("데이터 손실이 있습니다");
} else {
	byte b = (byte) i; System.out.println(b);
} // => 데이터 손실이 있습니다. 출력

 

Byte.MAX_VALUE, Byte.MIN_VALUE Short.MAX_VALUE, Short.MIN_VALUE Integer.MAX_VALUE, Integer.MIN_VALUE Long.MAX_VALUE, Long.MIN_VALUE Float.MAX_VALUE, Float.MIN_VALUE Double.MAX_VALUE, Double.MIN_VALUE

 

2.3.2 연삭식에서 자동 타입(형) 변환

만약 타입이 다른 데이터를 연산한다면 어떻게 될까? 데이터 타입 중 큰 타입으로 자동 변환 된 다음에 연산된다.

byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)

int intValue = 10;
double doubleValue = 5.5;
double result = intValue + doubleValue; //result에 15.5가 저장
// (double)int + double = double이 됨.

int intValue1 = 10;
short shortValue1 = 10;
long longValue1 = 10;
float floatValue1 = 5.5f;
double doubleValue1 = 5.5;

//intValue1 + shortValue1 + longValue1 + floatValue1 + doubleValue1 하면? double이 가장 크니까 모든 게 double 타입으로 형 변환되어 계산 됨. 

 

예제

밑변이 10이고 높이가 5인 삼각형의 넓이를 기억할 변수를 만들고 초기화하세요. 밑변과 높이의 변수도 선언하고 초기화 하세요.

공식 ] 삼각형의 넓이 = 밑변 * 높이 * 1/2

더보기

int height = 5;
int width = 10;
double area = height * width * 1/2;
double area로 선언 // (double)5.0 * (double)10.0 * (double)0.5

반응형

'Java' 카테고리의 다른 글

상속 : final 클래스와 final 메소드  (0) 2021.03.07
상속 : 메소드 재정의(오버라이딩)  (0) 2021.03.07
상속 : 상속의 개념  (0) 2021.03.07
참조타입  (0) 2021.03.04
동일성과 동등성(==, equals())  (0) 2021.01.10