Variable이란?

자료를 저장하기 위한 메모리 공간으로 타입에 따라 크기가 달라짐
메모리 공간에 값을 할당 후 사용

Type이란?

데이터의 종류

  • 기본형(primitive type) : 미리 정해진 크기의 Memory Size로 표현, 변수 자체에 값 저장
  • 참조형(reference type) : 크기가 미리 정해질 수 없는 데이터의 표현, 변수에는 실제 값을 참조할 수 있는 주소만 저장

기본형(primitive type)의 크기

  • 논리형 : boolean
  • 정수형 : byte(8bit), short(16bit), int(32bit), long(64bit, 뒤에 l이나 L을 붙여 명시한다)
  • 실수형 : float(32bit, 뒤에 f를 붙여 명시한다), double(64bit)
  • 문자형 : char(16bit)

  • byte(1byte) < short(2byte) < int(4byte) < long(8byte)
  • float(4byte) < double(8byte)
  • ⭐ float(4byte) > long(8byte)

  • 정수 계산 시 overflow 주의
  • 필요한 수의 크기를 고려해서 int 또는 long등 타입 선택

실수의 연산은 정확하지 않다.

  • 유효 자리수를 이용한 반올림 처리

참조형(reference type)

  • class, 배열

형변환(Type casting)이란?

변수의 타입을 다른 타입으로 변환하는 것
primitive는 primitive끼리, reference는 reference끼리 형 변환 가능

  • boolean은 다른 기본 타입과 호환되지 않음
  • 기본 타입과 참조형의 형 변환을 위해서 Wrapper 클래스 사용
형 변환 방법
  • 형 변환 연산자(괄호) 사용

기본형의 형 변환 진행

  • 묵시적 형 변환(Automatic Promotion, Implicit Type Casting)
    작은 데이터 타입에서 큰 데이터 타입으로 변환, 데이터가 손실되지 않음
  • 명시적 형 변환(Explicit Type Casting)
    큰 데이터 타입에서 작은 데이터 타입으로 변환, 데이터가 손실됨
    identifier = (target_type)value;<br>
    


  • 값의 크기, 타입의 크기가 아닌 타입의 표현 범위가 커지는 방향으로 할당할 경우는 묵시적 형변환 발생
  • 명시적 형 변환은 값 손실이 발생할 수 있으므로 프로그래머 책임하에 형 변환 진행
  • 묵시적 형 변환은 자료의 손실 걱정이 없으므로 JVM이 서비스 해줌

연산자란?

어떤 기능을 수행하는 기호
연산자 종류와 우선순위 및 결합 방향

byte b1 = 10;
byte b2 = 20;
// byte b3 = b1 + b2;
// Type mismatch: cannot convert from int to byte
byte b3 = (byte)(b1 + b2);

int i1 = 10;
long l1 = 20;
// int i2 = i1 + l1;
// Type mismatch: cannot convert from long to int
int i2 = i1 + (int)l1;

// float f1 = 10.0;
// Type mismatch: cannot convert from double to float
float f1 = 10.0f;

// float f2 = f1 + 20.0;
/* Multiple markers at this line
-Type mismatch: cannot convert from double to float
-f1 cannot be resolved to a variable */
double f2 = f1 + 20.0;
  • 산술 이항 연산자는 연산 전에 피 연산자의 타입을 일치시킨다.
  • 피연산자의 크기가 4byte(int) 미만이면 int로 변경한 후 연산 진행
  • 두 개의 피연산자 중 큰 타입으로 형 변환 후 연산 진행

위치에 따른 변수의 종류

  • 멤버 변수 : 클래스 멤버 변수(클래스 영역, static keyword), 인스턴스 멤버 변수(클래스 영역)
  • 지역 변수 : 지역 변수(함수 내부), 파라미터 변수(함수 선언부)
지역 변수 & 파라미터 변수
  • 선언 위치 : 클래스 영역의 {}이외의 모든 중괄호 안에 선언되는 변수들
    • 메서드, 생성자, 초기화 블록
      void call(String to){	// 파라미터 변수
      String beep = "띠";	// 로컬 변수
      
      for(int i=0; i<3; i++){	// 로컬 변수
          System.out.println(beep);
      }
      }
      
  • 변수의 생성 : 선언된 라인이 실행될 때
    • 생성 메모리 영역 : thread 별로 생성된 stack 영역
  • 변수의 초기화 : 사용하기 전 명시적 초기화 필요
  • 변수에의 접근 : 외부에서는 접근이 불가하므로 소속 불필요
    • 내부에서는 이름에 바로 접근
  • 소멸 시점 : 선언된 영역인 {}을 벗어날 때
멤버 변수
인스턴스 멤버 변수의 특징
  • 선언 위치 : 클래스 {}영역에 선언
    public class Person{
      String name;
      int age;
    }
    
  • 변수의 생성 : 객체가 만들어질 때 객체 별로 생성됨
    • 생성 메모리 영역 : heap
  • 변수의 초기화 : 타입 별로 default 초기화
  • 변수에의 접근 : 객체 생성 후(메모리에 올린 후) 객체 이름(소속)으로 접근
    • 객체를 만들 때마다 객체 별로 생성 -> 객체마다 고유한 상태(변수 값) 유지
  • 소멸 시점 : Garbage Collector에 의해 객체가 없어질 때 프로그래머가 명시적으로 소멸시킬 수 없음
클래스 멤버 변수의 특징(static 멤버)
  • 선언 위치 : 클래스{}영역에 선언되며 static 키워드를 붙임
    public class Person{
      static String scientificName = "Homo Sapiens";
      String name;
    }
    
  • 변수의 생성 : 클래스 영역에 클래스 로딩 시 메모리 등록
    • 개별 객체의 생성과 무관
    • 모든 객체가 공유하게 됨(공유 변수라고도 불림)
  • 변수의 초기화 : 타입 별로 default 초기화
  • 변수에의 접근 : 객체 생성과 무관하게 클래스 이름(소속)으로 접근
    • 객체를 생성하고 객체 이름으로 접근도 가능하나 static에 부합한 표현은 아님
  • 소멸 시점 : 프로그램 종료 시
  • 정적 : 거의 바뀌지 않음