Java - 변수, 형변환

BK·2024년 4월 4일
0

Java-Basics

목록 보기
1/6
post-thumbnail

변수

변수란 데이터를 저장하는 메모리 공간이다. 메모리 공간의 크기는 데이터 타입에 따라 달라질 수 있다.
변수(variable)이라는 이름 때문에 혼동 될 수 있지만, 변수(변하는 수)이기 때문에 데이터가 바뀌는 것이 아니라, 저장된 데이터의 값이 변할 수도 있기 때문에 변수라 부르게 되는 것이 조금 더 적합한 표현인것 같다.

데이터 타입

Java의 데이터 타입은 크게 기본형(Primitive type)과 참조형(Reference type)으로 나눌 수 있다.

  • Primitive type(기본형)은 지정된 크기의 데이터를 표현(?) 하기 위해 사용되며, 지정된 크기의 메모리 크기를 사용하며, 변수에 그 값 자체를 할당한다.
  • Reference type(참조형)은 미리 지정되지 못하는 크기의 데이터를 표현할 수 있으며, 값 자체가 할당되는 것이 아닌 참조할 주소가 할당된다.

Primitive types

기본형 데이터 타입은 크게 논리, 정수, 실수, 문자타입으로 나눌 수 있다.

CategoryTypebitValue
Logicbooleantrue/false
Integerbyte8-128 ~ 127
short16-32768 ~ 32767
int32-2147483648 ~ 2147483647
long64-2^63 ~ 2^63
Real numberfloat32+/- ( 1.4E-45 ~ 3.4E38 )
double64+/- ( 4.9E-324 ~ 1.8E308 )
Characterchar16\u0000 ~ \uFFFF
  • boolean 타입의 크기(bit)는 JVM에 따라 달라질 수 있으며, 정확하게 정의된 값이 아니다.
  • Java에서는 unsigned가 존재하지 않는다.
    그래서 이문제는 Java로 풀려면 고생해야 한다. https://www.acmicpc.net/problem/1270
  • 다른 언어들도 그렇듯이 실수형 데이터 타입의 값은 정확하지 않다. 1.1+0.1 != 1.2
  • float형과 double형의 차이는 단순히 bit수로 인해 표현할 수 있는 값의 범위가 넓은것은 아니다. Java 뿐 아니라 IEEE754에 지정된 실수형 데이터 표현 방식의 차이다.

float & double : IEEE754

IEEE754에 따르면, 실수형 데이터의 precision은 다음과 같다.

  • float(32bit) = S(1bit) + E(8bit) + M(23bit)
  • double(64bit) = S(1bit) + E(11bit) + M(52bit)
  • S, E, M은 각각 sign(부호), Exponent(지수), Mantissa(가수-fraction)를 의미한다.
  • Exponent는 데이터의 범위와 관련된 부분이고, Mantissa는 데이터의 유효 숫자의 수(number of significant number)과 관련된 부분이다. Normalization을 거치면 float과 double은 각각 24bit, 53bit의 Mantissa를 가지게 되는데 이를 통해
    - float은 7자리수(digit) : 10^7 < 2^24 < 10^8
    - double은 16자리수(digit)
    의 유효 숫자 수를 가지게 된다.
  • 이외에도 single precision, double precision 등의 차이가 있지만 자세한 내용은 추후 IEEE754, 부동 소수점에서 이에 대해 자세히 다루어 보겠다.

Java 변수 선언

Java에서 변수를 선언할 때는 2가지를 명시해주어야 한다.

  • 변수에 담을 데이터의 형태(type), 변수의 이름
int a; // 정수타입의 변수
Object obj; // Object type의 변수

위와 같이 변수를 선언한 후, 변수에 = 연산자를 통해 값을 할당할 수 있다.

a = 10;
obj = new Object();

변수 선언 단계에서는 변수의 타입에 따라 필요한 메로리가 할당되며, 할당 단계에서 메모리에 데이터를 삽입(?)지정(?)하게 된다.
위 두 과정은 하나의 line에서 아래와 같이 작성할 수 있다.

int a = 10;
Object obj = new Object()

new Constructor()는 생성자를 호출하여 객체를 생성하는 방식이다. 추후 Class에 관련한 포스팅에서 자세히 알아보도록 하겠다.

Type casting

