공부내용 정리 Java :: 기초I
# 서론
기초 학습에 앞서, 자바가 무엇인지에 대한 개괄적인 이해를 위하여, 입문이라는 내용으로 자바를 훑어보았다. 이제는 자바의 세세한 내용을 다시 한번 학습함으로써, 자바에 대한 이해도를 제고하고자 하였다. 입문에서 학습하였던 내용을 자세하게 복습하여 개념을 재확립하고자 함이 본 기초 학습내용 정리의 목표이다.
본 내용은 생활코딩의 자바 수업을 수강한 내용을 정리한 것이고, 필자가 주관적으로 중요하다고 판단한 내용을 서술하였다. 필자는 모든 학습은 다른 내용보다도 기초가 가장 중요하다고 생각하기 때문에, 중복적인 내용이 존재하더라도, 다시 한번 세세히 복습하고 그 내용을 정리하였다.
1. 자료형(Data Type)
모든 프로그래밍 언어에서 가장 중요한 부분은 자료형(资料形)이다. 컴퓨터가 인식하는 자료의 형(形)에 따라 연산의 방식과 취급하는 방식이 달라진다. 자료형에 대한 구분과 개념이 미흡하다면, 향후 어떠한 프로그램을 구성할 때 곤란한 일을 종종 마주하게 된다.
모든 언어의 초입에서 반복적으로 학습하는 내용이 자료형이지만, 소홀히 여기지 않고 중요시하여 몇 번씩 복습해도 지나치지 않은 부분이 자료형이다.
1-1) 숫자 자료형
프로그램을 다루는 데 있어 가장 많이 마주하는 자료의 형식은 숫자이다. 컴퓨터가 다루는 숫자와 우리가 현실에서 다루는 숫자는 괴리가 있다.
자바에 있어서 숫자는, 따옴표가 없이 쓴 숫자를 숫자로 인식한다. 우리에게 있어 1이나 "1"이나 마찬가지의 1이지만, 자바에서는 이 두 개의 숫자가 다른 의미를 갖게 되는 것이다. 전자의 1이 바로 프로그래밍에 있어 숫자형 자료인 것이다.
이러한 숫자형 자료는 정수와 실수 등을 구분 가능하고, 실제로 구분하여 사용하지만 이번 장에서는 그러한 모든 것을 숫자형 자료로서 포함시켜 학습하였다.
숫자 자료형은 여러 가지 연산이 가능하다. 대표적인 연산으로는 사칙연산이 있는데 자바에서 사칙연산은 다음과 같이 진행한다.
public class Number {
public class Number {
public static void main(String[]args) {
System.out.println(1+2);
System.out.println(3-2);
System.out.println(4*2);
System.out.println(10/2);
}
}
}
위에서부터 차례로 덧셈, 뺄셈, 나눗셈, 곱셈의 연산자이다. 이 외에도 여러 가지 연산이 가능한데, 상세한 내용은 다른 장에서 다루도록 한다.
1-2) 문자 자료형
자바는 문자(Character)와 문자열(String)을 구분한다. 문자는 의미 그대로 하나의 자(字)만을 인식하고, 문자열은 그러한 문자가 여러 개 모인 것을 의미한다.
자바에서 문자(Char)는 작은따옴표 ' '로 감싸서 문자인 것을 표현하고, 문자열은 큰 따옴표 " "로 감싸서 문자열인 것을 표현한다. 문자열은 문자를 포함한다. 즉 문자를 큰 따옴표로 감싸도 문제가 되지 않는다는 것이다. 하지만 문자는 문자열을 포함할 수 없다. 즉 여러 개의 문자를 작은따옴표로 감싸서 사용하는 것이 불가능하다는 의미이다.
public class String {
public class String {
public static void main(String[]args) {
System.out.println('a'); // 가능
System.out.println("a"); // 가능
System.out.println('ab'); // 불가능
System.out.println("ab"); // 가능
System.out.println("나는 "자바 공부가 즐겁다."라고 이야기 하였다."); // 불가능
System.out.println("나는 \"자바 공부가 즐겁다.\"라고 이야기 하였다."); // 가능
}
}
문자와 문자열의 구분에 대한 상세는 상기 코드와 같다.
서술한 바와 같이, 자바는 문자와 문자열을 ' ' 와 " " 로 구분하기 때문에 같은 문자열 안에 큰 따옴표가 두 개 이상 들어간다면 오류를 발생시킨다.
가령 예제와 같이 "나는 "자바 공부가 즐겁다."라고 이야기 하였다."와 같이 내가 무언가 이야기한 부분을 인용하고자 하여 큰따옴표를 재사용한다면 자바는 큰 따옴표로 둘러싸인 "나는 "과 "라고 이야기 하였다."를 문자열로 인식하고 (자바 공부가 즐겁다.)는 인식하지 못하는 상황이 발생하는 것이다.
그러나 "나는 "자바 공부가 즐겁다."라고 이야기 하였다."처럼 따옴표를 중복하여 사용해야 하는 경우가 필연적으로 발생할 것이고, 그것에 대한 해결책이 필요할 것이다.
이때 자바에서 컴파일을 해주는 JVM에게 문자열 안에 내포된 " "이 문자열의 시작과 끝을 알리는 구분자가 아니라 그저 문자열 안에 포함된 문자열이다 라는 것을 알려주어야 한다. 이때 사용하는 것이 바로 이스케이프(Escape)이다.
이스케이프의 사용법은 간단하다. 이스케이프 하고자 하는 글자 앞에 \(역슬래쉬)를 붙여주면 된다. 이렇게 하면 컴파일러가 해당하는 글자를 문자로 인식하여 해석할 수 있게 되는 것이다.
2. 변수(Variable)
변수는 변할수 있는 수를 의미한다. 여기서의 수는 숫자의 수를 의미하는 것이 아니라 변할 수있는 어떠한 것을 의미한다. 변수는 용기(容器)와 같다. 어떠한 값을 담을 수 있고, 담았던 값을 빼고 새로운 값을 담을 수도 있다. 또한 변수는 대명사(代名词)와도 같다. 어떠한 값에 이름을 짓고, 이름을 불러서 그 값을 호출하는 역활을 하기도 한다.
이러한 기능이 있는 변수가 있기에, 프로그램이 효율적으로 돌아갈 수 있는 것이다.
2-1) 변수의 선언 및 할당
변수라는 것을 이용하기 위해서는 우선, 프로그램에 변수를 선언하여야 한다. 즉, 선언하고자 하는 변수의 이름에 들어갈 값을, 향후 그 변수의 이름으로서 사용할 것이라고 프로그램에게 알려주어야 하는 것이다.
자바는 변수를 선언할때는 하기와 같은 문법을 사용한다. 다른 언어와 구분할만한 특징은 바로 변수 앞에 자료의 형식을 표기하는 것이다.
int a; // a라는 변수를 만들었다. (선언하였다)
a = 1; // a라는 변수에 1이라는 값을 주었다.(할당하였다)
// 변수를 이용한 연산
System.out.println( a + 1 ); // 2
상기 예제의 변수는, 1이라는 값은 앞으로 a라는 이름으로 부를 것이고, a라는 이름에는 숫자형 자료중에 정수(integer)만 사용할 것이다. 라는 취지로서 사용된 것이다.
이렇듯 자바에서 변수는 선언할 때 해당 변수에 할당될 자료의 형식을 앞에 표기해주어야만 한다. 스크립트 언어에서는 변수를 선언할 때 사용할 자료형에 대하여 표기를 미루어 두었다가 인터프리터가 알아서 해석하지만, 자바는 프로그램을 제작할 때 먼저 변수에 대한 자료형 선언을 해주어야 하는 것이 특징이다.
여러가지 자료형에 대한 변수 선언에 대한 실습과 예제는 하기와 같다.
// 실수(实数) 자료형 변수
double b = 1.1;
// 문자열(文字列) 자료형 변수
String c = "이것은 문자열 입니다."
예제와 같이, 할당할 값에 대한 자료형을 변수의 이름 앞에 표기해주어야 오류없이 컴파일이 가능하다.
3. 주석(Comment)과 세미콜론
다른 언어와 마찬가지로 자바에도 주석(Comment)이 존재한다. 주석은 로직에 대한 설명이나 코드를 비활성화 할 때 주로 사용된다. 주석은 컴파일 할때 컴퓨터가 인식하지 않도록 만들어 놓은 장치로서 사용된다.
자바에서의 주석처리는 다음과같이 존재한다.
3-1) 주석(Comment)
public static void main(String[] args) {
// 한줄주석은 두개의 슬래시(/)를 사용한다.
}
public static void main(String[] args) {
/*
여러줄 주석은
/* 와 */로 시작과끝을정한후 사용한다.
*/
}
public static void main(String[] args) {
/**
* Java Doc 주석은 /**로 시작하여 */로 끝나며
* 이렇게 사용한다.
* 자바의 문서를 만들때
* 주로 사용한다.
*/
}
자바에서의 주석처리는 상기의 예제와 같이 사용한다.
3-2) 세미콜론
세미콜론은 코드의 문장(Statement)의 끝을 의미한다. 자바에서는 문장의 끝에 세미콜론( ; )을 사용하지 않으면 컴파일시 에러가 발생하게된다. 세미콜론을 기준으로 문장이 끝남을 판별하기 때문에 세미콜론을 사용하였다면 다른의미의 문장을 한줄에 사용하여도 컴파일시 오류가 발생하지 않는다. 다음과 같다.
int a = 20; int b = 70;
상기 예제와 같이, 동일한 행에 두개의 변수를 선언하여도 세미콜론을 기준으로 해석하기 때문에 컴파일시 오류가 발생하지 않는다.
4. 자료형(Data Type) 심화
1장에서 다룬 자료형에 대하여 보다 자세하게 학습하였다. 컴퓨터에서 사용하는 데이터는 각각 크기(용량)을 갖고 있고, 그 용량 그리고 용도에 맞추어 형식이 나누어져있다.
자료형에 대하여 보다 자세히 학습하기 전에, 데이터들의 크기가 무엇인지 또 어떻게 이루어져있는지에 대하여 선수학습을 진행하였다.
4-1) 데이터의 크기
컴퓨터상의 데이터는 크기로서 그 단위를 측정할 수 있다. 현실에서 길이를 측정하기 위한 단위는 mm, cm, m, km로 구분되어진다. 하나의 단위로 큰 단위를 모두 표현하는것이 불편하기 때문에 상위단계를 만들어 측정하고 관리하도록 설계되어있는 것이다.
컴퓨터에 있어서 데이터의 단위 역시 마찬가지이다. 일정한 크기로 단위를 만들고, 그 단위별로 이름을 지어 사용하는 것이다. 컴퓨터의 데이터 단위, 즉 데이터의 크기는 하기 표와 같다.
<표 1> 데이터의 크기
8 bit | 1 byte |
1024 byte | 1 kilobyte (KB) |
1024 kilobyte (KB) | 1 megabyte (BM) |
1024 megabyte (MB) | 1 gigabyte (GB) |
1024 gigabyte (GB) | 1 terabyte (TB) |
1024 terabyte (TB) | 1 petabyte (PB) |
1024 petabyte (PB) | 1 exabyte (EB) |
1024 exabyte (EB) | 1 zettabyte (ZB) |
데이터의 크기에서 가장 작은 단위는 1비트이다. 8개의 비트가 모이면 1바이트라고 일컫는다. 1024개의 바이트가 모이면 킬로바이트, 1024의 킬로바이트가 모이면 메가바이트, 1024의 메가바이트가 모이면 기가바이트가 된다.
4-1) 데이터의 크기와 데이터의 타입
1장에서 다루었던 내용과 동일하게, 숫자형 자료에는 실수와 정수가 존재한다. 현실에서는 수를 더 많은 기준으로 구분하고 사용하지만, 컴퓨터에 세계에서는 실수와 정수 정도로 구분한다고 하여도 될것이다.
다음은 정수형과 실수형 데이터 타입의 보다 상세한 내용이다.
i ) 정수형
데이터 타입 | 메모리의 크기 | 표현 가능 범위 |
byte | 1 byte | -128 ~ 127 |
short | 2 byte | -32,768 ~ 32,767 |
int | 4 byte | -2,147,483,648 ~ 2,147,483,647 |
long | 8 byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
상기 표는 정수에 해당하는 데이터 타입의 리스트이다. 모두 정수와 관련된 수를 표현하기 위하여 만들어진 자료의 형식인 것이다. 다 똑같은 숫자를 나타내기위함이라면 어떤것이 차이인가
각각의 데이터 타입은 처리가 될 때 사용되는 메모리의 용량(메모리의 크기)이 다르고, 표현할 수 있는 수의 범위가 다르다. (표현가능범위)
가령 byte 형식으로 변수를 선언하고 128이라는 숫자(표현가능범위를 초과한)를 할당한다면, 오류가 발생하여 컴파일을 할 수가 없게 된다.
그러나 특수한 목적에 따라 보다 빠르고 효율적으로 일을 처리하기 위해서, 해당 변수의 범위를 정확하게 파악하고 있다면, 적재적소에 알맞는 자료형을 사용하여 선언해 주는 것이 프로그램에 있어서 고효율을 낼 수 있는 길일 것이다.
일반적으로 가장 많이 쓰이고, 가장 연산과 처리속도가 빠른것은 int이다.
byte와 short는 다른 명기 없이 그냥 int로 선언하여 사용할 수 있는 반면, long 타입으로 정수를 사용하고 싶다면, 반드시 해당 상수(숫자) 뒤에 L이라고 표시를 해주어야 컴파일러가 long타입이라는 것을 인식할 수 있게 된다.
ii) 실수형
실수형 자료도 정수형 자료와 동일한 구조로 이루어져있다. 즉, 데이터의 타입과 해당 데이터 타입으로 선언했을 시에 사용하는 메모리의 크기, 그리고 해당 데이터 타입이 표현 가능한 수의 범위등이 제한되어있는 것등이 그것이다. 하기의 표가 자바에서의 실수형 자료의 상세이다.
데이터 타입 | 메모리의 크기 | 표현 가능 범위 |
float | 4 byte | ±(1.40129846432481707e-45 ~ 3.40282346638528860e+38) |
double | 8 byte | ±(4.94065645841246544e-324d ~ 1.79769313486231570e+308d) |
실수 자료형에는 float과 double이 있는데, 정수와 상등한 이유로서 일반적으로 double을 많이 사용한다. 실수형 자료는 정밀도보다는 큰 범위의 수를 나타내기 위함이라 여긴다.
5. 상수(Constant)의 데이터 타입
변수는 변하는 값을 의미한다고 학습하였다. 변할수 있는 상태를 염두에 두고 그 안에 값을 내포하여 사용할 수 있도록 마련한 장치를 변수라고 일컫는 것인데, 그것과 대비되는 개념으로서 상수를 들 수 있다.
상수(常数)는 문자 그대로 항상 그대로인 수, 즉 변하지 않는 값을 의미한다. 하기의 예제와 같다.
int a = 10;
예제에서 a는 변수이고 a에 들어가는 정수 10은 상수이다.
경험에 의하면, 우항의 10 이라는 정수도 결국 컴퓨터에서 다루는 데이터 이기 때문에, 정수 라는 특정한 범위 안에 포함되어있는 데이터이다.
프로그래밍 언어에서는 10과 10.0을 구분한다. 현실에 있어 10과 10.0은 동일한 값이다. 하지만 프로그램은 10과 10.0서로 다른 값으로 인지하고 처리하는 것이다. 이는 10은 int라는 데이터 타입으로 정의되어있고, 10.0은 float 혹은 double 이라고 정의되어있기 때문이다.
여기서 ~라고 정의되어있다를 어느 특정한 범위(객체)에 속해있다 정도로 해석하는 모양이었다. 즉 컴퓨터에서의 10은 정수(int)라는 범위(객체)에 속해있는 것이고, 10.0은 float 혹은 double 즉 실수라는 범위(객체)에 속해있는 것이기 때문에 실제로는 같은 값일지언정, 다르게 취급하고 있는 모양새인 것이다.
본 내용은 컴퓨터 공학이 전공이 아닌 필자가 초보적 단계의 언어학습 및 코딩을 진행하며 어리숙하게 판단한 결과임으로 확실한 내용은 아니다.
예제의 내용에서 주목할 점은 바로 변수의 자료형(Type)과 상수의 자료형(Type)을 동일하도록 선언해주어야 오류가 발생하지 않는다는 것이다.
public class NumberExample {
public static void main(String[] args) {
int a = 2147483648; // 컴파일 할 수 없다. int의 표현 범위를 벗어났기 때문이다.
long b = 2147483648L; // 컴파일 할 수 있다. 변수의 타입을 long으로 바꾸고.
// 우항 상수의 값도 L을 표기해줌으로써 해당 값이
// 기본 타입인 int가 아니라 long타입 이라는 것을
// 명시적으로 선언하였기 때문이다.
}
}
예제와 같이, 상수에도 기본적으로 해당되는 자료형이 존재한다. 특별한 목적 혹은 데이터의 표현범위를 지나쳐 표현해야할 때에는 해당 값에 명시적으로 표기를 해주어야 한다.