[Java] 변수

yejubi1531·2022년 7월 22일
0

JAVA를 잡아보자!

목록 보기
2/5

변수의 명명규칙

  1. 대소문자가 구분되며 길이에 제한이 없다.
  2. 예약어를 사용해서는 안 된다.
    예약어는 'keyword' 또는 'reserved word'라고 하는데, 프로그래밍언어의 구문에 사용되는 언어를 뜻한다. 따라서 예약어는 클래스나 변수, 메서드의 이름으로 상ㅇ할 수 없다.
  3. 숫자로 시작해서는 안 된다.
  4. 특수문자는 '_'와 '$'만을 허용한다.
  • JAVA에서 사용되는 예약어

JAVA 프로그래머들에게 권장하는 규칙

  1. 클래스 이름의 첫 글자는 항상 대문자로 한다.
    -변수와 메서드의 이름의 첫 글자는 항상 소문자로 한다.
  2. 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다.
  3. 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_'로 구분한다.
    -PI, MAX_NUMBER

위의 규칙들은 반드시 지켜야 하는 것은 아니지만, 코드를 보다 이해하기 쉽게 하기 위한 자바 개발자들 사이의 암묵적인 약속이다.

만일 특별한 방식으로 식별자를 작성해야 한다면 미리 규칙(coding convention)을 정해놓고 프로그램 전체에 일관되게 적용하는 것이 필요하다.

  • java에서는 모든 이름에 유니코드에 포함된 문자들을 사용할 수 있지만, 적어도 클래스이름은 ASCII코드(영문자)로 하는 것이 좋다. 유니코드를 인식하지 못하는 OS도 있기 때문이다.

  • 변수의 이름은 짧을수록 좋지만, 약간 길더라도 용도를 알기 쉽게 '의미있는 이름'으로 하는 것이 바람직하다. 변수의 선언문에 주석으로 변수에 대한 정보를 주는 것도 좋은 생각이다.

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

변수의 타입

변수를 선언할 때는 저장하려는 값의 특성을 고려하여 가장 알맞은 자료형을 변수의 타입으로 선택하면 된다.

기본형과 참조형

자료형은 크게 기본형과 참조형 두 가지로 나눌 수 있는데, 기본형 변수실제 값(data)을 저장하는 반면, 참조형 변수는 어떤 값이 저장되어 있는 주소(address)를 값으로 받는다.

  • JAVA는 C언어와 달리 참조형 변수 간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수이다.
  • 메모리에는 1byte 단위로 일련번호가 붙어있는데, 이 번호를 '메모리 주소(memory address)'라 한다. 객체의 주소는 객체가 저장된 메모리 주소를 뜻한다.

기본형(primitive type)

  • 논리형(boolean), 문자형(char), 정수형(byte,short, int, long), 실수형(float, double) 계산을 위한 실제 값을 저장한다. 모두 8개

참조형(reference type)

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

참조형 변수(또는 참조변수)를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 참조변수의 타입이 된다. 그래서 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 셈이다.

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

다음은 Date클래스 타입의 참조변수 today를 선언한 것이다.
참조변수는 null 또는 객체의 주소를 값으로 갖으며 참조변수의 초기화는 다음과 같다.

Date today = new Date(); //Date객체를 생성해서, 그 주소를 today에 저장

객체를 생성하는 연산자 new의 결과는 생성된 객체의 주소이다. 이 주소가 대입연산자 '='에 의해서 참조변수 today에 저장되는 것이다. 이제 참조변수 today를 통해서 생성된 객체를 사용할 수 있게 된다.

|참고| 참조형 변수는 null 또는 객체의 주소(4byte, 0x0~0xFFFFFF)를 값으로 갖는다. null은 어떤 객체의 주소도 저장되어 있지 않음을 뜻한다.
단, JVM이 32bit가 아니라 64bit라면 참조형 변수의 크기는 8byte가 된다.

Q. 자료형(data type)과 타입(type)의 차이

A. 기본형은 저장할 값(data)의 종류에 따라 구분되므로 기본형의 종류를 얘기할 때는 '자료형'이라는 용어를 사용한다. 참조형은 항상 '객체의 주소'를 저장하므로, 객체의 종류에 의해 구분되므로 참조형 변수의 종류를 구분할 때는 '타입'이라는 용어를 사용한다.
'타입(type)'이 '자료형(data type)'을 포함하는 보다 넓은 의미의 용어이므로 굳이 구분하지 않아도 된다.

기본형(primitive type)

