본문 바로가기

자바스프링웹공부(2024)/자바

2024.07.25. 변수, 형변환, 연산자1

반응형

*자바 타입별 데이터 표현범위

* (byte 표현범위) : -128 ~ 127

- byte b = 127;  // (O)
  byte b = 128;  // (X) 표현범위 넘어섬.
- long l =2147483648; // (X) 범위 안이지만 오류/
  long l =2147483648L; // (ㅇ) long은 뒤에 L을 붙여줘야함. L을 쓰지않으면 int로 받아들인다. =>오류

- int i=100L; // (X) 접미사 L이붙으면 int타입으로 저장 가능한 숫자라 하더라도 저장불가.

- float f = 3.14f; //(O) float타입은 접미사 f 또는 F를 붙여야함.
- double d=3.14; //(O) double 기본타입이므로 접미사 없어도 잘 나옴.
- char c='A'+1; ==> B
- true = 1, false = 0 이렇게 숫자로도 표현됨.

 

*변수

* String 타입 : 기본형 아닌 참조형 데이터타입(Reference Type). 공백(null String)저장가능. char는 공백저장안됨.

* printf() 
-출력할 형식을 미리 지정하여 원하는 형태로 데이터 출력 :  (printf() 메서드의 f는 format 의 약자)
-출력할 형식을 ""큰따옴표안에 '형식지정문자'를 사용하여 형식 지정 후 우측에 콤마를 붙이고 실제 데이터를 지정함.
ex. String s1 = "Java";
      String s2 = "프로그래밍";
      System.out.printf("%s \n %s",s1,s2);

결과화면 \n때문에 두줄.

 


*오늘의 퀴즈1*

Q. 안녕하세요. 제 이름은 XXX 입니다. 제 나이는 XX 입니다. 제 키는 XXX.XX 입니다. 를 printf() 를 사용하여 표현하시오.

String name="홍길동";
int age = 200;
double height =190.9; //소숫점 2자리까지만 표시.
		
//tip. printf 는 + 쓰지않고 단순히 변수만 넣어서 표현할때 사용하는 점 기억하세요.
System.out.printf("안녕하세요 제 이름은 %s 입니다.", name);
System.out.printf("\n%s\n","제 나이는 "+age+"세 입니다.");
System.out.printf("제 키는 %.2f 입니다.", height);//소숫점 2째자리까지만 보여다오.

*형변환 = 타입변환(Type Casting)

 

- 기본형끼리의 형변환과 참조형끼리의 형변환으로 구분.

- short와 char 같의 형변환은 일어날 수 없다. 

   short : +-3만2천 얼마.음수존재.
   char : 아스키코드, 유니코드 저장. 코드값은 음수가 없다.

- 자동형변환(long->float)는 long이 더큰데 자동형변환이 되는 이유? 

   long :  크기 - 8byte , 값의 범위 10^19
   float :  크기 - 4byte , 값의 범위 10^38 
    => flaot이 표현할 수 있는 값의 범위가 훨씬크기 때문에 자동형변환이 가능하다. 

 

< 명시적 형변환 ( = 강제 형변환) >
 :큰 데이터타입에서 작은 데이터타입으로 변환하는 경우 
 :반드시 형변환 연산자를 사용하여 우변의 데이터 앞에 작은 데이터 타입을 명시. 이때, overflow 때문에 다른 데이터가 저장될 수가 있다.  

- byte b1=10;

  byte b2=20;

  byte b3=0;

  b3=b1+b2; // (X). 산술이 넘쳐서 오류가 발생을 한다. byte 연산결과가 int가 되므로 b3에 저장불가.

  b3=(byte)(b1+b2); // (ㅇ). 형변환을 두개다 괄호쳐주면 저장가능.

 

< 산술연산시 자동형변환 >
- 산술 연산전에 데이터 타입이 다르면 산술 연산을 수행하기 전 피연산자끼리의 데이터타입을 일치 시킨후 연산수행.
- 규칙1. int 타입보다 작은 타입끼리의 연산은 모두 int 타입으로 변환후 연산해야한다. 
  ex. byte + byte = int + int = 결과가 int
  ex. char + int    = int + int = 결과가 int
- 규칙2. int 타입보다 큰 타입과의 연산은 큰 타입으로 변환 후 연산.
  ex. int + long     = long     + long     = 결과가 long
  ex. int + double = double + double = 결과가 double

- char ch='A';

  char ch2= ch + 2;             // (X) char , int 간에 형이 맞지 않으므로 오류/

  char ch2= (char)(ch + 2); // (O). 결과값 : C

-long l = 200; 뒤에 L없는데 왜 오류 안나지??  int 형 범위내의 숫자에서는 식별자 L이나 l을 붙이지 않아도 괜찮다. 

- long+float만나면 결과가 float 이 된다.

  long l   = 200;

  float f   =3.14f;

  long l2 =l+f; //(X)

  long l2 =(long)(l+f);// (O) 결과값이 float이 되므로 long으로 표현하려면 형변환을 해줘야 함.

- (double)(10/3) = 3.0

  (double)10/3) = 3.3333333333333335

  10/(double)3) = 3.3333333333333335

 - b3=b1+b2; // (X)

   b3=10+20; // (O) 변수는 뭐가 들어올지 모르니까 실행이 안되는데 상수(리터럴)끼리 하면 실행이된다. 그래서 형변환을 해 줄 필요가 없다.

   b3=100+20;// (X) 대신 byte가 넘어버리는 숫자를 넣으면 아예 안된다.

< 대입연산자 >

- 대입연산자를 사용하면 명시적 형변환을 하지않아도 된다.

- short s = 10;

  s=s+10; // (X) 자동형변환의 결과로 결과가 int라서 오류가 난다.

  s += 10; // (O) 연산시 자동 현변환이 일어나지 않는다.그래서 오류가 나지않음.

 

 

 

반응형