Chapter2. 변수

개발빼-엠·2023년 1월 30일

Java

목록 보기
3/8
post-thumbnail

1.변수와 상수

변수

하나의 값을 저장할 수 있는 메모리 공간(RAM)

지역 변수는 읽기 전에 꼭 초기화(변수를 사용하기 전에 처음으로 값을 저장하는 것)를 해야 한다.

클래스변수와 인스턴스변수는 초기화를 생략할 수 있다.

변수의 명명규칙

“변수의 이름처럼 프로그래밍에서 사용하는 모든 이름을 식별자(identifier)라고 한다.”

  1. 대소문자가 구분되며 길이에 제한이 없다.
  2. 예약어(Reserved word)를 사용해서는 안 된다.
  3. 숫자로 시작해서는 안 된다.
  4. 특수문자는 ‘-’와 ‘$’만을 허용한다.

변수 권장사항

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

  2. 여러 단어 이름은 단어의 첫 글자를 대문자로 한다.

    lastIndexOf(클래스이름이 아니라는 것을 추측),StringBuffer(클래스이름이라는 것을 추축)

  3. 상수의 이름은 대문자로 하며 단어는 ‘_’로 구분한다.

    PI, MAX_NUMBER

2.변수의 타입

변수의 타입

자료형은기본형(Primitive type)과 참조형(Reference type) 두 가지로 나눌 수 있다.

기본형의 종류를 얘기할 때는 ‘자료형(data type)’이라는 용어를 쓰고, 참조형 변수의 종류를 구분할 떄는 ‘타입(type)’이라는 용어를 사용한다.

  • 자료형(Data type) 변수타입.drawio.png
  • 기본형 - 계산을 위해 실제 값을 저장한다. 모두 8개
    • 논리형(Boolean)
    • 문자형(char)
    • 정수형(int<정수 값>, long<아주 큰 정수>, byte<이진데이터>, short<C언어와의 호완. 잘안쓰임>)
    • 실수형(float, double)
      • float의 정밀도는 7자리이다.
      • double의 정밀도는 15자리이다.
  • 참조형 - 객체의 주소를 저장한다.
    • 8개의 기본형을 제외한 나머지 타입
    • String, System 등
    • 메모리 주소를 저장(4byte<최대값은 40억정도 된다.> 또는 8byte)
  • 종류\크기1byte2byte3byte4byte
    논리형boolean
    문자형char
    정수형byteshortintlong
    실수형floatdouble
    • boolean은 true와 false 두 가지 값만 표현할 수 있으면 되므로 가장 작은 크기인 1byte.
    • char은 자바에서 유니코드(2byte 문자체계)를 사용하므로 2byte.
    • byte는 크기가 1byte라서 byte.
    • int(4byte)를 기준으로 짧아서 short(2byte) 길어서 long(8byte)
    • float는 실수값을 부동소수점(floating-point)방식으로 저장하기 때문에 float.
    • double은 float보다 두 배의 크기(8byte)를 갖기 때문에 double.
  • byte
    • 정수형과 실수형에는 부호가 있다.
    • 부호있는 정수의 범위: -2^n-1 ~ 2^n-1 - 1
    • 부호없는 정수의 범위: 0 ~ 2^n - 1

변수, 상수, 리터럴

  • 변수(Variable): 하나의 값을 저장하기 위한 공간
  • 상수(Constant): 한 번만 값을 저장 가능한 변수 상수는 변수명 앞에 final을 붙여주어야한다. 선언과 동시에 초기화하는 습관을 들이는 것이 좋다. 상수의 이름은 모두 대문자로 하는 것이 암묵적인관례이며, 여러 단어로 이루어져있는 경우 ‘_’로 구분한다. 의미있는 이름을 붙여 코드의 이해와 수정을 쉽게 만든다.
  • 리터럴(Literal): 그 자체로 값을 의미하는 것 기존에 알고 있던 ‘상수'의 다른 이름일 뿐이다.

