5 분 소요

변수와 타입

변수

변수란

  • 하나의 값을 저장할 수 있는 메모리 공간
  • 다양한 타입의 값을 저장할 수 없고 한 가지 타입의 값만 저장

선언

  • 어떤 타입의 데이터를 저장할 지, 변수 이름이 무엇인지 결정
  • 같은 타입의 변수는 콤마(,)를 이용해 한번에 선언할 수 있음
  • 규칙
    • 첫번째 글자는 문자이거나 $, _ 이어야 하고 숫자로 시작할 수 없음
    • 영어 대소문자 구분
    • Camel Case
    • 문자 수 제한 없음
    • 자바 예약어 사용 불가

사용

  • 변수에 값을 저장하고 읽는 행위
  • 저장
    • 대입 연산자(=) 사용
    • 우측의 값을 좌측 변수에 저장한다는 의미

        int score; // 변수 선언
        score = 90; // 값 저장
              
        int score = 90;
      
  • 리터럴 : 상수와 같은 의미지만 프로그램에서 상수는 다른 뜻이 있어 구분하기 위해 사용
  • 정수 리터럴
    • 소수점 없는 정수 리터럴은 10진수로 간주 ⇒ 0, 75, -100
    • 0으로 시작되는 리터럴은 8진수로 간주 ⇒ 02, -04
    • 0x, 0X로 시작하고 0~9 숫자나 A, B, C, D, E, F 또는 a, b, c, d, e, f로 구성된 리터럴은 16진수로 간주 ⇒ 0x5, 0xA, 0xB3, 0xAC08
  • 실수 리터럴
    • 소수점 있는 리터럴은 10진수 실수로 간주 ⇒ 0.25, -3.14
    • E 또는 e가 있는 리터럴은 10진수 지수와 가수로 간주 ⇒ 5E7 = 5 10^7, 0.12E-5 = 0.1210^-5
  • 문자 리터럴(char)
    • 작은 따옴표로 묶은 텍스트 ⇒ ‘A’, ‘한’, ‘\t’, ‘\n’

      이스케이프 문자 용도 유니코드
      ‘\t’ 수평 탭 0x0009
      ‘\n’ 줄 바꿈 0x000a
      ‘\r’ 리턴 0x000d
      ‘\”’ 큰따옴포 0x0022
      ‘\” 작은따옴표 0x0027
      ‘\’ \ 0x005c
      ‘\u16진수’ 16진수 유니코드 0x0000 ~ 0xffff
  • 문자열 리터럴(string)
    • 큰따옴표로 묶은 텍스트 ⇒ 문자열 리터럴
    • 문자열 리터럴 내에서 이스케이프 문자 사용 가능
  • 논리 리터럴(boolean)
    • true, false

변수값 읽기

  • 변수는 초기화 되어야 읽을 수 있음

변수 사용 범위

  • 중괄호 내에서 선언되고 사용 ⇒ 클래스, 생성자, 메소드
  • 로컬 변수 : 블록 내에서 선언된 변수
  • 변수는 선언된 블록 내에서만 사용 가능

데이터 타입

기본 타입

종류 타입 메모리 사용 크기 저장되는 값 범위
정수 byte 1byte -128 ~ 127
  char 2byte 0~2^16-1
  short 2byte -32,768 ~ 32,767
  int 4byte -2147483648 ~ 2147483647
  long 8byte 2^63 ~ 2^63-1
실수 float 4byte (+/-)1.4E-45 ~ (+/-)3.4028235E38
  double 8byte (+/-)4.9E-324 ~ (+/-)1.7976931348623157E3087
논리 boolean 1byte true, false
  • 정수 타입
    • byte
      • 색상 정보, 파일 또는 이미지 등의 이진 데이터 처리
      • 정수 중 가장 작은 범위 (-128 ~ 127) ⇒ 0이 포함되어 128이 아닌 127
    • short
      • C 언어와의 호환을 위해 사용. 자바에서는 잘 안씀
    • int
      • 일반적으로 쓰임
    • long
      • int 타입의 저장 범위를 넘으면 소문자 l이나 대문자 L을 붙임
    • 실수 타입
      • 기본값 : double
      • 가수 표현에 있어서 double가 약 두 배의 자리수 ⇒ 더 정밀한 계산
  • 문자
    • 자바는 모든 문자를 유니코드로 처리
    • 하나의 유니코드 : char 타입(2byte)
    • 유니코드는 음수가 없기 때문에 char 타입에 음수 안됨
    • 작은 따옴표 문자, 유니코드 정수값 저장
    • 문자열(string)
      • 클래스 타입, 참조 변수
      • 문자열이 변수에 직접 저장되는 것이 아닌 string 객체가 생성되고 string 변수는 string객체의 번지를 참조

타입 변환

자동 타입 변환

  • 프로그램 실행 도중 자동적으로 타입 변환이 일어나는 것
    • 작은 크기를 가지는 타입이 큰 크기를 가진 타입에 저장될 때
    • 에외 : 음수가 저장될 수 있는 byte 타입을 char 타입으로 자동 변환시킬 수 없다.
  • 연산식
    • 서로 다른 타입일 경우 크기가 큰 타입으로 자동 변환

강제 타입 변환

  • 큰 데이터 타입을 작은 데이터 타입으로 쪼개서 저장하는 것
    • 캐스팅 연산자() 사용
    • 강제 반환해도 값이 보존되어야 함
  • 입력값을 변환할 때 값의 손실이 발생하면 안됨
    • 타입.MAX_VALUE, 타입.MIN_VALUE로 검사

