본문 바로가기

프로그래밍/Java

원시타입 변수와 참조타입 변수...그리고 조건문 IF

변수(Variable)

  • 변하는 값, 변수명(명확하고, 정보를 담고 있어야 함) = 메모리상에 올라가 있는 변수의 주소값
  • 변수 선언: 메모리에 변수가 쓸 공간을 할당 받는 행위 - 값이 있던 없던 상관 x
  • ex) 카카오톡 최근 메세지도 변수에 속함

 

📌 변수 선언 방법: 자료형 변수이름 값;  

 - 세미콜론 = 마침표, 없으면 처리 X

 - 한 번에 하나의 선언만 가능

 

📌 자료형: 사용하는 비트에 따라 저장할 수 있는 최소, 최대값이 다름

 

🐾 원시타입(Primitive Type): JAVA에서 기본적으로 제공 🐾

 

✅ 정수형

- 다양한 크기의 자료형을 제공하는 이유 = 메모리 공간의 적절한 사용

- 데이터 범위: -2^(n-1) ~ +(2^(n-1)-1)

 

1. byte: 8비트

      - 2^8(256)개의 값을 나타낼 수 있음

      - 데이터 범위: -128 ~ +127

      - 1바이트 단위의 자료형, 동영상, 음악파일, 실행파일 등의 자료 처리에 사용

 

2. short: 16비트

      - 2^16(65536)개의 값을 나타낼 수 있음

      - 데이터 범위: -32768 ~ +32767

      - JAVA에서는 자주 안쓰이고 C/C++ 언어와 호환 시 사용

 

3. int: 32비트

      - 기본 데이터 타입

      - CPU가 처리하기에 가장 적합한 크기의 정수 자료형 So, int형 연산 속도가 다른 자료형 연산속도에 비해 동일 or 빠름

      - 따라서 int보다 작은 크기의 데이터는 int로 바꿔 연산 but, 연산 속도보다 데이터 크기를 줄이는 것이 더 중요한 경우 short형 유용

 

4. long: 64비트

      - 32비트(int)를 초과하는 크기의 자료형을 처리

      - int가 기본 데이터 타입이라 정수 데이터 뒤에 'L', 'l'을 붙여줘야 long으로 인식

 

✅ 실수형

- 정수보다 정밀, 부동 소수점 방식으로 표현

 

부동 소수점 방식(Fixed-point)

: 모든 실수를 m * 10^n 꼴로 나타내는 방식

ex) 167.8 = 1.678 x 10^2

1.678 = 정수부(Significand)

 

정규화(Normalize): 소수점을 일의 자리까지 이동한 것

*일의 자리에는 0이 아닌 숫자가 와야함

 

이진수의 부동 소수점 방식

101.1 = 1.001 x 2^2

이진수 -> 십진수

101.1 = (1 x 2^2) + (0 x 2^1) + (1 x 2^0) + (1 x 2^-1) = 4 + 0 + 1 + 0.5 = 5.5

 

1. float: 32비트

- 표현 가능 범위: -3.4 x 10^38 ~ +3.4 x 10^38

- 컴퓨터 저장 방식: Single Precision(단정도, 32비트 저장 방식)

- double형이 기본 데이터 타입이라 실수 데이터 뒤에 'F', 'f' 붙여줘야 float으로 인식

float fl = 3.14F;
float fl = 3.14f;

 

 ☑️ 32비트의 구성

- Sign: 1비트, 부호(양수 = 0, 음수 = 1)

- Exponent(지수부): 8비트, 2의 지수를 나타내냄, 실제 2 지수에 basis를 더한 값이 저장

+ Basis: 지수를 표현하기 위해 필요한 상수로 single precision에서는 127, double precision에서는 1023

- Fraction(가수부): 23비트, 정수부를 표햔하기 위한 파트, 정수부에서 1을 뺀 값이 저장

 

ex1) 1101.0101

ⓐ 부동 소수점 방식으로 표현: 1101.0101 = 1.1010101 x 2^3

ⓑ Sign bit 채우기: 양수이므로 Sign bit = 0

ⓒ Exponent 계산

    3 + 127(basis) = 130

    130 = 1000 0010

    Exponent = 10000010

