자바 변수

2025. 2. 17. 18:35Java/Java 문법

0. 변수, 리터럴, 상수

  • 변수: 데이터를 저장하기 위해 할당 받은 메모리 공간, 수정 가능
  • 리터럴: 프로그래머에 의해 직접 입력된 값, 변수에 저장하는 고정된 값 (등호 오른쪽에 있는 값)
  • 상수: 값을 한 번만 저장할 수 있는 공간, 수정 불가 (키워드 'final' 사용하여 정의, 나중에 값 수정하면 에러)
int age = 20;                // age라는 int 변수(메모리 공간)에 20이라는 리터럴이 저장됨
String str = "java"          // str이라는 String 변수(메모리 공간)에 "text"라는 리터럴이 저장됨 
final int MAX_AGE = 100;     // MAX_AGE라는 int 상수(값이 변하지 않는 메모리 공간)에 100이 저장됨

 

1. 변수

1-1. 변수란?

  • 변수
    • 값을 저장할 수 있는 메모리의 특정 번지(주소)에 붙이는 이름 
    • 컴퓨터 메모리(RAM)는 값을 저잘할 수 있는 수많은 주소들로 구성되어있다. 그런데 메모리를 어디에 저장하고, 어떤 방식으로 저장할지 정해놓지 않으면 개발이 어려워진다. 이를 해결하기 위해 메모리 주소에 이름을 붙이고 값을 저장하는 변수라는 개념을 사용한다.  
    • 자바의 변수는 다양한 타입의 값을 저장할 수 있는데, 하나의 타입에 하나의 값만 저장할 수 있다. 
  • 변수 사용 이유
    • 값에 의미를 부여하기 위한 목적 (int salary = 1000000;)
    • 한번 저장해둔 값을 재사용하기 위한 목적 (여러 군데에 사용된 변수의 값이 변하면 한번에 변경할 수 있다)
    • 흐름에 따라 변하는 값을 저장하고 사용하기 위한 목적 

1-2. 변수 선언

int age; 	//정수 int를 저장할 수 있는 age라는 이름의 변수 선언
age = 10; 	//값 저장
  • 변수를 사용하기 위해서는 변수를 선언하고, 값을 저장하면 된다. 
  • 변수 선언은 변수에 어떤 타입(자료형)의 데이터를 저장할 것인지, 그리고 변수 이름이 무엇인지를 결정한다. 
  • 필수적 변수 명명 규칙 (컴파일 에러 발생)  
    • 동일한 범위 내에서 동일한 변수명을 가질 수 없다
    • 변수의 이름에는 자바에서 사용중인 키워드(keyword)를 사용할 수 없다. (int, float, while, continue 등)
    • 변수의 이름은 영문자 대소문자를 구분한다 (age와 Age는 다르다)
    • 변수의 이름은 숫자로 시작할 수 없다. (123abc 사용불가)
    • 특수기호는 '-'와 '$'만 사용 가능하다. 
  • 선택적 변수 명명 규칙 (암묵적인 룰) 
    • 변수명의 길이 제한은 없다. (하지만 적당히 해야 한다)
    • camel-case: 변수명이 합성어로 이루어진 경우 첫 단어는 소문자, 두 번째 시작 단어는 대문자로 시작한다. (memberAddress)
    • 단어와 단어 사이의 연결을 언더스코어( _ )로 하지 않는다. (타 언어 네이밍 규칙이다.)
    • 한글로 변수명을 짓는 것이 가능하지만, 권장하지 않는다. (한글을 취급하는 다양한 방식들이 존재하기 때문에 에러를 유발할 수 있다.)
    • 변수 안에 저장된 값이 어떤 의미를 가지는지 명확하게 표현하도록 한다.
    • 전형적인 변수 이름이 있다면 가급적 사용하도록 한다.
    • 명사형으로 작성할 수 있도록 한다.
    • boolean 형은 의문문으로 가급적 긍정 형태로 네이밍한다.

1-3. 값 저장 (변수 초기화) 

int score;	//변수 선언 (변수 생성되지 않음)
score = 90; 	//오른쪽의 값을 왼쪽의 변수에 저장 (변수 생성됨)

int score2 = 100;	//선언과 초기화 동시에
  • 변수의 값을 저장할 때는 대입 연산자 = 를 사용한다. 
  • 대입 연산자 오른쪽의 값(리터럴)을 왼쪽의 변수에 저장한다는 의미를 갖는다.   
  • 변수에 값을 대입할 때는 대입하는 값의 리터럴 형태와 선언된 자료형이 일치해야 한다.
  • 변수 초기화
    • 변수를 선언만 했을 경우에는 값이 저장되지 않으며, 변수가 생성되지 않는다. 
    • 변수 초기화: 변수가 선언된 후 최초로 값이 저장될 때 변수가 생성되는 것.
    • 초기값: 변수 초기화에 사용된 값
    • 변수가 초기화 되면 메모리 값에 번지 정보를 갖게 되고, 해당 메모리 번지에 값이 저장된다. 

1-4. 변수 사용

int salary = 1000000;
int bonus = 200000;
System.out.println("보너스 : " + bonus + "원");
System.out.println("보너스를 포함한 급여 : " + (salary + bonus) + "원");
  • 변수의 값을 읽거나 변경하는 것. 
  • 변수는 출력문이나 연산식 내부에서 변수에 저장된 값을 출력하거나 연산할 때 사용한다. 
  • 변수 사용 범위
    • 자바의 모든 변수는 중괄호 {} 블록 내에서 선언되고 사용된다.  
    • 변수는 기본적으로 자신이 선언된 블록 내에서만 사용할 수 있다. 
    • 로컬변수: 메소드 블록 내에서 선언된 변수. 메소드 실행이 끝나면 메모리에서 사라진다. 
    • 따라서 변수가 어떤 범위에서 사용될 것인지 생각하고 선언 위치를 결정해야한다.  

 

