java 변수(타입),형변환

개미Coder
|2024. 4. 12. 16:18
반응형

## 프로그램 소스 분석


자바 실행 프로그램은 반드시 클래스(class) 블록과 main() 메서드(method) 블록으로 구성되어야 한다. 
메서드블록은 단독으로 작성될 수 없고 항상 클래스 블록 내부에서 작성되어야 한다. 
클래스와 메서드를 간단하게설명하면 다음과 같다.

클래스 : 필드 또는 메서드를 포함하는 블록
메서드 : 어떤 일을 처리하는 실행문들을 모아 놓은 블록 

클래스의 이름은 개발자가 마음대로 정할 수 있지만  소스 파일명 클래스명은 대/소문자가 일치해야 한다. 


# 주석과 실행문
주석은 프로그램 실행과는 상관없이 코드에 설명을 붙인 것을 말한다.   
컴파일 과정에서 주석은 무시 되고 실행문만 바이트 코드로 번역된다.   
따라서 주석을 많이 작성한다고 해서 전체 프로그램의 크기가 커지는 것은 아니므로 
가급적이면 설명이 필요한 코드에 주석을 달아 두는 것이 좋다. 


코드에서 사용하는 주석문의 종류에는 다음과 같이 두가지가있다

// //부터 라인 끝까지 주석으로 처리한다. (행주석)

/* */ /*와 */ 사이에 있는 모든 코드를 주석으로 처리한다. (범위 주석)

class Main01 { // 클래스 블럭
public static void main(String[] args) { // 메인 메서드 블럭

// 콘솔에 출력하는 실행문
System.out.println("Hello, Welcome to the java world"); // 내용을 출력하는 실행문
} // 메인 메서드 블럭
} // 클래스 블럭


# 실행문과 세미콜론(;)
실행문은 변수 선언, 값 저장, 메소드 호출에 해당하는 코드를 말한다. 
실행분을 작성할 때 주의할 점은 실행문의 마지막에 반드시 세미콜론(;)을 붙여서 실행문이 끝났음을 표시해주어야 한다. 
다음 은 실행문을 작성한 예를 보여준다.

class Main01 {
public static void main(String[] args) {

int x = 10;
int y = 20;
int result = x + y;
System.out.println(result);
}
}
컴파일러는 세미콜론(;)이 나올때까지 실행문이 계속해서 연결된 것으로 보기 때문에 
한 실행문이 여러 줄에 걸쳐 있어도 되고, 한줄에 여러 개의 실행문이 있어도 된다. 
예를 들어, 앞의 코드를 다음과 같이 바꾸어 작성해도 전혀 문제가 없다.

class Main01 {
public static void main(String[] args) {

int x = 10; int y = 20;
int result = 
x + y;
System.out.println(result);
}
}

 

 


 

 

 

# 변수 선언


-변수를 사용해야 하는 이유는 무엇일가?


-게임을 프로그래밍 한다고 생각해보자 게임내의 케릭터들은 레벨이 존재한다.
 처음에는 레벨이 1이었지만 시간이 지나면서 레벨2, 레벨3으로 업그레이드된다.
 우리가 프로그래밍 할 때 처음에 사용한 값과 다르게 변하는 값이 있다.
 예를 들면 나이나 은행 잔고등은 처음과 지금이 다르게 변할 수 있다.
 이렇게 변하는 값을 변수라고 한다.

 


프로그램은 작업을 처리하는 과정에서 필요에 따라 데이터를 메모리에 저장한다. 
이때 변수를 사용하는데, 변수(Variable) 는 값을 저장할 수 있는 메모리의 공간을 의미한다. 
변수란 이름을 갖게 된이유는 프로그램에 의해서 수시로 값이 변동될 수 있기 때문이다. 
변수에는 복수 개의 값을 저장할수 없고, 하나의 값만 저장할 수 있다.

변수에는 다양한 타입의 값을 저장할 수 없고 한 가지 타입의 값만 저장할 수 있다. 
예를 들어 정수 것인지 그리고 변수 이름이 무엇인지를 결정한다. 변수 선언은 다음과 같다.

 
변수타입 변수명;
int age; // int = 정수 값을 저장할 수 있는 age 변수 선언
double value; // double = 정수 값을 저장할 수 있는 value 변수 선언

 