Type casting은 크게 자동/수동 casting으로 나눌 수 있을것이다. (사실 틀린 표현이다)
Type casting은 기본형(primitive)타입 끼리, 그리고 참조형(reference)타입 끼리 수행될 수 있으며, 기본형과 참조형의 연산 중 수행되지 않는다. Wrapper class의 경우 해당하는 기본형 타입과의 Autoboxing과 unboxing을 지원한다.

Java의 Wrapper Class란 Integer, Long, Double 등 기본형 데이터를 객체로서 다루기 위해 사용하는 class이다.

Type casting은 명시적(explicit) 형변환과 묵시적(implicit) 형변환이 있으며, 묵시적(implicit) 형변환은 Promotion이라고도 부른다.

  • Promotion(implicit type casting)은 컴파일러에 의해 자동으로 작은 값에서 큰 값으로 casting을 수행하며(데이터 값의 크기가 아닌 타입의 크기) 과정에서 데이터의 값이 손실되지 않는다. (그러니까 바꿔주지)
  • Explicit type casting은 개발자에의해 명시되어 변환되며, 큰 값에서 작은 값(데이터 타입의 크기) 변환할 수 있지만, 그 과정에서 데이터의 값이 손실될 수 있다.

묵시적 형변환에 의해 변환될 수 있는 데이터 타입의 관계는 아래와 같다.

묵시적 형변환이 존재하지만, 웬만하면 직접 쓰자

문자열

Java의 String은 문자열을 나타내는 특별한 객체이다. 문자열은 다양한 방법으로 생성할 수 있다.

String str1 = "Hello"; // literal string
String str2 = new String("Hi"); // new String()

두 문자열은 생성되는 메커니즘이 다르며 JVM의 메모리 구조에서 저장되는 영역도 다르다.
Java의 문자열에 대해 설명하기에는 JVM의 메모리 구조에 대한 이해가 필요하기에, 이는 추후에 문자열에 대해 깊게 다루어 보겠다. 우선은 문자열 비교는 .equals()를 통해 하는것을 권장한다.

"Hello" + "World" 이런 연산은 편하지만(사실 나는 안편하다) 좋지 않은 방식이다. StringBuilder 많이 쓰는 것 같은데. 문자열에 대해서는 할 말이 많으니 다음 포스트에서 다뤄보겠다.

참조형 데이터

Reference type의 변수는 단순히 해당 인스턴스의 주소를 담고있다. 사실, Java의 모든 것(기본형 데이터 빼고)은 객체(?)이다. 모든 객체는 Object를 상속 받으며, 이에 대해 더 말하기에는 Java의 다형성에 대해서도 알아야 하니 이것 또한 추후에 다루어보겠다.
언어를 처음 배울 때 왜 자세히 설명하지 않고 넘어가는 일이 많은가 싶었는데 써보니까 알것 같다

변수명 작성(작명)

사실 위 내용들 보다 이게 더 중요하지 않을까 싶다. 진짜 어렵다
Java의 변수명 작성을 위해 알아야 할 몇가지 규칙이 있다.

  • Java의 변수명은 case-sensitive하다. 대소문자를 구분한다.
  • 첫 글자는 숫자로 시작할 수 없으며, 일반적으로 영어 소문자로 시작한다
    - 일반적으로 class는 대문자로 시작하게 해 구분한다.
  • 특수문자는 $_만 사용할 수 있다.
    - 웬만하면 _만 써라
  • Java의 예약어는 사용할 수 없다(당연하다)

이러한 규칙들이 있으며, 가능하면 camelCase를 사용하는 것을 권장한다. C언어로 시작하다 보니 아직 알고리즘 풀 때는 snake_case를 사용하는데 이것도 고치는게 좋겠다
사실 이러한 규칙은 하다보면 익숙해지니 제일 중요한 것은 알아보기 쉬운 변수 이름을 작성하는 것 아닐까 싶다. 이부분은 Clean code에 대해 공부하고, 가능하다면 지금까지 프로젝트에서 만났던 인상깊은(여러 의미로) 변수명과 함께 포스팅을 해보고자 한다. 포스팅 하나 했는데 할 포스팅이 몇개는 더 생겼다

요약

  • Java의 변수는 primitive type과 reference type이 있다.
  • Java는 특정 상황에서 promotion(묵시적 형변환)을 지원한다. 근데 웬만하면 직접 하자.
  • Java의 String은 복잡하다. 비교할 때 ==쓰지말고 .equals() method를 쓰도록 하자.
  • 변수명 작명은 어렵다.
  • 포스팅할 내용이 4개 더 생겼다

0개의 댓글