[Java] 변수와 자료형(Data Type), 형변환

승등·2023년 10월 2일
0

Java

목록 보기
1/4

변수(variale)


변수란 데이터(data)를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 의미하며 변수에 저장하는 데이터를 값(value)이라 한다.

한번 이름이 할당(선언)된 변수는 이름과 타입을 변경할 수 없으며, 변수에 저장된 값은 변경될 수 있다.

1. 변수의 선언

자바에서 변수를 사용하기 위해서는 반드시 변수의 선언이 선행되어야 한다.
변수를 선언하는 방법은 아래와 같다..

1) 변수의 선언만 하는 방법

[타입] [변수 이름];
: 먼저 변수만을 선언하여 메모리를 할당받은 후, 나중에 변수를 초기화 하는 방법.

  • 프로그램의 안정성을 위해 초기화 되지 않은 변수를 사용할 경우 컴파일러 오류 발생.
  • 선언된 변수의 타입과 다른 타입의 데이터를 저장하려고 하는 경우 컴파일러 오류 발생.

2) 변수의 선언과 동시에 초기화 하는 방법

[타입] [변수 이름] = [초기값];
: 변수의 선언과 초기화를 같은 열에서 수행하는 방법.

3) 동일한 타입의 경우 다수의 변수를 한번에 선언할 수 있다.

[타입] [변수 이름], [변수 이름];
[타입] [변수 이름] = [초기값], [변수 이름] = [초기값];

2. 변수 이름 생성 규칙

자바에서 변수, 상수, 메서드의 이름을 지을 때 반드시 지켜야 하는 공통 사항이다.

  • 문자(한글, 영문 등), 숫자, '$', '_' 를 사용할 수 있다.
  • 숫자로 시작할 수 없다.
  • '$', '_' 이외의 특수문자 사용은 불가능.
  • 한글자 이상으로 생성해야하며 길이 제한은 없다.
  • 공백을 포함할 수 없다.
  • 자바에서 미리 정의된 키워드(예약어)는 사용할 수 없다.

아래는 필수 사항은 아니나 변수 이름 생성 시 관례적으로 사용하길 권장하는 사항이다.

카멜 케이스(Camel Case): 프로그래밍에서 파일, 변수, 함수 등 대상의 이름을 띄어쓰기 없이 짓기 위하여 따르는 관례인 네이밍컨벤션(Naming convention)의 하나.

  • 변수 이름 생성 시 단어 전체적으로 소문자를 사용.
  • 2개 이상의 단어를 결합할 때는 변수명의 첫글자를 제외한 단어의 첫 글자만 대문자로 표기한다.

3. 변수 유형

변수의 선언 위치에 따라 다음과 같은 유형으로 구분할 수 있다.

1) 전역변수(Global variable)
클래스부에 선언된 변수들로 객체의 속성에 해당.
인스턴스 변수와 클래스 변수로 구분됨.
필드(Field) 혹은 멤버변수(Member variable) 이라고도 한다.

  • 인스턴스 변수(Instance variable)
    클래스가 인스턴스될 때 초기화되는 변수.
    인스턴스를 통해서만 접근할 수 있음.

  • 클래스 변수(Class variable)
    static으로 선언된 변수.
    인스턴스 생성없이 클래스이름.변수명으로 사용가능.
    main() 메서드에서 참조 가능.

2) 지역 변수(Local variable)
메서드 내에서 선언된 변수.
멤버변수와 동일한 이름을 가질수 있으며 지역변수가 우선.

3) 매개 변수(Parameter)
메서드에 인자로 전달되는 값을 받기 위한 변수.
메서드 내에서는 지역변수 처럼 사용됨.

자료형(Data Type)


자료형, 즉 데이터 타입(data type)은 변수에 저장하는 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 역할을 한다.

1. 자료형의 분류

  • 자바에서 제공하는 자료형은 크게 기본 자료형(Primitive Data Type)과 참조 자료형(Reference Data Type)으로 나뉜다.
  • 변수에 대입한 '실제 값'이 저장되면 기본 자료형, 변수에 데이터가 저장된 메모리의 '주소 값'이 저장되면 참조 자료형으로 구분할 수 있다.

