본문 바로가기
멀티캠퍼스 풀스택 과정/Java의 정석

자바의 정석1-2 변수, 기본형과 참조형

by 이쟝 2021. 12. 28.

변수(Variable)란? 

하나의 값을 저장할 수 있는 메모리 공간

 

변수의 선언

 

변수의 선언 이유
값(data)을 저장할 공간을 마련하기 위해서 
변수의 선언 방법:
변수 타임 변수 이름; (int age;) -> 정수(int) 타입의 변수 age 선언

 


변수에 값 저장하기

int age; // 정수(int) 타입의 변수 age를 선언

age = 25; // 변수 age 25를 저장

 

변수의 초기화 변수에 처음으로 값을 저장하는 것

int x = 0;  // 변수 x를 선언 후, 0으로 초기화

int y = 5;  // 변수 y를 선언 후, 5로 초기화

-> int x = 0, int y = 5;  //위의 두줄을 한 줄로

 

- 변수의 종류: 클래스 변수, 인스턴스 변수, 지역 변수(읽기 전에 반드시 초기화해줘야 함)

 

변수의 값 읽어 오기

- 변수의 값이 필요한 곳에 변수의 이름을 적는다.

int year = 0, age = 14;

year = age + 2000; -> year = 14 + 2000 -> year = 2014;

age = age + 1; -> 변수의 값을 1 증가시키는 방법

 

package ch01;

public class VarEx1 {

	public static void main(String[] args) {
		int x= 4, y=2;
		System.out.println(x+y);
		System.out.println(x-y);
		System.out.println(x*y);
		System.out.println(x/y);
	}
}

변수의 타입

1) 변수의 타입은 저장할 값의 타입에 의해 결정된다.

2) 저장할 값의 타입과 일치하는 타입으로 변수를 선언한다.

char ch = ‘’; // char는 문자 타입

double pi = 3.14; // double은 실수 타입

 

값의 타입

기본형과 참조형

1) 기본형(Primitive type)

문자: char

숫자: 정수(byte, short, int, long) / 실수(float, double)

논리: Boolean(true, false)

- 실제 값을 저장

 

2) 참조형(Reference type)

- 기본형을 제외한 나머지(String, System )

- 무한대

- 메모리 주소를 저장(4 byte 또는 8 byte)

Date today; // 참조형 변수 today를 선언

today = new Date( ); // 객체를 생성하고 today에 객체의 주소를 저장


기본형(Primitive type)

1) 논리형(Boolean): true와 false 중 하나의 값으로 갖으며, 조건식과 논리적 계산에 사용된다.

2) 문자형(char): 문자를 저장하는 데 사용되며, 변수 당 하나의 문자만을 저장할 수 있다.

3) 정수형: 정수 값을 저장하는 데 사용된다. 주로 사용하는 것은 intlong(아주 큰 정수)이며, byte는 이진 데이터를 다루는 데 사용되며, short c언어와의 호환을 위해 추가되었다.(잘 안 씀)

4) 실수: 실수 값을 저장하는 데 사용된다. floatdouble이 있다.

 

종류와 크기 1(byte) 2(byte) 4(byte) 8(byte)
논리형 Boolean      
문자형   char    
정수형 byte short int(default) long
실수형     float double(default)

-> 1 bit = 2진수(01, 2) / 2 bit = 4(00, 01, 10, 11)

-> 1 byte = 8bit = 2의8 제곱

-> 2 byte = 16bit = 2의 16 제곱


기본형의 표현 범위

byte의 표현 범위

-> 1 bit 2(01) -> 2 bit 4(00, 01, 10, 11)

예)byte인 경우(1byte = 8bit)

n비트로 표현할 수 있는 값의 개수: 2의 n제곱 개 -> 1 byte는 8bit ->   2의 8 제곱 => 256개

n비트로 표현할 수 있는 부호 없는 정수의 범위: 0 ~ 2n제곱-1=> 0 ~ 255

n비트로 표현할 수 있는 부호 있는 정수의 범위: -2의 n-1제곱 ~ 2의 n-1제곱 -1

type의 크기만 알고 있으면 각 정수의 범위를 쉽게 계산할 수 있음

ex) 1 byte = 8 bit이어서 n = 8

-> 부호 없는 byte의 범위 -> 0 ~ 255 / 부호 있는 byte의 범위 -> -128 ~ 127


byte의 표현범위

S는 부호 비트라고 하고 1bit이다.  0은 양수 1은 음수를 나타낸다. 

short의 표현범위

 

chr의 표현 범위

