전체 글 (3)

11
25

pixabay 저작권 무료 이미지 by thehalaldesign

 

형 변환(Casting / Type Conversion)

형 변환은 어느 한 변수에 담았던 값을 다른 변수 타입에 담는 것이다.

[1주차] 1. 기본 자료형과 변수 - 기본편을 이미 보았다면 이렇게 생각해보자.

 

파티 가방으로 쓰는 엘리자베스장바구니로 쓰는 마봉팔이 있다. 원래라면 엘리자베스에 파티 물품을 넣고, 장바구니에 마트 물품을 담을 것이다.

 

하지만 당신이 파티 가방에 마트 물품을 넣고 싶다면 어떨까? 프로그래밍에서는 그러한 행위가 불가능한 것일까?

 

한 마디로 답하겠다. 가능하다.

 

우리는 일전 포스트에서 기본 자료형의 종류를 알아보았다. 그 중 boolean을 제외한 7개의 기본형은 서로 형변환이 가능하다.

 

다른 말로 말하자면 우리가 옛날에 공병 팔아 엿 바꿔 먹었듯이, 이 7개의 기본 자료형들은 서로 변수를 바꿔먹는 형 변환을 해도 상관 없다는 것이다.

 

형 변환의 종류에는 자동(묵시적) 형 변환과 강제(명시적) 형 변환이 있는데, 이 두 가지를 알아보도록 하자.

 

 

 

자동-묵시적 형 변환(Automatic-Implicit Type Conversion)

자동 형 변환. 이름부터가 그 성질을 대변하고 있지 않은가? 우리가 뭘 난리치고 지지고 볶든 그냥 자동으로 형이 변환된다는 거다.

 

 

기본 자료형 중 정수형에는 byte, short, int, long이 있고 실수형에는 float와 double이 있다고 말했었다. 각기 다른 범위도 간단히 소개를 했었는데, 이 범위가 형 변환이 자동일지 강제일지를 정하는 열쇠가 된다.

 

정수형은 long, int, short, byte순으로 크며, 실수형은 double, float 순으로 크다.

 

좁히는(자동) 형 변환과 늘리는(강제) 형 변환

java T point website

 

위의 이미지는 그 범위를 나타내고 있다. 소수점을 포함할 수 없는 정수형은 소수점도 포함할 수 있는 실수형보다 크다고 보기 때문에 double가 float가 가장 큰 범위로서 자리잡고 있다. 단, float는 long보다 4바이트 적은 범위의 숫자를 나타낼 수 있다는 것에 유의해야 한다.

 

 

byte -> short -> char -> int -> long -> float -> double

 

byte b = 17;
int i = b;

System.out.println(i);			// 결과 = 17

 

위의 예제는 byte형인 b를 int형인 i에 담은 것이다.

 

위와 같이 작은 숫자를 더 큰 숫자 안에 담는 것에는 문제가 없다. 소주잔에 들어있는 소주를 맥주잔에 넣으려고 하면 어떨까? 문제가 생기나?

 

전혀 생기지 않는다. 당신은 맛있는 소맥을 말아먹을 수 있을 것이다.

 

작은 잔에 담겨있던 내용물을 큰 잔에 옮긴다 한들 그 어떠한 불편도, 에러도 따르지 않는다.

 

이렇게 작은 범위(byte)로 선언되었던 변수(b)를 더 큰 범위(int)의 변수(i)에 담으려 할 때는, 자동적으로 형 변환 (byte -> int)이 되어 문제 없이 형 변환을 할 수 있게 된다.

 

이를 자동 형 변환 또는 묵시적 형 변환이라 한다.

 

 

 

강제-명시적 형 변환(Manual-Explicit Type Conversion)

위에서 자동 형 변환에 대한 설명을 들었을 때, 당신은 궁금해 했을 것이다.

 

그렇다면 더 큰 범위로 선언된 변수를 작은 범위로 선언된 변수 안에 담고 싶다면 어떻게 해야할까?

 

 

그러한 경우에는 강제 형 변환(명시적 형 변환)을 적용해야 한다.

 

double -> float -> long -> int -> char -> short -> byte

 

int i = 17;
byte b = (byte)i;

System.out.println(b);			// 결과 = 17

 

위의 예제는 int형인 i를 byte형인 b에 담은 것이다. 아까와 변수의 순서만 바꾸었다.

 

위와 같이 큰 범위(int)로 선언되었던 변수(i)를 더 작은 범위(byte)의 변수(b)에 담으려 할 때는, 자동적으로 형 변환이 되지 않기 때문에 직접 형 변환을 선언해주어야 한다.

 

