java LTS : 8, 17, 21
오랫동안 지원받을 java 예정인 버전
스프링 부트와의 호환을 생각해서 21 버전으로 사용할 예정
자바에서 package = 폴더
ui 에서 확인하면 폴더와 똑같이 노출됨
main 메서드
실행할 수 있는 시작점. 실행 단위 중 하나
왼쪽의 녹색 버튼이나 위쪽의 녹색 버튼으로 런 가능
자바는 수많은 컴퓨터 프로그래밍 언어 중 하나
컴퓨터 프로그래밍에 사용하는 언어
자바를 다 배우고 한번 더 읽어보는걸 추천!
객체 - 하나하나의 요소
프로그램을 하나 만드는데 하나하나의 객체로 구성되어 있다. 그 객체들이 서로 상호작용 하면서 프로그램을 동작 시킨다. 이렇게 완성하는 기법을 객체 지향 프로그래밍 (OOP)라고 한다.
다양한 프로그램 작성 방식 중 하나. 6장에서 한번 더 짚고 넘어갈 예정.
ex) 자동차를 만드는데 수많은 부품이 필요함, 자동차 = 프로그램 / 수많은 부품 = 객체
C++ : 메모리를 코드상에서 관리 해야 함 ↔ JAVA : 메모리를 자동으로 관리 해줌
개발자가 할 일을 조금 덜어준다고 이해하면 됨. 메모리를 관리하는 Garbage Collector (GC)가 있음.
프로그램상에 문제가 있을 때 GC를 직접 들여다 볼 수 있음. 자바에 특화된 기능.
java script에는 GC가 없음. 해당 언어는 인터프리터 언어로 한줄한줄 실행 시켜서 따로 GC가 없다.
라이브러리 - 개발자가 개발을 할 때 필요로 하는 것들을 가져다 쓸 수 있는 것. 마치 도서관에서 책을 빼 쓰듯이.
JVM - 눈에 보이지 않는 가상 머신
자바 소스(사람이 읽을 수 있는 파일)에 코드를 작성해서 컴파일 해주면 기계들이 이해할 수 있도록 클래스 파일(기계가 읽을 수 있는 파일) 로 변환되고 JVM(가상의 머신)으로 실행되는 것
인텔리제이에서 런을 시킨다는 건 : 자바소스를 자바 컴파일러를 시켜준 다음 클래스 파일로 빌드 시킨 후 실행 시킨 것.
RUN : 컴파일, 빌드 → 실행 (런타임)
컴파일 단계 : 코드를 작성하는 단계
실행 (런타임) : 런 시킨 후 단계
런타임 데이터 에어리어 - 개발자가 선언한 변수, 클래스, 매서드 등등 저장해두는 창고
익스큐션엔진 - 말 그대로 런 시켜주는 엔진
클래스 로더 - 번역가, 클래스 파일을 기계가 알아 들을 수 있도록 번역을 해주는 친구.
GC - 메모리를 관리해주는 친구. 런타임 데이터 에어리어에서 사용하지 않는 코드가 있으면 알아서 제어.
일단 구조랑 키워드만 알아두기
개발자가 anyprogram.java를 작성 > 컴파일을 시킨 후 클래스 파일로 변환 > JVM이란 녀석이 각 OS에 따라 실행 시켜줌 > 런이 됨
자바의 가장 큰 장점 중 하나는 한번 작성 하면 어디서든 실행된다.(”Write Once, run anywhere”) → JVM이 있기에 가능한 장점
cd C:\Users\사용자명.jdks\corretto-17.0.9\bin
bin>javac
javac 로 컴파일 가능
해당 명령어를 치면 클래스 파일이 생성됨 (JVM이 인식할 수 있는 이진(binary) 파일로 만들어주는 것 )
특징 맨 아래 내용 다시 확인하기
Main.java
소스파일을 Main.class
클래스 파일로 컴파일 합니다. JVM이 인식할 수 있는 이진(binary) 파일로 만들어주는 것이죠.Main.java
파일과 같은 위치에 Main.class
파일이 생성 되었을겁니다.여기까지 직접 java javac 명령어로 자바 코드를 실행해보았습니다.
위 2, 3번에서 수행하는 컴파일, 실행 과정을 인텔리제이(IntelliJ)에서는 Run 버튼 하나만으로도 수행됩니다 🙂
자바 공식 문서
https://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html
메서드 작성 후 컨트롤 누르고 클릭하면 설명을 읽을 수 있음.
컨트롤 누르고 메서드 눌러도 볼수있음
해당 버튼 클릭 시 파일 위치를 알수있음.
자바 이전의 많이 사용하는 기본적인 자료 구조들은 해당 base에 다 들어가 있음
자바 표준 API 문서, JDK
import문
import java.util.HashMap;
import 패키지.클래스;
해당문을 작성해야 아래에 해당 클래스 라이브러리를 사용할 수 있음.
없으면 해당 이미지처럼 나오고 해당 버튼 클릭시 임포트문이 작성 됨.
제네릭 - <>로 되어있고 안에 파라미터를 넣어서 사용하는 것, 타입파라미터를 정의할 수 있음.
// : 행 주석
// 라인부터 끝까지 주석 처리. 한 줄만 주석 할 때 해당 주석 방식 사용
// 한줄한줄한줄한줄한줄한줄한줄한줄한줄한줄한줄한줄
/~/ : 여러 행 주석, 범위 주석
/**/ 라인부터 끝까지 주석 처리. 여러줄을 주석 할 때 해당 주석 방식 사용
/*
여러줄여러줄여러줄여러줄여러줄여러줄여러줄여러줄여러줄여러줄
여러줄여러줄여러줄여러줄여러줄여러줄여러줄여러줄여러줄여러줄
*/
실무에서 사용할 때 코드의 기능, 히스토리, 설명 등 즉 존재 이유를 작성하는데 찬반 논란이 있음.
이후에 변수 명과 메서드 명은 의미 있는 네이밍으로 하는 게 중요!
ex) int index = 1 // void 의미있는_네이밍() {}
이때 커밋 할 때는 의미있는 주석이 아니거나 나한테만 필요한 주석이면 삭제 후 커밋 한다.
실행문은 변수 선언, 값 저장, 메소드 호출에 해당하는 코드
변수 선언문, 값 저장, 메소드 호출, 제어문(if 조건, for 반복) / 대략 해당 범주 안에서 정리됨.
웬만하면 한 줄 한 줄 이후에 세미클론을 붙여준다 (;) 이유는 세미클론을 보고 실행문의 끝을 인지함. 반드시 붙여준다.
// 해당 코드 작성법을 추천
int index = 1; // 변수의 선언과 값 저장
int loop = 2;
int result = index + loop;
System.out.println(result);// 메소드 호출 println()
예를 들어 앞의 코드를 다음과 같이 바꾸어 작성해도 전혀 문제가 없음.
// 추천하지는 않지만 사용할수는 있음
int index = 1; int loop = 2;
int result =
index + loop;
System.out.println(result);
파이썬이나 스포크 안붙임, 이유는 줄 바꿈으로 실행문의 끝을 이해함
구조
public - 접근제어자, 클래스 파일 하나에 public class는 무조건 하나는 들어가 있어야 함
// 클래스 블록
public class 클래스명 {
//필드라고 하는애가 들어오기도 함.
/* 메서드 블록 */
[public|private|protected] [static] (리턴자료형|void) 메서드명1(입력자료형 매개변수, ...) {
// [접근 제어자(여기선 없어도 괜찮음), []는 생략가능] (리턴 타입이라고도 함, 없으면 void) 메서드명 (매개변수 목록이 올수도 하나만 적을수도 있음.)
// 여기서 main 메서드는 자바에서 실행을 할수있는 특이한 메서드이다.
명령문(statement);
실행문
ex)
int result = 11;
return result;
...
}
/* 메서드 블록 */
[public|private|protected] [static] (리턴자료형|void) 메서드명2(입력자료형 매개변수, ...) {
명령문(statement);
...
}
...
}
특정 규칙이 있음 거의 컨벤션임. → 맨 앞엔 동사로 시작
ex) 회원정보를 조회한다! getMembersProfile || findMembersProfile
회원정보를 저장한다! saveMembersProfile
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
명령문의 맨 뒤에는 세미콜론(;)을 항상 표시
자바에서는 명령문 맨 뒤에 반드시 이것을 표기해 문장이 끝났다는 것을 표기해야한다.
클래스 블록 안에서 변수 선언 가능, 메서드 블록 안에서도 변수 선언 가능하다.
변하는 수
프로그래밍 하는 과정에서 필요에 따라 데이터를 저장할 때 사용하는 공간
변수를 선언했을 때 특정 공간이 할당된다.
특정 메서드를 변수에 저장하기도 함.
변수에는 하나의 값만 저장할 수 있음. 단 배열 자료형의 경우엔 복수개의 값을 저장
(자료형 타입)(변수명) = (값); 순서기억!
오른쪽 값을 왼쪽의 변수에 할당한다.
int age = 20;
double pi = 3.14;
자바에 예약어라는 것이 있다.
해당 예약어로는 변수를 설정하면 컴파일 에러가 난다.
아래 내용처럼 빨간줄이 그여진다.
예약어는 아래 표 확인.
분류 | 예약어 |
---|---|
기본 데이터 타입 | boolean, byte, char, short, int, long, float, double (실수형 타입) |
접근 지정자 | private, protected, public, default |
클래스와 관련된 것 | class, abstract, interface, extends, implements, enum |
객체와 관련된 것 | new, instanceof, this, super, null |
메소드와 관련된 것 | void (리턴 값이 없을 때) , return |
제어문과 관련된 것 | if, else, switch, case, default, for, do, while, break, continue |
논리값 | true, false |
에외 처리와 관련된 것 | try, catch, finally, throw, throws |
기타 | transient, volatile, package, import, synchronized, native, final, static, strictfp, assert |
public class VariableExample {
int value;
int result = value + 10;
}
변수 value는 선언만 되고 초기화 되지 않은 값이기 때문에 산술 연산식에서 사용할수 없음.
value의 초기값을 설정하면 해결 가능!
변수의 호출은 선언한 해당 중괄호 블럭 내에서만 호출 가능하다.
지역변수과 같은 개념.
외부에서 호출하면 호출 불가능
하나의 블럭 안에서 변수명이 중복되서 사용되면 안되지만 중괄호 스코프가 다르면 사용 가능하다.
변수의 네이밍 규칙은 다음과 같습니다.
1. 숫자로 시작해서는 안됨.
2. 예약어를 사용해서는 안됨.
3. 자가 구분되며 길이에는 제한이 없음. (다만, 길이가 너무 길어진다면 가독성이 많이 떨어지니 주의.)
4. 특수문자는 언더바(_)와 달러($)만 가능.
위의 네이밍 규칙은 자바 컴파일러가 규정하는 규칙이지만, 다음으로 오는 네가지는 ‘컨벤션’, 혹은 권장사항 정도로 알고계시면 좋음.
1. 클래스나 변수명은 영문이어야 합니다.
2. 클래스명의 첫 글자는 항상 대문자여야 합니다.
3. 여러 단어가 합쳐진 변수명 이라면 단어의 시작은 대문자로 합니다. 단, 변수명의 첫 시작은 소문자 입니다.
예시) saveMembers, lastIndexOf
4. 상수(지금 선언한 값에서 절대 변할 수 없는 값)의 이름은 대문자가 권장사항 입니다. 단어 사이의 구분자는 언더바(_) 입니다.
예시) MIN_NUMBER, LAST_NAME
코딩 컨벤션
[JAVA] Google Java Style Guide 요약 번역
(1) 자바에서의 변수 선언은 어떤 타입의 데이터를 저장할것인지,
변수 이름이 무엇인지를 결정한다.
타입 변수명 = 초기값 세팅;
(2) 변수는 선언 시 사용한 타입의 값만 저장할 수 있다.
(3) 변수는 변수가 선언된 중괄호{} 안에서만 사용 가능하다.
(4) 변수는 초기값이 저장되지 않은 상태에서 읽을 수 있다.
(1) className - 카멜 케이스로 적은 변수명. 웬만하면 이런 평이한 형식으로 작성.
(2) class - 예약어로 변수명으로 사용 x
(3) 6hour - 앞에 숫자로 시작해서 변수명으로 사용 x
(4) $value - 변수명으로 사용 가능하지만 해당 변수명은 조금 지양하도록
(5) _age - 변수명으로 사용 가능
(6) at - 변수명으로 사용 가능
정수타입 - byte, short, int, long, float, double, boolean
참조타입 - Class, Array, Enum
자바의 변수 타입은 매우 엄격
1 byte = 8 bit
bit는 0과 1이라는 데이터로 구성
각각의 자리는 1과 0으로 채울 수 있음. 즉 2의 8승 > 256가지 숫자
값의 종류 | 기본 타입 | 메모리 사용 크기 | 저장되는 값의 범위 |
---|---|---|---|
정수 | byte | 1byte | -128 ~ 127 |
정수, 문자 | char | 2byte | 0 ~ 65535 |
정수 | 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.4E+/-38(7개의 자릿수) |
실수 | double | 8byte | 1.7E+/-308(15개의 자릿수) |
논리형 | boolean | 1byte | true, false (1,0) |
정수 타입을 메모리 사용 크기 순서대로 나열하면 다음과 같음.
byte (1byte) < char (2byte) < short (2byte) < int (4byte) < long (8byte)
byte 타입
아래의 for문으로 확인 하는 방법도 있고 해당 방법처럼 확인 하는 방법도 있음
129가 byte에 담을 수 없어서 int를 써서 담으라는 제안
package chap01;
public class GarbageValueExample {
public static void main(String[] args) {
byte a = 127; // -128 ~ 127
int b = 127; // +- 20억 이것보다 숫자가 크면 long
for (int i = 0; i < 5; i++) { // i = 0 ~ 4
a++; // a = a + 1
b++;
System.out.println(i + " a = " + a);
System.out.println(i + " b = " + b);
}
}
}
결과값
0 a = -128 // byte는 127 이상으로 표현 할 수 없기에 쓰레기값이 할당 되었음.
0 b = 128 // int는 127 이상으로 표현 가능하여 정상적으로 노출되는 것을 확인 가능
1 a = -127
1 b = 129
2 a = -126
2 b = 130
3 a = -125
3 b = 131
4 a = -124
4 b = 132
또 다른 테스트
package chap01;
public class GarbageValueExample {
public static void main(String[] args) {
byte a = 127; // -128 ~ 127
int b = 127; // +- 20억 이것보다 숫자가 크면 long
int c = 2147483647; //
long d = 2147483647; //
for (int i = 0; i < 5; i++) { // i = 0 ~ 4
a++; // a = a + 1
b++;
c++;
d++;
System.out.println(i + " a = " + a);
System.out.println(i + " b = " + b);
System.out.println(i + " c = " + c);
System.out.println(i + " d = " + d);
}
}
}
결과값
0 a = -128
0 b = 128
0 c = -2147483648
0 d = 2147483648
1 a = -127
1 b = 129
1 c = -2147483647
1 d = 2147483649
2 a = -126
2 b = 130
2 c = -2147483646
2 d = 2147483650
3 a = -125
3 b = 131
3 c = -2147483645
3 d = 2147483651
4 a = -124
4 b = 132
4 c = -2147483644
4 d = 2147483652
char 타입
정수형도 문자형도 저장 가능하지만 문자형을 자주 사용
// 문자
char ch = 'C';
// 문자열 - String이라는 참조타입으로 저장할 수 있음.
String str2 = ""; // 문자열을 초기화 한다~
String str = "값을 표현할 수 있습니다.";
int 타입
4byte(32bit)로 표현
-2147483648 ~ 2147483647
실무에서 정수값을 int 타입으로 가장 많이 사용하고, 21억이 넘어가는 큰 범위의 숫자는 long타입 사용.
long 타입
8byte(64bit)로 표현되는 정수값을 저장할 수 있는 타입
-9223372036854775808 ~ 9223372036854775807
은행, 우주와 관련된 프로그램에서 많이 사용
int에서 표현할 수 있는 4byte를 넘어가면 표시해 주는게 좋다.
package chap02;
public class VariableExample {
// long 타입
public static void main(String[] args) {
// psvm 치면 해당 구문 나옴, 익숙해질때까진 타이핑
int a = 1;
int b = 1000000000; // int에 담을 수 있는 값이라 오류 x
int b = 10000000000; // int에 담을 수 없는 값이라 오류
int b = 10000000000L; // 정수 타입이 long이 아니어서 오류
long b = 10000000000L; // 오류 해결
long longValue = 100; // (int -> long 자동 변환됨)
long longValue2 = 10000000000L; // 100억, 지금 기본적으로 int 정수형을 생각해서 오류를 띄우고 있음. -> int형이 아니라 long 타입이라는 표식을 해줘야함 - 숫자 뒤에 L을 적으면 초기회됨.
}
}
소수점이 있는 숫자를 실수
float(4byte) < double(8byte)
자바는 기본적으로 double을 사용하여 float를 사용하여 실수값을 저장하려면 값 뒤에 f 나 F 를 붙여주면 된다. 이때 소문자도 사용할 수 있지만 구분을 뚜렷하게 하기 위해 대문자로 적어준다.
double var1 = 3.14;
float var2 = 3.14F;
package chap02;
public class VariableExample {
public static void main(String[] args) {
// psvm 치면 해당 구문 나옴, 익숙해질때까진 타이핑
//float, double 타입
float floatValue = 1.01234F;
double doubleValue = 1.1234;
//System.out.println(); sout 치면 해당 구문 바로 나옴, soutv 치면 바로 위의 값을 넣어서 나옴
System.out.println(floatValue);
System.out.println(doubleValue);
}
}
//결과값
1.01234
1.1234
소수점의 정밀도 차이
double이 더 정밀한 소수점이 표현 가능
package chap02;
public class VariableExample {
public static void main(String[] args) {
float floatValue2 = 0.1234567890123456789F;
double doubleValue2 = 0.1234567890123456789;
System.out.println(floatValue2);
System.out.println(doubleValue2);
}
}
//결과값
0.12345679 // 0.12345678자리까지 나오고 뒷자리에서 반올림
0.12345678901234568 // 0.12345678901234567자리까지 나오고 뒷자리에서 반올림
boolean 값은 1byte(8bit)로 표현되는 논리값 (true/false)을 저장할 수 있는 데이터 타입
public static void main(String[] args){
boolean stop = true;
if (stop) {
System.out.println("중지합니다!"); // 해당 문구 노출
} else {
System.out.println("시작합니다!");
}
}
// 여기서 시작합니다!를 노출시키려면
// stop의 할당값을 false로 바꾸거나 if(stop)를 if(!stop)로 바꾸면 된다.
public class Question {
public static void main(String args[]) {
/*
* serialNo는 15자리의 숫자로 이루어져 있습니다.
* serialNo 변수를 선언하는 한 줄의 코드를 적으세요.
*/
System.out.println(serialNo);
}
}
long serialNo = 100000000000000L;
public class Question {
public static void main(String args[]) {
// 다음 문장들의 출력 결과를 확인해보세요.
System.out.println("10" + "04");
System.out.println("" + false);
System.out.println('a' + 100);
}
}
1004
false
197
public class Question {
public static void main(String args[]) {
// 에러가 발생하는 부분을 고쳐보세요.
byte a = 999;
char b = 'abc';
float c = 1.23d;
}
}
int a = 999;
String b = "abc";
float c = 1.23F;
2 참조 자료형
2byte , 0~65535
2. char b = ' ';
3. String c = "Hello";
4. int d = 12345;
int example7Value1 = 100;
float example7Value2 = 10.5F;
float example7Value3 = 10.0F;
int example7Value4 = 5;
System.out.println(example7Value1 + example7Value2)
System.out.println(example7Value1 / example7Value4)
System.out.println(example7Value3 / example7Value4)
// 결과값
110.5
20
2.0
char example8Value = '\uac00';
System.out.println(example8Value);
//결과값
가
public class ChangeNumbers {
public static void main(String[] args) {
int x = 1;
int y = 20;
int z = 300;
// 코드를 작성해주세요
System.out.println("x = " + x);
System.out.println("y = " + y);
System.out.println("z = " + z);
}
}
<실행결과>
x = 20
y = 300
z = 1
int tmp;
tmp = x;
x = y;
y = z;
z = tmp;