본문 바로가기

개발

Java - 변수

반응형

1. 변수 
 - 하나의 값을 저장할 수 있는 메모리 공간(RAM)
 - 변수의 선언

2. 변수, 상수, 리터럴
 변수(variable) - 하나의 값을 저장하기 위한 공간
 상수(constant) - 한 번만 값을 저장 가능한 변수
 리터럴(literal) - 그 자체로 값을 의미하는 것

int score = 100;
     score = 200;

final int MAX = 100;
             MAX = 200; // 에러

char ch = 'A';
String str = "abc";

3. 리터럴의 접두사와 접미사

종류 리터럴 접미사
논리형 false, true 없음
정수형 int - 123, 0b0101, 077, 0xFF
long - 100L
L - 씀 
실수형 long - 3.14, 3.0e8, 0x1.0p-1
float - 1.4f
f(float)- 씀, d(double) - 생략가능
문자형 'A', '1', '\n' 없음
문자열 "ABC", "123", "A", "true" 없음

int i = 100; // 10진수
int b = 0b0101; // 2진수
int oct = 0100; // 8진수
int hex = 0x100; // 16진수

long l = 10_000_000_000L; // _ > jdk 1.7 부터 추가 됨 숫자가 큰 경우에 알아보기 쉽게 넣기 

float f = 3.14f; // f생략불가
double d = 2.34d; // d생략가능

10. >> 10.0
.10 >> 0.10 
-- 둘다 모두 실수형 접미사가 없기 때문에 double 
10f >> 실수형 float
10e3 >> 1000.0 >> 접미사가 없기 때문에 double

4. 변수와 리터럴의 타입 불일치
 - 범위가 '변수' > '리터럴' 인 경우 OK
 - 범위가 '변수' < '리터럴' 인 경우 error
  int a = 30_0000_0000; // int의 범위 +-20억이 벗어남 
  long l = 3.14f // long < float
               - long이 8byte, float가 4byte 이기때문에 에러가 안날것 같지만 실수형이 정수형보다 크기때문에 에러 발생
  float f = 3.14 // float < double  에러 
 - byte, short 변수에 int 리터럴 저장 가능 

5. 기본형과 참조형
 - 기본형(Primitive type)
    boolean, char, byte, short, int, long, float, double
    실제 값을 저장 
 - 참조형(Reference type)
    기본형을 제외한 나머지(String, System 등)
    메모리 주소를 저장(4byte(32bit) 또는 8 byte(64bit))
  Date today; // 참조형 변수 today
  todya = new Date(); // today 에 객체 주소를 저장

6. 기본형의 종류와 크기 
 논리형(boolean) - true와 false 중 하나를 값으로 갖으며, 조건식과 논리적 계산에 사용된다.
 문자형(char) - 문자를 저장하는데 사용되며 변수당 하나의 문자만을 저장할 수 있다.
 정수형 - 주로 int, long 사용
              byte : 이진데이터에 사용 / short : c언어와의 호환을 위해 추가됨(잘 안쓰임)
 실수형 - float, double 

  1 byte 2 byte 4 byte 8 byte
