변수 - 정의

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



변수 - 선언

  • 변수를 사용하려면 먼저 변수를 선언해야 함

  • 변수타입 변수이름;

  • 타입이 같은 경우 ‘,(콤마)’를 구분자로 여러 변수를 한 줄에 선언할 수 있음

int age;
int a, b;



변수 - 초기화

  • 변수를 선언한 이후부터는 변수를 사용할 수 있으나, 그 전에 반드시 변수를 ‘초기화(initialization)’ 해야함

    • 메모리는 여러 프로그램이 공유하는 자원이므로 전의 다른 프로그램에 의해 저장된 ‘알 수 없는 값(쓰레기 값; garbage value)’이 남아있을 수 있기 때문
  • 변수의 초기화란, 변수를 사용하기 전에 처음으로 값을 저장하는 것

  • 변수의 값을 저장할 때는 대입 연산자 ‘=’를 이용

  • 변수 = 값;

  • 선언과 마찬가지로 타입이 같은 경우 ‘,(콤마)’를 구분자로 여러 변수를 한 줄에 선언할 수 있음

  • 변수 선언과 동시에 초기화할 수 있음

// 위에서 변수 int age; 선언
age = 25;
int c = 2, d = 1;



변수 - 명명규칙

  • 대소문자가 구분되며 길이에 제한이 없음

    • Sunny와 sunny는 서로 다른 것으로 간주

    • 예약어를 사용해서는 안 됨

    • true는 예약어라서 사용할 수 없지만, True는 사용할 수 있음

  • 예약어

    • keyword 또는 reserved word라고 하는데 프로그래밍 언어의 구문으로 사용되는 단어

    • Java의 예약어 예) abstract, boolean, break, byte, case, catch, class, const …

  • 숫자로 시작해서는 안 됨

    • Sunny25은 허용되지만 25Sunny는 비허용
  • 특수문자는 ‘_‘와 ‘$’만 허용

    • $Sunny는 허용되지만, S$unny는 비허용
  • 자바 프로그래머에게 권장하는 규칙(암묵적인 규칙)

    • 클래스의 이름의 첫 글자는 항상 대문자로 할 것

    • 변수와 메서드의 이름의 첫 글자는 항상 소문자로 할 것

    • 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 할 것 (lastIndexOf, StringBuffer)

    • 상수의 이름은 모두 대문자로 하고, 여러 단어일 경우 ‘_‘로 구분할 것 (PI, MAX_NUMBER)

규칙은 아니지만)

변수의 이름은 짧을수록 좋지만 약간 길더라도 용도를 알기 쉽게 ‘의미있는 이름’으로 하는 것이 바람직하고,

변수의 선언문에 주석으로 변수에 대한 정보를 주는 것도 좋은 생각

int curPos = 0;     // 현재 위치(current position)
int lastPost = -1;   // 마지막 위치(last position)



변수 - 타입 : 기본형

  • 실제 값(data)을 저장 → Java의 실제 연산에 사용되는 것은 모두 기본형 변수

  • 모두 8개 - 계산을 위한 실제 값을 저장

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

  • boolean : 논리형

    • 조건식과 논리적 계산에 사용

    • 8bit / 1byte

    • false, true

  • char : 문자형

    • (한 개의) 문자를 저장하는데 사용

    • 16bit / 2byte

    • ’\u0000’ ~ ‘\uffff’ (0~2^16-1, 0 ~ 65535)

  • byte : 정수형

    • 정수를 저장하는데 사용 - 이진 데이터

    • 8bit / 1byte

    • -128 ~ 127 (-2^7 ~ 2^7-1)

  • short : 정수형

    • 정수를 저장하는데 사용 - C언어와의 호환

    • 16bit / 2byte

    • -32,768 ~ 32,767 (-2^15 ~ 2^15-1)

  • int : 정수형

    • 정수를 저장하는데 사용 - 주로 사용됨

    • 32bit / 4byte

    • -2,147,483,648 ~ 2,147,483,647 (-2^31 ~ 2^31-1, 약 ±21억)

  • long : 정수형

    • 정수를 저장하는데 사용

    • 64bit / 8byte

    • -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (-2^63 ~ 2^63-1)

  • float : 실수형

    • 실수를 저장하는데 사용

    • 32bit / 4byte

    • 1.5E-45 ~ 3.4E38 (1.410^-45 ~ 3.410^38) || 정밀도 7자리

  • double : 실수형

    • 실수를 저장하는데 사용 - 주로 사용됨

    • 64bit / 8byte

    • 4.9E-324 ~ 1.8E308(4.910^-324 ~ 1.810^308) || 정밀도 15자리



변수 - 타입 : 참조형

  • 주소(memory address) 값을 저장 (null 또는 주소 값을 가질 수 있음)

  • 8개의 기본형을 제외한 나머지 타입 - 객체의 주소를 저장

    • 변수의 타입이 기본형이 아닌 것들은 모두 참조변수
  • 참조 변수 선언

  • 클래스이름 변수이름;

Date today = new Date(); // Date 객체를 생성하여 today에 저장



