본문 바로가기
프로그래밍 언어/자바

1. 다시 공부하는 자바 - 자바 언어 기초 1 (이것이 자바다)

by amobu0 2024. 6. 11.

이것이 자바다 라는 책을 보고 정리한 글이다.

https://m.hanbit.co.kr/store/books/book_view.html?p_code=B4861113361

 

이것이 자바다(개정판)

2015년 초판이 출간된 이후부터 지금까지 기본 개념에 충실한 설명으로 독자들에게 큰 사랑을 받아온 『이것이 자바다』의 개정판. 기존 Java 8 버전에 최신 Java 17 LTS 버전까지 아우르는 내용으로

m.hanbit.co.kr

 

Part 1 자바 언어 기초


프로그래링 언어와 자바

컴퓨터가 이해할 수 있는 기계어는 0과 1로 이루어진 이진 코드를 사용한다. 그렇기 때문에 사람과 컴퓨터가 대화하기 위한 즉, 사람의 언어와 기계어의 다리 역할을 하는 프로그래밍 언어가 필요하다.

 

프로그래밍 언어는 고급언어와 저급 언어로 구분되고 고급 언어는 컴퓨터와 대화할 수 있도록 만든 언어 중에서 사람이 쉽게 이해할 수 있는 언어이다. 고급 언어로 작성된 소스 파일은 컴퓨터가 바로 이해할 수 없기 때문에 컴파일Compile이라는 과정을 통해서 컴퓨터가 이해할 수 있는 0과 1로 이루어진 기계어로 변환한 후 컴퓨터가 사용하게 된다.

 

개발자가 고급언어로 작성한 파일을 소스파일라고 부른다. 자바 언어로 작성된 자바 소스 파일의 확장자명은 .java이다. 소스 파일(.java)을 작성한 후에는 컴파일 해야하는데 컴파일 결과는 확장자명이 .class인 바이트 파일로 생성된다. 윈도우, 맥os, 리눅스 등 어떤 운영체제라도 동일한 소스 파일을 javac로 컴파일하면 모두 동일한 바이트코드 파일이 생성된다. 

 

바이트코드 파일(.class)을 특정 운영체제가 이해하는 기계어로 변역하고 실행시키는 명렁어는 java이다. java 명렁어는 자바 가상 머신(JVM)을 구동시켜 바이트 코드 파일을 완전한 기계어로 번역하고 실행시킨다. 바이트코드 파일(.class)은 운영체제와 상관없이 모두 동일한 내용으로 생성되지만 자바 가상 머신(JVM)은 운영체제에서 이해하는 기계어로 번역해야 하므로 운영체제별로 다르게 설치된다. 


변수 선언

컴퓨터 메모리(RAM)는 수많은 번지들로 구성된 데이터 저장 공간으로 프로그램은 데이터를 메모리에 저장하고 읽는 작업을 수행한다. 이때 데이터를 어디에 어떤 방식으로 저장할지 정해져 있지 않다면 메모리 관리가 어려워진다. 프로그래밍 언어는 이 문제를 해결하기 위해 변수variable를 사용한다. 변수는 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름이다. 변수를 통해 프로그램은 메모리 번지에 값을 저장하고 읽을 수 있다.

 

변수 = 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름

 

 

변수를 사용하려면 변수 선언이 필요한데 변수 선언은 어떤 타입의 데이터를 저장할 것인지 그리고 변수 이름이 무엇인지 결정하는 것이다.

변수 선언은 저장되는 값의 타입과 이름만 결정한 것이지 아직 메모리에 할당된 것이 아니다. 변수에 최초로 값이 대입될 때 메모리에 할당되고 해당 메모리에 값이 저장된다. 

 

변수가 선언 되었다면 값을 저장할 수 있다. 이때는 대입 연산자 = 를 사용한다. 수학에서 = 은 '같다'를 의미하지만 자바에서는 우측의 값을 좌측 변수에 대입하는 연산자이다.

 

변수에 최초로 값을 대입하는 행위를 변수 초기화라고 하고, 이 때의 값을 초기값이라고한다. 초기화 값은 변수를 선언함과 동시에 대입할 수 도 있다.

//문자열(String) 값을 저장할 수 있는 name 이름의 변수 선언
String name;
//name 변수에 Amoub0 값 대입
name = "Amobu0"

//정수(int) 값을 저장할 수있는 age 이름의 변수 선언
int age;
//age 변수에 100 값 대입
age = 100;

// 변수 선언과 동시에 값을 대입
String name = "Amobu0";
int age = 100;

 

변수는 또 다른 변수에 대입되어 메모리 간에 값을 복사할 수 있다.  다음 코드는 변수 x 값을 변수 y값으로 복사한다.

int x = 1; //변수 x에 1을 대입
int y = x; //변수 y에 변수 x 값을 대입

 


정수 타입

변수는 선언될 때의 타입에 따라 저장할 수 있는 값의 종류와 허용 범위가 달라진다.

자바는 정수, 실수, 논리값을 저장할 수 있는 기본Primitive타입 8개가 있다.