형 변환은 삽입되는 변수 앞에 (들어가질 더 큰 자료형)을 붙이면 된다. 위에서 i 앞에 (byte)를 붙인 것처럼 말이다.

 

만일 (byte)를 앞에 붙이지 않는다면 Type mismatch: cannot convert from int to byte라는 메세지와 함께 에러가 뜨며 프로그램을 실행할 수 없게 될 것이다.

 

더보기

💡  Java에서 쓰여지는 모든 정수의 기본형은 int, 실수의 기본형은 double이다.

 

사용자의 편의를 위해 byte b = 12;라고 해도 Java는 아무런 문제 없이 그것을 byte로 받아들이게 된다. 하지만 long에 12,345,678,910이라는 수를 넣으려 한다면 오류가 뜰 것이다. long의 범위 내에서 담을 수 있는 숫자인데도 말이다. 이는 12,345,678,910을 int로 인식하기에 생기는 문제이다.

 

따라서, long에 int 범위 이상의 값을 대입하려면 long에 대입한다는 표시로 숫자 뒤에 알파벳 L을 넣어줘야 한다. 이는 간단한 강제 형 변환이다. 소문자로 넣어줘도 문제가 없으나 숫자 1과 혼동 할 수 있으므로 대문자를 넣는 것이 좋다.

 

long l = 12345678910L;

 

실수형의 기본형이 double이기에 생기는 문제도 있다. 우리는 큰 범위의 변수를 작은 범위의 변수에 담으려면 강제 형 변환을 해야 한다고 했다. float라는 작은 범위의 변수에 큰 범위의 변수값인 double형의 실수를 넣을 수는 없다. 그래서 우리는 long의 경우와 마찬가지로, float의 값 뒤에 f를 붙여주어야 한다. 이 또한 대소문자 상관이 없다.

 

float f = 1.6f;

 

 

오버플로우(Overflow)

 

몇몇 독자는 궁금해 할지도 모르겠다.

 

그렇다면 특정 자료형 A의 범위 이상인 값을 자료형 B의 변수에 담고, 그 변수를 강제 형변환 하여 A에 대입했을 경우 어떻게 될까? 잘 들어갈까? 

 

그런 경우, 들어가긴 들어가지만 잘 들어가지는 않는다.

 

이게 무슨 말이냐면, 값이 들어가지기는 하나 손실되는 값이 생긴다는 것이다.

 

 

Copyright free image by Zac Harris

 

COMMENT
 
11
24

pixabay 저작권 무료 이미지 by Shafin_Protic

 

자료형은 자료의 형태, 변수는 변하는 수 아니야?

 

당신이 자료형과 변수가 무엇인지 배우지 않은 채 그 단어만을 본다면 위와 같은 생각을 할 수도 있다. 필자도 일전에 그러한 적이 있다.

 

모 영단어- self-explanatory -처럼 단어의 형태 스스로가 그 뜻을 알려주고 있다고 생각하며 그런 답을 주었다면 당신은 절반 정도 맞았다. 축하한다.

 

하지만 우리들은 절반의 성공과 이해만으로는 살아남을 수 없는 사회에 살고 있기에 더욱 깊은 설명으로 들어가보자.

 


변수(variable)는 특정 값(들)을 저장하기 위한 저장공간이고, 자료형(data type)은 그러한 변수의 성질을 나타내는 자료의 모습이다.

들어도 무슨 뜻인지 잘 모르겠는가? 그렇다면 아래의 예제를 살펴보도록 하자.

 

예를 들어 당신이 파티에 간다고 하자.

그러면 당신은 엘리자베스라는 이름의 파티용 가방을 챙기고 파티 물품을 가방에 넣을 것이다.

엘리자베스는 변수이고 파티용 가방은 자료형이며 파티 물품은 변수에 들어간 값이다.

 

예를 들어 당신이 마트에 간다고 하자.

그러면 당신은 마봉팔이라는 이름의 장바구니를 챙기고 마트 물건을 가방에 넣을 것이다.

마봉팔은 변수이고 장바구니는 자료형이며 마트 물건은 변수에 들어간 값이다.

 

예를 들어 당신이 '1, 유, 6, 사연, 87, 수정'이라는 단어와 숫자들 중 숫자만을 고르고 싶다고 하자.

그러면 당신은 num이라는 이름의 int를 쓰고 1, 6, 87을 넣을 것이다.

num은 변수이고 int는 자료형이며 1, 6, 87은 변수에 들어간 값이다.

+ int형인 num에는 여러 값이 들어갈 수 없고 자료형이 array(배열)인 경우에만 여러 값이 저장될 수 있다고는 하지만 일단 무시하도록 하자. 우리들은 초보가 아닌가.

 

이제 어느정도 감이 오는가?

 