2. 변수의 데이터 타입 (자료형)

2-1. 데이터 타입

  • 데이터 타입: 변수에 저장할 값의 크기와 저장 방식을 결정하는 요소
  • 데이터 타입은 크게 기본형과 참조형으로 나누어진다 

2-2. 데이터 타입의 종류

  기본형 (Primitive Type) 참조형 (Reference Type)
저장방식 실제 값을 저장 객체의 주소값을 저장
메모리 위치 스택 (Stack) 힙 (Heap)
종류  논리형, 문자형, 정수형, 실수형 타입 기본형을 제외한 나머지 타입
String, 배열(Array), 클래스(Class), 인터페이스(Interface)

 

2-3. 기본 타입의 종류 

구분 자료형  크기 설명  기본값
논리형  boolean 1 true or false false
문자형  char 2 한 글자 저장 (유니코드 사용) '\u0000'
숫자-정수형 byte 1 -128 ~ 127 (8비트) 0
  short 2 -32,768 ~ 32,767 (16비트)
  int 4 약 -21억 ~ 21억 (기본 정수형)
  long 8 아주 큰 정수 저장 (끝에 L 붙여 사용)
숫자-실수형 float 4 7자리 정도의 소수 저장 (끝에 F 붙여 사용) 0.0
  double 8 15~16자리 정도의 소수 저장 (기본 실수형)

 

1) 논리형  - boolean

  • 논리 리터럴: 참과 거짓을 의미하는 true 또는 false를 저장
  • 조건문과 제어문의 실행흐름을 변경하는데 주로 사용된다
  • 다른 자료형으로 변환 불가

2) 문자형 - char

  • 문자 리터럴
    • 하나의 문자를 작은따옴표(' ')로 감싼 것
    • 유니코드로 변환되어 부호없는 정수의 형태로 저장된다 ('A' -> 65)
    • 유니코드: 세계 각국의 문자를 2바이트로 표현할 수 있는 숫자로 매핑한 국제 표준규약 (0~65535)
  • 문자 리터럴을 int 타입에 저장하는 경우 정수의 형태로 출력된다 

 

3) 정수형 - byte, short, int, long

  • 정수 리터럴: 2진수, 8진수, 10진수, 16진수 
  • 정수 리터럴의 접미사
    • 정수 리터럴 기본값은 int, 접미사 안 붙여도 됨
    • long: 대문자 L (단, long 변수의 정수 리터럴이 int 타입 범위 이내라면 안 붙여도 됨)
    • 십진수: 숫자 그대로, 이진수: 0b, 8진수: 0, 16진수: 0x 
  • n비트로 표현할 수 있는 정수의 개수: 2^n
  • n비트로 표현할 수 있는 부호있는 정수의 범위: 2^(n-1) ~ 2^(n-1)-1
  • 자바에서 모든 정수형은 부호있는 정수이므로 왼쪽의 첫번째 비트를 '부호 비트'로 사용한다.  
  • overflow, underflow    
    • overflow : 데이터 타입이 저장할 수 있는 범위를 넘어서면 최솟값부터 다시 시작하게 된다. 
    • underflow : 반대로 최솟값보다 작아지면 최댓값부터 다시 시작하게 된다. 

 

4) 실수형 - float, double

  • 실수 리터럴
    • 실수를 저장할 수 있는 타입으로 float과 double 타입이 있다
    • double 타입이 float 타입 보다 2배 정도 정밀도가 높기 때문에 좀 더 정확한 데이터 저장이 가능하다. 
    • 메모리 여유가 있고 특별한 이유가 없는 한 실수 리터럴에는 double 타입을 사용하는 것이 좋다. 
  • 실수 리터럴의 접미사 
    • 실수 리터럴의 기본값은 double 타입이고 접미사 안 붙여도 됨
    • float 타입을 쓸 때는 반드시 리터럴 뒤에 f나 F를 붙여서 float 리터럴임을 알려야 컴파일 오류가 나지 않는다.  

 

3. 변수 형변환 (Casting)

 

3-1. 형변환이란? (Casting)

  • 형변환: 값의 타입을 다른 타입으로 변환하는 것
  • 모든 변수와 리터럴에는 타입이 있는데 서로 다른 타입간의 연산을 수행하는 경우 타입을 일치시켜야만 한다.
  • boolean을 제외한 나머지 7개 기본형은 서로 형변환이 가능하다
  • 기본형과 참조형 사이의 변환은 불가
  • 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 자동으로 이루어지므로 생략 가능 (묵시적/자동 형변환)

3-2. 형변환 방법

  • (변환하고자하는타입) 피연산자
  • 형변환하고자하는 변수나 리터럴의 앞에 변환하고자하는 타입을 형변환연산자인 괄호()와함께 붙여주면 된다.
  • 형변환연산자는 그저 피연산자의 값을 읽어서 지정된 타입으로 형변환하고 그 결과를 반환할 뿐이지 실제 변수의 값을 바꾸는것은 아니기 때문에 피연산자의 값은 형변환 후에도 아무런 변화가 없다.

3. 자동 형변환

  • 형변환 종류
    • 묵시적(자동) 형변환: 값의 범위가 작은 타입을 큰 타입으로 변환하는 경우 자동으로 형변환 되므로 생략 가능.
    • 명시적 형변환: 값의 범위가 큰 타입을 작은 타입으로 변환하는 경우 형변환 연산자 () 사용. 값 손실 발생 가능.
  • 자동 형변환의 규칙: 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다. 
  • int형 + float형 연산 -> int형이 float형으로 자동 형변환되어 float + float 연산이 수행된다.