타입은 변수에 저장되는 값의 종류와 범위를 결정짓는 요소이기 때문에 어떤 값을 변수에 저장할지
충분히 생각한 다음 결정해야 한다. 
예를 들어 변수에 정수를 저장하고 싶다면 정수 타입(int)을 사용할 수 있고, 
실수를 저장하고 싶다면 실수 타입 (double)을 사용할 수 있다.   
같은 타입의 변수는 콤마(,)를 이용해서 한꺼번에 선언할 수도 있다. 
다음은 정수 타입 변수 x, y , z를 선언한 예를 보여준다


int x, y, z;


변수 이름은 메모리 주소에 붙여진 이름이다.   
프로그램은 변수 이름을 통해서 메모리 주소에 접근하고, 그곳에 값을 저장하거나 그곳에 있는 값을 읽는다. 
변수 이름은 자바 언어에서 정한 명명 규칙(naming convention)을 따라야 한다. 






# 변수의 사용

변수를 사용한다는 것은 변수에 값을 저장하고 읽는 행위를 말한다. 
변수에 값을 저장하는 방법과 변수에 저장된 값을 읽는 방법에 대해 알아보기로 하자.

# 변수 값 저장

변수에 값을 저장할 때에는 대입 연산자(=)를 사용한다. 
일반 수학에서 =은 같다는 의미지만, 자바 언어에서는 우측의 값을 죄측 변수에 저장한다는 의미를 갖는다.   
변수를 선언하고 처음 값을 저장할경우, 이러한 값을 초기값이라고 한다. 
그리고 변수에 초기값을 주는 행위를 변수의 초기화라고 한다. 
예를 들어, 90이라는 값을 변수 score에 저장하려면 먼저 
정수 타입 (int)으로 score 변수를 선언하고 초기값 90을 다음과 같이 기술하면 된다.

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

초기값은 변수를 선언함과 동시에 줄수도 있다.

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

변수의 초기값은 코드에서 직접 입력하는 경우가 많은데, 소스 코드 내에서 
직접 입력된 값을 리터럴(literal) 이라고 부른다. 
리터럴은 값의 종류에 따라 정수 리터럴, 실수 리터렬, 문자 리터렬, 논리 리터럴로 구분된다. 
이 리터럴들은 정해진 표기법대로 작성되어야 한다. 
사실 리터렬은 상수(constant)와 같은 의미지만 
프로그램에서는 상수를 “값을 한번 저장하면 변경할 수 없는 변수”로 정의하기 때문에 
이와 구분하기 위해 “리터럴”이라는 용어를사용한다.

 

#bit는 데이터를 담을 수 있는 단위 (속도)

#byte는 데이터의 크기를 표시 , 처리하는 단위 (크기)

 

#java는 정수를 int로 인식한다. 실수는 double

 

 


 

 

# 정수 리터럴(리터럴 = 값)

-리터럴은 원래 constant(상수)와 같은 의미이지만, 프로그램의 언어상 상수는 한 번 정해놓으면 절대 변할 수 없는 값이 되었기 때문에(const, final) 상수와 구분지어서 리터럴이라고 표현한다.


소숫점이 없는 정수 리터럴은 10진수로 간주한다.

  0,  75,  -100


0으로 시작하는 리터럴은 8진수로 간주한다.

  02,  0-4


0x로 시작하고 0~9, A,B,C,D,E,F로 구성된 리터럴은 16진수로 간주한다. (대/소문자를 구분하지 않는다.)

  0x5,  0xA, 0xB1, 0xA90B

-정수 리터럴을 저장할 수 있는 타입은 byte, char, short, int, long과 같이 5개의 타입이 있다.


		int intValue1 = 10;	// 10진수
		int intValue2 = 012;	// 8진수(0으로 시작)
		int intValue3 = 0xA;	// 16진수(0x로 시작)
		System.out.println(intValue1);	// 10
		System.out.println(intValue2);	// 10
		System.out.println(intValue3);	// 10





# 실수 리터럴
# 소숫점이 있는 리터럴은 10진수로 간주한다.

  0.25 , 3.14