변수의 타입(자료형)에는 기본형(primative type)과 참조형(non-primative or reference type)이 존재한다. 아래의 표를 한번 살펴보자.

 

자바의 자료형 설명도 by Neotam in getKT (his/her blog)

Neotam's blog

 

기본형 (Primative type)

 

변수의 타입이 기본형일 경우, 변수는 변수의 실제 값을 저장한다.

기본형에는 정수형, 실수형, 문자형, 논리형이 존재하는데 각자의 형에 해당하는 자료형이 따로 있다.

 

 

정수형(Integers): byte, short, int, long

정수형의 구성원인 byte, short, int, long은 그 이름처럼 '정수'만을 다룬다. 소수점이 포함된 실수, 문자 등등은 이 정수형에 담을 수 없는 것이다.

 

각 구성원은 그 값을 담을 수 있는 범위도 다른데 byte는 1바이트만큼(-128 ~ 127), short는 2바이트만큼(-32,768 ~ 32,767), int는 4바이트만큼(대략 21억 즈음), long는 8바이트만큼(매우 긴 길이)을 담을 수 있다고 한다.

때문에 어느 변수에 128이라는 값을 넣고 싶으면 byte가 아닌 다른 정수형을 사용해야 옳은 것이다.

 

실수형(Floating point): double, float

실수형은 정수는 물론 소수점을 가진 실수까지 담을 수 있는 자료형이다. 이도 정수형과 같이 두 구성원의 범위가 다르다. double은 -1.8 x 10^308 ~ 1.8 x 10^308, float는 -3.4 x 10^38 ~ 3.4 x 10^38의 범위를 가진다.

 

문자형(Character): char

문자형은 한 글자로만 이루어진 문자를 담을 수 있는 자료형이다. A는 괜찮아도 Apple 같은 단어는 담을 수 없는 것이다. 단, '벌'과 같이 ㅂ, ㅓ, ㄹ로 이루어진 단어도 하나로 합쳐지면 하나의 단어로 봐준다.

 

