CH01. 자바 시작하기
자바란?
자바 소개
자바 초기
- 1995년 썬 마이크로시스템즈(Sun MicroSystems)에서 자바(Java)언어 발표
- Oak(오크)라는 언어에서부터 시작, 가전제품에서 사용될 목적
- 메모리 미치 CPU를 지나치게 많이 사용하여 윈도우 프로그래밍 언어로는 부적합하다는 문제점
인터넷 활성화 이후
- 웹 애플리케이션 구축용 언어로 급부상
- 기업체 및 공공기관의 다양한 서버 운영체제에서 한 번의 작성으로 모든 곳에서 실행이 가능한 언어는 자바뿐
- 스마트폰, 데스크톱, 금융 공공기관 대기업 등의 엔터프라이즈 기업 환경에서 실행되는 서버 애플리케이션을 개발하는 중추적인 언어
자바의 특징
- 이식성이 높은 언어
- 자바로 구현된 프로그램은 소스파일을 다시 수정하지 않아도, 자바 실행 환경(JRE: Java Runtime Environment)이 설치되어 있는 모든 운영체제에서 실행 가능하다.
- **이식성** : 서로 다른 실행 환경을 가진 시스템 간에 프로그램을 옮겨 실행할 수 있는 것
- ex) MS윈도우에서 실행하는 프로그램을 리눅스, 유닉스에서 실행한다면 이식성이 높은 것.
- MS 윈도우에서 실행되는 대부분의 프로그램들은 MS 윈도우 환경에 최적화 되어 있어 유닉스나 리눅스에서 실행하기 위해서는 프로그램 소스 파일을 수정한 후, 재컴파일 과정을 거쳐야 한다.
- 객체 지향 언어
- 객체 지향 프로그래밍(OOP)
- 프로그램을 개발하는 기법
- 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립 및 연결해서 전체 프로그램을 완성하는 기법
- 객체 지향 언어의 특징인 캡슐화, 상속, 다형성 기능을 완벽하게 지원.
- 객체 지향 프로그래밍(OOP)
- 함수적 스타일 코딩 지원
- **함수적 프로그래밍**은 대용량 데이터의 병렬 처리 그리고 이벤트 지향 프로그래밍에 적합
- 자바는 함수적 프로그래밍을 위해 람다식(Lambda Expressions)를 지원(Java8부터)
- 람다식을 사용하면 컬렉션의 요소를 필터링, 매핑, 집계 처리하는데 쉬워지며, 코드가 간결해진다.
- 메모리 자동 관리
- C++은 메모리에 생성된 객체를 제거하기 위해 개발자가 직접 코드를 작성
- 자바는 개발자가 직접 메모리에 접근할 수 없도록 설계되었으며, 메모리는 자바가 직접 관리.
- 객체 생성 시 자동적으로 메모리 영역을 찾아서 할당하고, 사용이 완료되면 **가비지 컬렉터**를 실행시켜 자동적으로 사용하지 않는 객체 제거
- 개발자는 메모리 관리의 수고스러움을 덜고, 핵심 기능 코드 작성에 집중할 수 있다.
- 생산성 향상
- 다양한 애플리케이션 개발
- 자바는 윈도우, 리눅스, 유닉스, 맥 등 다양한 운영체제에서 실행되는 프로그램을 개발할 수 있다.
- 다양한 운영체제에서 사용할 수 있는 개발 도구와 API를 묶어 에디션 형태로 정의하고 있다.
-
더보기JAVA EE(Enterprise Edition) - 서버용 애플리케이션 개발 에디션
- Java EE는 분산환경(네트워크, 인터넷)에서 서버용 애플리케이션을 개발하기 위한 도구 및 라이브러리 API를 정의.
- 서버용 애플리케이션으로는 Servlet/JSP를 이용한 웹 애플리케이션
- 분산 처리 컴포넌트인 EJB(Enterprise Java Bean)
- XML 웹 서비스(Web Services) 등이 있다. -
더보기JAVA SE(Standard Edition) - 기본 에디션
- 자바 프로그램들이 공통적으로 사용하는 자바 가상 머신(JVM)을 비롯해서 자바 프로그램 개발에 필수적인 도구와 라이브러리 API를 정의.
- 클라이언트와 서버 프로그램에 상관없이 자바 프로그램을 개발하고 실행하기 위해선 반드신 Java SE 구현체인 자바 개발 키트(JDK:Java Development Kit)를 설치해야 한다. - 멀티 스레드(Multi-Thread) 구현 용이
- 하나의 프로그램이 동시에 여러 가지 작업을 처리해야 할 경우 대용량 작업을 빨리 처리하기 위해 서브 작업으로 분리해 병렬 처리 하려면 멀티 스레드 프로그래밍이 필요하다.
- 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하고 있어, 실행되는 운영체제에 상관없이 멀티 스레드를 쉽게 구현할 수 있다.
- 동적 로딩(Dynamic Loading)지원
- 애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적 로딩하여 객체를 생성한다.
- 개발 완료 이후 유지보수가 발생하더라도 해당 클래스만 수정하면 되므로 전체 애플리케이션을 다시 컴파일할 필요가 없다.
- 유지보수 용이
- 풍부한 오픈소스 라이브러리
- 자바는 오픈 소스 언어로, 오픈소스 라이브러리 또한 다양하다.
자바 가상 머신 (JVM)
- 자바는 완전한 기계어가 아닌 중간 단계의 바이트 코드
- 따라서 이것을 해석하고 실행할 수 있는 가상의 운영체제가 필요
- 이것이 JAVA Virtual Machine
- 실 운영체제를 대신하여 자바 프로그램을 실행하는 가상의 운영체제 역할
- 바이트 코드는 모든 JVM에서 동일한 실행 결과를 보장.
- JVM은 운영체제에 종속적이므로 JVM은 운영체제에 맞게 설치되어야 한다.
자바 프로그램 개발 순서
- .java 소스 파일 작성
- 컴파일러(javac.exe)로 바이트 코드 파일(.class) 생성
- JVM 구동 명령어(java.exe)로 실행
CH02. 변수와 타입
변수란?
- 변수란 하나의 값을 저장할 수 있는 메모리 공간.
변수의 선언
타입 변수이름;
int | age; // 정수(int)값을 저장할 수 있는 age 변수 선언
double | value; // 실수(double)값을 저장할 수 있는 value 변수 선언
--------------------------------------------------------------------------------------
int x, y, z; // 같은 타입의 정수는 콤마(,)를 이용해서 한꺼번에 선언 가능
변수의 사용
int score // 변수 선언
score = 90; // 값 저장
---------------------------
// 변수의 초기값을 변수 선언과 동시에 저장
int score = 90;
- 소스 코드 내에서 직접 입력된 값을 리터럴(literal)이라고 부름.
- 리터럴(literal)
- 정수 리터럴
- byte, char, short, int, long
- 소수점이 없는 정수 리터럴은 10진수
- 0, 75, -100
- 0으로 시작되는 리터럴은 8진수
- 02, -04
- 0x 또는 0X로 시작하고 0~9 숫자나 A, B, C, D, E, F 또는 a, b, c, d, e, f로 구성된 리터럴은 16진수
- 0x5, 0xA, 0xB3, 0xAC08
- 실수 리터럴
- float, double
- 소수점이 있는 리터럴은 10진수 실수
- 0.25, -3.14
- 대문자 E 또는 소문자 e가 있는 리터럴은 10진수 지수와 가수
- 5E7 // 5 x 10^7 0.12E-5 // 0.12 x 10^(-5)
- 문자 리터럴
- 작은 따옴표 (’)로 묶은 텍스트
- ‘A’, ‘한’, ‘\\t’, ‘\\n’
‘\t’ 수평 탭 ‘\n’ 줄 바꿈 ‘\r’ 리턴 ‘\”’ 큰따옴표 '\’’ 작은따옴표 '\\’ \ '\u16진수’ 16진수에 해당하는 유니코드 - 문자열 리터럴
- 큰따옴표로 묶은 텍스트
- 논리 리터럴
- true, false
- 정수 리터럴
변수의 선언
- 변수는 선언된 블록 내에서만 사용할 수 있다.
public static void main(String[] args){
int var1; --------------------------- 메소드 블록에서 선언
if(...){
int var2; --------------------------- if 블록에서 선언
// var1과 var2 사용 가능
}
for(...){
int var3; --------------------------- for 블록에서 선언
// var1과 var3 사용 가능
// var2는 사용 못함
}
// var1 사용 가능
// var2와 var3 사용 못함
}
데이터 타입
기본(원시: primitive) 타입
- 정수 : byte, char, short, int, long
- 실수 : float, double
- 논리 : boolean
[정수 타입 ]
byte 타입
- 색상 정보 및 파일 또는 이미지 등의 이진(바이너리) 데이터를 처리할 때 주로 사용된다.
- 정수 타입 중에서 가장 작은 범위의 수 저장
- -128 ~ 127(-2^7~2^7-1)
char 타입
- 자바는 모든 문자를 유니코드(Unicode)로 처리한다.
- 유니코드에는 음수가 없으므로 char type에는 음수 값을 저장할 수 없다.
- char 변수에 저장된 유니코드를 알고 싶다면 char 타입 변수를 int 타입 변수에 저장하면 된다.
- 만약 문자열을 저장하고 싶다면 Strnig 타입 사용
- String은 기본 타입이 아닌 클래스 타입.
- String 변수는 참조 변수이다.
- 문자열을 String 변수에 대입하면 문자열이 변수에 직접 저장되는 것이 아니라, String 객체가 생성되고, String 변수는 String 객체의 번지를 참조
short 타입
- 2byte (16bit)로 표현되는 정수값을 저장할 수 있는 데이터 타입
int 타입
- 4byte(32bit)로 표현되는 정수값을 저장할 수 있는 데이터 타입
- byte 타입 또는 short 타입의 변수를 +연산하면 int 타입으로 변환된 후 연산
→ byte나 short 타입으로 변수를 선언한 것과 int 타입으로 선언한 것의 차이는 거의 없다.
long 타입
- 8byte(64bit)로 표현되는 정수값을 저장할 수 있는 데이터 타입
- 은행 및 우주와 관련된 프로그램과 같이 수치가 큰 데이터를 다루는 프로그램에서 필수적
long var3 = 1000000000000; // 컴파일 에러
long var4 = 1000000000000L;
[실수 타입]
float, double
- 각각 4bytes, 8bytes
- int와 long의 크기와 같지만, 정수 타입과는 다른 저장 방식으로 정수 타입보다 훨씬 더 큰 범위의 값을 저장할 수 있다.
[논리 타입]
boolean
- 1byte(8bits)로 표현되는 논리값 (true, false)을 저장할 수 있는 데이터 타입
- 두 가지 상태값을 저장할 필요성이 있을 경우에 사용
- 상태값에 따라 조건문과 제어문의 실행 흐름을 변경하는데 주로 이용
타입 변환
- 타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것.
- 자동(묵시적) 타입 변환
- 강제(명시적) 타입 변환
자동 타입 변환(Promotion)
- 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것.
- 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생.
- 큰 크기 타입 = 작은 크기 타입
- 사용하는 메모리 크기를 기준으로 타입 구분
- **byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)**
byte byteValue = 10;
int intValue = byteValue; // 자동 타입 변환이 일어난다.
----------------------------------------------------------
int intValue = 200;
double doubleValue = intValue; //200.0
- char 타입의 경우 int 타입으로 자동 변환되면 유니코드 값이 저장된다.
char charValue = 'A';
int intValue = charValue; // 65가 저장.
- 자동 타입 변환의 단 하나의 예외
- 음수가 저장될 수 있는 byte 타입을 char 타입으로 자동 변환할 수 없다.
- char의 범위 : 0~65535
강제 타입 변환
- 큰 크기의 타입은 작은 크기의 타입으로 자동 타입 변환을 할 수 없다.
- int 타입을 4개의 byte로 쪼갠 다음, 끝에 있는 1byte만 byte 타입 변수에 저장하는 것은 가능
- 강제적으로 큰 데이터 타입을 작은 데이터 타입으로 쪼개어서 저장하는 것을 **강제 타입 변환(캐스팅:Casting)**이라고 한다.
int intValue = 103029770;
byte byteValue = (byte) intValue; // 강제 타입 변환(캐스팅)
- 원래 값이 보존되지 않는다.
연산식에서의 자동 타입 변환
- 연산은 기본적으로 같은 타입의 피연산자(operand)간에만 수행
- 서로 다른 타입의 피연산자가 있을 경우 두 피연산자 중 크기가 큰 타입으로 자동 변환된 후 연산 수행
- 자바는 정수 연산 시 int 타입을 기본으로 한다.
- 피연산자가 4byte 단위로 저장하기 때문이다.
char ai = 'A';
int result = ai + 1; // 'A'의 유니코드보다 1이 큰 유니코드가 저장.
char na = (char) result; // 'B'가 저장됨
'CS > 이것이 자바다' 카테고리의 다른 글
[CS] 이것이 자바다 - 클래스(3): 패키지, 어노테이션 (1) | 2023.10.04 |
---|---|
[CS] 이것이 자바다 - 클래스(1) - 객체와 클래스 (0) | 2023.09.21 |
[CS] 이것이 자바다 - 클래스(2) (0) | 2023.09.21 |
[CS] 이것이 자바다 - 참조 타입 (0) | 2023.09.16 |