리터럴의 타입과 접미사

값이 출력될때 접미사는 출력되지 않는다.

종류리터럴접미사
논리형false, true없음
정수형123, 0b0101L
실수형3.14, 3.0e8f, d
문자형‘A’, ‘1’없음
문자열“ABC”, “123”없음

변수와 리터럴의 타입 불일치

  1. 범위가 “변수(그릇) > 리터럴(물건)” 인 경우 → OK

  2. 범위가 “변수(그릇) < 리터럴(물건)” 인 경우 → ERR

  3. byte, short 변수에 int리터럴 저장가능

    단, 변수의 타입의 범위 이내어야 함.

문자와 문자열

문자 리터럴 → ‘A’

빈 문자는 허용되지 않는다.

문자열 리터럴 → “A”

빈 문자도 허용이 된다.

형식화된 출력 - printf()

printf()는 ‘지시자(specifier)’를 통해 변수의 값을 여러가지 형식으로 변환하여 출력하는 기능을 가지고 있다.

‘지시자’는 값을 어떻게 출력할 것인지를 지정해주는 역할을 한다.

printf()의 지시자는 JavaAPI → Formatter에서 찾아 볼 수 있다.

  • println()의 단점
    • 출력형식 지정불가

    • 실수의 자리수 조절불가

    • 10진수로만 출력

      System.out.println(10/3) // 3
      System.out.println(10.0/3) // 3.33333

화면에서 입력받기 - Scanner

Scanner란?

화면으로부터 데이터를 입력받는 기능을 제공하는 클래스

Scanner를 사용하려면

  1. import문 추가
  2. Scanner객체의 생성
  3. Scanner객체를 사용

3.진법

2진법: 0~1

8진법: 0~7

10진법: 0~9

16진법: 0~F

10진법과 2진법

컴퓨터는 2진 체계로 설계되어 2진수(0과1)밖에 모른다.

비트(bit)와 바이트(byte)

한 자리의 2진수를 ‘비트(bit, binary digit)’라고 하며, 1비트는 컴퓨터가 값을 저장할 수 있는 최소 단위이다.

그러나 1비트는 너무 작은 단위이기 대문에 1비트 8개를 묶어서 ‘바이트(byte)’라는 단위로 정의해서 데이터의 기본 단위로 사용한다.

워드(word)는 CPU가 한 번에 처리할 수 있는 데이터의 크기를 의미한다.

워드의 크기는 CPU의 성능에 따라 달라진다. ex) 32bit CPU → 1word === 32bit, 64bit CPU → 1word === 64bit

*nibble: 4bit, 16진수 1자리를 저장할 수 있는 단위

*0001과 1은 같은 값이지만, 0001의 크기가 4자리인 데이터라는 것을 강조하기 위해 빈자리를 0으로 채운것

n비트로 2^n개의 값을 표현할 수 있다.

n비트로 10진수를 표현한다면, 표현가능한 10진수의 범위는 0~2^n - 1이 된다.

8진법과 16진법

0과1만 사용하는 2진법은 자리수가 길어진다는 단점을 보안하기 위해 8진법, 16진법을 사용한다.

8진수는 2진수 3자리를, 16진수는 2진수 4자리를 각각 한자리로 표현할 수 있기 때문에 자리수가 짧아져서 알아보기 쉽고 서로 간의 변환방법 또한 매우 간단하다.

4.기본형(Primitive type)

논리형 - boolean

문자형 - char

char ch = 'A';

변수에 ‘문자’가 저장되는 것 같지만, 문자가 아닌 ‘문자의 유니코드(정수)’가 저장된다. 즉, ‘A’의 유니코드 65가 저장된다.

어떤 타입을 다른 타입으로 변환하는 것을 ‘캐스팅(Casting)’이라고 한다.

char타입의 크기는 2byte(=16bit)이다.