상수(constant) - 정의

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

  • 상수 : 값을 한번만 저장할 수 있는 공간

    • 상수는 리터럴에 ‘의미있는 이름’을 붙여 코드의 이해와 수정을 쉽게 만듦

    • 값을 변경할 때도 여러 곳을 수정할 필요 없이 상수 초기화 값만 변경하면 됨

  • 리터럴 : 그 자체로 값을 의미하는 것



상수 - 선언

  • 변수와 동일하며, 변수의 타입 앞에 키워드 ‘final’을 붙여주면 됨

  • 선언과 동시에 초기화하는 것이 좋으며, 그 후부터는 상수의 값을 변경하는 것이 허용되지 않음

  • 암묵적인 관례로, 모두 대문자를 사용하며 여러 단어로 이루어진 경우 ‘_‘로 구분

  • final 변수타입 변수이름 = 값;

final int SUNNY_AVG = 10; // 상수 SUNNY_AVG를 선언하고 10으로 초기화



리터럴(literal) - 정의

  • 수학에서 말하는 ‘상수’

    • 예) 12, 123, 3.14, ‘A’
  • Java에서는 상수를 다른 개념으로 사용하기 때문에 ‘상수’ 대신 리터럴이라는 용어를 사용



리터럴(literal) - 타입(종류)

종류 리터럴 접미사
논리형 false, true 없음
정수형 123, 0b0101, 077, 0xFF, 100L l, L
실수형 3.14, 3.0e8, 1.4f, 0x1, 0p-1 f, d
문자형 ‘A’, ‘1’, ‘\n’ 없음
문자열 “ABC”, “123”, “A”, “true” 없음



리터럴(literal) - 타입과 접두/미사(정수형)

  • short, byte : int타입의 리터럴 사용

  • int : 접미사 없음

  • long : 접미사 ‘l’ or ‘L’ (소문자 l은 1이랑 헷깔리므로 L 사용 권장)

    • 정수형 리터럴 중간에 구분자’_‘를 넣을 수 있게 됨 (JDK 1.7 ~)

    • long a = 1000000L; → long a = 1_000_000L;

    • 큰 숫자를 구분하기 편하게 (위의 선언은 동일함)

  • 2진 리터럴

    • 2진수 - 접두사 ‘0b’ or ‘0B’ (예) 0b10 → 2진수 10 → 10진수로 2

    • 8진수 - 접두사 ‘0’ (예) 010 → 8진수 10 → 10진수로 8

    • 10진수 - 생략

    • 16진수 - 접두사 ‘0x’ or ‘0X’ (예) 0x10; → 16진수 10 → 10진수로 16



리터럴(literal) - 타입과 접두/미사(실수형)

  • float : 접미사 ‘f’ or ‘F’

  • double : 접미사 ‘d’ or ‘D’, 생략 가능(int처럼)

  • 실수형 리터럴과 다른 형태의 동등한 표현

자료형 실수형 리터럴 다른 형태의 동등한 표현
float 10f 10.0f
float 3.14e3f 3140.0f
double 10. 10.0
double .10 0.10
double 1e1 10.0
double 1e-3 0.001
  • 기호 p를 이용한 16진 지수 형태의 표현

    • p는 2의 제곱을 의미

    • p의 왼쪽에는 16진수를 적고 오른쪽에는 지수를 10진수로 적음

    • p는 대/소문자 모두 사용 가능 (p, P)

    • p가 포함된 리터럴은 실수형

    • 예시
      0x1p1 = (1 * 16^0) * 2^1 = 1.0 * 2 = 2.0
      0x0.2p-1 = (2 * 16^-1) * 2^-1 = 0.125 * 0.5 = 0.0625
      0x12p3 = (1 * 16^1 + 2 * 16^0) * 2^3 = (16+2) * 8 = 144.0



리터럴(literal) - 타입(문자형)

  • 작은 따옴표 ‘로 문자 하나를 감싼 것 (예) ‘A’

  • char Type의 변수



리터럴(literal) - 타입(문자열형)

  • 큰 따옴표로 “문자열을 감싼 것 (예) “”, “A”, “AB”

  • empty String (“”) 허용

  • 문자열 리터럴은 무슨 타입을 더하던 문자열로 반환

  • 문자열 + any type → 문자열 + 문자열 → 문자열

  • any type + 문자열 → 문자열 + 문자열 → 문자열

  • 예시

    • 7 + “ “ → “7” + “ “ → “7 “

    • ” “ + 7 → “ “ + “7” → “ 7”

    • 7 + 7 + “” → 14 + “” → “14” + “” → 14

    • ”” + 7 + 7 → “7” + 7 → “7” + “7” → “77”

    • true + “” → “true” + “” → “true”

    • null + “” → “null” + “” → “null”



타입의 불일치

  • 리터럴의 값이 변수의 타입의 범위를 넘어서면 컴파일 에러 발생

    • 예) int의 리터럴인 11111111값을 byte 타입의 변수에 저장할 수 없음
  • 리터럴의 타입이 변수의 타입보다 저장범위가 넓으면 컴파일 에러 발생

    • 예) double 리터럴인 3.14를 float 타입의 변수에 저장할 수 없음
  • 해결방법 → 형변환