JAVA
- os를 가리지 않음
- 소스코드 파일(*.java)을 컴파일(*.class) 하면 자동으로 os에 맞게 실행, 이식성이 좋음
- oop(object orient program) : 객체지향프로그램, 레고형태로 조립하여 사용
- 객체 안에 속성(변수)과 매서드(동작)
- 메모리관리의 편리함(비지니스 로직)
- 멀티스래드
- 동적로딩
- JDK = JVM(Java Virtual Machine) + JRE(Java Runtime Environment) 
- 클래스 파일 = 바이트 코드 파일
- JVM의 구동명령어에 따라 컴파일러가 컴파일
- 메모리공간, 객체 내의 코딩공간 중요

JDK(Java Developement Kit) : 여러 버전 존재, 가장 안전한 버전 1.8 + 11v

개발자끼리의 약속
자바프로젝트이름은 대문자시작
패키지명은 다 소문자시작
클래스는 무조건 대문자시작 

cmd 관리자모드는 찾기에서 cmd적고 ctrl+shift+엔터

IDE
1. 프로젝트 생성기능
2. 자동완성기능
3. 디버깅
4. 플러그인 
5. 환경설정 metadata

java jdk 삭제

1. 터미널 켜기
2. cd /Library/Java/JavaVirtualMachines/
3. ls 입력 후 내부 파일 파악
4. sudo rm -rf jdk이름.jdk
5. mac password 입력
윈도우 java 설치
[] 안에는 입력 명령어
1. 선생님이 주신 javaUtil 프로그램 c드라이브에 압축풀기
2. javaUtil 폴더 안에 이클립스 알집 풀기
3. zulu 어쩌구 파일 다운로드
4. cmd 열기 그리고 [java -version] 으로 버전확인

5. 내 pc 우클릭 속성 > 고급시스템설정 > 고급 탭 > 환경변수 > 시스템변수 
6. 새로만들기 클릭 후 변수 이름에 [JAVA_HOME] 변수 값에 [C:\\Program Files\\Zulu\\zulu-8]
7. 시스템 변수 중에 path 클릭 새로만들기 누르고 [%JAVA_HOME%\\bin] 입력

8. cmd에 [javac] 입력 후 잘 깔렸는지 확인

9. cmd에서 c드라이브 가는 법 [c:] 또는 [cd c:\\]

mac apple silicon

환경변수 설정

root에서 ls .bash_profile 확인 후 
open .bash_profile로 파일 켜서 수정 후 
source .bash_profile로 적용 후
printenv로 적용여부확인
이클립스

이클립스 실행 후 우측상단 open perspective 켜서 Java 선택 //코어자바연습

워크스페이스[작업공간] 런치

file > Switch Workspace > other > 경로 선택 후 런치

작업환경설정

* 초기화 
window > perspective > reset perspective

*설정 

window > preference

Workspace에서 text file encoding을 utf-8로 변경
Web에서 css Files, html Files, jsp Files의 언어를 utf-8로 변경

*프로젝트 생성
project java로 생성 1.8버전 맞춘 후
프로젝트 파일에 우클릭 project facets에서 java 버전 1.8로 맞추기
//패키지 : 폴더로 관리하는 개념
package hello;
/*
	작동방식
	: *.java = 사람이 볼 수 있는 코드, 저장 후 컴파일을 하면 *.class가 만들어짐(= 컴퓨터가 알 수 있는 코드)
		a. HelloWorld.java 코딩
		b. HelloWorld.class 컴파일
		c. JavaVirtualMachine(JVM => JDK설치시 생김)이 해석
		d. 결과 출력
		
	JVM = a. HelloWorld.java와 같은 이름의 HelloWorld.class 파일을 찾아
		  b. (무조건) main메서드를 찾아 첫 번 째로 실행시키도록 약속이 되어 있음
		  c. 자바의 Entry Point(시작점) = main() 메서드

*/
public class HelloWorld {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("첫 번 째 자바코딩 !!");
	}

}
A. 데이터 타입 = 기본 타입(Primitive type), 참조타입(Reference type)이 있음
* 기본타입(리터럴) = byte, char, short, int, long, float, double, boolean => 총 8개 , stack에 저장
* 참조타입 = 클래스, 인터페이스, 배열, 열거 , heap에 저장

B. 변수의 메모리 사용
* 기본 타입 변수 = 실제 값을 변수 안에 저장 => stack
* 참조변수 타입 = 주소를 통해 객체참조(=주소값 참조) => heap

기본 자료형(Primitive Type)

