Language/Java

[JAVA 10] 자바 변수(Variable) ② 메모리 참조 방식 <기본형 / 참조형>

reifier.tistory.com 으로 이전하였습니다. 2018. 2. 4. 20:04
반응형



2. 메모리 참조 방식
<1> 기본형 변수 ( Primitive Type )
1) Call by value

2) 첫글자가 소문자

3) 종류
byte(1) → short(2) → int(4) → long(8) → float(4) → double(8)
        → char(2) →
boolean(1)

cf) 자동 형변환
 : (boolean을 제외한) 범위가 작은 타입 → 큰타입 (왼쪽 → 오른쪽)
 


 < 잘못된 예1 >┐

[ error : incompatible types: possible lossy conversion from int to short ]

에러 : 공존할 수 없는 타입 : int 에서 byte 로 전환시에 파일 정보가 손실될 수 있다.

 (함께 쓸 수 없는 타입) int 에서 short 로

(호환성이 없는 타입)


< 잘된 예1 >┐

1
2
3
4
5
6
7
8
9
10
11
12
13
class VS2{
    byte b = 1;
    short s = 2;
    int i = 3;
 
    VS2(){
        int r = b + s + i;
        System.out.println("r : " + r);
    }
    public static void main(String[] args){
        VS2 vs2 = new VS2();
    }
}
cs


4) 값의 범위
-   byte  :  (-2^7) ~ (2^7-1)  경우의 수 : 2^8
-   short : (-2^15) ~ (2^15-1) 경우의 수 : 2^16
-   char  :       0 ~ (2^16-1) 경우의 수 : 2^16
-   int   : (-2^31) ~ (2^31-1) 경우의 수 : 2^32
-   long  : (-2^63) ~ (2^63-1) 경우의 수 : 2^64
-   float : ∞ 무한
-  double : ∞ 무한
- boolean : false 또는 true
           


< 주의 >

컴파일은 되지만, byte는 -128에서 127 까지의 범위만 허용한다.

컴파일에서는 에러가 나오지 않지만, 허용 범위가 넘어가면 깨지는 현상이 발생하게 된다.

  byte b = (byte)128; 를 하지 않으면 위에서 보았던 에러가 난다.


 [ error : incompatible types: possible lossy conversion from int to short ]

에러 : 공존할 수 없는 타입 : int 에서 byte 로 전환시에 파일 정보가 손실될 수 있다.


하지만 범위가 -128~127까지 허용되기 때문에 byte b = 127; 은 가능하다.

int 로 자동 변환 되어 보여주기 때문이다. 





<잘된 예2>┐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class VS3{
    byte b = 127// -128 ~ 127까지 허용
                  // 127이상일때에는 깨짐 현상이 생긴다.
    void m1(){    // 기본형
        System.out.println("b  : " + b);
    }
 
    void m2(){    // 실수형
        long lo = 123456789123456789L;
        System.out.println("lo : " + lo);
 
        float f = lo;
        System.out.println("f  : " + f);
 
        double d = lo;
        System.out.println("d  : " + d);
 
        double dd = 123456789123456789123456789123456789.123456789;
        System.out.println("dd : " + dd);
    }
 
    public static void main(String[] args){
        VS3 vs3 = new VS3();
        vs3.m1();
        vs3.m2();
    }
}
cs

float 과 double 은 소수자리를 표현하지만

오차가 발생한다. float 보다는 double이 더 오차가 적다.

하지만 내가 알기로는 오차가 안나오지는 않는다.


5) 형변환 필요성
→ 연산시 같은 type끼리만 가능

6) 초기값
- 정수형 (byte , short , char , int)   
: 0 , 0L
- 실수형 (float , double)
: 0.0f , 0.0
- 불린형 (boolean)
: false




<잘된 예3>┐
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class VS4{
    byte b;
    short s;
    char c;
    int i;
    long lo;
    float f;
    double d;
    boolean flag;
 
    void m(){
        System.out.println("  byte  : " + b);
        System.out.println("  short : " + s);
        System.out.println("  char  : " + (int)c);
        System.out.println("   int  : " + i);
        System.out.println("  long  : " + lo);
        System.out.println("  float : " + f);
        System.out.println(" double : " + d);
        System.out.println("boolean : " + flag);
    }
 
    public static void main(String[] args){
        new VS4().m();
    }
}
cs


long 과 float 은 값을 직접 입력 할때에는 L 과 f 를 꼭 붙여야 한다

ex) long lo = 10L;

float f = 1.1f;





7) 존재이유
- 실행의 효율성


<잘된 예4>┐
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class VS5{
    String number = "100";
 
    void m1(){ // 범위 최소/최대값 확인
        int max = Integer.MAX_VALUE;    // (-2^31)
        int min = Integer.MIN_VALUE;    // (2^31-1)
        System.out.println(" max : " + max);
        System.out.println(" min : " + min);
        System.out.println("");
    }
 
    void m2(){
        int i = Integer.parseInt(number);
        System.out.println(" number r : " + (i + 11));
    }
 
    public static void main(String[] args){
        VS5 vs = new VS5();
        vs.m1();
        vs.m2();
    }
}
//cs


자바는 객체 지향 언어이기 때문에 모든 것을 객체로 만들어야 하는데

1 + 2 = 3 로 예를 들자면

1객체를 만든다. → 2객체를 만든다.  객체를 더해서 3이 나온다. 

라는 흐름은 굉장히 비효율적이기 때문에 기본형 타입은 실행의 효율성을 위해서 예외가 된다.

각각의 MAX_VALUE; MIN_VALUE; 를 사용하면 허용 범위를 직접 확인할 수 있다.



8) 예외 형변환
→ 정수형(byte , short , char , int)끼리의 연산의 결과는 int
위의 <잘된 예1> 에서 설명하였다.

9) 컴퓨터의 소수 오차
float 와 double 은 소수형으로 무한대까지 보여줄수는 있다.
double 이 float 보다 오차가 적다.
하지만 오차가 없지는 않다.



<2> 참조형 변수( Reference Type )

1) Call by reference


2) (일반적)첫글자가 대문자


3) 기본형8가지를 제외한 모든 Type


4) 초기값 : null


5) 형변환

ⓐ 자동 형변환(up casting)

      : Human hm = new Superman();

        Object ← Human ← Superman (상속성에 대해 설명글 참조)1

ⓑ 강제 형변환(down casting)1

      : Superman sm = (Superman)hm;

        Object  Human → Supermam



반응형