ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CH2 변수(Variable)
    DevBook/Java의 정석 2022. 1. 13. 23:32

    ✔️ 변수

    • 단 하나의 값을 저장할 수 있는 메모리 공간
    • 메모리의 빈 공간에 '변수타입'에 알맞은 크기의 저장공간이 확보되고, 이 저장공간은 '변수이름'을 통해 사용할 수 있게 됨

    #️⃣ 변수의 초기화

    • 변수를 선언한 이후부터는 변수를 사용할 수 있으나, 그 전에 반드시 변수를 초기화 해야 함
      • 전에 다른 프로그램에 의해 저장된 '알 수없는 값(garbage value)'이 남아있을 수 있기 때문임

    #️⃣ 변수의 명명규칙

    • 프로그래밍에서 사용하는 모든 이름을 '식별자(identifier)'라고 하며, 같은 영역 내에서 서로 구분될 수 있어야 함

     

    <식별자 규칙>

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

      - True와 true는 서로 다른 것으로 간주됨

    2. 예약어를 사용할 수 없음

      - true는 예약어라서 사용할 수 없지만, True는 가능함

    3. 숫자로 시작하면 안됨

      - top10은 허용하지만, 7up은 허용 X

    4. 특수문자는 '_'와 '$'만을 허용함

      - $harp은 허용되지만, S#arp는 허용되지 않음

     

    <권장 규칙>

    1. 클래스 이름의 첫 글자는 항상 대문자로 함

      - 변수와 메서드의 이름의 첫 글자는 항상 소문자로함

    2. 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 함

      - lastIndexOf, StringBuffer

    3. 상수의 이름은 모두 대문자로 함(여러 단어로 이루어진 경우 '_'로 구분함)

      - PI, MAX_NUM

     

    ✔️ 변수의 타입

    ▶️ 기본형과 참조형

    기본형 변수 - 실제 값(data)을 저장

    참조형 변수 - 어떤 값이 저장되어 있는 주소(memory address)를 값으로 가짐

    → 참조형 변수 간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수

     

    ▶️ 기본형(prmitive type) : 8개

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

     

    ▶️ 참조형(reference type) : 위의 8개를 제외한 나머지 타입

    객체의 주소를 저장함 

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

     

     #️⃣ 기본형(prmitive type)

    분류 타입
    논리형 boolean
    true / false 중 하나를 값으며, 조건식과 논리적 계산에 사용된다.
    문자형 char
    문자를 저장하는데 사용되며, 변수에 하나의 문자만 저장할 수 있다.
    정수형 byte, short, int, long
    정수를 저장하는데 사용되며, 주로 int가 사용된다. byte는 이진 데이터를 다룰 때 사용되며, short는 C언어와의 호환을 위해서 추가되었다.
    실수형 float, double
    실수를 저장하는데 사용되며, 주로 double이 사용된다. 
    • 문자형인 char는 문자를 내부적으로 정수(유니코드)로 저장하기 때문에 정수형과 별반 다르지 않으며, 정수형 or 실수형과 연산이 가능함
    • 반면, boolean은 다른 기본형과의 연산이 불가능함
    • 즉, boolean을 제외한 나머지 7개의 기본형은 서로 연산과 변환이 가능함

     

    ▶️ 기본 자료형의 종류와 크기

    종류/ 크기 1 byte 2 byte 4 byte 8 byte
    논리형 boolean      
    문자형   char    
    정수형 byte short int(기본 자료형) long
    실수형     float double(기본 자료형)

     

    #️⃣ 상수와 리터럴(constant & literal)

    ▶️ 상수(constant)

    변수와 달리 한 번 값을 저장하면 다른 값으로 변경할 수 없음

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

    → JDK1.6부터 상수를 선언과 동시에 초기화 하지 않고 사용하기 전에만 초기화하면 되도록 바뀌었지만, 상수는 선언과 동시에 초기화하는 습관을 들이는 것이 좋음

    한 번 초기화가 되면 상수 값 변경 불가능함

    상수의 이름은 모두 대문자로 하는 것이 암묵적인 관례임

     

    ▶️ 간단 정리

    변수(variable) 하나의 값을 저장하기 위한 공간
    상수(constant) 값을 한번만 저장할 수 있는 공간
    리터럴(literal) 그 자체로 값을 의미하는 것
    int year = 2022;	// year: 변수, 2022: 리터럴
    final int MAX_VALUE = 2022;	// MAX_VALUE: 상수, 2022: 리터럴

     

    ▶️ 상수가 필요한 이유

    Q. 그냥 리터럴을 직접 쓰면 될 텐데, 굳이 상수가 따로 필요할까?

    // 리터럴로 표기한 경우
    int triangleArea = (20 * 10) / 2;	// 삼각형의 면적 구하는 공식
    
    // 상수를 사용한 경우
    final int WIDTH = 20;	// 폭
    final int HEIGHT = 10;	// 높이 
    
    int triangleArea = (WIDTH * HEIGHT) / 2;	// 삼각형의 면적 구하는 공식

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

     

    ▶️ 리터럴의 타입과 접미사

    변수의 타입은 저장될 '값의 타입(리터럴의 타입)'에 의해 결정되므로, 만일 리터럴에 타입이 없다면 변수의 타입도 필요없을 것임

    종류 리터럴 접미사
    논리형 false, true X
    정수형 123, 0b0101, 077, 0xFF, 100L L
    실수형 3.14, 3.0e8, 1.4f, 0x1.0p-1 f, d
    문자형 'A', '1' X
    문자열 "ABC", "123" X

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

    정수형: long타입의 리터럴에 접미사 'L'을 붙이고, 접미사가 없으면 int타입의 리터럴임

    실수형: float타입의 리터럴에는 'f'를, double타입의 리터럴에는 'd'를 붙임 (double은 기본 자료형 이어서 접미사 생략 가능함)

    float pi = 3.14;	// 컴파일 에러 (float타입 변수에 double타입 리터럴 지정불가)
    float pe = 3.14f;	// 올바른 표현
    
    double rate = 1.618;	// 접미사 d는 생략 가능함

    즉, long & float의 리터럴에 접미사를 붙이는 것만 신경쓰면 됨!

     

    ▶️ 문자 리터럴과 문자열 리터럴

    • 문자 리터럴: 'A'와 같이 작은따옴표로 문자 하나를 감싼 것
    • 문자열 리터럴: 두 문자 이상을 큰 따옴표로 감싼 것
    String str = ""; 	// 빈 문자열 허용
    char ch = ''; 		// 에러 (빈 문자 허용 X)
    char ch = ' '; 		// 공백 문자(blank)로 변수 ch 초기화
    • 기본형과 참조형 구별 없이 어떤 타입의 변수도 문자열과 덧셈연산을 수행하면 그 결과가 문자열이 됨
      • 문자열 + any type → 문자열 + 문자열 → 문자열 
      • 기본형 타입의 값을 문자열로 변환할 때 빈 문자열("")을 더해주면 됨

     

    ▶️ 형식화된 출력 - printf()

    • printf()는 지시자(specifier)를 통해 변수의 값을 여러 가지 형식으로 변환하여 출력하는 기능을 가짐

     

    ✔️ 기본형(primitive type)

    #️⃣ 문자형 - char 

    • char형 변수에는 문자가 아닌 '문자의 유니코드(정수)'가 저장됨 (컴퓨터에 저장하기 위해 모든 데이터를 숫자로 변환하여 저장하는 것)

     

    ▶️ 인코딩과 디코딩(encoding & decoding)

    • 문자 → 코드 변환 : '문자 인코딩'
    • 코드 → 문자 변환 : '문자 디코딩'
    • 문자를 컴퓨터에 저장할 때는 인코딩을 해서 숫자로 변환해서 저장하고, 저장된 문자를 컴퓨터에서 읽어올 때는 디코딩을 해서 숫자를 원래의 문자로 되돌려야 함

     

    #️⃣ 정수형 - byte, short, int, long

    ▶️ 정수형의 선택 기준

    • byte나 short보다 int를 사용하도록 하자
      • byte, short는 저장할 수 있는 값의 범위가 작은 편이라서 연산 시 범위를 넘어서 잘못된 결과를 얻기 쉬움
      • JVM의 피연산자 스택(operand stack)이 피연산자를 4byte단위로 저장하기 때문에 크기가 4byte보다 작은 자료형(byte, short)의 값을 계산할 때 4 byte로 변환하여 연산을 수행하므로, int를 사용하는 것이 더 효율적임
    • 정수형 변수 선언 시 int타입으로 하고, int의 범위(약 +- 20억)을 넘어서는 수를 다뤄야할 때는 long을 사용하도록 함

     

    ✔️ 형변환

    #️⃣ 형변환 방법

    (타입)피연산자
    • (): 캐스트 연산자 or 형변환 연산자
    • 기본형(primitive type)에서 boolean을 제외한 나머지 7개의 타입들은 서로 형변환이 가능
      • float타입의 값을 int타입으로 변환할 때 소수점 이하의 값은 반올림 X, 버림으로 처리됨
        • 정수형의 표현 형식으로 소수점 이하의 값은 표현할 수 없기 때문임
    • 기본형과 참조형간의 형변환은 불가능
    • 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있음
      • 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환함
      • char와 short의 경우, 서로 범위가 달라서 둘 다 2 byte의 크기로 같지만, 둘 중 어느 쪽으로의 형변환도 값 손실이 발생할 수 있으므로 자동 형변환 수행 X

     

     

     

     

    댓글

Designed by Tistory.