언어/JAVA

[JAVA] 변수(Variable)

hvoon 2022. 9. 7. 17:00

-프로그램 실행 중 발생/입력되는 데이터를 저장할 목적으로 만든 임시 저장장소

-프로그램 실행명령시 생성되고, 프로그램 종료시 소멸됨

변수의 이름을 만드는 규칙

1. 인터넷 사이트 회원가입시 만드는 아이디 이름 규칙과 비슷

2. 영문과 숫자, 그리고 일부 특수문자(_)를 섞어서 사용가능함

3. 첫글자는 반드시 영문

4. 중간에 공백이 있을 수 없음

5. 너무 짧지 않게 약간의 의미를 부여해서 이름 생성하는 편

6. 변수의 이름 너무 짧으면 변수 갯수가 많아졌을 때 서로 용도를 구분하기 어려움

7. 변수의 이름 너무 길면 사용할 때마다 긴 이름을 타이핑해야하는 불편함이 있음

8. 두가지 의미의 단어가 조합되어 변수 이름이 만들어 진다면 첫단어는 소문자로, 두번째 단어 첫글자 대문자로 생성

    ex)덧셈의 결과 총 저장할 변수 이름: plusResult

9. 변수는 자료형(정수, 실수, 문자)에 따라 만드는 명령이 달라짐

-int: 정수, double: 실수, String: 문자 등

-int a; → 정수형 변수 a가 생성

-double b; → 실수형 변수 b

-String c; → 문자형 변수 c

int a; //a라는 이름의 변수를 생성(int->정수를 저장하기 위한 변수)
int b;
int plusResult, minuResult, multiplyResult; //한번에 여러변수를 생성(정수를 저장하기 위한 변수)
double divideResult; //실수를 저장할 변수

// a=10.24; 실수->정수형 변수에 저장하면서 데이터 손실을 유발하므로 에러
divideResult =100;  //정수->실수형 변수에 저장하는건 데이터 손실이 없으므로 정상 실행

boolean b1; // 참(true)또는 거짓(false) 중 하나를 저장하는 자료형(변수)
b1=true; // 또는 false를 저장할 수 있음

System.out.printf("변수 b1의 값: %b\n", b1);
System.out.println("변수 b1의 값: "+b1);
// boolean 자료를 printf로 출력할 때 %b를 사용함

 

변수 특징
int 정수형 자료형 4Byte형 정수
long 정수형 자료형 8Byte형 정수
float 실수형 자료형 4Byte형 실수
double 실수형 자료형 8Byte형 실수
(저장공간, 연산속도가 다름 → 정수, 실수 구분하는 이유)
char
문자(글자)자료형 2Byte ex) 'a', 'b'
String과는 다름
string 문자열 자료형 "", "a", "abc" 0글자에서 글자갯수 제한 없이 저장할 수 있는 자료형
현재는 자료형이라고 부르지만 엄밀히 자료형이라기보다 클래스(객체)라고 부르는게 정확한 표현

 

종류 변수
정수형 byte(1), short(2), int(4-기본형), long(8)
실수형 float(4), double(8-기본형)
문자형 char(2), string(정해진 크기 없음)
진위형 boolean(1-true/false의 값만 저장)

 

-1byte=8bit

00000000~11111111

00000000 → A, 00000001 → B .... 256개 문자 중 하나를 저장 가능

-예전 시스템 int는 2byte (-32,768~32,767) → 현재 시스템 int는 4byte (-2,147,483,648~2,147,483,647)

-double 0.0002 → 0.2x10의-4승(변수에 저장되는 값은 2와 -4)

-10의 -308승~308승

 

-정수와 정수의 사칙연산은 결과도 정수임

-피연산자 둘 중 하나만 실수이면 연산의 결과는 실수가 됨

a=16; b=52;
plusResult=a+b;
minuResult=a-b;
multiplyResult=a*b;
divideResult=a/b;

c='+';
System.out.printf("%d %c %d = %d\n", a, c, b, plusResult);
c='-';
System.out.printf("%d %c %d = %d\n", a, c, b, minuResult);
c='*';
System.out.printf("%d %c %d = %d\n", a, c, b, multiplyResult);
c='/';
System.out.printf("%d %c %d = %.2f\n", a, c, b, divideResult);

divideResult =a/(double)b;
// 현재 위치에서만 잠시 double로 변환. 이 명령이 지나면 다시 int형으로

 

변수의 사용자 입력

-programming 하다보면 외부의 라이브러리 또는 API를 불러다 사용해야할 경우가 있는데 사용자로부터 화면 입력을 받는 도구는 외부 라이브러리에 있는 걸 불러와서 사용해야 함

System.out.printf("정수를 입력하세요 ");
// 원활한 입력을 위해 안내 명령은 입력 명령보다 반드시 위에 써줌