갑의 분류 기본타입
정수 byte, char, short, long
실수 float, double
논리(true/false) boolean

 

메모리 할당 크기

종류 byte short int long
메모리 사용크기 (단위 bit) 8 16 32 64

 

코드에서 프로그래머가 직접 입력한 값을 리터럴(literal)이라고 부른다.

 

long 타입은 수치가 큰 데이터를 다루는 프로그램에서 사용하는다. 기본적으로 컴파일러는 정수 리터럴을 int 타입 값으로 간주하기 때문에, int 타입의 허용 범위(-2,147,483,648 ~ 2,147,483,647)를 초과하는 리터럴은 뒤에 대문자'L'을 붙여서 long 타입 값임을 컴파일러에게 알려줘야 한다.

long var3 = 100000000000000; //컴파일러는 int로 간주하기 때문에 에러 발생
long var4 = 100000000000000L;

문자 타입

하나의 문자를 작은 따옴표(')로 감싼 것을 문자 리터럴이라고 한다. 문자 리터럴은 유니코드로 변환되어 저장되는데, 자바는 이러한 유니코드를 저장할 수 있도록 char 타입을 제공한다. (유니코드는 세계 각국의 문자를 0 ~ 65535 숫자로 매핑한 국제 표준 규약) 

유니코드가 정수이기 때문에 char 타입도 정수(int) 타입에 속한다. 그렇기 때문에 char 타입의 변수에 작은따옴표로 감싼 문자가 아니라 유니코드 숫자를 직접 대입할 수 있다.

char c1 = 97;
int c2 = '가';
int c3 = 'Z';
char c4 = 55203;

System.out.println("c1 = " + c1); //c1 = a
System.out.println("c2 = " + c2); //c2 = 44032
System.out.println("c3 = " + c3); //c3 = 90
System.out.println("c4 = " + c4); //c4 = 힣

char c4 = ''; //컴파일 에러
char c4 = ' '; //공백 하나를 포함해서 초기화

실수 타입

타입 메모미 사용 크기 유효 소수 이하 자리
float 32bit / 4byte 7자리
double 64bit/ 8byte 15자리

 

컴파일러는 실수 리터럴을 기본적으로 double 타입으로 간주하기 때문에 float 타입 변수에 대입하고 싶다면 리터럴 뒤에 'f'나 'F'를 붙여 컴파일러에게 알려줘야한다. 

float floatNum1 = 0.12370; //컴파일러는 double로 간주하기 때문에 에러 발생
float floatNum2 = 0.12370f;

논리 타입

참과 거짓을 의미하는 논리 리터럴은 true와 false이다. 논리 리터럴은 boolean 타입 변수에 대입할 수 있다.

boolean java = true;
boolean spring = true;
boolean haveCash = false;

 

boolean 타입 변수는 두 가지 상태값을 저장할 필요가 있을 경우에 사용되며, 상태값에 따라 조건문과 제어문의 실행 흐름을 변경하는데 사용된다. 연산식 중에서 비교 및 논리 연산의 산출값은 true 또는 false이므로 boolean 타입 변수에 대입할 수 있다.


문자열 타입

작음따옴표(')로 감싼 한 개의 문자는 char 타입이지만, 큰따옴표(")로 감싼 여러 개의 문자들은 유니코드로 변환되지 않는다. 큰따옴표(")로 감싼 문자들을 문자열이라고 부른다. 문자열은 String 타입을 사용해야하고 String 타입은 자바 8개의 기본Primitive 타입에 속하지 않는 참조 타입이다.

String name = "Amobu0"
String job = "개발자"

 

문자열 -> 기본 타입으로 변환

프로그램에서 문자열을 숫자 타입으로 변환하는 경우가 매우 많다.

변환 타입 사용 예
String → byte String str = "10";
byte value = Byte.paresByte(str);
String → short String str = "100";
short value = Short.parseShort(str);
String → int String str = "1000000";
int value = Integer.parseInt(str);
String → long String str = "100000000000000";
long value = Long.parseLong(str);
String → float String str = "12.345";
float value = Float.parseFloat(str);
String → double String str = "12.345";
double value = Double.parseDouble(str);
String → boolean String str = "true";
boolean value = Boolean.parseBoolean(str);

 

반대로 기본 타입의 값을 문자열로 변경하는 경우 String.valueOf() 메소드를 이용한다.

String str = String.valueOf(기본타입값);

키보드 입력 데이터를 변수에 저장

키보드로부터 입력된 데이터를 입는 방법 중 하나로 Scanner를 사용한다. Scanner 타입 변수를 선언하고, 대입 연산자 = 를 사용해서 new 연산자로 생성한 Scanner 객체를 변수에 대입한다.

Scanner createdScanner = new Scanner(System.in);

//아래 코드는 키보드로 입력된 내용을 문자열로 읽고 String 변수에 저장할 수 있다.
//Enter가 입력되기 전까지 블로킹(대기) 상태가 되며, 
//Enter키가 입력되면 입력된 모든 내용이 문자열이 된다.
String input = createdScanner.nextLine();