Hello.java (코드 해석 + Data type)

안녕하세요.
이번에는 이클립스로 기초적인 예제를 다루어보겠습니다.


먼저, 이클립스 좌측에 package explorer에서 마우스 우클릭으로 new-class를 누릅니다.

그다음 아래 사진처럼 Name에 Hello라고 작성합니다.
자바는 대소문자를 구별하고, 클래스 이름은 첫글자를 대문자로 작성해야합니다.



다음은 작성한 코드입니다.



이클립스에서는 키워드를 위 사진처럼 보라색으로 표시해줍니다.
import, public, class, int, static, void 모두 키워드라고 보시면됩니다.
키워드는 모두 소문자로 작성해야합니다.
예를들어 public을 Public으로 첫글자를 대문자로 작성하면 키워드로 인식하지 못합니다.


1행 import java.lang.*;
1행은 사실상 모든 코드들에 있어서 자동적으로 내재되어 있는 부분 굳이 작성하지 않으셔도 됩니다. 
이클립스에서는 세미클론(;)을 붙여서 실행문이 끝났음을 반드시 표시해주어야합니다.

2행 public class Hello 
2행은 class를 정의하는 부분으로 Hello라는 클래스를 정의하겠다.
(Hello처럼 첫글자가 대문자면 거의 대부분 class입니다.)
(public은 추후 접근제한자에서 조만간 다루겠습니다.)

4행 int age = 100;
4행에서 int는 정수타입을 저장할 수 있는 타입을 의미하고, age는 변수를 의미합니다.
즉, age는 100이라는 정수를 int타입으로 저장하겠다는 뜻입니다.
7행에도 int age = 27; 이 있죠?
자바에서 데이터를 저장할 수 있는 위치는 메소드 안과 메소드 밖으로 나눌 수 있습니다.

데이터타입에 대해 아래 그림을 통해 설명드리고 6행으로 넘어가겠습니다.

데이터타입

데이터 타입에는 기본형과 참조형이 있습니다.
기본 타입이란 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입을 말합니다.
컴퓨터에서는 0과 1만을 인식하고 이를 다루는 최소 단위를 bit라고 부릅니다.
그리고 8bit를 바이트(byte)라고 부릅니다.

각 타입에 대해서 값의 범위를 정확하게 알 필요는 없지만, 이게 정수를 다루는 것인지, 실수를 다루는 것인지, 그리고 대략적으로라도 아는 것이 좋습니다.

1. 기본형(primitive)

1-1. 정수타입(byte, short, int, long)
정수타입으로는 byte, short, int, long이 있습니다. (1byte = 8bit)
byte 타입은 정수 타입 중에서 가장 작은 범위의 수를 저장합니다.
표현할 수 있는 값의 범위는 -128~127(-2^7~2^7-1)입니다.
여기서 -1이 들어간 이유는 0이 들어갔기 때문입니다.
값의 범위는 몇bit인지 생각하고 2의 지수에 해당 bit -1을 하시면됩니다.

그렇다면, short는 2byte = 16bit
값의 범위는 -2^15~2^15-1이 되겠네요.

나머지 각각의 타입은 몇byte인지위 그림에 표시되어있습니다.

int 타입은 사실상 정수를 다룰 때 가장 많이 쓰게 되는 기본적인 데이터입니다.
short와 byte를 더해도 int타입으로 변환한 후 결과 값도 int로 출력합니다.
만약 여기서 억지로 short나 byte로 바꿔도 지장은 없지만 굳이 안해도 되는 행동을 취했기 때문에 성능이 떨어진다고 볼 수 있습니다.

즉, 기본적인 정수 연산에서 int값의 범위에서 억지로 short나 byte를 쓰는 것은 문제는 없지만, 성능적으로는 나쁘기 때문에 int를 쓰는 것이 좋습니다.

long 타입은 수치가 큰 데이터를 다루는 프로그램에서 필수적으로 사용됩니다.
long타입 변수를 초기화 할 때 주의해야할 것은 int타입의 저장 범위를 넘어서기에 반드시 뒤에 long타입이라는 것을 표시해주어야합니다.

예를들어 
즉 int타입의 범위를 초과하는 숫자는(ex:10000000000000) 같은 경우 뒤에 L을 붙여줘야 정상적으로 받아들입니다.


1-2. 실수타입(float, double)
실수는 소수점이 있는 데이터를 저장하는 타입으로 float과 double이 있습니다.
자바에서는 double이 더 정밀한 값을 저장할 수 있기 때문에 기본적으로 double을 사용해야합니다. 

정수에서는 int, 실수에서는 double을 기본타입으로 간주합니다.

값이 큰 숫자를 L을 붙여 long으로 인식시킨 것처럼, float을 쓴다면 뒤에 f나 F를 붙여 float임을 나타내야합니다.