2. 기본 자료형(Primitive Data Type)

  • 자바에서는 미리 정의된 8가지의 기본 자료형이 제공된다.
  • 실제 값을 가지는 자료형으로 기본값이 존재하므로 Null값을 가질 수 없다.
  • 스택(stack) 영역에 저장된다.
  • 자료형의 첫글자가 소문자로 시작한다.
  • 자료형의 세부적인 분류와 크기는 다음과 같다.

    정수형: byte(1byte), short(2byte), int(4byte,기본), long(8byte)
    실수형: float(4byte), double(8byte,기본)
    문자형: char (2byte, 유니코드)
    논리형: boolean (1byte, 참, 거짓(true or false))

1) 실수형 데이터의 오차

  • 이진법을 사용하는 컴퓨터의 특성 상 실수 값을 오차없이 표현할 수 없다.
  • 이런 오차를 최대한 완화하기 위해 거의 대부분의 프로그래밍 언어(자바를 포함한)에서는 실수의 표현하는 방식으로 부동 소수점(floating point) 방식을 사용한다.
  • 고정 소수점 방식에 비해 큰 범위의 실수를 표현할 수 있으나 여전히 오차가 존재한다. 따라서 매우 정확한 계산이 필요한 프로그램에서는 실수형 데이터 타입의 사용을 지양하는 것이 좋다.
  • float 타입은 소수 6자리까지, double 타입은 소수 15자리까지만 오차 없이 표현할 수 있다.

3. 참조 자료형(Reference Data Type)

  • 기본 자료형 8가지를 제외한 모든 데이터 유형.
  • 객체를 참조하는 변수 타입이기 떄문에 Null값을 가질 수 있다.
  • 변수의 메모리 공간(스택 영역)에 저장되는 값은 실제 값이 메모리 상에 저장된 위치를 알려주는 주소 값이며 실제 값은 힙 영역에 저장된다.
  • 자료형의 첫글자가 대문자로 시작한다.
  • 클래스형(Class Type), 배열형(Array Type), 인터페이스형(Interface Type), 열거형(Enum Type)등이 있다.
  • 대표적인 참조 자료형으론 문자열 객체를 참조하는 String이 있다.

3-1) 래퍼클래스(Wrapper Class)

  • 기본 자료형을 ‘객체(Object)’로 다루기 위해서 비 객체를 객체화 시키는 클래스로 “기본타입의 객체화”를 의미한다.

  • 기본 자료형(비 객체)를 객체화 시키는 과정을 기본 자료형을 클래스로 감싼다하여 '박싱(Boxing)'이라고 한다. (int -> Integer)

  • 반대되는 과정은 '언박싱(UnBoxing)'이라고한다. (Integer -> int)

  • 래퍼 클래스의 종류는 아래와 같다.

        분류        기본형         래퍼 클래스     
    논리형booleanBoolean
    문자형charCharacter
    정수형byteByte
    정수형shortShort
    정수형intInterger
    정수형longLong
    실수형floatFloat
    실수형doubleDouble

형변환


자료형을 다른 자료형으로 변환하는 것을 형변환(Type Conversion)이라 한다.
형변환은 상황 혹은 필요에 따라 자동적으로 발생하기도, 강제적으로 이뤄지기도 한다.

1. 형변환의 종류

1-1) 자동 형변환(Promotion)

  • 묵시적 형변환, 암시적 형변환 이라고도 함.
  • 컴파일러에 의해 자동적으로 이루어지는 형변환.
  • 작은 크기를 가지는 자료형 데이터를 큰 크기의 자료형에 저장할 때만 발생한다.
  • 데이터 손실을 최소화 하여 기존 값을 최대한 보존.
  • 실수형 값을 정수형으로 저장할때는 이뤄지지 않는다.
    (실수형으로 표현할 수 있는 값이 정수형보다 크기 때문.)
  • char 타입에서 int 타입으로 형변환 시 자동 형변환이 이루어진다.
    (해당 문자(아스키 코드)의 10진수에 해당하는 값이 int 타입으로 저장된다.)