-실수 리터럴을 저장할 수 있는 타입은 float, double이 있다.


		double doubleValue1 = 0.5;
		double doubleValue2 = 3.14;
		System.out.println(doubleValue1);
		System.out.println(doubleValue2);





# 문자 리터럴
-작은 따옴표(‘)로 묶은 텍스트는 하나의 문자 리터럴로 간주한다.

'A' , '한' , '\n' , '\t'

-역슬래쉬(\)가 붙은 문자 리터럴은 이스케이프(escape) 문자라고도 하는데, 다음과 같이 특수한 용도로 사용된다.
-문자 리터럴을 저장할 수 있는 타입은 char 하나뿐이다.

		char charValue1 = 'A';
		char charValue2 = '혜';
		System.out.println(charValue1);
		System.out.println(charValue2);
		System.out.println('\t' + "들어쓰기"); 		// \t는 Tap키를 의미한다.
		System.out.println('\n' + "들어쓰기"); 		// \n은 Enter키를 의미한다.
		System.out.println('\'');			// 홑따옴표
		System.out.println('\"');			// 겹따옴표
		System.out.println('\\');			// 역슬래쉬





# 문자열 리터럴
-쌍따옴표로 묶은 텍스트는 문자열 리터럴로 간주한다.
-쌍따옴표 안에는 텍스트가 없어도 문자열 리터럴로 간주된다.
         

  "대한민국"
  "자바를 공부합니다."

String value = "안녕하세요";
System.out.println(value);



# 논리 리터럴
# true, false는 논리 리터럴로 간주한다.

  true, false

논리 리터럴로 저장할 수 있는 타입은 boolean 하나이다.
리터럴은 변수의 초기값으로 소스코드에서 많이 나타난다.

 

 

		boolean boolValue1 = true;
		boolean boolValue2 = false;
		System.out.println(boolValue1);	// true
		System.out.println(boolValue2); // false
		
		boolean boolValue4 = 10>5;
		boolean boolValue5 = 5>10;
		System.out.println(boolValue4); // true
		System.out.println(boolValue5); // false

 

 

-println 줄바꿈해서 출력하겠다.

		System.out.println("대한");
		System.out.println("민국");
		
		System.out.print("대한");
		System.out.print("민국");

 

 


 

 

 

## 변수의 사용 범위



변수는 중괄호 { } 블록 내에서 선언되고 사용된다. 
중괄호 블록을 사용하는 곳은 클래스, 생성자, 메서드인데, 클래스와 생성자는 자바 기본 구문 뒤쪽에서 확인하자

지금은 모든 변수는 메서드 블록 내에 존재한다고 생각하자. 
메서드 블록 내에서 선언된 변수를 지역 변수(Local variable) 라고 부른다. 
지역 변수는 메서드 실행이 끝나면 메모리에서 자동으로 없어진다. 
다음은 메인 메서드 블록에서 변수가 선언된 모습을 보여준다.

 

하단에 대괄호를 나가면 선언된 변수들은 지역변수이기에 사용이 불가능하다.



-변수는 메서드 블록 내 어디에서든 선언할 수 있지만 변수 사용은 제한이 따른다.   
  (선언된 변수는 블록 내에서만 사용이 가능하다.)
-메서드 블록 내에서도 여러 중괄호{} 블록들이 있을 수 있다. 

if( ){  // 조건문
}

for( ){  // 반복문
}

-이러한 if, for, while을 제어문이라고 하는데, 제어문 블록에서 선언된 변수는 
 해당 제어문 블록 내에서만 사용이 가능하고 블록 밖에서는 사용할 수 없다.

띠라서 변수를 선언할 때에는 변수가 어떤 범위에서 사용될 것인지를 생각하고, 선언 위치를 결정해야
한다. 메서드블록에서 어떤 위치에서건 시용할 수 있도록 한다면 메서드블록 첫머리에 선언하는 것이 좋을 것이다. 
만약 제어문 내에서 잠깐 사용되는 변수라면 제어문 내에서 선언하는 것이 좋다.

if 대괄호가 끝나는 부분에서 int ad = 10; 이라는 값은 메모리에서 소멸된다.



 


 

 

 

# 형변환 (타입 변환)



