본문 바로가기
Back-End/Java

변수와 타입

by newny 2022. 12. 8.
반응형

변수

  • 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름
  • 메모리 값 저장
    • 변수 선언(메모리 할당X) 후, 변수에 값을 지정(메모리 할당O)
    • 저장 위치 또는 어떤 방식으로 저장할지는 JVM이 정함

 

변수이름 작성 규칙

  • 첫 번째 글자는 문자 또는’$’,’_’ 이어야 하고, 숫자로 시작할 수 없음(필수)
  • 영어 대소문자를 구분(필수)
  • 첫 문자는 영어 소문자로 시작하되, 다른 단어가 붙을 경우 첫 문자를 대문자로 한다(관례, 캐멀스타일)
  • 자바 예약어는 사용할 수 없음
분류
예약어
기본 타입
boolean, byte, char, short, int, long, float. double
접근 제한자
private, protected, public
클래스와 관련된 것
class, abstract, interface, extends, implements, enum
객체와 관련된 것
new, instanceof, this, super, null
메소드와 관련된 것
void, return
제어문과 관련된 것
if, else, switch, case, default, for, do, while, break, continue
논리값
true, false
예외 처리와 관련된 것
try, catch, finally, throw, throws
기타
package, import, synchronized, final, static

 

값 저장

  • 대입 연산자(=) : 변수에 값 저장
  • 변수 초기화 : 변수에 최초로 값을 저장, 사용된 값을 초기값이라고 함

정수 타입

타입 메모리 사용크기 저장되는 값을 허용 범위 (1byte = 8bit), bit는 0과 1이 저장되는 단위

타입
메모리 사용크기
저장되는 값을 허용 범위
byte
1byte
-128~127
short
2byte
-32,768~32,767
char
2byte
0~65535(유니코드)
int
4byte
-2^31 ~(2^31-1)
long
8byte
-2^63~(2^63-1)
  • 2진수
    • 0b또는 0B로 시작하고 0과 1로 구성
    • 0b1011 → 11
  • 8진수
    • 0으로 시작하고 0~7 숫자로 구성
    • 013 → 11
  • 16진수
    • 0x 또는 0X로 시작하고 0~9 숫자와 A~F 또는 a~f로 구성
    • 0xB3 → 179

 

long 타입

  • 기본적으로 컴파일러는 정수 리터럴을 int 타입으로 간주함
  • 정수 리터럴이 int 타입의 허용범위를 초과할 경우, 컴파일러에게 ‘L’을 붙여 long 타입임을 알려주어야함
  • long 타입이더라도 리터럴이 int 타입의 허용범위 이내라면 L을 붙이지 않아도됨

 

char 타입

  • 유니코드로 변환되어 저장됨 (0~65535)
  • int var = ‘A’ → 65(유니코드) 출력됨
  • 어떤 문자도 대입하지 않고 초기화 할 시, 공백(유니코드:32) 하나를 포함해서 초기화 해야함 (char c = '   ';)

 

문자열 타입 (String)

  • 클래스 타입 → 기본타입 아님
  • 문자열(””)을 변수에 저장할때 사용
  • 이스케이프 문자를 사용하여 문자열 내부에 특정 문자를 포함 시킬 수 있음
  • (윈도우)키보드 엔터키 → \r\n (캐리지리턴 → 라인피드)
이스케이프 문자 출력 용도
\t (tap) 탭만큼 띄움
\n (line feed) 줄 바꿈
\r (carriage return) 캐리지리턴 (앞으로 끌어옴)
\” “ 출력
\’ ‘ 출력
\\ \ 출력
\u16진수 16진수 유니코드에 해당하는 문자 출력

 

 

실수 타입

  • 자바는 실수 리터럴을 기본적으로 double 타입으로 해석함
  • float 타입으로 저장하고 싶다면 리터럴 뒤에 f 또는 F를 붙여줌
  • 10의 거듭제곱 리터럴 작성 방법 → e또는 E로 작성→ double x = 5e2; //5.0 * 10^2 = 500.0
타입
메모리 사용 크기
정밀도 (소수점이하)
float
4byte
7자리
double
8byte
15자리

 

 

논리 타입 (boolean)

  • 리터럴로 true와 false를 사용
  • 조건문과 제어문의 실행 흐름을 변경하는데 사용
  • == → 같은가
  • != → 같지 않은가
  • x > y → x가 y보다 큰가
  • x && y → x 이면서 y 인가 (논리 AND)
  • x || y → x 이거나 y 인가 (논리 OR)

자동 타입 변환 (promotion)

  • 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생
  • byte < short, char < int < long < float < double
  • byte - char 자동타입변환 불가 : byte 타입은 char 타입보다 허용 범위가 작지만, char 타입은 음수 값을 포함하지 않으므로 자동타입변환 될 수 없음

 

 