연산자

종류

종류 연산자 피연산자 수 산출값 기능 설명
산술 +, -, *, /, % 이항 숫자 사칙연산, 나머지 계산
부호 +, - 단항 숫자 음수, 양수
문자열 + 이항 문자열 두 문자열 연결
대입 =, +=, -=, *=, /=, %=, &=, ^=, |=, «=, »=, »>= 이항 다양 우변의 값을 좌변의 변수에 대입
증감 ++, — 단항 숫자 1만큼 증가 / 감소
비교 ==, !=, >, <, >=, <=, instanceof 이항 boolean 값 비교
논리 !, &, |, &&, || 단항, 이항 boolean 논리 연산
조건 (조건식) ? A : B 삼항 다양 조건에 따라 A 또는 B
비트 ~, &, |, ^ 단항, 이항 숫자, boolean 비트 연산
쉬프트 », «, »> 이항 숫자 비트를 좌우측으로 밀어서 이동

연산 방향, 우선순위

연산자 연산 방향 우선순위
증감(++, —), 부호(+,-), 비트(~), 논리(!) 좌 ← 우 높음
산술(*, /, %) 좌 → 우  
산술(+, -) 좌 → 우  
쉬프트(«, », »>) 좌 → 우  
비교(<, >, <=, >=, instanceof) 좌 → 우  
비교(==, !=) 좌 → 우  
논리(&) 좌 → 우  
논리(^) 좌 → 우  
논리(|) 좌 → 우  
논리(&&) 좌 → 우  
논리(||) 좌 → 우  
조건(? :) 좌 → 우  
대입(=, +=, -=, *=, /=, %=, &=, ^=, |=, «=, »=, »>=) 좌 ← 우 낮음
  • 괄호를 사용해 우선순위 표시하자 ⇒ 최우선 연산

단항 연산자

  • 부호 연산자(+, -)
    • 양수 및 음수 표시
    • boolean, char 타입 제외한 나머지 기본 타입에 사용
    • 부호 연산자 산출 타입 ⇒ int
  • 증감 연산자(++, —)
    • ++ / — 피연산자 : 다른 연산을 수행하기 전에 증감
    • 피연산자 ++ / — : 다른 연산 수행 후 증감
  • 논리 부정 연산자(!)
    • boolean 타입에만 사용
    • true, false 반대로 출력
  • 비트 반전 연산자
    • 정수 타입(byte, short, int, long) 피연산자에만 사용
    • 2진수로 표현했을 때 1과 0을 반전
    • 부호 비트를 포함해서 모든 비트가 반전되기 때문에 부호가 반대인 새로운 값 산출
    • int 타입 산출

이항 연산자

  • 산술 연산자(+, -, /, *, %)
    • 사칙연산, 나머지 구하기
    • 가장 큰 숫자 타입으로 변환 후 연산
    • char 타입도 정수 타입이므로 산술 연산 가능(int 타입으로 변환) ⇒ ‘A’ + 1 = 66
    • 정확한 숫자 계산을 위해서는 int 형으로 바꿔 계산하고 다시 원래 형태로 변환
  • NaN, Infinity
    • 어떤 수와 연산하더라도 NaN, Infinity 값 산출 ⇒ 데이터 엉망
    • NaN은 falsy 값이기 때문에 Double.isNaN() 메소드로 검사
  • 문자열 연결 연산자(+)
    • 문자열 서로 연결
  • 비교 연산자(<, <=, >, >=, ==, !=)
    • boolean 타입 산출
    • == : 모든 타입에 사용
    • 대소 연산자 : boolean 타입 제외한 기본 타입에 사용
    • 이진 포맷의 가수를 사용하는 모든 부동소수점 타입은 0.1 정확히 표현할 수 없음 ⇒ 0.1 == 0.1f → false
      • float 강제 변환 후 비교 연산 or 정수로 변환해서 비교
    • String 객체의 문자열이 같은지 비교 ⇒ equals() 메소드 사용
  • 논리 연산자(&&, ||, &, |, ^, !)

    • boolean 타입에만 사용
    • && / &: &&는 앞의 피연산자가 false면 뒤의 피연산자 평가하지 않고 바로 false 출력. &는 두 피연산자 모두 평가해서 산출
    • || / | : || 는 앞의 피연산자가 true면 뒤의 피연산자 평가하지 않고 바로 true. | 는 두 피연산자 모두 평가해서 산출
  • 비트 연산자(&, |, ~, <<, >>, >>>)
    • 정수 타입 연산
    • int 타입 산출
  • 비트 이동 연산자(«, », »>)
    • 1 « 3 : 32비트 전체를 왼쪽으로 3비트 이동. 왼쪽 3비트 버려지고 맨 오른쪽에 새로 생기는 3비트는 0으로 채움 ⇒ 8
    • -8 » 3 : 32비트 전체 오른쪽으로 3비트 이동. 오른쪽 3비트 빌려서 버려지고, 맨 왼쪽에 새로 생기는 3비트는 최상위 부호 비트와 동일한 값 ⇒ -1
    • -8 »> 3 : 오른쪽 3비트 버려지고, 맨 왼쪽에 새로 생기는 3비트 무조건 0으로 채워짐 ⇒ 536870911
  • 대입 연산자
    • 오른쪽 피연산자 값 좌측 피연산자인 변수에 저장
    • 모든 연산자 중 가장 낮은 연산 순위
  • 삼항 연산자
    • 조건식 ? 값 또는 연산식(true) : 값 또는 연산식(false)