Post

☕ Java Syntax 002 - 변수

☕ Java Syntax 002 - 변수

변수

1
2
3
4
5
6
7
8
9
package variable;

public class Var1 {
    public static void main(String[] args) {
        System.out.println(10); // 변경 10 -> 20
        System.out.println(10); // 변경 10 -> 20
        System.out.println(10); // 변경 10 -> 20
    }
}
  • 패키지는 자바 파일을 구분하기 위한 폴더다.
  • 자바 파일 첫 줄에 package variable;과 같이 소속된 패키지를 선언해야 한다.
  • 위의 예제 코드에서 10을 20으로 바꾸려면 어떻게 해야할까?
    • 10이라고 적혀 있는 곳을 모두 찾아서 20으로 변경한다.
    • 만약 10을 출력하는 부분이 100개라면?
    • 결국 어딘가에 값을 보관해두고 필요할 때 값을 꺼내서 읽을 수 있는 저장소가 필요하다.
    • 이러한 그릇을 변수라고 한다.
    • 변수는 이름 그대로 변할 수 있다는 뜻이다.
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
package variable;

public class Var2 {
	public static void main(String[] args) {
		int a;
		a = 20;
		
		System.out.println(a);
		System.out.println(a);
		System.out.println(a);
	}
}

package variable;

public class Var2 {
	public static void main(String[] args) {
		int a;
		
		a = 10;
		System.out.println(a);
		
		a = 50;
		System.out.println(a);
	}
}
  • 변수를 만드는 것을 변수 선언이라 한다.
    • 변수를 선언하면 컴퓨터의 메모리 공간을 확보해서 그곳에 데이터를 저장한다.
    • 그리고 변수의 이름을 통해 해당 메모리 공간에 접근할 수 있다.
  • 변수에 처음으로 값을 대입해서 저장하는 것을 변수 초기화라 한다.
    • 변수는 초기화 해야 한다.
    • 변수 선언과 변수 초기화는 한 번에 할 수 있다.
  • 여러 변수를 한 번에 선언 및 초기화 할 수 있다.
  • 자바는 실행 시점에 변수의 값을 읽어서 사용한다.
  • 변수의 값은 코드 중간에 변경할 수 있다.

변수를 초기화해야 하는 이유

  • 초기화 하지 않은 변수를 읽는다면 다음과 같은 컴파일 에러가 발생한다.
1
java: variable a might not have been initialized
  • 컴퓨터에서 메모리는 여러 시스템이 함께 사용하는 공간이다.
  • 그래서 어떠한 값들이 계속 저장된다.
  • 변수를 선언하면 메모리 상의 어떤 공간을 차지하고 사용한다.
  • 그런데 그 공간에 기존에 어떤 값이 있었는지는 아무도 모른다.
  • 따라서 초기화를 하지 않으면 이상한 값이 출력될 수 있다.
  • 이를 예방하고자 자바는 변수를 초기화하도록 강제한다.
  • 변수를 선언했으나 초기화하지 않고, 사용하지도 않는다면 컴파일 단계에서 코드 최적화를 위해 모두 정리된다.

참고

  • 지금 학습하는 지역 변수는 개발자가 직접 초기화를 해주어야 한다.
  • 나중에 배울 클래스 변수와 인스턴스 변수는 자바가 자동으로 초기화를 진행해준다.
  • 컴파일 에러는 자바 문법에 맞지 않았을 때 발생하는 에러이다.
  • 오류를 빨리, 그리고 명확하게 찾을 수 있기 때문에 좋은 에러이다.
  • 덕분에 빠르게 버그를 찾아서 고칠 수 있다.
  • 제일 무서운 에러는 런타임 에러이다.
  • 예를 들어 고객이 계좌 이체를 했는데 내 돈은 나갔으나 상대방에게 돈이 안 들어간 경우이다.
  • 그렇기 때문에 프로그램을 작성할 때 컴파일 오류가 많이 발생할 수 있도록 작성하는 것이 중요하다.

변수 타입

  • 타입, 형식, 형 등으로 일컫는다.
  • 정수형
    • ~~byte: -128 ~ 127 (1byte, 2⁸)~~
    • ~~short: -32,768 ~ 32,767 (2byte, 2¹⁶)~~
    • int: -2,147,483,648 ~ 2,147,483,647 (약 20억) (4byte, 2³²)
    • long: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (8byte, 2⁶⁴)
  • 실수형
    • ~~float: 대략 -3.4E38 ~ 3.4E38, 7자리 정밀도 (4byte, 2³²)~~
    • double: 대략 -1.7E308 ~ 1.7E308, 15자리 정밀도(8byte, 2⁶⁴)
  • 기타
    • boolean: true, false (1byte)
    • char: 문자 하나(2byte)를 표현한다. 작은 따옴표로 문자를 감싸야 한다.
    • String: 문자열을 표현한다. 큰 따옴표로 문자열을 감싸야 한다. 메모리 사용량은 문자 길이에 따라 동적으로 달라진다. 첫 글자가 대문자로 시작하는 특별한 타입이다.