문자형을 사용할 때에는 값의 양 옆을 싱글쿼터(')로 감싸주어야 한다.

 

논리형(Boolean): boolean

논리형은 그 이름 그대로 논리의 값을 담는 자료형이다. 논리형에 들어갈 수 있는 값은 참(true)과 거짓(false), 두 가지로 구성되어 있다.

 

기민한 독자라면 정수형의 int와 실수형의 double이 강조되어 있는 것을 알아차렸을 것이다. 이 둘은 기본 타입(default type)이라고 불리는데, 기본편에서 이에 대한 설명은 추가로 하지 않고, 정수나 실수로 된 값은 기본적으로 각각 int와 double로 인식된다는 말 정도만 하겠다.

 

기본 자료형에 대해 알아보자.

byte b = 129;				//byte의 범위 -128~127 초과!
short s = 250;
int i = 32903;
long l = 91283092L;

// System.out.println(변수 이름);은 결과값을 출력하는 데에 쓰이는 출력문이다.
System.out.println(b);			//결과 = Error! 프로그램이 돌아가지 않는다.
System.out.println(s);			//결과 = 250
System.out.println(i);			//결과 = 32903
System.out.println(l);			//결과 = 91283092


// +배움 플러스+

// 변수끼리 더한(뺀, 곱한, 등등) 값을 새로운 변수에 저장하는 것도 가능하다.
int x = 5;
int y = 6;
int z = x+y;
System.out.println(z);			//결과 = 11

/* 
 * 긴 주석
 * 긴 글자도 적을 수 있다.
 */
더보기

💡 코드블럭에 있는 코드에 //를 넣으니 글씨가 회색이 되었다.

JAVA에서 //를 친다는 것은 그 칸에 오는 말을 주석 처리 하겠다는 선언이 된다.

/* ~*/ 은 긴 주석이다. 창에 /*만 치고 엔터를 하면 저절로 뒤의 부분이 생기게 된다.

 

참조형 (Non-primative or Reference type)

반면 참조형은 객체의 주소를 저장한다. 새로운 클래스를 정의하면 새로운 참조형이 하나 생성된다고는 하는데 이건 뭔 소린지 모르겠다. 필자도 이건 아직 안 배웠다. 당장 앞의 몇 주간 사용할 지식이 아니기 때문이다.

 

기본형이라며 위에서 소개한 자료형이 아닌 모든 자료형은 참조형이다. 이 중 String은 명예 기본형이라는 타이틀을 줘야 할 정도로 자주 사용된다. 문자형인 char에 비해, 문자열형이라 불리는 String은 여러 글자를 값으로 담을 수 있다는 이점이 있다. 때문에 문자를 변수에 담을 때에는 대부분 char 대신 String을 사용한다.

 

이후에 나올 코딩에는 기본적으로 기본형만이 쓰이다 싶이 할 것이기 때문에 참조형은 후에 자세히 알아보는 시간을 가지도록 하겠다. 참조형 중에서는 String, 원한다면 Array까지만 기억해두면 된다.

Array는 배열이라는 뜻으로, 여러 값을 담을 수 있는 변수의 자료형이다.

 

 

 

이번 포스트에서는 기본 자료형과 변수에 대해 알아보았다. 간단히 축약해 기본적인 것에 대해서만 서술한 것이니, 무엇 하나 배울 때 모든 세세한 것까지 다 알아두는 것을 좋아하는 필자와 같은 변태는 심화편을 봐주길 바란다.

COMMENT
 
11
24

pixabay 저작권 무료 이미지 by lakexyde

어떤 프로그래밍 언어를 배워야 할까?

 

IT 관련 공부나 산업에 발을 들인 사람은, 입문자 시절에 누구나 한 번쯤 고민해보았던 주제일 것이다.

 

필자도 현재 입문자로서 컴퓨터 프로그래밍에 들어선 시점에서 여러 번 물어보았던 익숙한 질문인데, 질문을 던진 대상이 책이든 선배든 영상매체든 백이면 아흔 아홉은 늘 아래와 같은 답변을 주었다.

 

그건 당신이 무엇을 하고 싶은지에 따라 다르다.

 

그 어떠한 프로그래밍 언어도 완벽할 수는 없다. 각자가 각자의 목표에 맞추어 형성되었고, 때문에 당신의 성취목적이 불분명한 상태에서 어떤 것이 좋은지에 대한 명확한 답변을 내릴 수는 없는 것이다.

 

우리가 살고 있는 이 세계의 언어들이 그러하듯이 우월한 프로그래밍 언어도 열등한 프로그래밍 언어도 없다.

 

다만 더 자주 사용되는 언어, 배우는 것이 비교적 더욱 어려워 배웠을 때에 취업경쟁에서 유리할 수 있는 언어, 성장의 추세가 더욱 크거나 미래에도 사용될 확률이 높은 언어가 있을 뿐이다.

 

JAVA는 배우는 것 자체는 어렵지 않으나 프론트엔드를 위한 HTML이나 CSS보다 어려워 경쟁력이 비교적 높고, 과거를 더불어 현재에도 자주 사용되는 유명한 프로그래밍 언어이다. 성장 추세는 Python을 이길 수 없으나 IT회사에서 실무를 할 때 JAVA를 사용할 일이 적지 않을 것이다.

 

Python은 쉽고 개발자 친화적인 언어이다. 이러한 탓에 Python을 배우면 경쟁적 이점이 없을 거라 생각할 수 있지만 그것은 큰 오산이다. Python은 전례없는 급격한 성장 추세를 보이며 가장 유명한 프로그래밍 언어 중 하나로 자리잡았다. 배우기도 쉬운 Python이 유명하기도 하니, Python을 배우는 것은 이제 프로그래머의 교양과 다름 없는 것이 되어가는 것 같다.

 

이러한 점을 고려해본다면 JAVA와 Python은 충분히 배울 가치가 있는 프로그래밍 언어이다. 그리고 이 두 언어는 필자가 참여하게 된 내일배움카드 국비지원 교육 프로그램의 주요 두 프로그래밍 언어이다.

 

pixabay 저작권 무료 이미지 by 200degrees

필자는 경기도 수원의 휴면교육센터에서 'JAVA, Python 기반의 AI활용 응용 소프트웨어 개발자 양성과정'이라는 프로그램에 참여하게 되었다. 2021년 11월부터 2022년 6월까지 평일마다 8시간씩 이루어질 길고 긴 하나의 교육 과정이다.

 

이 교육 과정에서 필자는 백엔드를 위한 JAVA와 Python은 물론 프론트엔드를 위한 HTML과 CSS, 그리고 두 영역에 모두 사용할 수 있는 JavaScript를 배울 예정이다. 또한 학생들에 따른 수업 진도의 페이스에 따라 다른 언어들도 더 배울 수 있는 모양이다.

 

필자는 교육을 수료하며 할 공부를 기록함과 동시에 취업을 위한 이점을 얻고 싶어 본 블로그를 개설하게 되었다.

 

아직은 무엇하나 제대로 아는 것이 없는 병아리와 같은 상태이지만, 교육을 수료하고 블로그에 기록하며 배운 것과 얻은 것을 잃지 않고 더욱 성장해 한 회사의 번듯한 일원이 되는 미래를 꿈꾼다.

COMMENT
 
1