char 16비트 유니코드(Unicode) 문자 데이터 16 ‘\u0000’ ~ ‘\uFFFF’
boolean 참/거짓 값 8 true 또는 false
byte 부호를 가진 8비트 정수 8 -128 ~ +127
short 부호를 가진 16비트 정수 16 -32,768 ~ +32,767
int 부호를 가진 32비트 정수 32 -2,147,483,638~+2,147,483,647
long 부호를 가진 64비트 정수 64 -9223372036854775808~+9223372036854775807
float 부호를 가진 32비트 부동 소수점 32 -3.402932347e+38~+3.40292347e+38
double 부호를 가진 64비트 부동 소수점 64 -179769313486231570e+308~1.79769313486231570e+08

참조 자료형(Reference Type)

C. JVM이 사용하는 메모리 영역 
: OS에서 할당받은 메모리 영역(Runtime Data Area)을 세 영역으로 구분
* 메서드 영역(Method Area)
  => (참고) 런타임 상수풀, 필드/메서드 데이터, 메서드 코드, 생성자 코드 => 4영역 구분
  => JVM이 시작될 때 생성
* (JVM)스택 영역(Stack Area)
  => 스레드-n이 생성될 때마다 변수 n개가 저장되는 영역
  => JVM별 생성
* 힙 영역(Heap Area)
  => 주소값이 가르키고 있는 실제 데이터가 있는 영역
  => JVM이 시작될 때 생성
  => 객체/배열 등 저장
  => 사용되지 않는 객체 => Garbage Collection이 자동 제거

//참조는 클래스 본인도 데이터 형이 될 수 있음
public class Jb04ReferenceType {
  public static void main(String[] args){
		ReferenceData1 refDate1 = new ReferenceData1();
		ReferenceData1 refDate2 = new ReferenceData1();
		//refDate1과 refDate2는 같은 클래스를 생성하지만 주소값이 다름
	}
}
데이터 타입에 따라 계산할 수 있는 연산이 다름
따라서 데이터 타입을 반드시 알아야 함
숫자형, 문자형이 데이터 타입의 핵심

# 복합연산자(Operator) : +,-,*,/,%

int num = 1;
int num2 = 2;
num + num2 //result = 3 : int

int num = 1;
long num3 = 10;
num + num3 //retult = 11 : long
* 작은 타입과 큰 타입이 연산될 시 자동으로 더 큰 타입으로 형 변환 (promotion)
 
String str = "1";
int num4 = 99;
str + num4 //retult = 199 : String
* 문자열과 숫자가 결합 시 문자열로 리턴

# Math : 수학 객체
객체 = 폴더 = 수학에 관련된 중요한 것들을 그룹화 해놓은 매서드, 프로퍼티들이 있다.
* Math.PI : double //원주율
* Math.floor(double num) : double //내림
* Math.ceil(double num) : double //올림

# String : 문자열 객체
* String.length() : int
* String.replace(char old_str, char new_str) : String

# Escpae 문자 : \\t, \\n, \\b, \\', \\" , \\\\ ...
\\ 다음에 오는 회피문자 => 일부 컴파일러는 다르게 나오거나 비정상적인 결과를 제공할 수 있음
(예) \\t => 탭, \\n => 개행, \\b => 백스페이스(단어사이공백제거), 
\\' => 작은따옴표, \\" => 큰 따옴표, \\\\백슬래쉬

System.out.println("Hello" +"\\t"+"world"+" 탭 문자열"); //Hello	world 탭 문자열
System.out.println("Hello" +"\\n"+"world"+" 개행"); //Hello
																									//	world 개행
