Java의정석 2| 변수(Variable)

두윤기·2022년 12월 11일
post-thumbnail

1. 변수

1.1 변수(variable)란

  • 값을 저장할 수 있는 메모리상의 공간

1.2 변수의 선언

  • 변수를 사용하기 위해서는 먼저 변수 선언
  • 변수가 선언되면 메모리에 변수의 타입에 알맞은 크기의 저장공간이 확보되어, 값을 저장할 준비

변수 선언

변수타입 변수이름;
int number;	// 정수형 변수 number를 선언한다.
  • 변수타입은 변수에 담을 값의 종류와 범위를 충분히 고려하여 결정
  • 변수를 사용하기에 앞서 적절한 값을 저장해주는 것이 필요

변수의 초기화

// 정수형 변수 number 선언, 변수의 값 10으로 초기화
int number = 10;

int number;
number = 10;

콤마의 사용

int a;
int b;
int x=0;
int y=0;
//
int a, b;
int x=0, y=0;

참고| 지역변수는 사용되기 전 초기화를 반드시 해야하지만 클래스변수와 인스턴스 변수는 초기화를 생략할 수 있다.

1.3 명명규칙(naming convention)

명명규칙

변수의 이름, 메서드의 이름, 클래스의 이름 등 모든 이름을 짓는 데는 반드시 지켜야 할 공통적인 규칙

  • 대소문자가 구분, 길이 제한 X
    True와 true는 서로 다른 것으로 간주
  • 예약어 사용 X
    true는 예약어라서 사용 X, True는 사용 가능
  • 숫자로 시작해서는 안 된다
    top10은 가능, 7up은 불가능
  • 특수문자는 '_'와 '$'만 허용
    참고| 예약어는 키워드(keyword) 또는 reserved word라고 하는데, 프로그래밍언어의 구문에 사용되는 단어

자바프로그래머 권장규칙

  • 클래스의 이름의 첫 글자는 대문자
    변수와 메서드의 이름의 첫 글자는 항상 소문자로 한다
  • 복합어는 단어경계의 첫글자를 대문자
    ex)lastIndexOf, StringBuffer
  • 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_'로 구분한다.
    ex) PI, MAX_NUMBER

2. 변수의 타입

  • 모든 변수에는 타입(type, 형)이 있으며, 변수의 타입에 따라 저장할 수 잇는 값의 종류와 범위가 달라진다.
  • 변수를 선언할 때 저장하고자 하는 값을 고려하여 가장 알맞은 타입을 선택

변수의 타입

기본형(primitive type)

  • 실제 값(data) 저장
  • boolean, char, byte, short, int, long, float, double

참조형(Reference type)

  • 값이 저장되어 있는 주소
  • 객체의 주소를 저장
    참고| 참조형 변수는 null 또는 객체의 주소(4byte)를 갖는다
  • 참조형 변수를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 변수의 타입
  • 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 셈
클래스이름 변수명;	// 타입이 클래스 이름인 것들은 모두 참조변수이다.
Date today;
  • 참조변수 초기화
Date today = null
|
Date today = new Date();

- 객체를 생성하는 연산자 new의 연산결과는 생성된 객체의 주소
- 새로 생성된 객체의 주소가 대입연사자 '='에 의해 참조변수 today에 저장
- 참조변수 today를 통해서 생성된 객체 사용

2.1 기본형(primitive type)

논리형(boolean)

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

문자형(char)

  • 문자 저장
  • 변수 당 하나의 문자만 저장
  • 선언
	char c1 = 'A';
    
    // java에서는 ''는 character형, ""은 String형을 의미
    String s1 = "A";
  • 초기화
	// char c1 = ''; // error
    // char타입의 기본값인 널 문자 (\u0000)가 있지만
    // 일반적으로 기본값 대신 공백으로 초기화
    char c1 = ' ';
    
    String s1 = null; // s1은 reference variable이므로 null로 초기화 할 수 있다.
    String s2 = ""; // 그러나 String은 일반적으로 빈 물자열로 초기화

정수형

  • 정수 값 저장
  • 주로 사용되는 것은 int와 long
  • byte는 이진 데이터, short는 C언어와의 호환위해 추가

실수형

  • 실수 값 저장
  • float, double

2.2 논리형 boolean

  • true와 false 중 하나 저장
  • 기본값(default) false
  • 1byte
    참고| 데이터를 다루는 최소단위가 1byte

2.3 문자형 char

  • 2byte (유니코드 문자체계 사용)
  • 16진수로 0000부터 ffff까지, 문자를 표현하는데 65536개 코드 사용
char firstLetter = 'A';
|
char firstLetter = '\u0041';
  • char ch = 'A';가 수행되면 char형 변수 ch에는 문자 'A'의 유니코드인 65가 저장된다. 변수에 문자를 저장하는 것 같지만 실제로는 정숫값(유니코드)이 저장되는 것이다. 즉 모든 데이터는 숫자로 저장된다.
  • println()은 변수의 값을 출력할 때 변수의 타입이 정수형이면 정숫값을 그대로 출력하고, char형이면 정숫값에 해당하는 문자를 찾아서 출력

String 클래스

  • char형 변수는 단 하나의 문자 밖에 저장할 수 없기 때문에, 여러 문자를 저장하기 위해서는 String 클래스 사용