기본형에는 모두 8개의 타입(자료형)이 있으며, 크게 논리형, 문자형, 정수형, 실수형으로 구분된다.

분류타입
논리형boolean
true와 false중 하나를 값으로 갖으며, 조건식과 논리적 계산에 사용, 다른 기본형과의 연산 불가능
문자형char
문자를 저장하는데 사용되며, 변수에 하나의 문자만 저장할 수 있음
정수형byte, int, short, long
정수를 저장하는데 사용되며, 주로 int가 사용. byte는 이진 데이터를 다룰 때 사용되며,
short는 C언어와의 호환을 위해서 추가
실수형float, double
실수를 저장하는데 사용되며, 주로 double이 사용
  • boolean을 제외한 나머지 7개의 기본형은 서로 연산과 변환이 가능
  • 정수는 일반적으로 int를 많이 사용한다.
    (CPU가 가장 효율적으로 처리할 수 있는 타입이기 때문)
  • 효율적인 실행보다 메모리를 절약하려면 byte나 short를 선택하자.
  • 실수형은 정수형과 저장형식이 달라서 같은 크기라고 훨씬 큰 값을 표현할 수 있는데 오차가 발생할 수 있다는 단점이 있다. 정밀도가 높을수록 발생할 수 있는 오차의 범위가 줄어든다.
  • float의 정밀도는 7자리인데, 이는 10진수로 7자리의 수를 오차없이 저장할 수 있다.
  • 높은 정밀도가 필요한 경우에는 변수의 타입으로 double을 선택하자.

기본형의 종류와 크기

분류1 byte2 byte4 byte8 byte
논리형boolean
문자형char
정수형byteshortintlong
실수형floatdouble

상수와 리터럴(constant & literal)

상수(constant)

'상수'는 한 번 값을 저장하면 다른 값으로 변경할 수 없다.
반드시 선언와 동시에 초기화해야하며, 그 후부터는 상수의 값을 변경하는 것이 허용되지 않는다.

상수를 선언하는 방법은 변수와 동일하며, 단지 변수의 타입 앞에 키워드 'final'을 붙여주기만 하면 된다.

final int MAX_SPEED = 10; //상수 MAX_SPEED를 선언 & 초기화

final int MAX_SPEED; // 에러. 상수는 선언과 동시에 초기화해야 함. 
final int MAX_SPEED = 10; // ok. 상수 MAX_SPEED를 선언 & 초기화
MAX_SPEED = 20; // 에러. 상수의 값은 변경할 수 없음.

상수의 이름은 모두 대문자로 하는 것이 암묵적인 관례이며, 여러 단어로 이루어져있는 경우 '_'로 구분한다.

|참고| JDK 1.6 부터 상수를 선언과 동시에 초기화되지 않아도 되며, 사용하기 전에만 초기화하면 되도록 바뀌었다. 그래도 상수는 선언과 동시에 초기화하는 습관을 들이는 것이 좋다.

리터럴(literal)

우리가 기존에 알고 있던 '상수'의 다른 이름

원래 12, 123, 3.14, 'A' 와 같은 값들이 '상수'인데, 프로그래밍에서는 상수를 '값을 한 번 저장하면 변경할 수 없는 저장공간'으로 정의하였기 때문에 '상수' 대신 '리터럴'이라는 용어를 사용한다.

변수(variable): 하나의 값을 저장하기 위한 공간
상수(constant): 값을 한 번만 저장할 수 있는 공간
리터럴(literal): 그 자체로 값을 의미

int year(변수) = 2014(리터럴);
final int MAX_VALUE(상수) = 100;

Q. 상수가 필요한 이유
A. 상수는 리터럴에 '의미있는 이름'을 붙여서 코드의 이해와 수정을 쉽게 만든다. 다른 값으로 계산할 때 여러 곳을 수정할 필요없이 상수의 초기화만 다른 값으로 해주면 된다.

리터럴의 타입과 접미사

  • 리터럴의 접미사가 붙는 타입은 long, float, double뿐인데, double은 생략 가능하므로 long과 float의 리터럴에 접미사를 붙이는 것만 신경쓰면 된다.
  • 리터럴의 접두사와 섭미사는 대소문자를 구별하지 않는다.

