Java의 특징 및 기초에 대해 배워보자
자바는 1996년 1월에 세상에 나온 객체지향 프로그래밍(Object Oriented Programming, OOP) 언어이다.
운영체제에 독립적으로 실행이 가능하기 때문에, Write Once, Run Anywhere 이라는 슬로건을 내세워 빠르게 많은 사용자를 확보했고 다양한 운영체제가 공존하는 웹 환경에 적합한 언어로서, 현재까지도 전 세계에서 많이 쓰이는 인기 있는 언어이다.
TIOBE의 자료에 따르면, 자바가 오랜 기간 상위권을 유지했음을 확인할 수 있다.
특별히 국내에서 자바는 전자정부 프레임워크 등에 사용되면서 백엔드 개발 분야에서 가장 보편적으로 사용되고 있는 언어이다.
# 자바의 특징
자바의 특징은 크게 4가지로 나눌 수 있다.
첫째, 운영체제에 독립적이다.
자바 이전의 언어들, C와 C++들은 특정 CPU에서만 작동하거나 특정 OS에 따라 다르게 작성해야 하는 경우가 대부분이었다. 자바는 해당 문제를 해결하고자 JRE(Java Runtime Environment)가 설치되어 있는 모든 운영체제에서 실행이 가등하도록 만들어졌다. 참고로 JRE는 자바의 소스코드를 각각 OS에 맞는 기계어로 변환시켜 주는 JVM(자바 가상머신) + 표준 클래스 라이브러리의 조합이다. 이러한 JRE에 여러 개발도구를 도입한 것을 일반적으로 JDK라고 부른다.
둘쨰, 객체 지향 언어(Object Oriented Programming, OOP)이다.
자바는 객체지향 프로그래밍 개념을 사용하는 언어이다. 따라서 모든 기능은 객체로 만들어 사용해야 한다. 객체는 프로그램이 동작하는 부품이라고 생각하면 된다. 여러 부품(객체)들을 만들고 조립하여 하나의 프로그램을 실행하는 개념이 OOP이다. 객체 지향적으로 설계된 프로그램은 유지보수가 쉽고 확장성이 높다.
셋째, 함수형 프로그래밍을 지원한다.
자바 8버전부터 함수형 프로그래밍을 지원하는 문법인 람다식과 스트림이 추가되었다. 이를 사용하면 컬렉션의 요소를 필터링, 매핑, 집계 처리하기 쉬워지고 코드가 간결해지는 장점이 있다.
넷째, 자동으로 메모리를 관리(Garbage Collection)한다.
자바는 96년에 발표된 언어이고 C++를 개선하는 것 또한 여러 목표 중의 하나였다. 그래서 자바는 자동으로 메모리를 관리해주는 기능을 추가했다. C, C++의 경우 메모리의 생성과 소멸을 개발자가 직접 설계해야 했지만, 자바는 가비지 컬렉터(Garbage Collector)를 실행시켜 자동으로 사용하지 않는 메모리를 수거한다. 이를 통해 개발자는 메모리를 관리하는 수고를 덜고 핵심 코드에 집중할 수 있게 된다.
# 자바의 기초 문법
[변수]
변수(variable)란 데이터(data)를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 의미한다.
자바 프로그램을 사전에 비유하면, 사전에 등록된 단어만을 프로그램에서 사용할 수 있다. 만약 사전에 등록되지 않은 단어를 사용하려고 한다면, 직접 사전에 등록해 주어야 한다. 이를 변수를 선언하고 할당한다고 말한다. 즉, 변수를 선언하는 것은 데이터를 저장하기 위한 공간을 메모리상에 확보하는 것을 의미하며, 변수에 값을 할당하는 것은 선언을 통해 확보한 메모리 공간에 값을 저장하는 것을 의미한다.
예를 들어 다음과 같은 코드가 변수이다.
여기에 값을 할당하고자 하면
위 와같이 대입 연산자 = 를 활용하여 10이라는 정수값을 할당할 수 있다.
[변수명]
변수명은 영문자(대문자, 소문자)나 숫자, _를 사용할 수 있다. 자바에서 변수명은 일반적으로 카멜 케이스(camelCase)를 사용한다. 카멜케이스란 낙타 등 모양을 닮았다고 해서 붙여진 이름으로, 두 번째 단어부터 대문자로 시작해 구분한다.
int firstNumber;
사용할 수 없는 변수명은 다음과 같다.
- 숫자로 시작하는 변수명
int 100Num;
//사용 불가한 변수(에러 발생)
- 자바에서 이미 사용 중인 예약어
int byte;
int class;
[타입의 종류]
구분 | 데이터 형 | 바이트 수 | 데이터 범위 |
정수 | byte | 1Byte | -128 ~ 127 |
short | 2Byte | -32,768 ~ 32,767 | |
int | 4Byte | -2,147,483,648 ~ 2,147,483,647 | |
long | 8Byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | |
실수 | float | 4Byte | (3.4 X 10-38) ~ (3.4 X 1038) |
double | 8Byte | (1.7 X 10-308) ~ (1.7 X 10308) | |
문자 | char | 2Byte | 0 ~ 216 |
논리 | boolean | - | true,false |
[타입 변환]
하나의 데이터 타입을 다른 타입으로 바꾸는 것을 타입 변환(type conversion)이라고 한다. 자바에서는 boolean형을 제외한 나머지 기본 타입 간의 타입 변환을 자유롭게 수행할 수 있습니다.
타입 변환의 종류에는 크게 두 가지 방식으로 나뉘는데, 각각 자동 타입 변환, 강제 타입 변환이라고 한다.
자동 타입 변환이란 컴파일러가 값을 자동으로 수행해주는 타입 변환을 말한다. 자바에서는 데이터의 손실이 발생하지 않거나, 데이터의 손실이 최소화되는 방향으로 자동 타입 변환을 진행한다.
예를 들어 다음 코드와 같이 변수의 데이터 타입이 double이지만 변수에 할당된 값이 정수, 즉 바이트 수가 더 낮은 타입이 값으로 지정되어 있을 경우 자동으로 더 큰 바이트 수를 지닌 데이터 타입 형을 따르게 된다.
double number = 10;
System.out.println(number);
10.0
메모리 용량이 더 큰 타입에서 작은 타입으로는 자동으로 타입이 변환되지 않습니다. 이때 더 큰 데이터 타입을 작은 데이터 타입의 변수에 저장할 수 있는데, 이를 캐스팅(casting)이라고 한다. 캐스팅 연산자인 ()를 사용하고, 연산자 안에는 변환하고자 하는 타입을 적어주면 된다.
위 코드와 같이 더 낮은 메모리의 데이터 타입 변수에 double 타입인 변수 number을 대입시키려고 하면 에러가 발생한다.
이떄 캐스팅 문법을 활용한다면 강제로 데이터 타입을 변환하는 것이 가능하다.
물론 더 작은 데이터 타입에 강제로 할달하였기 떄문에 변환과정에서 일부 데이터가 손실되게 된다.
[상수]
상수(constant)란 변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간을 의미한다. 그러나 변수와의 차이점은 프로그램 중간에 다른 데이터로 변환할 수 없다는 점이다.
때문에 일반 변수와 상수를 구분해 주어야 한다. 자바에서는 final키워드를 통해 구분한다.
int number =10; //일반 변수
final int number1 = 10; //상수
[리터럴(literal)]
리터럴(literal)이란 그 자체로 값을 의미한다. 즉, 변수와 상수와는 달리 데이터가 저장된 메모리 공간을 가리키는 이름을 가지고 있지 않는다.
int number =10; //10이 리터럴이다.
*기본 타입 long과 float의 경우 리터럴 뒤에 리터럴 타입 접미사가 붙는 경우가 있다. ex) 123L, 1.23f 등