STUDY/JAVA

[Java] 이것이 자바다 Ch.02

Eunjng 2023. 12. 26. 18:00

'이것이 자바다' 교재 및 강의를 참고하여 정리한 내용입니다.

Ch.02 변수와 타입

변수 선언

  • 컴퓨터 메모리(RAM): 수많은 번지들로 구성된 데이터 저장 공간
  • 변수: 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름
  • 자바의 변수는 다양한 타입의 값을 저장할 수 없다.
  • 변수 선언: 타입 이름
  • 변수 이름: 첫 글자는 문자로 시작하고, 캐멀 스타일로 작성하는 것이 관례
    • camel 스타일
      • 자바 소스 파일명(클래스명)은 대문자로 시작: MemberGrade.java
      • 변수명은 소문자로 시작: mathScore
  • 변수에 최초로 값을 대입하는 행위: 변수 초기화. 이때의 값: 초기값
    • int score = 90;
  • 초기화되지 않은 변수는 메모리에 할당되지 않았기 때문에 변수를 통해 메모리 값을 읽을 수 없다.
  • int value; int result = value + 10; // 컴파일 에러

타입

  • 정수: byte, char, short, int, long
  • 실수: float, double
  • 논리: boolean

정수 타입

타입 메모리 크기 저장되는 값의 허용 범위
byte 1byte (=8bit) -2^7 ~ (2^7 - 1) -128 ~ 127
short 2byte -2^15 ~ (2^15 - 1) -32,768 ~ 32,767
char 2byte 0 ~ (2^16 - 1) 0 ~ 65535
int 4byte -2^31 ~ (2^31 - 1) -2,147,483,648 ~ 2,147,483,647
long 8byte -2^63 ~ (2^63 - 1)  

 

  • byte, short, int, long은 부호 있는 정수 타입이므로 최상위 bit는 부호 bit로 사용되고, 나머지 bit는 값의 범위를 결정

  • 최상위 bit가 1인 음수의 경우 나머지 bit를 모두 1의 보수로 바꾸고 1을 더한 값에 -를 붙이면 10진수가 된다.

리터럴(liteal): 직접 입력한 값

  • 2진수: 0b 또는 0B로 시작하고 0과 1로 작성
    • int x = 0b1011;
  • 8진수: 0으로 시작하고 0~7 숫자로 작성
    • int x = 0206;
  • 10진수: 소수점 없는 0~9 숫자로 작성
    • int x = 12;
  • 16진수: 0x 또는 0X로 시작하고 0~9 숫자나 A, B, C, D, E, F 또는 a, b, c, d, e, f로 작성
    • int x = 0x2A0F;
  • 허용 범위 초과 시 컴파일 에러
  • l 또는 L을 붙여 long 타입 값임을 알려줘야 한다.
    • long var1 = 1000000000000L;