System.out.println("Hello " +"\\b"+"world"+" 단어사이공백제거"); //Helloworld 단어사이공백제거
System.out.println("Hello" +"\\'"+"world"+" 작은따옴표"); //Hello'world 작은따옴표
System.out.println("Hello" +"\\""+"world"+" 큰따옴표"); //Hello"world 큰따옴표
System.out.println("Hello" +"\\\\"+"world"+" 백슬래쉬"); //Hello\\world 백슬래쉬

# Casting : 강제로 데이터형을 변환시킴
(ex) int num3 = (int)1.1;

# Scanner : inputStream //입력스트림
* java.util 소속 객체
(ex) import java.util.Scanner; //불러오기
Scanner scan = new Scanner(System.in) //객체 생성
* 참조 변수는 객체 자신도 데이터타입이 될 수 있음
참조객체 변수이름 = new 메서드()

scan.next() : String
scan.nextByte() : byte
scan.nextShort() : short
scan.nextInt() : int
scan.nextLong() : long
scan.nextBoolean() : boolean

(ex) int num = scan.nextInt() : int
* 입력한 값에 맞는 데이터형과 일치하는 변수에 담아야 함

# for문

for(int i=0; i<9; i++){실행문;}

* 초기값 생략
int i=0;
for(; i<9; i++){실행문;}

* 조건식 생략
for(i=0; ; i++){if(i<200) break;}

* 증감식 생략
for(i=0; i<5;){i = (++i);}
**# 패키지 (package)**

* 클래스 파일의 묶음
* 프로젝트의 하위 디렉토리. 즉, 클래스를 담아놓는 폴더
* 패키지의 네이밍은 소문자로 시작, 개발자들 끼리의 암묵적 약속

**# 객체지향프로그래밍(Object Oriented-Programming)**

* 객체를 정의하고, 객체를 조립하여 프로그래밍 하는 것 (예)시침, 분침, 초침 => 시계

**# 절차지향프로그래밍(Procedural Programming)**

* 순서대로 일어나는 일을 시간 순으로 프로그래밍하는 것
* 처리속도가 빠른 대신에 유지보수가 어렵다

**# 클래스**

* 객체지향 프로그래밍의 기반, 객체의 속성과 기능을 담고 있음
* 속성(property || attribute)은 멤버변수라고 부름 
* 클래스의 네이밍은 대문자로 시작, 파일명과 같아야함
* 작성형식
접근제어자 class 클래스이름 {
	멤버변수;
	메서드(){
		실행문
	}
}

**# 멤버변수**

* 객체의 속성, 데이터
* 작성형식, []안의 값은 생략 가능
[접근제어자] [메모리할당변수] [키워드] 데이터타입 변수이름 = 값;
// 접근제어자 = private || public, 메모리할당변수 = static, 키워드 = final 등등...

**# 메서드**

* 객체의 메서드, 기능
* 작성형식, []안의 값은 생략 가능
[접근제어자] [메모리할당변수] 리턴타입 메서드이름([변수타입 변수]){
	실행문;
}
// 접근제어자 = private || public, 메모리할당변수 = static, 리턴타입 = void 등등...

* 메서드에 void를 쓸 경우 리턴값 반환 없이 바로 실행
* void 메서드 (반환값이 없음)
public void voidMethod(){
	System.out.println("void method!");
}
* return type 메서드 (반환값이 있음)
public String stringMethod(){
	return "string method!";
}

**# 인스턴스 (Instance)**
* 객체(class)를 불러오는(생성) 것
* 작성형식
데이터타입(객체이름) 변수이름 = new 객체이름();
* 객체 본인이 데이터타입이 될 수 있음
* 객체생성 키워드 = new
* 기본 변수타입을 제외한 모든 변수는 참조변수
* 참조(Reference)변수에 불러온 객체(인스턴스)를 할당하여 사용
* 불러온 객체는 heap(동적메모리)의 메서드 공간에 할당

**# DAO (DATA ACCESS OBJECT)**
* DB에 접근하여 수정, 삽입, 삭제 등의 기능을 수행
* MVC 중에서 M(Model)에 해당

**# 생성자**
* 클래스를 생성할 때만 호출, 생성자 이름은 클래스 이름과 같고, 반환값은 없음
* 생성과 동시에 멤버변수 초기값 설정하는 역할
* 디폴트 생성자는 컴파일시 자동으로 자바 컴파일러가 값을 생성 (생성자명 = 클래스명)
* 생성자는 매개변수의 값으로 클래스 생성 시 초기화 해주고 싶은 멤버변수를 코딩해줌.

public Person(){}
		//a. 디폴트 생성자
		public Person(){}
    //b. 생성자 만들기
    public Person(String name){
        this.name = name;
    }
		String name;
}

**# 접근제어자**
* 종류 : public, protected, private, default
* 정보은닉, 캡슐화 등때문에 사용
* public : 멤버변수, 메서드가 외부 클래스에서 접근 가능하므로 누구나 사용가능
* protected : 같은 패키지 내부와 (상속) 관계의 클래스에서만 접근 가능. 그 외 접근 불가
* private : 멤버변수, 메서드가 외부 클래스에서 사용 불가. 즉, 같은 클래스에서만 사용 가능
//외부에서의 접근을 막아, 데이터를 외부에서 바꾸지 못하도록 하기 위해(=데이터 보안을 위해 사용)
* default : 같은 패키지 내에서 사용

**# this**
* 자신의 메모리 주소를 가르키는 키워드 => 즉, 생성된 인스턴스 스스로를 가르키는 예약어
class Birthday {
		int num = 1;
		public int getNum(){
				return this.num;
		}
}