1-3. 논리타입(boolean)
boolean타입은 1byte로 표현되는 논리값(true/false)를 저장할 수 있는 타입입니다.
보통 boolean은 조건문에서  쉽게 접할 수 있는데요.
if(2<3){...} => 만약 3이 2보다 작다면 / 이면 true죠? 
즉 3이 2보다 작을 때는 {...}을 실행하겠다.
이럴 때 자주 사용합니다.


#타입변환


타입변환은 해당 타입을 가지고 다른 데이터타입으로 바꾸는 것을 말합니다.
아까 말씀드린 byte와 short의 연산은 int로 된다는 것도 타입변환이라고합니다.

작은 타입에서 큰 타입으로 가는 것은 Auto-casting(=promotion)
큰 타입에서 작은 타입으로 바꾸는 것을 explicit-casting(=demotion)이라고 부릅니다.

프로모션의 경우는 간단합니다.
byte value1 = 10;
int value2 = value1;

이것은 value1이라는 10의 값 byte값으로 저장했는데 int타입의 value2에 넣는다는 뜻입니다.

문제는 큰 타입에서 작은 타입으로 억지로 바꾸는 것인데, 이 때에는 목표 타입을 반드시 명시해야합니다.

int value3 = 3333333;
byte value4 = (byte) value3;

이러한 경우에는 원래의 값이 보존되지 않습니다. byte로 변환한다고 목표 타입을 명시해줬다고 하더라도 value4의 타입인 byte는 3333333을 넣을 크기가 안되기 때문입니다.

2. 참조타입
참조타입은 기본형으로 표현하지 못한다면 무조건 참조타입이라고 보시면 되겠습니다.
추후에 배우게 될 배열도 참조타입이라고 볼 수 있습니다.
지금은 이정도로 아시면 되겠습니다.



6행 public static void main(String[] args)
6행을 메인 메소드라고 부르는데 기계로 비유하자면 시동을 거는 엔진이라고 생각하시면됩니다. 모든 class가 main 메소드를 가지고 있는 것은 아니지만, 여러 class들이 존재 할 때 반드시 하나는 main 메소드가 있어야 실행이 가능해집니다.
(지금은 public static void main(String[] args)를 통째로 암기하시기 바랍니다.
main이라 쓰고 컨트롤+스페이스 눌러도 자동적으로 만들어지기도합니다.)

아무튼 6행을 기준으로 4행은 메소드 밖에 있는 데이터로 필드(멤버 변수)라고 부릅니다.
7행은 메소드 안에 있는 것으로 로컬 변수라고 부릅니다.

보통 사람들은 동네사람을 좋아하고 이방인들을 꺼려하죠?
main메소드에서도 age를 100(이방인)이라 주었다고 할지라도 안에서 27이라고 정했기 때문에(동네사람) 27로 받아들입니다.

8행 System.out.println("Hello 작년 정식의 나이는 " +age+"입니다");

System.out.println은 화면에 출력하겠다는 메소드입니다.
.을 기준으로 뒤가 앞의 것의 소유라고 했습니다.
println의 소유주는 out, out의 소유주는 System

System.out.print도 있는데 System.out.println과의 차이점은 println은 출력한 내용을 끝내고 한줄 내리겠다는 차이가 있습니다. (ln은 라인의 약자로 라인을 한줄 내리겠다)

""안의 내용은 그대로 출력하겠다는 것인데,
Hello 작년 정식의 나이는 
까지는 그대로 출력되고 
+age는 그 뒤에 더해서 age(27)을 넣겠다

Hello 작년 정식의 나이는 27

+"입니다"는

Hello 작년 정식의 나이는 27입니다

로 출력됩니다.

9행 age=age+1;
연산을 할 때에는 오른쪽을 먼저 계산하고 왼쪽에 값을 넣습니다.
즉 age에 1을 더한 값을 age에 넣는다는 것인데 age가 27에 1을 더해서 28이 된다는 것을 뜻합니다.
여기서는 int가 안들어갔는데 그 이유는 데이터타입(ex:int)은 어떠한 변수를 처음 선언할 때에만 사용하기 때문입니다.





요약
Hello라는 class를 만들겠다.
멤버변수로 age를 100 정했고, 로컬변수로 age를 27로 정했다.
메소드 안에서는 로컬변수(동네사람) 우선으로 취급하기에 27로 받아들인다.
출력화면은 처음에는 
"Hello 작년 정식의 나이는 27입니다" (println이니 한줄 내린다.)
9행에서 1을 더했으니 
다음 줄에서
"Hello 작년 정식의 나이는 28입니다" 

결과화면




















댓글 없음:

Powered by Blogger.