📝 TIL

[TIL] Java 개발 환경 구축, 변수와 타입

오늘 ONEUL 2022. 11. 7. 19:19

✍ Today I Learned

 

항해99 시작! 💪
99일간의 여정 중, 첫 주는 pre-onboarding 기간으로 주특기가 될 언어의 문법을 팀원들과 공부한다.
기초적인 내용이지만, 그동안 알 것 같은 느낌만 있고 실제로 설명하긴 어려웠던 개념이나 정의를 다시 곱씹어 보려 한다!
내가 헷갈렸던 내용, 다시 보면 좋을 내용 위주로 정리해 보았다😉

 


 

01 자바 시작하기

01-1 프로그래밍 언어와 자바

시작하기 전에

  • 기계어는 사람의 언어와 다르기 때문에 다리 역할의 프로그래밍 언어 필요
  • 프로그래밍 언어로 작성한 파일 == 소스파일
  • 소스파일은 컴퓨터가 바로 이해할 수 없기 때문에 컴파일 과정을 통해 기계어 파일로 번역한 후 컴퓨터에서 사용

자바의 특징

  1. 모든 운영체제에서 실행 가능
    • ex) 윈도우에서 개발된 프로그램을 바로 리눅스에서 실행 가능
  2. 객체 지향 프로그램
    • 객체(부품)를 만들고, 연결해서 더 큰 프로그램을 완성하는 기법
  3. 메모리 자동 정리
  4. 무료 라이브러리 풍부

JDK vs JRE

  • JDK(Java Developmetn Kit)
    • Java 어플리케이션 개발을 위해 반드시 필요하며, 사람이 작성한 소스 코드를 번역하여 컴퓨터가 이해할 수 있는 바이트 코드로 변환하는 도구인 Java 컴파일러가 포함되어 있다.
    • 일반적으로 JDK는 OpenJDK + 제조사의 부가 기능으로 구성되며, 대표적인 것이 바로 Oracle JDK 다. 현재 Oracle JDK는 상용 버전으로 공개되고 있으며, 라이센스 이슈를 피하기 위해서는 다른 제조사의 JDK 이용을 권장한다.
    • JDK에는 JRE가 포함되어 있기 때문에 별도로 분리하여 설치할 필요가 없다.
  • JRE(Java Runtime Environment), JVM(Java Virtual Machine)
    • Java로 컴파일 된 어플리케이션을 실행하는 역할을 한다. 모든 Java 어플리케이션은 JVM이라고 하는 가상의 컴퓨터 공간에서 실행되며, Windows, Linux, Mac 등 어떠한 운영체제라도 JVM이 설치되어 있다면 Java 어플리케이션을 실행할 수 있다.

 

 

01-2 이클립스(대신 인텔리제이) 개발 환경구축

  • IDE(Integrated Development Environment)
    • 통합 개발 환경으로 프로젝트 생성, 자동 코드 완성, 디버깅 등과 같이 개발에 필요한 여러 가지 기능을 통합적으로 제공해주는 툴

 

 

01-3 자바 프로그램 개발 과정

자바 소스 파일에서 실행이 되기까지

  1. 자바 소스 파일(Hello.java)
  2. javac 명령어 실행(컴파일)
  3. 바이트 코드 파일(Hello.class)
    • 바이트 코드 파일은 완전한 기계어가 아니다.
    • 운영체제에서 바로 실행할 수 없다.
    • 완전한 기계어로 번역해서 사용하려면? java 명령어를 사용한다.
  4. java 명령어 실행(JVM이 기계어 번역 후 실행)

자바에서 모듈이란?

  • 자바의 모듈은 외부에서 재사용할 수 있는 패키지들을 묶은 것을 말한다. 어떻게 보면 이클립스에서 개발하는 프로젝트는 하나의 모듈을 개발하는 것. 그리고 서로 다른 프로젝트가 import와 export를 이용하여 패키지(package)를 주고받는다. 패키지의 상위 개념이라고 할 수 있다.
  • 왜 자바는 모듈과 패키지로 나누어져 있을까?
    1. 패키지의 캡슐화가 완벽하지 않다.
    2. 빌드 단계에서 프로그램 구동에 필요한 모든 클래스가 다 있는지 확인할 수 없다.
    3. 런타임이 거대해져 배포가 어려워졌다.
  • 참고 링크 [Java] 자바에서 패키지(package)와 모듈(module)의 차이점

이클립스의 모듈과 인텔리제이의 모듈이 다르다?

[IntelliJ] 자바 멀티 프로젝트(모듈) 생성하기

인텔리제이에서 모듈이란 프로젝트를 구성하는 하나의 작은 프로젝트라고 생각하자.

명령 라인에서 컴파일하고 실행하기

.class 파일을 모두 지운 후 cmd에서 컴파일하고 실행해보자.

# 해당 폴더로 이동
cd C:\\_java\\lec\\_hanghae_java\\chap01

