티스토리 뷰

2.1 변수 선언

  • 컴퓨터 메모리(RAM)는 번지들로 구성된 데이터 저장 공간
  • 변수: 하나의 값을 저장할 수 잇는 메모리 번지에 붙여진 이름
  • 첫 번째 글자가 문자여야하고 중간부터는 문자, 숫자, &, _ 포함 가능
  • 첫 번째 글자는 소문자이며 캐멀 스타일
  • 변수에 최초로 값이 대입될 때 메모리에 할당됨
  • 변수 선언만 한 상태에서는 메모리에 할당되지 않았기 때문에 값을 읽을 수 없어 컴파일 에러가 날 수 있음
  • 초기화: 변수에 최초로 값을 대입하는 행위, 초기값, 대입 연산자(=) 사용
// 변수 선언
// 데이터 타입 변수 이름
int age;

// 변수 선언과 동시에 초기화를 할 수도 있음
int hour = 3;

// 변수에 또 다른 변수를 대입해서 메모리 간에 값 복사 가능
int time = hour;

 

 

 

2.2 정수 타입

  • 기본 타입(primitive type) 8개
  • 정수: byte, char, short, int, long
  • 실수: float, double
  • 논리: boolean
  • 리터럴: 프로그래머가 직접 입력한 값
int var1 = 0b1011;	// 2진수
int var2 = 0206;	// 8진수
int var3 = 365;		// 10진수
int var4 = 0xB3;	// 1진수
		
// 정수 리터럴을 어떤 진수로대입해도 기본인 10진수 값으로 출력
System.out.println(var1); // 11
System.out.println(var2); // 134
System.out.println(var3); // 365
System.out.println(var4); // 179


long var1 = 10;
long var2 = 20L;
		
// 정수 리터럴은 기본적으로 int값으로 간주하기 때문에 int 값을 벗어날 경우 에러 발생
// long var3 = 10000000000;
		
// L 혹은 l을 붙여서 사용
long var4 = 10000000000L;

 

 