정수형과 실수형에는 여러 타입이 존재하므로, 리터럴에 접미사를 붙여서 타입을 구분한다.

  1. 정수형의 경우 long 타입의 리터럴에 접미사 'l' 또는 'L'을 붙이고, 접미사가 없으면 int타입의 리터럴이다.
  2. 10진수 외에도 2, 8, 16 진수로 표현된 리터럴을 변수에 저장할 수 있으며, 16진수라는 것을 표시하기 위해 리터럴 앞에 접두사 '0x'또는 '0X'를, 8진수의 경우에는 '0'을 붙인다. ('0'은 문자가 아닌 숫자)
  3. JDK 1.7부터 정수형 리터럴의 중간에 구분자'_'를 넣을 수 있게 되어서 큰 숫자를 편하게 읽을 수 있다.
  4. 실수형에서는 float 타입의 리터럴에 접미사 'f' 또는 'F' 를 붙이고, double 타입의 리터럴에는 접미사 'd' 또는 'D'를 붙인다. (실수형에서는 double이 기본 자료형이라서 접미사 'd'는 생략 가능)
2.
int octNum = 010; // 8진수 10, 10진수로 8
int hexNum = 0x10; // 16진수 10, 10진수로 16
int binNum = 0b10; // 2진수 10, 10진수로 2

3.
long big = 100_000_000_000L; // long big = 100000000000L;
long hex = 0xFFFF_FFFF_FFFF_FFFFL; // long hex = 0xFFFFFFFFFFFFFFFFL;

4.
float pi = 3.14f; // 접미사 f 대신 F 사용 가능
double rate = 1.618d; // 접미사 d 대신 D 사용 가능

float pi = 3.14; // 에러. float 타입 변수에 double 타입 리터럴 저장 불가
double rate = 1.618; // OK. 접미사 d 생략 가능

리터럴에 소수점이나 10의 제곱을 나타내는 기호 E 또는 e, 그리고 접미사 f, F, d, D를 포함하고 있으면 실수형 리터럴로 간주된다.

자료형실수형 리터럴다른 형태의 동등한 표현
double10.10.0
double.100.10
float10f10.0f
float3.14e3f3140.0f
double1e110.0
double1e-30.001

잘 쓰이지는 않지만 기호 p를 이용해서 실수 리터럴을 16진수 지수형태로 표현할 수 있다.
p는 2의 제곱을 의미하며, p의 왼쪽에는 16진수를 적고 오른쪽에는 지수를 10진수 정수로 적는다. (실수형)

0x1p1 = (1 × 16^0 ) × 2¹ = 1.0 × 2 = 2.0
0x0.2p-1 = (2 × 16^-1 ) × 2^-1 = 0.125 × 0.5 = 0.0625
0x12p3 = (1 × 16¹ + 2 × 16^0 ) × 2³ = (16 + 2) × 8 = 114.0

타입의 불일치

리터럴의 타입은 저장될 변수의 타입과 일치하는 것이 보통이지만, 타입이 달라도 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용된다.

그러나 리터럴의 값이 변수의 타입의 범위를 넘어서거나, 리터럴의 타입이 변수의 타입보다 저장범위 넓으면 컴파일 에러가 발생한다.

int i = 'A'; // OK. 문자 'A'의 유니코드인 65가 변수 i에 저장된다. 
long l = 123; // OK. int보다 long 타입이 더 범위가 넓다. 
double d = 3.14f; // OK. float보다 double 타입이 더 범위가 넓다. 

int i = 0x123456789; // 에러. int 타입의 범위를 넘는 값을 저장
float f = 3.14; // 에러. float 타입보다 double 타입의 범위가 넓다.

문자 리터럴과 문자열 리터럴

문자열은 '문자의 연속된 나열'이라는 뜻이며, 영어로 'string'

'A'와 같이 작은따옴표로 문자 하나를 감싼 것을 '문자 리터럴'이라고 한다.
두 문자 이상은 큰 따옴표로 감싸야 하며 '문자열 리터럴'이라고 한다.

char 타입의 변수는 '단 하나의 문자'만 저장할 수 있으므로, 여러 문자(문자열)을 저장하기 위해서는 String 타입을 사용해야 한다.
문자열 리터럴은 빈 문자열을 허용하지만 문자 리터럴은 반드시 ''안에 하나의 문자가 있어야 한다.

String str = ""; // OK. 내용이 없는 빈 문자열
char ch = ''; // 에러. ''안에 반드시 하나의 문자가 필요
char ch = ' '; // OK. 공백 문자(blank)로 변수 ch를 초기화

원래 String은 클래스이므로 아래와 같이 객체를 생성하는 연산자 new를 사ㅏ용해야 하지만 특별히 위와 같은 표현도 허용한다.

String name = new String("JAVA"); //String 객체를 생성
profile
노력하는 중

0개의 댓글