println()은 변수의 타입이 정수형이면 변수에 저장된 값을 10진수로 해석하여 출력하고, 문자형이면 저장된 숫자에 해당하는 유니코드를 출력한다.

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

문자를 코드로 변환하는 것을 ‘문자 인코딩’, 코드를 문자로 변환하는 것을 ‘문자 디코딩'이라고 한다.

문자를 저장할 때는 인코딩을 해서 숫자로 변환해서 저장하고, 저장된 문자를 읽어올 때는 디코딩을해서 숫자를 원래의 문자로 되돌려야 한다.

정수형 - byte, short, int, long

byte(1) < short(2) < int(4)[default data type] < long(8)

  • 정수형의 선택기준 byte와 short이 int보다 크기가 작아 메모리를 조금 더 절약할 수는 잇지만, 저장할 수 있는 값의 범위가 작은 편이라서 연산 시에 범위를 넘어서 잘못된 결과를 얻기가 쉬우므로 int를 사용하는 것이 좋다. *결론: 정수형 변수를 선언할 때는 int타입으로 하고, int의 범위(약 20억)를 넘어서는 수를다뤄야할 떄는long을 사용하면 된다. byte나 short은 성능보다 저장공간을 절약하는 것이 더 중요할 떄 사용하자.
  • 정수형의 오버플로우 타입이 표현할 수 있는 값의 범위를 넘어서는 것을 오버플로우라고 한다. 에러가 나는 것은 아니지만 예상했던 결과를 얻지 못한다. 발생하지 않도록 충분한 크기의 타입을 선택해서 사용한다. ‘계수기',’ 자동차 주행표시기'와 같다.

실수형 - float, double

  • 실수형도 정수형처럼 저장할 수 있는 범위를 넘게 되면 오버플로우가 발생할까? 정수형과 달리 실수형에서는 오버플로우가 발생하면 변수의 값은 ‘무한대(infinity)’가 된다. 정수형에 없는 ‘언더플로우(underflow)’가 있는데, 언더플로우는 실수형으로 표현할 수 없는 아주 작은 값. 양의 최소값보다 작은 값이 되는 경우를 말한다. 이 때 변수의 값은 0이 된다.
  • 실수형의 범위와 정밀도 실수형에서는 오차가 발생할 수 있는 단점이 있어 실수형에는 표현할 수 있는 값의 범위뿐만 아니라 ‘정밀도(precision)'도 중요한 요소이다. 7자리 이상의 정밀도가 필요하다면, 변수의 타입을 double로 해야 한다. float타입이 아닌 double타입의 변수를 실수형 값을 저장할 때 사용하는 경우는 대부분 저장하려는 ‘값의 범위'때문이 아니라 ‘보다 높은 정밀도'가 필요해서이다. 연산속도의 향상, 메모리 절약 = float > double 더 큰 값의 범위, 더 높은 정밀도 = double > float

형변환(캐스팅, casting)

형변환이란?

변수 또는 상수의 타입을 다른 타입으로 변환하는 것

int타입과 float타입의 값을 더하는 경우, 먼저 두 값을 같은 타입으로 즉, 둘 다 float타입으로 변환한 다음에 더해야 한다.

형변환 방법

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

(타입)피연산자

여기에 사용되는 괄호()는 ‘캐스트 연산자' 또는 ‘형변환 연산자'라고 하며, 형변환을 ‘캐스팅'이라고도 한다.

double d = 85.4;
int score = (int)d; // double타입의 변수 d를 int타입으로 형변환

피연산자인 변수 d의 값은 형변환 후에도 아무런 변화가 없다.

기본형에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다.

기본형과 참조형간의 형변환은 불가능하다.

정수형간의 형변환

큰 타입에서 작은 타입으로의 변환, ex) int → byte 으로 변환하는 경우는 크기의 차이만큼 잘려나간다.

그래서 경우에 따라 ‘값 손실(loss of data)’이 발생할 수 있다.

0개의 댓글