문자 타입

  • 문자 리터럴: 하나의 문자를 작은따옴표(')로 감싼 것. 유니코드로 변환되어 저장된다.
char c1 = 'A'; // 문자 저장 
char c2 = 65; // 유니코드 직접 저장 

// char 초기화 
char c = ''; // 컴파일 에러 
char c = ' '; // 공백 포함해서 초기화

실수 타입

타입 메모리 크기 저장되는 값의 허용 범위(양수 기준) 유효 자릿수
float 4byte 1.4 * 10^-45 ~ 3.4 * 10^38 7자리
double 8byte 4.9 * 10^-324 ~ 1.8 * 10^308 15자리

  • 자바는 float과 double 타입의 값을 부동 소수점 방식으로 메모리에 저장

실수 리터럴

  • 10진수 리터럴
    • double x = 0.25;
  • e 또는 E가 포함된 10의 거듭제곱 리터럴
    • double x = 5e2; // 5.0 * 10^2 = 500.0
  • 기본적으로 double 타입으로 해석하기 때문에 float 타입에 입력 시 f나 F를 붙여야 한다.
    • float var = 3.14f;
float var1 = 0.1234567890123456789f;
double var2 = 0.1234567890123456789;
System.out.println(var1);    // 0.12345679
System.out.println(var2);    // 0.12345678901234568
  • double 타입이 float 타입보다 약 2배 정도의 유효 자릿수를 가진다.

논리 타입

  • 논리 리터럴: true, false
int x = 10; 
boolean result1 = (x == 20); 
boolean result2 = (x != 20); 
System.out.println(result1); // false 
System.out.println(result2); // true

문자열 타입

  • 문자열: 큰따옴표(")로 감싼 문자들
    • String var1 = "A";
  • 이스케이프(escape) 문자: 문자열 내부에 \가 붙은 문자
    • \" : "문자 포함
    • \': '문자 포함
    • \\: \ 문자 포함
    • \u16진수: 16진수 유니코드에 해당하는 문자 포함
    • \t: 출력 시 탭만큼 띄움
    • \n: 출력 시 줄바꿈
    • \r: 출력 시 캐리지 리턴
  • Java 13부터는 텍스트 블록 문법 제공
String str = """ 
... 
""";

자동 타입 변환

  • 값의 허용 범위가 작은 타입이 큰 타입으로 대입될 때
  • byte < short, char < int < long < float < double
  • char타입의 허용 범위는 음수를 포함하지 않기 때문에 byte -> char 자동 변환 불가
byte byteValue = 10; 
int intValue = byteValue; 

// 자동 형변환 
char charValue = 'A'; 
int intValue = charValue; // 65 저장

강제 타입 변환

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;
System.out.println(intValue);    // 3

String strValue = "A";
char var = (char) strValue;		// 컴파일 에러

연산식에서 자동 타입 변환

  • 정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환되어 연산 수행
  • long 타입이 피연산자로 사용되면 다른 피연산자는 long 타입으로 변환되어 연산 수행
byte x = 10; 
byte y = 20; 
byte result = x + y; // 컴파일 에러 
int result = x + y;
  • 피연산자가 동일한 실수 타입이면 해당 타입으로 연산
  • 하나가 double이면 다른 피연산자도 double 타입으로 변환되어 연산되고, 연산 결과 또한 double 타입
float result = 1.2f + 3.4f;        // 컴파일: float result = 4.6f;

int intValue = 10;
double doubleValue = 5.5;
double result = intValue + doubleValue;    // 10.0 + 5.5

int intValue = 10;
double doubleValue = 5.5;
int result = intValue + (int) doubleValue;    // 10 + 5

int x = 1;
int y = 2;
double result = x / y;
System.out.println(result);        // 0.0

double result = (double) (x / y);            // 0.0

double result = (double) x / y;                // 0.5
double result = x / (double) y;                // 0.5
double result = (double) x / (double) y;    // 0.5
  • +연산자
    • 피연산자가 모두 숫자일 경우 덧셈 연산 수행
    • 피연산자 중 하나가 문자열일 경우 다른 피연산자도 문자열로 자동 변환되어 문자열 결합 연산 수행
int value = 3 + 7; 		// 10 
String str = "3" + 7; 	// "37"

// 순차적으로 + 연산 수행 
int value = 1 + 2 + 3; 		 // 6 
String str = 1 + 2 + "3"; 	 // "33" 
String str = 1 + "2" + 3;	 // 123 
String str = "1" + (2 + 3);  // "15"

문자열 변환

  • 문자열 -> 기본 타입
    • `Byte.parseByte`, `Integer.parseInt`, ...
  • 기본 타입 -> 문자열
    • `String str = String.valueOf(기본값);`

콘솔로 변수값 출력

  • println(내용); - 괄호 안의 내용을 출력하고 행 바꿈
  • print(내용); - 괄호 안의 내용을 출력하고 행 미바꿈
  • printf("형식문자열", 값1, 값2, ...); - 형식 문자열에 맞추어 값 출력

  • conversion: d(정수), f(실수), s(문자열)
  • 형식 문자열에 포함될 값이 둘 이상일 경우 값의 순번 포함
    • System.out.printf("이름: %1$s, 나이: %2d", "김자바", 25); // 이름: 김자바, 나이: 25
  • flags: 빈 공간 채우는 방법
    • 생략 시 왼쪽이 공백으로, -가 오면 오른쪽이 공백으로 채워진다. 0은 공백 대신 0으로 채운다.
  • width: 소수점을 포함한 전체 자릿수
  • .percision: 소수 이하 자릿수

키보드 입력 데이터를 변수에 저장

  • Scanner scanner = new Scanner(System.in);
  • String inputData = scanner.nextLine();
  • 기본 타입 비교 시 == 사용, String 타입 비교 시 equals() 사용

 

  • 변수 이름으로 사용할 수 없는 것: class, 6hour, #name, int
  • 가능: modelName, $value, _age