심화 포인트

  • 변수: 지역 변수, 인스턴스(멤버) 변수, 클래스 변수(static 키워드 사용)
  • 상수: final을 통해 한 번만 초기화할 수 있는 변수
    • 대문자와 언더스코어(_)를 통해 변수명 작성 권장
    • 값 변경 불가하여 안정성 향상
    • 모든 인스턴스가 동일한 상수를 갖도록 하려면 static final 설정해야함
  • 데이터 타입
    • 기본형(Bytes): boolean(1), int(4), long(8), double(8), char(2)
      • 잘 안 쓰는 기본형: byte(1), short(2), float(4)
      • 크기 순 나열: byteshortcharintlong(8) → float(4) → double
      • longfloat보다 크지만, 예외적으로 실수형이 정수형보다 크다고 간주함
    • 참조형
      • 숫자형 및 부울대수형 제외하고는 모두 참조형에 해당됨
      • Class, int[], ArrayList,
      • Heap Memory 상의 객체 레퍼런스(참조)를 저장
      • 모든 참조 타입의 값(객체)은 Heap Memory 에 생성되고 사용됨

리터럴

  • 코드에서 개발자가 직접 적은 100, 10.5, ‘A’, “Hello Java”와 같은 고정된 값을 프로그래밍 용어로 리터럴(literal)이라 한다.
  • 정수 리터럴, 실수 리터럴, 불리언 리터럴, 문자 리터럴, 문자열 리터럴 등으로 일컫는다.
  • 변수의 값은 변할 수 있지만 리터럴은 개발자가 직접 입력한 고정된 값으로, 변하지 않는다.
  • 정수가 int 범위인 20억을 넘어가면 L을 붙여서 정수 리터럴을 long으로 변경해야 한다.
  • 대문자 L, 소문자 l 모두 가능하지만 소문자는 숫자 1과 착각할 수 있어서 권장하지 않는다.
  • 실수 리터럴은 기본이 double형을 사용하므로 float형을 사용하려면 f를 붙여서 float형으로 지정해야 한다.
  • float를 사용하게 되면 소수점 계산에서 오류가 많이 발생하기에 실무에서 사용하는 경우는 거의 없다.

거의 사용하지 않는 타입

  • byte
    • 표현 길이가 너무 작다.
    • 자바는 기본적으로 4byte(int)를 효율적으로 계산하도록 설계되어 있다.
    • int를 사용하자.
    • 대신 파일을 바이트 단위로 다루기 때문에 파일 전송, 파일 복사 등에 주로 사용된다.
  • short
    • 표현 길이가 너무 작다.
    • 자바는 기본적으로 4byte(int)를 효율적으로 계산하도록 설계되어 있다.
    • int를 사용하자.
  • float
    • 표현 길이와 정밀도가 낮기까지 하므로 위험하다.
    • 실수형은 double을 사용하자.
  • char
    • 문자 하나를 표현하는 일은 거의 없다.
    • 문자 하나를 표현할 때도 문자열을 사용할 수 있으므로 String을 사용하자.
  • 메모리 용량은 매우 저렴하기 때문에 메모리 용량을 약간 절약하기 보다는 개발 속도나 효율에 초점을 맞추는 것이 더 효과적이다.

변수 명명 규칙

  • 자바에서 변수의 이름을 짓는데는 규칙과 관례가 있다.
  • 규칙은 필수이며, 지키지 않으면 컴파일 에러가 발생한다.
  • 관례는 필수는 아니지만 전세계 개발자가 해당 관례를 따르기 때문에 사실상 규칙이라고 생각해도 된다.

규칙

  • 변수 이름은 숫자로 시작할 수 없다.
  • 이름에는 공백이 들어갈 수 없다.
  • 자바의 예약어를 변수 이름으로 사용할 수 없다.
  • 변수 이름에는 영문자, 숫자, $, _만 사용할 수 있다.

관례

  • 소문자로 시작하는 낙타 표기법(Camel Case)을 사용한다.
    • 변수 이름은 소문자로 시작하는 것이 일반적이다.
    • 여러 단어로 이루어진 변수 이름의 경우 첫 번째 단어는 소문자로 시작하고 그 이후의 각 단어는 대문자로 시작하는 낙타 표기법을 사용한다.
  • 클래스명은 대문자로 시작, 나머지는 소문자로 시작한다.
    • 예외 사항
      • 상수는 모두 대문자를 사용하고 언더바(_)로 구분한다.(USER_LIMIT)
      • 패키지는 모두 소문자를 사용한다.(org.spring.boot)
  • 변수명은 의미있고, 그 용도를 명확하게 설명해야 한다.
    • a, b 등과 같은 이름의 변수는 사용하는 것을 지양해야 한다.

체크 포인트

  • 지역 변수 선언 시 스코프 내에서만 유효함
  • 업 캐스팅은 자동 형변환이 불가함
  • 다운 캐스팅 시 오버플로우 또는 값 손실 발생 가능
  • long 타입 초기화 시 L을 숫자 뒤에 붙여야 하며, L이 붙지 않은 정수형 리터럴은 int형으로 간주함
  • float 타입 초기화 시 F를 숫자 뒤에 붙여야 하며, 실수형 리터럴은 double형으로 간주함
  • 메모리 및 디스크 값이 저렴해졌기 때문에 실수형 변수를 다룰 때 float형은 거의 안 쓰고 double 형을 주로 쓴다.
  • 캐스팅은 반드시 같은 종류의 데이터 간에만 가능함
  • DataType 클래스에서 참조형은 다음과 같음
    1. DataType 클래스
    2. String[]
    3. System
    4. out
    5. ", "과 같은 문자형 리터럴
  • 참조형 변수는 .을 통해 해당 인스턴스에 접근이 가능하지만 접근 제어자나 해당 객체가 null일 경우 접근이 불가 할 수도 있음
  • 변수 출력 시 System.out을 통해 스택에서 기본형은 값을, 참조형은 참조 값을 가져옴
This post is licensed under CC BY 4.0 by the author.