int num1 = 10;
long num2 = num1; 
// num1의 '값'은 자동으로 long타입으로 변환되어 num2에 저장된다.
// 4byte로 저장된 값이 자동으로 8byte로 변환.

float num3 = 1.23f;
long num2 = num3; // 에러 발생. 
// 4byte의 float타입 값을 8byte의 long타입에 저장 시 자동 형변환이 이뤄지지 않는다.

1-2) 강제 형변환(Casting)

  • 명시적 형변환 이라고도 함.
  • 형변환 연산자를 사용하여 강제적으로 형변환을 수행한다.
  • 큰 크기의 자료형에서 작은 크기의 자료형으로 형변환 시 자동 형변환이 이루어지지 않아 강제적인 형변환이 필요하다.
  • 큰 크기의 자료형에서 작은 크기의 자료형으로 형변환 시 데이터의 손실이 발생할 수 있다.
    (또한 실수형에서 정수형으로 변환 시 소수점 아래의 값에 손실이 발생한다.)
  • 따라서 강제 형변환 시 데이터 손실이 일어나지 않도록 고려해야 하며 데이터 손실이 발생할 시 정확한 연산을 수행할 수 없어 예상하지 못한 결과를 얻을 수 있으므로 주의해야 한다.
  • boolean을 제외한 기본 자료형간은 자유로운 형변환이 가능하다.
  • int와 float 형변환 시 정밀도 손실이 발생할 수 있다. 따라서 정수형을 실수형으로 변환해야 할 시 double형을 사용하는 것이 좋다.
int num = 60000;
byte value = (byte)num;    // 96, 데이터 손실이 발생한다.

int num2 = 10;
byte value2 = (byte)num2;    // 10, 데이터 손실 발생하지 않는다.

객체 간 형변환

  • 클래스형이나 인터페이스형과 같은 객체 간에도 형변환이 가능하다.
  • 상속 혹은 구현관계에 있는 경우에 한해서만 가능하다.

2. 자료형 간 연산

**1) 같은 기본 자료형 간의 연산 결과**
연산결과
type 자료형 + byte 자료형int 자료형
short 자료형 + short 자료형int 자료형
int 자료형 + int 자료형int 자료형
long 자료형 + long 자료형long 자료형
float 자료형 + float 자료형float 자료형
double 자료형 + double 자료형double 자료형
char 문자형 + char 문자형int 자료형

2) 서로 다른 기본 자료형 간 연산 결과

연산결과
type 자료형 + short 자료형int 자료형
byte 자료형 + int 자료형int 자료형
short 자료형 + long 자료형long 자료형
int 자료형 + float 자료형float 자료형
long 자료형 + float 자료형float 자료형
float 자료형 + double 자료형double자료형
char 문자형 + int 문자형int 자료형

3) String과 기본 자료형간 형변환

연산결과
String 자료형 + 기본 자료형String 자료형
[기본자료형의 Wrapper Class].parse[기본자료형](String 자료형)기본 자료형
[기본자료형의 Wrapper Class].valueOf(string 자료형)기본 자료형의 Wrapper Class
[기본자료형의 Wrapper Class].toString([기본자료형])String 자료형
String.valueOf([기본자료형])String 자료형
"" + [기본자료형]String 자료형

String str = "123";
boolean flag = true;
char ch = 'A';
Integer.pasreInt(str); // (int형) 123
Double.parseDouble(str); // (double형) 123.0
Integer.valueOf(str); // (Integer형) 123
Boolean.toString(flag); // (String형) true
String.valueOf(ch); // (String형) A

Reference

https://dinfree.com/lecture/language/112_java_2.html#m2
https://sseoui.tistory.com/m/4
https://www.tcpschool.com/java/java_datatype_variable
https://www.devkuma.com/docs/java/data-type/
https://adjh54.tistory.com/119
https://inpa.tistory.com/entry/JAVA

0개의 댓글