Scanner sc=new Scanner(System.in); // 화면입력을 위한 준비코드
integer1=sc.nextInt(); 
// 화면으로 사용자가 정수를 입력하면 입력받아 integer1 변수에 저장

// 컴파일러가 sc.nextInt() 명령을 만나면 커서를 깜빡이면서 
// 사용자에게서 입력이 있을때까지 무한정 대기함

System.out.println("입력한 정수는 "+number1+"입니다"); //입력 후 출력

 

변수의 생성 방법

// 1. 변수 선언 후 값을 할당(대입)
int n1;
n1=10;
		
// 2. 변수의 선언과 값의 대입을 동시에 처리
int n2=20;
		
/* 실행 보류
// int n3=sc.nextInt(); -> 변수 값을 입력해줘야해서 실행 중 에러 발생
// start program, 변수를 선언하는 명령만 따로 모아서 
//                변수들을 관리하는 테이블에 넣고 시작
// 이때 입력명령이 섞어 있는 변수선언은 에러를 발생하게 됨. 
// 문법상 빨간줄/엑스가 표시되지는 않지만 실행시 에러 발생시킴(런타임에러)
*/
		 
// 3. 여러개의 변수를 한번에 선언(동일한 자료형만 가능)
int n3,n4,n5;
		
// 4. 여러개의 변수를 값 대입하면서 생성
int n6=60, n7=70;
		
// 5. 처음부터 모든 변수에 값을 대입할 필요 없음
int n8,n9=90,n10;

 

변수 선언

-변수 사용 전에는 위치에 관계없이 변수 선언 가능

-변수는 반드시 선언(생성) 후 사용 가능, 선언 전 사용하는 변수는 오류

-변수 선언 이후라도 값이 대입되지 않으면 사용 불가

-변수의 값은 여러번 대입 가능

-저장되는 값은 가장 최근/마지막에 저장한 값이 사용됨

-이전에 저장되는 값은 소멸. 한번에 하나씩만 저장할 수 있는 단점이 있음

 

char형 데이터

-컴퓨터 저장장치에 저장될 때, 이진수 코드로 저장됨

-문자를 저장하기 위한 코드체계에 의해 조합된 코드(ASCII code)임

-이를 십진수로 변환하면 정수로도 변환 가능

-위의 내용을 기초로 한 결과, 정수와 문자간 호환성 발생됨

char ch='A';
int intchar=ch;
System.out.printf("ch->integer variable save %d\n", intchar);
System.out.printf("ch->%c\n",ch);
System.out.printf("ch->정수형 변수값으로 임시변환 %d\n", (int)ch);

ch='B';
System.out.printf("'B'->정수값으로 캐스팅: %d\n", (int)ch);
System.out.printf("'B'->정수값으로 캐스팅: %d\n", (int)'B');

System.out.printf("'Z'->정수값으로 캐스팅: %d\n", (int)'Z');
System.out.printf("'z'->정수값으로 캐스팅: %d\n", (int)'z');
System.out.printf("'0'-> %d, '9'-> %d\n", (int)'0', (int)'9');

// 대문자 B값에 32를 더하여 소문자 b로 변경
System.out.printf("%c+32-> %c\n", ch,ch+32);

// 아라비아 기호 '8'에서 아라비아 기호 '0'을 빼면 정수 8이 결과로 나옴
System.out.printf("'8'-'0'-> %d\n", '8'-'0');
System.out.println();
 

실수형 변수의 초기화

-자바에서 모든 실수들은 별도의 표기가 없으면 기본적으로 double타입으로 인식

-float 타입으로 값을 저장하기 위해서 float형 변수를 선언하고 float형 데이터를 저장

// float 변수에 double형 데이터 입력-> 에러
// float f1=1.123; -> error

// float 변수에 float형 데이터 입력-> 정상실행
float f2=1.123f; 

// float 변수에 캐스팅 연산을 적용한 double형 데이터 입력-> 정상실행
double f3=1.123;
float f4=(float)f3;
		
// 용량이 큰 자료형(double)에 작은 자료형(float) 데이터 대입-> 정상실행
float f5=123.123F;
double f6=f5; // 캐스팅(형변환) 연산이 필요 없음

 

정수들의 값 대입

-용량이 큰 변수값을 용량이 작은 변수값으로 넣으려고 하면 캐스팅 연산 필요

-반대의 경우 문제없이 모든 실행 가능

int a=100;
byte b1=(byte)a;

// byte b2=a; -> 변수를 이용한 값의 대입은 캐스팅이 필요
 
byte b2=123; // 일반값에 의한 대입은 캐스팅이 필요가 없음
             // (정수데이터에 한해서만 허용)
a=b2; // 용량이 작은 자료형을 큰 자료형에 대입은 정상실행