-> 같은 2byte(16bit)라도 short는 부호가 있어서 표현 범위가 다름!

int의 표현 범위

 

  • int -> 4bytes -> 32bits -> 2^32 -1 (0이 있어서) : 32개의 비트공간으로 표현할 수 있는 숫자의 최대값은 2^32-1
  • 정수는 양의 정수, 음의 정수가 있기 때문에 맨 앞의 한 칸은 +, - 사인으로 쓰기로 함 
  • 음의 정수 -> -2^31 (0은 굳이 표현하지 않는다.)  / 양의 정수 -> 2^31-1
  • 정수를 표현할 수 있는 값의 범위 약 -20억 ~ 20억

 

long의 표현 범위

 

자료형 저장 가능한 값의 범위 정밀도(오차없는 자리수) 크기
bit byte
float 1.4E-45 ~ 3.4E38 7자리 32 4
double 4.9E-324 ~ 1.8E308 15자리 64 8

float의 표현 범위

-> 같은 크기의 정수형인 int와 달리 float 타입은 값을 부호, 지수, 가수로 나눠서 저장되기 때문에 범위는 더 넓어지지만, 대신 실수형은 원래 저장하려던 값과 저장된 값의 오차가 생길 수 있음

 

double의 표현 범위

 

변수, 상수, 리터럴

변수: 하나의 값을 저장하기 위한 공간

상수(constant): 한 번만 값을 저장 가능한 변수

리터럴(literal): 그 자체로 값을 의미하는 것(=기존의 상수)

int score = 100;

score = 200;

final int MAX = 100; //MAX는 상수

MAX = 200; // 에러

char ch = ‘A’;

String str = “abc”;


리터럴의 접두사와 접미사 

 

종류 리터럴 접미사(대소문자 구별 xx)
논리형 false, true 없음
정수형 123, 0b0101, 077, 0xFF, 100L L(long 타입)
실수형 3.14, 3.0e8, 1.4f. 0x1.0p-1 f(float), d(double 생략가능)
문자형 ‘A’, ‘1’, ‘\n’(개행문자) 없음
문자열 “ABC”, “123”, “A”, “true” 없음

Boolean power = true;

char ch = ‘A’,

String str = “ABC”;

 

int i = 100;  // 10진수

int oct = 0100; //8진수

int hex = 0x100; //16진수

int binary = 0b0101 //2진수

-> 접두사도 대소문자 구별 xx

 

long l = 10_000_000_000L;  // 100-> 20억이 넘는 값은 long타입에 넣어 줌

long l = 100; // OK

float f = 3.14f; //생략 불가

double d = 3.14d; //d 생략 가능

 

10. -> 10.0 / .10 -> 0.10 è 둘 다 double (d가 생략되어 있음)

10f -> 10.0f è float

le3 // 기호 e는 10n제곱을 의미 -> 기호 e는 실수형에 사용됨 -> 10의 3 제곱에 실수형인데 접미사 생략 -> double1000.0


변수와 리터럴의 타입 불일치

1) 범위가 변수 > 리터럴인 경우 OK

int i = ‘A’; ->A의 문자코드인 65가 저장됨  // int > char

long l = 123;  // long > int

double d = 3.14f; // double > float

2) 범위가 변수 < 리터럴인 경우 ERROR

int i = 30_000_000_000; //int의 범위(20억 벗어남)

long l = 3.14f // long < float

float f = 3.14; // float < double

3) byte, short 변수에 int리터럴 저장 가능(단 변수의 타입의 범위 이내이어야 함

byte b = 100; //OK. byte의 범위(-123~127)에 속함

byte b = 128; //에러. byte의 범위를 벗어남

 


문자와 문자열

char ch = ‘A’;  char ch = ‘AB’; //에러   String s = “ABC”;

String class!

String s1 = “AB”; String s2 = new String(“AB”); //두 식이 같음

String s = “A”; // OK , String s =””; //빈 문자열도  ok(empty string)

char ch= “”; //에러

String s1 = “A” + “B”; //AB

숫자를 문자열로 변환하는 방법 “” + 7 -> “” + “7” -> “7”

문자열 결합은 왼쪽에서 오른쪽으로

문자열 + any type -> 문자열 / any type + 문자열 -> 문자열


두 변수의 값 교환하기

int x = 10, y = 20;

int = tmp; //빈 변수인 tmp 선언

tmp = x;  // x의 값을 tmp에 저장

x = y; // y의 값을 x에 저장

y = tmp; // tmp의 값을 y에 저장