ⓓ Fraction 계산: 정수부의 소수점 이하를 그대로 Fraction에 넣는다

    Fraction = 101 0101 0000 0000 0000 0000

ⓔ 결과 : 1101.0101 = 0100 0001 0101 0101 0000 0000 0000 0000

 

ex2) -130.625

ⓐ 이진수로 변환: -130.625 = -1000 0010.101

ⓑ 부동 소수점 방식으로 표현: -1000 0010.101 = -1.0000010101 x 2^7

ⓒ Sign bit 채우기: 음수이므로 Sign bit = 1

ⓓ Exponent 계산

    7 + 127(basis) = 134

    134 = 1000 0110

    Exponent = 10000110

ⓔ Fraction 계산

    Fraction = 000 0010 1010 0000 0000 0000 

ⓕ 결과: -130.625 = 1100 0011 0000 0010 1010 0000 0000 0000

 

ex3) 0011 1101 0110 1000 0000 0000 0000 0000은 이진수 실수로 몇일까?

ⓐ 정수부 계산: 오른쪽 끝에서부터 23비트를 가져옴

110 1000 0000 0000 0000 0000

정수부 = 1 + 0.110 1000 0000 0000 0000 0000 = 1.1101

ⓑ 2의 지수 계산: 다음 8비트를 가져옴

0111 1010 = 122

2의 지수 = 122 -127 = -5

ⓒ 음수 or 양수: 0이므로 양수

ⓓ 결과: 1.1101 x 2^-5 = 0.000011101

 

2. double: 64비트

- 표현 가능 범위: - 1.79 x 10^308 ~ + 1.79 x 10^308

- 컴퓨터 저장 방식: Double Precision(배정도, 64비트 저장 방식)

- 기본 데이터 타입

 

☑️ 64비트의 구성

- Sign: 1비트

- Exponent(지수부): 11비트

- Fraction(가수부): 52비트


✅ 문자형

- char:  16비트

- 문자 하나 하나 ex) 'a', 'b', '가'

- JAVA에서 유일하게 제공하는 unsigned 형태

+ unsigned: 음수 없이 0부터 양수값만 가지는 데이터 형태

 

✅ 논리형

- boolean: 8비트

- True/False

 


 

🐾  참조타입(Reference Type): 원시 타입을 제외한 타입(배열, 열거, 클래스, 인터페이스) 🐾 

 

문자열(string)

 - 문자의 조합 ex) 'abc', '가나다'

 - stella를 변수에 할당하는데 char을 사용하면

char name1 = '스';
char name2 = '텔';
char name3 = '라';

 => 비효율적이라 나온 것이 string

 

 


조건문: if

📌선언 방법 

 

if(조건){
system.out.println(조건을 충족했을 때 실행시킬 코드)’ }


📌 
Example1. boolean

 

boolean button = T ;

if(button==T){
”불이 켜졌습니다”;
}else{”불이 꺼졌습니다";
}

 

else를 실행하지 않는 경우 중괄호 없이 실행코드를 작성할 수 있음

 

if(button==T)”불이 켜졌습니다";

 

📌 Example2. int

 

int select = 1 ;

if(select==1){
(“1번 입니다”);
} else if(select==2){
“2번 입니다”;
}else if(select==3){
“3번 입니다”;
}else{
“1, 2, 3 어느 것도 아닙니다”;
}

 

 

* 원시 타입과 참조 타입의 차이 *

1. Null 포함 가능 여부: 원시 타입은 null 담을 수 X 참조 타입은 가능

2. 제너릭 타입에서의 사용 가능 여부: 원시 타입은 제너릭 타입에서 사용 X, 참조  타입은 가능

 

* 원시 타입의 장점 *

1. 접근 속도

- 원시 타입은 스택 메모리에 값이 존재

- 참조 타입은 하나의 인스턴스(실행 중인 임의의 프로세스)로 스택 메모리에는 참조값만 있고 실제 값은 힙 메모리에 존재, 값이 필요할 때마다 언박싱 과정(힙에 저장된 참조형식을 다시 원래의 값 형식으로 변환)을 거쳐야해 원시 타입과 비교해 접근 속도가 느려짐

2. 메모리 양

- 참조 타입이 사용하는 메모리양이 압도적으로 높기 때문에 메모리 사용적으로 원시 타입이 참조 타입보다 효율적으로 사용 가능