# javac 명령어로 컴파일
javac -d [바이트 코드 파일 저장 위치] [소스 경로/*.java]
javac -d out/production/chap01 *.java

# 생성되었는지 확인
tree /f /a

# 실행해보자
java -cp out/production/chap01 Hello
# Hello Wordl!가 실행되는걸 볼 수 있다

주석에 관한 진실

  • 주석은 컴파일 과정에서 무시되고 실행문만 바이트 코드로 번역된다.
  • 따라서 주석을 많이 작성한다고 바이트 코드 파일의 크기가 커지는 것은 아니다.
  • 가급적이면 설명이 필요한 코드에 주석을 달아둘 것!

 

 

 

02 변수와 타입

02-1 변수

값 저장

  • 자바에서는 변수에 값이 저장되지 않으면 변수가 생성되지 않는다.(선언과 생성은 다른 이야기!)
  • 변수에 최초로 값이 저장될 때 변수가 생성된다 → 변수 초기화

변수 사용 범위

  • 로컬 변수(local variable)
    • 메서드 블록 내에서 선언된 변수
    • 메서드 실행이 끝나면 메모리에서 자동으로 없어짐

 

02-2 기본 타입

기본 타입(primitive type)

  • 정수 타입: byte, char, short, int long
  • 실수 타입: float, double
  • 논리 타입: boolean

정수 타입

정수형 타입 할당되는 메모리의 크기 데이터의 표현 범위
byte 1바이트 -128 ~ 127
short 2바이트 -215 ~ (215 - 1)
-32,768 ~ 32,767
int 4바이트 -231 ~ (231 - 1)
-2,147,483,648 ~ 2,147,483,647
long 8바이트 -263 ~ (263 - 1)
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
// char 타입
char var1 = 'A';
int var2 = 'A';
System.out.println(var1); // A를 출력
System.out.println(var2); // 65를 출력

실수 타입

실수형 타입 할당되는 메모리의 크기 데이터의 표현 범위 리터럴 타입 접미사
float 4바이트 (3.4 X 10-38) ~ (3.4 X 1038) F 또는 f
double 8바이트 (1.7 X 10-308) ~ (1.7 X 10308) D 또는 d (생략 가능함)
  • 정수 리터럴은 기본적으로 int 타입
  • 실수 리터럴은 기본적으로 double 타입
  • 메모리에 여유가 있고 특별한 이유가 없는 한 실수 리터럴을 저장할 때에는 double 타입을 사용하는 것이 좋다.(약 2배의 정밀도!)

 

 

02-3 타입 변환

자동 타입 변환(promotion)

  • 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생
  • 예외: char 타입보다 허용범위가 작은 byte 타입은 char 타입으로 자동 타입 변환될 수 없다. byte 타입은 음수를 포함하기 때문이다.

강제 타입 변환(casting)

  • 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장하는 것
  • 캐스팅 연산자 괄호() 사용
작은 허용 범위 타입 = (작은 허용 범위 타입)큰 허용 범위 타입

정수 연산에서의 자동 타입 변환

  • 정수 타입끼리 연산할 경우 int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환되어 연산을 수행한다.
  • 특별한 이유가 없는 경우 정수 연산에 사용되는 변수는 int 타입으로 선언하는 것이 타입 변환을 줄여주는 방법이다. (타입 변환을 줄인다 == 실행 성능이 향상된다.)

실수 연산에서의 자동 타입 변환

  • 실수 타입끼리 연산할 경우 동일한 타입이라면 해당 타입으로 연산되지만, 하나가 double 타입이면 다른 하나도 double 타입으로 자동 타입 변환되어 연산을 수행한다.
  • int 타입과 double 타입을 연산해도 동일한 과정을 거친다. int 타입의 피연산자가 double 타입으로 자동 변환되고 연산을 수행한다. → 근데 꼭 int 타입으로 연산을 해야 한다면? 아래와 같이 double 타입을 int 타입으로 강제 변환하고 연산을 수행하면 된다.
int invalue = 10;
double doubleValue = 5.5;
int result = intValue + (int)doubleValue; // result에 15가 저장됨
  • 정수 연산의 결과는 정수이다. 실수 연산으로 변경해야 할 경우 둘 중 하나, 또는 둘 모두를 double타입으로 변환하면 된다.

 

 

02-4 변수와 시스템 입출력

println() / print() / printf()

  • println(내용): 괄호 안의 내용을 출력하고 행을 바꿔라
  • print(내용): 괄호 안의 내용을 출력만 해라
  • printf(”형식문자열”, 값1, 값2, …): 괄호 안의 첫 번째 문자열 형식대로 내용을 출력해라
    • 형식 문자열에서 %와 conversion(변환 문자)는 필수로 작성하고 그 외의 항목은 생략 가능
    • %는 형식 문자열의 시작, d는 정수, f는 실수, s는 문자열을 의미한다.
    • 형식 문자열에 포함될 값이 2개 이상일 경우 값의 순번(argument_index$)을 알려주어야 한다.
System.out.printf("이름: %1$s, 나이: %2$d", "김자바", 25)
// 이름: 김자바, 나이: 25

System.in.read()

  • 키보드 키를 입력하면 숫자로 된 키코드를 읽을 수 있다
  • 단점
    • 키코드를 하나씩 읽기 때문에 2개 이상의 키가 조합된 한글을 읽을 수 없다
    • 키보드로부터 입력된 내용을 통 문자열로 읽지 못한다 → Scanner, BufferedRead 사용

 

 

 

 

※ 이 내용은 책 [혼자 공부하는 자바]를 보고 정리한 내용입니다.