강제 타입 변환 (casting)

  • 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제 변환하여 저장하는것
    • ex) int 타입(4byte)를 byte 타입으로 캐스팅 하면 앞 3byte는 삭제되고 끝 1byte값만 저장됨
      따라서 2byte 이상 필요한 int 값(-128~127 범위를 넘어가는 값)은 보존되지 않음
      나머지 타입들의 강제타입 변환도 같은 원리로 이루어짐
  • 캐스팅 연산자 괄호() 를 사용
  • 실수 타입을 정수 타입으로 강제 타입 변환하면 소수점 이하 부분은 버려지고, 정수 부분만 저장됨

 

 

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

  • int 타입보다 작은 변수(byte, char, short)가 산술 연산식에서 피연산자로 사용되면 기본적으로 int 타입으로 자동 변환됨
    • ex1 ) byte x = 10; byte y = 20; byte result = x + y // 컴파일 에러 → 피연산자 변수로 사용되어 int 타입으로 자동변환됨
    • ex2 ) byte result = 10+20 ; // 피연산자가 변수가 아니고 정수 리터럴 이므로 int 타입으로 자동변환되지 않음
  • 허용 범위가 더 큰 long 타입이 피연산자로 사용되면 다른 피연산자는 무조건 long 타입으로 변환하여 연산을 수행해야함

 

 

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

  • 피연산자 중 하나가 double 타입이라면 다른 피연산자도 double로 자동 타입 변환이 됨
  • 자바에서는 f 또는 F가 없는 실수 리터럴을 double 타입으로 해석함
    • ex ) float result = 1.5 + 2.3; // 컴파일 에러 → 피연산자에 float표기(f 또는 F)가 없으므로 double 타입으로 간주하여 컴파일 에러 발생
      컴파일 하려면 result를 double 타입으로 받거나, 피연산자에 f 또는 F를 표기해줘야함
  • 정수타입과 double타입의 연산에서도 정수타입 피연산자가 double 타입으로 자동 변환되고 연산을 수행함
  • int x = 1;  int y = 2;  double result = x / y;  → result 값은 0.5???
    • 자바에서 정수 연산의 결과는 항상 정수이기 때문에 x / y의 결과는 0이 되고 그 값이 result 에 double 타입으로 저장되므로 result 값은 0.0이 됨
    • 컴파일 하려면 x 또는 y 앞에(또는 x , y 둘다) double을 붙여 타입변환을 시켜줘야함

 

 

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

  • 피연산자 중 하나가 문자열일 경우 나머지 피연산자도 문자열로 자동 변환됨
  • 연산식에서 + 연산자가 연이어 나오면, 앞에서부터 순차적으로 + 연산을 수행
    • ex ) String str = 1 + 2 + “3”; → String str = 3 + “3”; → String str = “33”;

 

 

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

변환타입
사용 예 (String str = “1”;)
byte
byte value =Byte.parseByte(str);
short
short value =Short.parseShort(str);
int
int value =Integer.parseInt(str);
long
long value =Long.parseLong(str);
float
float value =Float.parseFloat(str);
double
double value =Double.parseDouble(str);
boolean
String str = “true”; boolean value =Boolean.parseBoolean(str);

 

 

기본 타입을 문자열로 변경

  • String str = String.valueOf(기본타입값); → 정적 메소드

로컬 변수 (지역 변수)

  • 메소드 블록 내에서 선언된 변수
  • 메소드 블록 내부에서만 사용
  • 메소드 실행이 끝나면 메모리에서 자동으로 없어짐

 

  • System.out → 시스템의 표준 출력 장치 (모니터)
  • System.in → 시스템의 표준 입력 장치 (키보드)

 

 

System.out.println(리터럴 또는 변수);

  • System : 시스템이 가지고 있는
  • out : 출력장치로
  • println(리터럴 또는 변수); : 괄호 안의 내용을 출력하고 행을 바꿔라
메소드 의미
println(내용); 괄호 안의 내용을 출력하고 행을 바꿔라
print(내용); 괄호 안의 내용을 출력해라
printf(”형식문자열”, 값1, 값2, …) 괄호 안의 첫 번째 문자열 형식대로 내용을 출력해라

 

 

printf() 메소드의 형식문자열

%[argument_index$][flags][width][.precision]conversion
  • % : 형식문자열 시작
  • argument_index$ : 값의 순번 의 순번을 써주지 않아도 순번대로 자동 지정되어 출력됨, 순번을 지정해야할 때 사용하면 되는것 같음
  • flags : -(공백) 또는 0(숫자'0')
  • width : 전체 자릿수(점포함)
  • .percision : 소수 자릿수
  • conversion : 변환문자(d(정수), f(실수), s(문자열))
System.out.printf("이름: %1$s, 나이: %2$d", "김자바", 25);

 

 

 

키보드에서 입력된 내용을 변수에 저장하기

  • int keyCode = System.in.read(); // 'a'입력+엔터 했을 경우 → a(65)와 엔터(13,10) 둘다 읽음
    
  • System.in.read()의 단점은 키코드를 하나씩 읽기 때문에 2개 이상의 키가 조합된 한글을 읽을 수 없다는 것

 

 

Scanner 클래스

  • 입력된 내용을 통 문자열로 읽음
Scanner scanner = new Scanner(System.in);

String inputData = scanner.nextLine();
  • import java.util.Scanner : import문, Scanner가 java.util 패키지에 있다는 것을 컴파일러에게 알려주는 역할

 

 

equals() 메소드

  • String타입에서는 문자열 자체가 동일한지 비교
  • boolean result = data. equals("문자열"); → data의 문자열과 괄호안의 문자열이 동일한지 비교함
반응형

'Back-End > Java' 카테고리의 다른 글

조건문과 반복문  (0) 2022.12.08
연산자  (0) 2022.12.08
자바 시작하기  (0) 2022.12.08

댓글