char ch = 'J';
String name = "Doo";
  • 원래 String은 클래스이므로 String name = new String("Doo");와 같이 연산자 new를 사용해야 하지만, 특별히 위와 같은 표현도 허용

덧셈 연산자

- 덧셈 연산자(+)의 피연산자 중 어느 한 쪽이 String이면, 나머지 한 쪽을 먼저 String으로 변환한 다음 두 String을 결합 (형변환 casting)

"" + 7 === "7"
7 + "" === "7"

7 + " " === "7 "
" " + 7 === " 7"

7 + "7" === "77"
7 + 7 + "" === "14"
"" + 7 + 7 === "77"

true + "" === "true"
null + "" === "null"

- 덧셈 연산은 왼쪽에서 오른쪽의 방향으로 연산 수행하기 때문에 결합순서에 따라 결과가 달라짐

2.4 정수형 byte, short, int, long

종류

  • byte 1 -128~127
  • short 2 -32,768~32,767
  • int 4 –2,147,483,648 ~ 2,147,483,647
    - 기본 자료형(default data type)
    - byte나 short는 값의 범위가 작은편이라 연산 시 범위를 넘어 잘못된 결과를 얻기 쉽다.
    - JVM의 피연산자 스택(operand stack)이 피연산자를 4byte단위로 저장하기 때문에, 크기가 4byte보다 작은 자료형의 값을 계산할 때는 4byte로 변환하여 연산 수행
  • long 8
byte b = 1;
short s = 2;
int finger = 10;
long big = 100000000000L	// long타입의 리터럴에는 접미사 L을 붙여야 한다.

참고| long타입의 리터럴에는 접미사 'L' 또는 'l'(소문자)을 반드시 붙여야한다. 리터럴에 접미사가 붙어있지 않으면 int 타입으로 간주. 'l'은 숫자 '1'과 혼동할 수 있으므로 'L'사용
참고| 그 자체로 데이터인 것을 '리터럴(literal)'이라고 한다. 예를 들어 'A', "AB", 123.

8진수, 16진수 수

  • 8진수 010 === 8
  • 16진수 0x10 === 16

부호자리(msb)

오버플로우(overflow)

2.5 실수형 float, double

부동소수점 방식(floating-point)

±a×10^n

  • a: 가수(mentissa), 0≦a<1 실수
  • n: 지수(exponent)
    ex) 3.1415 = 0.31415×10^1

float

  • 4byte: S(1)+E(8)+M(23)
  • 접미사 f,F (float pi = 3.14f;)

double

  • 8byte: S(1)+E(11)+M(52)
  • 값의 범위가 더 넓고, 정밀도도 높다.
  • 접미사 d,D (생략가능)

3. 형변환

3.1 형변환(캐스팅, casting)

  • 모든 연산은 기본적으로 같은 타입의 피연산자(operand)간에만 수행.
  • 서로 다른 타입의 피연산자간의 연산을 수행해야하는 경우, 연산을 수행하기 전 형변환을 통해 같은 타입으로 변환.

형변환: 변수 또는 리터럴의 타입을 다른 타입으로 변환하는 것

3.2 형변환 방법

  • 기본형과 참조형 모두 형변환이 가능하지만, 기본형과 참조형 사이에는 형변환이 성립되지 않는다.
  • 기본형은 기본형으로만, 참조형은 참조형으로만 형변환 가능
    참고| JDK1.5부터 오토박싱(autoboxing) 기능이 추가되어, 기본형을 Object 클래스나 wrapper 클래스 같은 참조형으로 형변환할 수 있게 되었다.

형변환 방법

형변환하고자 하는 변수나 리터럴 앞에 변환하고자 하는 타입을 괄호와 함께 붙여준다.

(타입)피연산자
int score = (int)85.4;	// double형 값을 int형으로 변환하여 score에 85가 저장된다.
byte b = (byte)score;	// score에 저장된 값을 byte형으로 변환하여 b에 저장
  • 캐스트 연산자(형변환 연산자)
    변환(casting)에 사용하는 괄호
  • 캐스트 연산자는 피연산자의 값을 읽어서 지정된 타입으로 형변환하고 그 결과를 반환
  • 피연산자는 형 변환 후에도 아무런 변화가 없다.

3.3 기본형의 형변환

  • 8개의 기본형 중에서 boolean을 제외한 나머지 7개의 기본형 간에는 서로 형변환이 가능.
  • 각 자료형마다 표현할 수 있는 값의 범위가 다르기 때문에 범위가 큰 자료형에서 범위가 작은 자료형으로의 변환은 값 손실이 발생할 수 있다.
  • 실수형->정수형에서는 소수점 이하의 값은 버려지게 된다.
  • 원칙적으로는 모든 형변환에 캐스트연산자를 이용한 형변환이 이루어져야 하지만, 값의 표현범위가 작은 자료형에서 큰 자료형의 변환은 값의 손실이 없으므로 캐스트 연산자 생략 허용
  • 반면에 값의 표현범위가 큰 자료형에서 작은 자료형으로의 변환은 값이 손실될 가능성(possible loss of precision)이 있으므로, JVM이 자동적으로 형변환하지 않고 프로그래머에게 캐스트 연산자를 이용하여 명시적으로 형변환하도록 강요하고 있다(컴파일 에러 발생)
profile
programmerD

0개의 댓글