타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환히는 것을 말한다. 
예를들어 byte 타입을 int 타입으로 변환하거나 반대로 int 타입을 byte 타입으로 변환하는 행위를 말한다 
타입 변환에는 두 가지 종류가 있다. 하나는 자동(묵시적) 타입 변환이고 다른 하나는 강제(명시적)타입 변환이다.

자동 타입 변환(Promotion) 은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다. 
자동 타입 변환은 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생한다.

큰 크기 타입과 작은 크기 타입의 구분은 사용하는 메모리 크기이다 
예를 들어 byte 타입은 lbyte 크기를 가지고, int 타입은 4byte 크기를 가지므로 
int 타입이 큰 크기 타입이고, byte 타입이 작은크기 타입이다. 크기별로 타입을 정리하면 다음과 같다.


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

 

#ASCII 코드표 상 A = 65, a = 97로 십진법 표기된다.

 

#아래의 타입들은 전부 큰 범위 > 작은 범위에 속하므로, 정상적으로 값이 출력된다.

		byte byteValue = 10;
		int intValue = byteValue; // int 라는 그릇에 byte를 담는다.
		System.out.println(intValue);
		
		
		// 작은 단위를 큰 단위로 넣으면 자동 형변환이 된다.
		char charValue = 'A';
		intValue = charValue;
		System.out.println(intValue);
		
		intValue = 500;
		long longValue = intValue;
		System.out.println(longValue);
		
		intValue = 200;
		double doubleValue = intValue;
		System.out.println(doubleValue);

 

 

 

 


 

 

 

 

## 강제 타입 변환 (Casting)


큰 크기의 타입은 작은 크기의 타입으로 자동 타입 변환을 할수 없다. 
예를 들어, 4byte인 int타입을 1byte인 byte 타입에 담을 수 없다.

int a = 130254520;
byte int
00000000 = 00000111 11000011 10000110 10111000

큰 크기의 타입은 작은 크기의 타입으로 자동 타입 변환을 할 수 없다.
마치 큰 그릇의 물을 작은 그릇 안에 모두 넣을 수 없는 것과 동일한 이치이다. 
하지만 큰 그릇을 작은 그릇 사이즈로 쪼개어서 한 조각만 작은 그릇에 넣는다면 가능하다. 

즉 int 타입을 4개의 byte로 쪼갠 다음, 끝에 있는 1byte만 byte 타입 변수에 저장하는 것은 가능하다. 
이와 같이 강제적으로 큰 데이터 타입을 작은 데이터 타입으로 쪼개어서 저장하는 것을 
강제 타입 변환(캐스팅: Casting) 이라고한다. 
강제 타입 변환은캐스팅 연산자 ()를사용하는데, 괄호 안에 들어가는 타입은 쪼개는 단위이다.

            작은 크기 타입 = (작은 크기 타입)큰 크기 타입

 

		// 01001001 10001111 00101110 11010001 	1+16+-64
		intValue = 1234120401;
		byteValue = (byte)intValue;

 

#500은 int에서 값을 처리할 수 있지만, long 자체는 8byte 이기 때문에, 4byte인 int는 담을 수 없는 것이다.

		longValue = 500;
		intValue = (int)longValue;
		doubleValue = 3.14; // double = 8byte
		intValue = (int)doubleValue;	// int = 4byte
		System.out.println(intValue); // result =  3

 

 

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



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

 

ex) int + double => double + double 로 자동 변환


예를 들어 int타입 피연산자와 double타입 피연산자를 덧셈 연산하면 먼저 int 타입 피연산자가 double 타
입으로 자동 변환되고 연산을 수행한다 당연히 연산의 결과는 double이 된다.
(메모리가 작은 타입이 큰 타입으로 변환된다.)

 

		int intValue = 10;
		double doubleValue = 5.5;
		double result = intValue + doubleValue ;	// double + double로 자동 형변환된다.
		int  result = intValue + doubleValue ;		// 변수를 int로 타입을 정하면 오류가 난다.
		int  result2 = intValue + (int)doubleValue ;	// double 앞에 형변환을 해주면 정상
		
		System.out.println(result);	// 15.5
		System.out.println(result2);	// 15

 

반응형