220521~0522_혼.공.자 - Ch.2 변수와 타입

창고·2022년 10월 12일
0

티스토리에 저장했던 글을 옮겼습니다.
https://mrcocoball.tistory.com/53?category=1098996
https://mrcocoball.tistory.com/54?category=1098996
https://mrcocoball.tistory.com/55?category=1098996
https://mrcocoball.tistory.com/56?category=1098996

Chapter 2. 변수와 타입

1. 변수

(1) 변수 선언

  • 타입 변수명; 으로 타입과 변수 이름을 선언
int age; // int(정수) 타입으로 age 변수 선언
double value; // double(실수) 타입으로 value 변수 선언
  • 변수명 명명 규칙
    ㄱ. 첫번째 글자는 문자나 $, _ 이어야 하며 숫자로 시작 불가
    ㄴ. 영어 대소문자 구분
    ㄷ. 첫 문자는 소문자이되 다른 단어가 붙을 경우 첫 문자를 대문자로 진행 (관례)
    ㄹ. 문자 수(길이) 제한 없음
    ㅁ. 자바 예약어 사용 불가

(2) 값 저장

  • 변수 = 값; 으로 변수에 값을 저장
age = 30;
  • 선언 시 값을 바로 저장할 수 있음
int age = 30;

(3) 변수 사용

  • 변수는 또 다른 변수에 대입하여 값 복사할 수 있음
int x = 10;
int y = x;

→ 이 경우 x, y 모두 10

  • 변수값 교환
int x = 10;
int y = 20;
int temp = y;
y = x;
x = temp;

※ Python 에서는 x,y = y,x로 변환 (튜플)

(4) 변수 사용 범위

  • 로컬 변수(local variable) : 메소드 블록 내에서 선언된 변수로,
    메소드 블록 내부에서만 사용되며 메소드 실행 시 자동으로 메모리에서 삭제됨
  • 예시
public static void main(String[] args) {
   int var1; //→ 메소드 블록에서 선언하였으며 블록 내 전체 사용 가능

   if(...) {
      int var2; //→  if 블록에서 선언하였으며 if 블록에서만 사용 가능

   }

   for(...) {
      int var3; //→ for 블록에서 선언하였으며 for 블록에서만 사용 가능
   }
}

2. 기본 타입

(1) 기본 타입 개요

  • 기본 타입 (primitive type) : 정수, 실수, 논리값을 저장할 수 있는 타입, 총 8가지
    ㄱ. 정수 타입 : byte, char, short, int, long
    ㄴ. 실수 타입 : float, double
    ㄷ. 논리 타입 : boolean

(2) 정수 타입

  • 타입 별로 메모리 사용 크기와 저장되는 값의 범위가 다름
  • 범위는 외울 필요 없으나 메모리 사용 크기 정도는 알고 있는 것이 좋음
  • char 타입은 음수 값을 가질 수 없으며, 나머지는 음수 값이 범위에 있음
    ㄱ. byte : 1byte, 8bit, -128 ~ 127 (2^7)
    ㄴ. short : 2byte, 16bit, -32,768~32,767 (2^15)
    ㄷ. char : 2byte, 16bit, 0~65535 (유니코드) (2^16)
    ㄹ. int : 4byte, 32bit, -2^31 ~ (2^31 - 1) (2^32)
    ㅁ. long : 8byte, 64bit, -2^63 ~ (2^63 - 1) (2^64)
  • 타입 변수에 범위를 넘어선 값을 넣을 경우 컴파일 에러 발생
  • 기본적으로 컴파일러는 정수 리터럴을 int 타입으로 간주하기 때문에 int 타입 초과 시 long 타입임을 알려주어야 함
  • 정수 리터럴 뒤에 소문자 l이나 대문자 L을 붙임으로서 long 타입임을 알려주어야 함
long balance = 3333333333333; //→ 컴파일 에러 발생
long balance = 3333333333333L;

(3) char 타입

  • 문자 리터럴은 유니코드로 저장되는데 유니코드를 저장할 수 있는 타입이 바로 char 타입
char var1 = 'A' // (유니코드 65)
char var2 = 'B' // (유니코드 66)
  • 유니코드도 정수이기 때문에 정수 타입에 속함
  • 작은따옴표로 감싼 문자 리터럴은 유니코드로 변환되기 때문에 정수 취급으로 int 타입 변수에도 저장 가능
    단, char는 문자로 매핑되어 출력되지만 int에는 유니코드 자체가 저장되어 출력됨