논리형 boolean(true, flase)      
문자열   char(유니코드)    
정수형 byte short(int 보다 작아서 short) int(기본) long(int 보다 커서 롱)
실수형     float(부동소수점 double(정밀도가 높아서 붙여짐) 실수형 기본

7. 기본형 표현범위
 byte - 1byte - 8bit 
          byte b = 3; >> 00000011
          비트 하나는 부호비트이다.
          그래서 > byte -2^7 ~ 2^7-1
            양수 : 0-7bit / 음수 : 1-7bit 
            2^7 = 128개   /  2^7 = 128개   >>> 256개 = 2^8 >> -128 ~ 127
 short : - 2byte - 16bit
            양수 - 15bit - 2^15
            음수 - 15bit - 2^15  >> - 32768 ~ 32767 

...

 

8. printf()의 지시자
 System.out.printf("%d", 15); // 15   10 진수
 System.out.printf("%0", 15); // 17   8 진수
 System.out.printf("%s", Integer.toBinaryString(15)); // 1111   2 진수를 스트링으로 변호환하여 문자열로 출력 %s > 문자열
 - 8진수 16진수에 접두사 붙이기
 System.out.printf("%#o", 15);
 // 017
 System.out.printf("%#x", 15);
 // 0x17
 System.out.printf("%#X", 15);
 // 0X17
 - 실수 출력
 float f = 123.4567890f;
 System.out.printf("%f", f); // 소수점 아래 6자리 까지 출력 123.456787
    >>> 끝자리가 다르다
            그 이유는 float 의 정밀도는 7자리 
            뒤에 87 은 의미가 없는 수. 그래서 이것을 표현하려면 flaot 보다 정밀도가 높은 double 을 사용하는것이 낫다 (double 는 15자리) 
 System.out.printf("%e", f);
 // 지수 형식 1.2345678e+02               
    >> 마지막수가 8 > 이유는 반올림되어 표시 실제 수는변화 없음.
 System.out.printf("%g", 123.456789); // 123.457 간략히 보여줌 7자리
 System.out.printf("%g",0.00000001); // 1.00000e-8 간략히 보여줌
 
 System.out.printf("[%5d]%n", 10); // 5자리에서 10출력  오른쪽정렬 [      10]
 System.out.printf("[%-5d]%n", 10); // 5자리에서 10출력  왼쪽정렬   [10      ]
 System.out.printf("[%05d]%n", 10); // 5자리에서 10출력  빈공간 0으로 채우기  [00010]
%전체자리.소수점아래자리f
 System.out.printf("d=%14.10f%n", d); // 전체 14자리 중 소수점 아래 10자리 

1 2 3 4 1 2 3 4 5 6 7 8 9 0
    1 . 2 3 4 5 6 7 8 9 0 0

앞에 두칸은 공백 뒤에 두칸은 숫자 0 으로 채운다.
String url = "www.codechobo.com";
 System.out.printf("[%s]%n", url);      // [www.codechobo.com]
 System.out.printf("[%20s]%n", url);  // 전체 20칸에서 오른쪽정렬 [    www.codechobo.com]
 System.out.printf("[%-20s]%n", url); // 전체 20칸에서 왼쪽정렬 [www.codechobo.com     ]
 System.out.printf("[%.8s]%n", url);  // 앞에서 8글자 [www.code]

9. 타입간 변환 (문자 <> 숫자)

        /* 문자를 숫자로 변환하여 계산 */
        
        // 문자열 3 을 문자 3으로 바꿈   문자 3 - 문자 0 = 숫자 3
        System.out.println("3".charAt(0) -'0');
        System.out.println(3 + 1);
        
        
        // 문자 3은 10진수 숫자로 51
        // 51 -1 임
        System.out.println('3' - 1);
        System.out.println(3+'0');
        
        System.out.println((char)(3+'0'));

- 실행 결과

10. 연산자 우선순위
 산술 > 비교 > 논리 > 대입 대입은 젤 마지막!
 단항 > 이항 > 삼항 단항 연산자의 우선순위가 이항 연산자보다 높다 
 단항 연산자와 대입연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.

11. 형변환
 int -> char : (char)65 >> 'A'
 char -> int : (int)'A' >> 65
 float -> int :(int)1.6f >> 1
 int -> float : (float)10 >> 10.0f

12. 자동 형변환
 float f = 1234; // int 타입의 값을 float타입의 변수에 저장 > 자동 형변환
 float f = (float)1234; // 형변환

 int i = 3.14f // 큰놈을 작은놈에 넣는다 값이 잘린다. >> 값 손실 발생 
 int i = (int)3.14f // 수동형변환

byte a = (byte)300;
System.out.println(a);
 >> 실행결과 44 값 손실이 있다. 
  300 > 이진수로 > 100101100
  이 수를 1바이트인 byte에 넣으면 맨 앞 숫자 1 이 삭제되어 00101100 이 들어간다
   따라서  변수 a에는 44가 들어간다.

13. 산술 변환
 연산 전에 피연산자의 타입을 일치시키는 것  
 - 둘 중 큰 타입으로 일치 시킨다.
 long + int > long + long > long
 float + int > float + float > float
 double + float > double + double > double
 - 피연산자의 타입이 int 보다 작으면 int 로 변환
 byte + short > int + int > int
 charb + short > int + int > int
 ex) '2' - '0'
   char - char > int - int >int 
                      > 50 - 48 > 2
int a = 1_000_000;  // 1백만
int b = 2_000_000; // 2백만
long c = a * b;

public class Ch3 {
    public static void main(String [] args){

        int a = 1_000_000;  // 1백만
        int b = 2_000_000; // 2백만
        long c = a * b;
        System.out.println(c);
        c = (long)a * b;
        System.out.println(c);
    }
}

- 실행결과 
  두 연산 결과가 long 의 사이즈를 초과 하기 때문에 첫번재 결과는 잘못된 결과가 나왔다 
  따라서 산술 변환을 일으키기 위해 a, b 중 a를 long 으로 변환하여 연산하여 올바른 결과가 나왔다.

 

14. switch 문
 -  switch 문의 조건식 결과는 정수 또는 문자열이어야 한다.
 - case 문의 값은 정수 상수(문자포함), 문자열만 가능하며 중복되지 않아야 한다.
 int num, result;
 final int ONE = 1;
 ....
 switch(result){
     case '1' :  // 정수 49와동일
     case ONE:
     case "YES": // 문자리터럴  jdk 1.7 부터 
     case  num : // 변수

 }
 - java 버전별 switch 문 변화는 아래 블로그에서 확인
congcoding.tistory.com/73

 

[Java 14] 개선된 switch 문(Enhanced Switch Expressions)

1. 개선된 switch 문이란? 2020년 3월에 출시된 Java 14부터 개선된 switch 문을 지원합니다. 기존 switch문은 깔끔하지 못하고 가독성도 떨어지며, break문의 누락으로 인한 오류 가능성도 크기 때문에 화

congcoding.tistory.com

 

반응형

'개발' 카테고리의 다른 글

Java - 객체지향개념  (0) 2021.05.30
Java - 배열  (0) 2021.05.10
Java  (0) 2021.05.05
클라우드 컴퓨팅의 이점  (0) 2021.04.08
Azure AI  (0) 2021.04.06