본문 바로가기
Language/Java

[Java] 변수(Variable)와 자료형(Data type)

by jaee_ 2021. 7. 18.

자바에서의 변수(Variable)

변수란?

내용을 어딘가에 담아두어야 할 때 사용되는 것을 "변수(variable)"라고 부른다.

 

변수의 종류

  • 지역 변수 local variables : 중괄호 내에서 선언된 변수
  • 매개 변수 parameters :  메소드에 넘겨주는 변수
  • 인스턴스 변수 instance variables : - 메소드 밖에 , 클래스 안에 선언된 변수. 앞에는 static이라는 예약어가 없어야 한다.
  • 클래스 변수 class variables : 인스턴스 변수처럼 메소드 밖에, 클래스 안에 선언된 변수 중에서 타입선언 앞에 static이라는 예약어가 있는 변수
public class VariableTypes{
    int instanceVariable;
    static int classVariable;

    public static void main(String[] parameter) {
        int localVariable;
    }

}

위의 코드에서 instanceVariable는 인스턴스 변수다.

타입선언 앞에 static가 붙어있는 classVariable은 클래스 변수이다.

main메소드명 옆에 매개변수자리에 있는 parameter는 매개변수, main메소드 안에 선언되어있는 변수 localVariable은 지역변수이다.

각 변수는 생명주기가 다르기 때문에 이름을 다르게 부르는 것이다. 각 변수의 생명주기를 정리해보자.

  • 지역 변수 : 지역변수를 선언한 중괄호 내에서만 유효하다. {} 내에서만 유효
  • 매개 변수 : 메소드가 호출될 때 생명이 시작되고, 메소드가 끝나면 소멸된다.
  • 인스턴스 변수 : 객체가 생성될 때 생명이 시작되고, 그 객체를 참조하고 있는 다른 객체가 없으면 소멸된다.
  • 클래스 변수 : 클래스가 처음 호출될 때 생명이 시작되고, 자바 프로그램이 끝났을 때 소멸된다.

왜 이렇게 복잡하게 변수의 종류를 나눈걸까? 정답은 각각의 용도가 다르기 때문이다.

참고 C++이나 C언어에서는 할당한 변수에 어떤 값을 지정했으면 개발자가 "이제 더이상 필요 없어"라고 지정할 수 있다. 그러면 바로 메모리에서 사라진다. 하지만 자바는 개발자가 임의로 "이제 필요없어요 지워주세요"를 할 수가 없다. 왜냐면 자바는 가비지 콜렉터(Garbage collector)라는 것이 때가 되면 알아서 메모리를 청소해주기 때문이다. 자세한 내용은 추후에 다시 정리해보겠다.

 

변수 명명규칙

변수는 명명규칙이 있다. 기본적인 규칙은 아래와 같다.

  1. 길이의 제한은 없다.
  2. 첫 문자는 유니코드 문자, 알파벳, $, _(언더코드), 만 올 수 있다. 하지만 보통 $나_는 사용하지 않는다.
  3. 두번째 문자부터는 유니코드 문자, 알파벳, 숫자, $,_ 중 아무거나 사용할 수 있다.
  4. 보통은 메소드 이름처럼 지정해서 사용하면 된다. 첫 문자는 소문자로 시작하는 단어이고, 두번째 단어의 첫 문자만 대문자로 시작하면 된다.
  5. 상수의 경우에는 모두 대문자로 지정하며, 단어와 단어 사이에는 _로 구분한다.

(상수는 절대 변하지 않는 값을 이야기한다. 따라서 계속해서 변하는 일반적인 변수에는 _를 붙이지 않는게 좋다.)

 

 

자바의 자료형(Data type)

  • 기본 자료형 Primitive data type
  • 참조 자료형 Reference data type

참조 자료형은 내 마음대로 만들 수 있지만 기본 자료형은 정해져 있다. 참조 자료형은 new라는 예약어를 사용해 초기화를 해야하지만 기본 자료형은 바로 값을 입력해 초기화가 가능하다.

초기화란? 어떤 변수든 값을 저장하기 위해서 만든다. 저장할 값이 정해져 있다면, 그 값을 지정해주면 되겠지만, 항상 저장할 값이 정해져 있지는 않다. 그래서, 변수를 선언할 때에는 초기화를 해 줘야 변수가 사용할 수 있는 상황이 된다고 할 수 있다.

위에서 기본 자료형은 정해져있다고 말했다. 그렇다면 기본 자료형은 어떤 것들이 있을까?

위의 그림에 나와있듯이 기본자료형은 총 8개로 나열해보면 아래와 같다.

  • 정수형 : byte, short, int , long
  • 실수형 : float, double
  • 논리형 : boolean
  • 문자형 : char

정수형과 실수형은 범위가 정해져 있다. 아래의 그림을 참고하여 해당하는 참조형의 범위를 알아보자.

일반적인 웹 어플리케이션에서는 intlong을 많이 쓴다. 보통은 int를 많이 사용하지만 int로 표현되기에 부족한 부분은 long을 사용한다. long을 사용하는 경우 선언할 때 L을 붙여 주는 것이 좋다. 붙이지 않을 경우 int로 인식되기 때문이다.

 

소수점 처리방식

floatdouble은 모두 소수점을 처리하기 위해서 사용된다. float는 32비트 double은 64비트로 표현된다. 이 두가지 소수점은 간단한 계산에서는 사용해도 무방하지만, 돈 계산과 같이 중요한 부분에서는 이 타입들을 사용해선 안된다.

왜냐하면, floatdouble은 32비트와 64비트로 제공할 수 있는 범위를 넘어서면 그 값의 정확성을 보장하지 않는다. 때문에 자바에서는 돈 계산과 같이 정확한 계산이 요구될 때 BigDecimal이라는 클래스를 사용해야만 한다.

 

char에 대해서

char는 캐릭터character라고 읽는다. char의 범위는 0~65,535이다. 정수형으로 속하기도 하는 문자형 char는 int보다 좁은 범위에 속해있다. 때문에 아래의 코드를 실행했을 때 형변환이 가능해야 한다. 형변환에 대해서는 상속을 정리한 내용을 참고하기 바란다.

public class PrimitiveTypes{

    public static void main(String[] args){
        PrimitiveTypes types = new PrimitiveTypes();
        types.checkChar();
    }

    public void checkOtherTypes(){
        short shortMax = 32767;
        int intMax = 2147483647;
        long longMax = 9223372036854775807L;
    }    
    public void checkChar(){
        char charMin = '\u0000';
        char charMax = '\uffff';
        System.out.println("charMin=["+charMin+"]");
        System.out.println("charMax=["+charMax+"]");
        int intValue = 'a';
        System.out.println("intValue = ["+intValue+"]");
    }
}

위 코드의 결과값은 아래와 같이 나온다.

charMin=[ ] //(1)
charMax=[?] 
intValue = [97] //(2)

(1) \u0000은 16진수로 \u뒤에 16진수의 수를 붙인 것이다. 아무것도 출력이 안된 것 처럼 보이지만 사실은 빈 공백이 출력된 것이다.

(2) a를 입력했는데 값이 97이 나오는 이유는 ASCII코드의 코드번호 97이 a이기 때문이다.

 

 

 

출처 : 자바의 신

댓글