char var1 = 'A'
int var2 = 'A'
System.out.printIn(var1); //→ A를 출력
System.out.printIn(var2); //→ 65를 출력

(4) 문자열 - String 타입

  • 작은따옴표로 감싼 문자는 char 타입 변수에 저장되어 유니코드로 저장되나,
    큰따옴표로 감싼 문자 또는 여러 개의 문자들은 유니코드로 변환되지 않음
char var1 = "A";
char var2 = "리코";
  • 문자열 : 큰따옴표로 감싼 문자들. 작은따옴표와 큰따옴표는 컴파일러가 문자 리터럴과 문자열 리터럴을 구별하는데에 사용, 이 때 String 타입을 사용
String var1 = "A";
String var2 = "리코";
  • 이스케이프 문자 정리
    ㄱ. \t : 탭만큼 띄움
    ㄴ. \n : 줄 바꿈 (라인 피드)
    ㄷ. \r : 캐리지 리턴
    ㄹ. \" : " 출력
    ㅁ. \' : ' 출력
    ㅂ. \\ : \ 출력
    ㅅ. \u16진수 : 16진수 유니코드에 해당하는 문자 출력

(5) 실수 타입

  • 실수 타입은 소수점이 있는 실수 리터럴을 저장할 수 있음
    ㄱ. float : 4byte, 32bit, 1.4 * 10^-45 ~ 3.4*10^38, 정밀도 7자리 (소수점 이하 자리)
    ㄴ. double : 8byte, 64bit, 4.9 * 10^-324 ~ 1.8 * 10^308, 정밀도 15자리 (소수점 이하 자리)
  • 자바는 실수 리터럴을 기본적으로 double 타입으로 해석하기 때문에 double 타입 변수에 저장해야 함
  • 따라서 float 타입으로 저장하고 싶다면 리터럴 뒤에 소문자 f나 대문자 F를 붙여 float 타입임을 알려야 함
float var = 3.14; → 컴파일 에러 발생
float var = 3.14f;

(6) 논리 타입

  • 참과 거짓을 의미하는 논리 리터럴로 true와 false를 사용하며 1byte 크기의 boolean 타입 변수에 저장
boolean stop = true;
boolean state = false;

3. 타입 변환

(1) 타입 변환이란

- 두 변수의 타입이 동일할 경우, 한 쪽 변수 값을 다른 쪽 변수에 복사해서 저장할 수 있음
- 그러나 변수의 타입이 다를 경우 값의 저장이 가능하거나 불가능할 수 있음
- 변수의 값을 다른 변수로 복사해서 저장할 때 타입의 값이 변환되는데 이를 타입 변환이라고 함
- 예시

byte a = 10; // byte 타입 변수 a에 10을 저장  
int b = a; // int 타입 b에 a에 저장되어 있던 10을 복사해서 저장  
// → 10은 byte 타입이었으나 b로 옮겨질 때 int 타입으로 변환되었음  

(2) 자동 타입 변환 (promotion)

- 자동으로 타입 변환이 일어나는 것을 의미
값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생
byte < short < int < long < float < double

  • 큰 허용 범위 타입 = 작은 허용 범위 타입
  • 예시
byte byteValue = 10;  
int intValue = byteValue; // byte -> int로 변환됨  
long longValue = 5000000000L;  
float floatValue = longValue; // 5.0E9f로 저장됨  
double doubleValue = longValue; // 5.0E9로 저장됨  
  
// char 타입의 경우 int 타입으로 자동 타입 변환되면 유니코드 값이 int 타입에 저장됨  
char charValue = 'A';  
int intValue = charValue // 65가 저장됨  

- 예외 : char 타입보다 허용 범위가 작은 byte 타입은 char 타입으로 자동 타입 변환될 수 없음
char 타입은 음수를 포함하고 있지 않으나 byte 타입은 음수를 포함하고 있으므로

(3) 강제 타입 변환 (casting)

  • 일반적으로 큰 허용 범위 타입은 작은 허용 범위 타입으로 자동 변환될 수 없음
  • 그러나 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장할 수 있음
  • 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장하는 것을 강제 타입 변환이라고 함
    작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입;
  • 예시
int intValue = 10;

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

int intValue = 65;