2.3 문자 타입

  • 문자 리터럴: (')로 감싼 것을 말하며, 유니코드로 변환되어 저장되고 유니코드는 정수기 때문에 char은 정수 타입
char c1 = 'A';

// 유니코드 숫자를 직접 대입할 수도 있음
char c2 = 65;

System.out.println(c1); // A
System.out.println(c2); // A

// 에러
// char c3 = '';

// 공백 유니코드를 대입해야한다
char c3 = ' ';

 

 

 

2.4 실수 타입

  • float: 소수점 이하 7자리
  • double: 소수점 이하 15자리
  • 동 소수점 방식으로 저장: 소수점 위치가 10의 지수에 따라 변경되는 방식
    123.45 를 1.2345 × 10²(여기서 2는 지수)로도 표현할 수 있는데 이 때 소수점의 위치가 달라진다.
  • 실수 리터럴은 기본적으로 double 타입으로 해석하기 떄문에 float 타입의 경우 F 혹은 f를 뒤에 써준다.
float var1 = 0.12345678901234567890f;
double var2 = 0.12345678901234567890;

// 데이터 타입에 따라 유효 자리수가 다르다.
System.out.println(var1); // 0.12345679
System.out.println(var2); // 0.12345678901234568

 

 

2.5 논리 타입

  • 논리 리터럴: true / false
  • 조건문과 제어문의 실행 흐름을 변경하는데 사용
  • 연산식의 true / false 도 대입 가능
boolean stop = true;

// 조건문의 실행 흐름 제어
if (stop) {
  System.out.println("중");
} else {
  System.out.println("시");
}

int x = 10;

// 연산식의 참거짓 판별
boolean result = (x == 20); 
System.out.println(result); // false

 

 

2.6 문자열 타입

  • (")로 감싼 여러 개의 문자들(문자열)은 유니코드로 변환되지 않는다.
  • 기본 타입이 아닌 참조 타입
  • 이스케이프 문자: \ (역슬래시)
\n 줄바꿈
\ 줄바꿈을 하지 않고 다음 줄에 이어서 작성할 때 사용
// 이스케이프 문자
String str = "번호\n이름\n직업";
System.out.println(str);

/*
번호
이름
직업
**/


// Java13부터 사용 가능 - 이스케이스 문자를 사용하지 않아도 문자열 그대로 저장
String str2 = """
나는 자바를 배웁니다.
아마도요!
""";

System.out.println(str2);

/*
나는 자바를 배웁니다.
아마도요!
**/


// Java14부터 사용 가능 - 줄바꿈을 하지 않고 이어서 작성
String str3 = """
나는 자바를
배웁니다
""";

System.out.println(str3); // 나는 자바를 배웁니다.

 

2.7 자동 타입 변환

  • 값의 허용 범위가 큰 타입에 작은 타입을 대입할 때 발생

 

// 큰 타입 = 작은 타입
byte byteValue = 10;
int intValue = byteValue; // int 타입으로 자동 타입 변환 됨
  • 실수 타입이 정수 타입보다 허용 범위가 크기 때문에 실수 타입에 정수 타입을 대입하면 무조건 자동 타입 변환
long longValue = 5000000L; float floatValue = longValue; // floa 타입으로 자동 타입 변환 됨
System.out.println(floatValue); // 5000000.0
  • char타입은 int타입으로 자동 타입 변환
  • char 타입은 음수가 없는데 byte 타입은 음수가 있기 때문에 byte 타입은 char 타입보다 작은 타입이지만 자동 변환되지 않는다.
char charValue = 'A'; int intValue2 = charValue; 
System.out.println(intValue2); // 65

 

 

2.8 강제 타입 변환

  • 값의 허용 범위가 큰 타입을 작은 타입으로 쪼개어서 저장할 때 발생
  • 원래의 값이 유지되면서 타입만 바꿔야 하기 대문에 작은 허용 범위에 저장될 수 있는 값을 가지고 변환해야 한다. 
  • 작은 허용 범위 = (작은 허용 범위 타입) 큰 허용 범위
  • int -> byte
    int intValue = 18;
    byte byteValue = (byte) intValue;
    System.out.println(byteValue); // 18
  • long -> int
    long longValue = 300;
    int intValue2 = (int) longValue;
  • int -> char
    int intValue3 = 65;
    char charValue = (char) intValue3;
    System.out.println(charValue); // 'A' 출력
  • 실수 -> 정수
    double doubleValue = 3.14;
    int intValue4 = (int) doubleValue;
    System.out.println(intValue4); // 소수점 이하 부분은 버려지고 정수만 남는다 -> 3 출력

 

2.9 연산식에서 자동 타입 변환

  • java는 컴파일 단계에서 연산을 실시해서 실제로 실행할 땐 연산을 하지 않아 실행 성능이 좋아진다.
  • 하지만 변수가 피연산자로 사용되면 실행 시 연산을 실시.
// 컴파일 단계에서 연산 -> 데이터 타입은 그대로 byte
byte result1 = 10 + 20;
System.out.println(result1); // 30

// 변수로 연산할 때는 byte가 아니라 int로 자동 타입 변환되어 연산
byte x = 10;
byte y = 20;        
int result2 = x + y;
System.out.println(result2); //30

// long이 있을 때는 long타입으로 변환한 후 연산
byte v1 = 10;
int v2 = 20;
long v3 = 30L;
long result3 = v1 + v2 + v3;
System.out.println(result3); // 60

// 실수와 정수 연산할 때는 double로 변환한 후 연산
int v4 = 8;
float v5 = 4.0f;
double result4 = v4 / v5;
System.out.println(result4); //2.0

// 정수 연산의 결과는 정수
int v6 = 1;
int v7 = 2;
double result5 = v6 / v7; 
System.out.println(result5); 
// 0.0 (1/2=0.5에서 정수 0만이 남고 여기서 double타입이 되어 0.0이 출력됨)

// double이 있으면 doubl로 변환한 후 연산
double result6 = (double) v6 / v7;
double result7 =  v6 / (double) v7;
double result8 =  (double) v6 / (double) v7;
System.out.println(result6); // 0.5
System.out.println(result7); // 0.5
System.out.println(result8); // 0.5

double result9 =  (double) (v6 / v7);
System.out.println(result9); 
// 0.0 (괄호 안의 정수 부분이 먼저 연산되어 0만이 남고 여기서 double타입이 되어 0.0 출력됨)
  • (+) 연산자
    • 덧셈 연산: 숫자일 경우 숫자의 덧셈을 실시
    • 결합 연산: 하나라도 문자열이 포함되어 있을 경우에는 문자열로 변환되어 문자 결합을 실시
// 숫자 연산
int x = 10;
int y = 20;
int result = x + y;
System.out.println(result); // 30

// 결합 연산
String result2 = 10 + 20 + "10"; 
System.out.println(result2); // 3010

String result3 = "10" + x + y; 
System.out.println(result3); // 101020

 

 

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

// 문자열을 기본 타입으로 변경
int var1 = Integer.parseInt("10");
double var2 = Double.parseDouble("5");

double result = var1 / var2;
System.out.println(result); // 2.0

// 기본 타입을 문자열로 변경
String str1 = String.valueOf(100);

 

 

2.11 변수 사용 범위

  • { } 블럭 내에서 선언된 변수는 해당 { } 블럭 내에서만 사용 가능

 

 

2.12 콘솔로 변수값 출력

System.out.println("개행");

System.out.print("개행");
System.out.print("하지");
System.out.print("않음 \n");

System.out.printf("이름: %s, 나이: %d, 실수: %.2f", "김자반", 100, 3.1412598);
// 이름: 김자반, 나이: 100, 실수: 3.14 (소수점 2자리까지)

 

 

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

Scanner in = new Scanner(System.in);

// 문자열 입력 받을 때
String str = in.nextLine();
System.out.println(str);

// 정수를 입력 받을 때 
int x = in.nextInt();
int y = in.nextInt();
System.out.println(x + y);
최근에 올라온 글