| 개발 환경 구축
(1) 자바 환경 구축
- 자바는 JVM을 통해 모든 플랫폼(OS)에서 독립적으로 작동한다.
- 오라클사에서 JDK를 다운할 수 있다.(또는 openJDK 사용) 설치 사이트 바로가기
- 명령프롬프트(CMD)로 설치 환경 확인
- 시스템 환경 변수 설정
변수명 | 경로 | 예시 |
Path | java.exe가 있는 경로 | %JAVA_HOME%\bin |
JAVA_HOME | jdk폴더 경로 | C:\myDev\jdk1.8.0_333 |
rf. 코딩 폰트 설치하기 : d2coding, jetbrains mono 폰트
rf. 맥에서 자바 설치하기 : [1] homebrew 설치 [2] 터미널에서 자바 설치
[ 시스템 환경 변수 - Path는 왜 넣는 걸까? ]
운영체제(OS)가 프로세스를 실행할 때 참조하는 값을 환경 변수라고 한다.
환경 변수에는 여러가지가 포함될 수 있는데, 이 중에서 Path는 말그대로 "경로"를 말한다.
Path를 통해서 한 번 경로를 입력해 두면, JDK 실행을 호출할 때 OS가 알아서 Path에 저장된 값를 참조한다.
(2) 컴파일 및 실행
- 컴파일 및 실행과정
start | ----------------> | compiled | ---------------> | result |
---|---|---|---|---|
소스파일.java | 컴파일러 : javac.exe | 바이트코드 | 인터프리터 : java.exe | 실행결과 |
class Main { //코드 } | javac HelloWorld.java | 000111101010001010...... | java HelloWorld | 안녕! |
- 명령프롬프트 활용
- 에디터(IDE) 활용
에디터명 | 개인적인 비교 | 다운경로 | 사용자수 (*jlab 설문결과) |
IntelliJ | - 말끔한 UI - 상세한 가이드 (ex. 메소드의 매개변수까지 자동 안내) |
바로가기 | 약 40% |
Eclipse | - 각종 단축키를 활용하여 빠른 코딩 가능 (ex. 만능해결사 ctrl + space) - 워크 스페이스 구조를 상세히 안내 - 다소 올드한 UI와 복잡한 설정 |
바로가기 | 약 30% |
Visual Studio | - 과거에 자주 사용되던 에디터 - 다양한 플러그인을 사용할 수 있다 |
바로가기 | 그 외 |
✅ | 이클립스를 설치하면 가장 먼저 해야할 것 : 인코딩 타입을 MS949 -> UTF-8로 바꾸어준다. ( 위치 : [Windows] - [Preference] - search : encoding, Workspace/CSS/HTML/JSP/XML 모두 UTF-8로 설정) |
|
✅ | IntelliJ나 이클립스나 내장된 openJDK를 사용할 수 있다. * 되도록 오라클에서 JDK 설치 후 사용 권장 (단, IntelliJ는 openJDK를 선택해서 설치해야 한다. 이클립스는 기본적으로 설치된 openJDK가 있다) |
|
✅ | 이클립스 프로젝트에 JDK 경로 설정하기 (아래 '더보기' 선택) |
| 자바 확장자와 파일
구분 | 확장자 | 내용 |
자바 파일 | 소스파일.java, 바이트코드.class | 소스코드, 이진코드 |
자바 아카이브 | 압축명.jar | 패키지 포맷 : 자바코드 + 리소스 + 메타데이터 + 기타 |
웹 아카이브 | 압축명.war | 웹 패키지 포맷 : 서블릿 + JSP + 리소스(html,js,css...) + ... |
엔터프라이즈 아카이브 | 압축명.ear | application server에 배포하기 위해 jar과 war을 묶어놓은 파일 |
| 자바 구조와 문장
패키지 | (선택) 첫글자 소문자로 표기, ' . '을 통해 상세 경로를 나타낸다. | package java.util.Random |
클래스 | 첫글자 대문자로 표기, 그 외는 식별자* 명명법을 따른다. | class Main{ // 필드 // 메소드 } |
* 예약어 : 예약어는 이미 정의된 것 (ex. 기본형 변수, if/while.... )
* 식별자 : 사용자가 지정한 것 (대소문자 구분, 첫문자 숫자 불가, 공백사용 불가, 특수문자 $, _만 가능, 한글 사용 가능)
| 클래스
클래스 | 필드 | 변수 | 기본형 | 논리형/문자형/정수형/실수형 | |
참조형 | 참조값(16진수의 주소)을 담는 변수 | ||||
초기화블럭 | 변수 선언 및 초기화 후, 초기화 블럭을 통해 재초기화* | ||||
메서드 | 생성자 | 인스턴스 생성 시, 생성자 안에 인자를 넣어 변수 초기화 | |||
일반 메서드 | 매개변수와 반환값을 갖는다 | ||||
접근제어자* | +, (default) | all |
* 사용하는 접근제어자 표시 : all(모두 사용가능), +(public), #(protected) , (default), -(private)
* 초기화 블럭 : static이 들어간 경우 클래스가 로딩될 때, 그렇지 않은 경우 인스턴스가 생성될 때마다 초기화를 한다. (일반적으로 리소스를 업로드할 때 쓴다.)
| 변수와 자료형
변수 | 구분 | 크기 | 범위 | 기본값 | ||
기본형 | 논리형 | boolean | 1byte | false, true | false | |
문자형 | char | 2byte | 0 ~ 약 6만 | '\u0000' | ||
정수형 | byte | 1byte | -128 ~ 127 | 0 | ||
short | 2byte | 약 -3만~약 3만 | 0 | |||
int | 4byte | 약 -20억 ~ 약 20억 | 0 | |||
long | 8byte | 0L | ||||
실수형 | float | 4byte | 0.0f | |||
double | 8byte | 0.0 | ||||
참조형 | - | JVM 크기에 따름 32bit(4byte) /64bit(8byte) |
null |
- 정수형에 대한 자세한 설명 (아래 '더보기')
(1) 진수 표현
int n10 = 10; //10진수
int n2 = 0b10; // 2진수
int n8 = 010; // 8진수
int n16 = 0xff; //16진수
// JDK 1.7부터는 '_'를 통해 자릿수를 표기할 수 있게 됐다.
n2 = 0b0000_0000_0000_0000_0000_0000_1010;
(2) 2진수의 음수 표현 (2의 보수)
//2의보수 [앞에서 마지막 전까지 반대, 마지막은 동일]
int n1 = 0b0000_0000_0000_0000_0000_0000_0000_1100; //12
int n2 = 0b1111_1111_1111_1111_1111_1111_1111_0100; //-12
//n1 + n2은 아래와 같다.
int n3 = 0b0000_0000_0000_0000_0000_0000_0000_0000; //0
(3) long과 short/byte
// short와 byte는 사칙연산 시 int로 반환된다. (내장된 연산장치가 int 단위로 반환하기 때문)
short n1 = 1;
short n2 = 2;
int res = n1 + n2;
// long의 표현
long n3 = 1L;
- 오버플로우와 언더 플로우
(1) 오버플로우 : 자료 범위를 넘어서 양수가 음수로 바뀌는 경우
(2) 언더플로우 : 자료 범위를 넘어서 음수가 양수로 바뀌는 경우
public class Test {
public static void main(String[] args) {
//int n = 30_0000_0000; --> 에러!
int n1 = 0b0111_1111_1111_1111_1111_1111_1111_1111; //int 최댓값 / int범위 : -2^31 ~ (2^31 - 1)
int n2 = 0b1000_0000_0000_0000_0000_0000_0000_0000; //최댓값에 2진수 1을 더한 값
System.out.println("n1 = " + n1); //n1 = 2147483647
System.out.println("n2 = " + n2); //n2 = -2147483648 ---> 오버플로우
int n3 = n2 - 1;
System.out.println("n3 = " + n3); //n3 = 2147483647 ---> 이처럼 음수가 양수로 바뀌는 경우는 언더플로우
}
}
- 문자형 : 유니코드에 따라 문자를 나타낸다
char c1 = '\u0000';
char c2 = '\uac00'; //'가'
//참조 : 한글 유니코드(UTF-8) https://jjeong.tistory.com/696
- 변수 표기법
표기법 | 어디에? | 예시 |
파스칼 | 자바 : 클래스 c# : 변수, 클래스 |
class Car { } Date, LocalDate, String, Scanner |
카멜 | 자바 : 변수, 메소드 | int speed, void speedTest(){} |
스네이크 - 소문자 | c, php | void speed_test(){} |
스네이크 - 대문자 | SQL문법 자바 : 상수 |
SELECT * FROM member final int MAX_SPEED |
헝가리언 | 과거 변수 타입을 구분하기 위해 사용 | int iMaxSpeed; int strUsername |
케밥 | html : class 구분 url 주소 표준 : '-'로 구분 |
<div class = "list-imgtxt"> http://www.naver.com/board-list //"_"가 아닌 "-"가 표준 |
| 연산자와 피연산자
- 단항 > 사칙연산 > 비교 > 대입, 크게 4가지의 방향으로 이해
- 아래의 어떤 연산자 보다도 가장 우선순위가 높은 것은 "( )"
우선순위 | 연산자 이름 | 연산자 | 연산 방향 |
1 | 후위 단항 | i++, i-- | 왼쪽에서 오른쪽 |
2 | 전위 단항 | ++i, --i, +val, -val, ! | |
3 | 곱셈/나눗셈/나머지 | *, /, % | |
4 | 덧셈 | + | |
5 | 비트이동 | >>, <<, >>> | |
6 | 관계 | >, <, <=, >=, instanceOf | |
7 | 동등 | ==, != | |
8 | 비트 AND | & | |
9 | 비트 배타적 | ^ | |
10 | 비트 OR | | | |
11 | 논리 AND | && | |
12 | 논리 OR | || | |
13 | 조건 삼항 | (조건) ? (참) : (거짓) | |
14 | 대입 | =, +=, -= .... | 오른쪽에서 왼쪽 |
- 비트 연산자
연산자 | 이름 | 사용 | 의미 |
& | 비트 AND | op1 & op2 | 비트가 모두 1이면 결과는 1, 아니면 0 |
^ | 비트 배타적 | op1 | op2 | 비트가 적어도 하나가 1이면 결과는 1, 아니면 0 |
| | 비트 OR | op1 ^ op2 | 비트가 서로 다르면 결과는 1, 같으면 0 |
~ | 보수(complement) | ~op1 | 비트가 0이면 결과는 1, 0이면 1 |
// 2의 보수를 구하는 법
int i1 = i2;
int i2 = ~i1 + 1; //~ : 1의 보수, 1을 더하면 : 2의 보수
- 비트 이동
연산자 | 이름 | 사용 | 의미 | 비고* |
>> | signed left shift | op1 >> op2 | [기존부호] 오른쪽으로 op2비트만큼 이동 | = op1 * 2^op2 |
<< | signed right shift | op1 << op2 | [기존부호] 왼쪽으로 op2비트만큼 이동 | = op1 / 2^op2 |
>>> | unsigned left shift | op1 >>> op2 | [0으로 채움] 오른쪽으로 op2비트만큼 이동 |
* 단, 변수의 Max크기까지만 가능하다. (ex. int 범위는 ~ 2^32까지)
- 형변환
(1) 자동 형변환 : 작은 범위에서 큰 범위의 자료형에 값을 넣을 때
(2) 명시적 형변환 : 큰 범위에서 작은 범위의 자료형에 값을 넣을 때. ex. int num = (int)(5/1.0);
- 연산 관련 예외
(1) ArithmeticException : (런타임 에러) 정수를 0으로 나눌 때
(2) Infinity : 실수를 0.0으로 나누면 무한대
(3) byte와 short 산술 연산 : 모두 int로 변환되어 연산 수행
| 제어문과 반복문
구분 | 이름 | 코드 | 비고 |
제어문 | 조건문 | if, if~else | 자바는 if~else if~else가 없다 |
스위치문 | switch~case | default | |
반복문 | - | for, foreach while, do while |
break와 continue |
'Language > Java' 카테고리의 다른 글
객체지향 언어의 특징 1_추상화 (모델링) (0) | 2022.07.20 |
---|---|
객체지향 프로그래밍이란? (0) | 2022.07.18 |
자바 기초 개념 정리 (0) | 2022.07.01 |
[객체지향프로그램] 응집도와 결합도 (0) | 2022.05.04 |
[이클립스] 프로젝트의 JDK 버전 변경하기 (0) | 2022.04.26 |