char charValue = (char) intValue;

System.out.println(charValue); // 'A' 출력

double doubleValue = 3.14;

int intValue = (int) doubleValue; // 소수점 이하 부분 버려지고 3만 저장

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

  • 정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환되어 연산 수행됨
  • 예시
int result = byte/char/short/int 연산자(+, -, \*, /, %) byte/char/short/int

에서

byte x = 10;
byte y = 20;

일 경우

int result = x + y;

로 해야 함 (byte result 로 할 시 컴파일 에러) 이 때 x와 y는 int로 변환됨

  • 정수 연산식에서 모든 변수가 int 타입으로 변환되는 것은 아니며, 두 피연산자 중 허용 범위가 큰 타입으로 변환되어 연산을 수행
long result = long 타입 연산자 연산자(+, -, \*, /, %) byte/char/short/int 일 경우 

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

  • 실수 타입 변수가 산술 연산식에서 피연산자로 사용될 경우 두 피연산자가 동일한 타입이라면 해당 타입으로 연산되지만 피연산자 중 하나가 double 타입일 경우, 다른 피연산자도 double 타입으로 자동 타입 변환됨
int intValue = 50;

double doubleValue = 5.5;

double result = intValue + doubleValue; 
// intValue가 double로 타입 변환 되며 double로 result 값이 저장됨
  • 만약 꼭 int 타입으로 변환해야 할 경우 double 타입을 강제로 int 타입으로 강제 변환하고 덧셈 연산 수행
int intValue = 50;

double doubleValue = 5.5;

int result = intValue + (int) doubleValue; // doubleValue를 int로 강제 변환하여 result 값을 int로 저장
  • 실수 리터럴 연산 : 자바에서 소문자 f 또는 대문자 F가 없는 실수 리터럴을 double 타입으로 해석하므로 연산 결과는 double 타입 변수에 저장해야 함
double result = 1.5 + 2.3;

float result = 1.5 + 2.3; // 컴파일 에러

float result = 1.5f + 2.3f;
  • 정수 연산은 무조건 정수 값이 출력됨. (int 끼리의 연산은 int 값으로 출력됨)
int x = 1;

int y = 2;

double result = x / y;

System.out.println(result);
// 0.5가 나올 것 같지만 정수끼리의 연산이라
// 0.5에서 소수점 이하 부분 제거되어 0이 되고 double로 출력하여 0.0이 나옴
  • 따라서 위의 경우 정수 연산이 아닌 실수 연산으로 변경해야 하며, 둘 중 하나의 값을 정수가 아닌 실수 타입(double이나 float)으로 변환해야 함 (아니면 둘 다 double, float으로 해도 상관 없음)
double x = 1;

int y = 2;

double result = x / y;

System.out.println(result);

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

  • 연산자는 피연산자가 모두 숫자일 경우 덧셈 연산을 수행
  • 피연산자 중 하나가 문자일 경우 나머지 피연산자도 문자열로 자동 변환되어 문자열 결합 수행
  • 예시
    숫자 + 숫자 -> 덧셈 연산 => 숫자
    "문자열"  숫자 -> "문자열" + "숫자" -> 결합 연산 -> "문자열숫자"
  • 특정 부분을 우선 연산하고 싶을 경우 괄호로 감싸기
String str = "1" + (2+3); -> "1" + 5 => "15"
  • Python에서는 안된다고 염병하는데...

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

  • 프로그램에서 문자열을 기본 타입으로 변환하는 경우가 아주 많음
  • "12", "3.5"를 정수 및 실수 타입으로 변환해서 숫자 연산을 하는 경우 등
변환 타입사용 예
String -> byteString str = "10"; byte value = Byte.parseByte(str);
String -> shortString str = "200"; short value = Short.parseShort(str);
String -> intString str = "30000"; int value = Int.parseInt(str);
String -> longString str = "40000000000"; long value = Long.parseLong(str);
String -> floatString str = "12.345"; float value = Float.parseFloat(str);
String -> doubleString str = "12.345"; double value = Double.parseDouble(str);
String -> booleanString str = "true"; boolean value = Boolean.parseBoolean(str);
  • 기본 타입의 값을 문자열로 변경하는 경우 - String.valueOf() 메소드 활용
    String str = String.valueOf(기본타입값);
profile
공부했던 내용들을 모아둔 창고입니다.

0개의 댓글