#필요 프로그램
1. git/svn/cvs
//github.com에서 프로그램 소스를 다운로드하기 위하여 설치해야 한다.
//
//Scoop
//매번 설치시 마다, 사이트 찾아가서 다운로드 하는 방법은 개발자에게 너무나도 귀찮고 피곤하다.
//따라서 중간매니저(Scoop 프로그램)을 이용해서 통해 설치를 해야한다.
//윈도우에서 window powershell 작동
//powershell에 복사한 거 붙혀넣기
//Set-ExecutionPolicy RemoteSigned -scope CurrentUser 붙혀넣기
//A(모두 예)
//iex (new-object net.webclient).downloadstring('https://get.scoop.sh') 붙혀넣기
//Scoop was installed successfully! 나오면 설치 완료.
#Scoop으로 git 설치하기
//Scoop을 powerShell을 통해 설치했으니,
//powerShell에 scoop install git 을 입력하여 설치한다.
2. Eclipse/intellij/Visual Studio Code(VSCode)
//Intergrated Devlopment Environment Editor 설치 쉽게 말하면 편집도구
//Visual Studio Code는 HTML 등등 웹 메뉴나 이런거 더 이쁘게, 화려하게 편집할때 주로 쓰는 보조 편집도구
//visual studio code 검색
//download - window용 다운로드
3. JDK -> GraalVM 설치
//원래 JDK는 유료라서, 요새 원래 기계어가 트렌드기도 하고,
//GraalVM에 openJDK를 쓸 수 있어, GraalVM을 설치
//graalvm.org - download - Community Edition - download form github
4. Gradle
//Maven이 더 자주 사용 되지만, Gradle이 무료라서 그걸 사용함.
//scoop install gradle로 scoop으로 설치한다.
//gradle tasks --all 모든 명령어를 보여준다.
#언어
C, Java, Python(딥러닝 특화), R(통계 특화)
//언어의 개념 CPU에게 기계어로 직접 명령을 주면 가장 좋지만,
//기계어는 매우 어렵기 때문에 C, Java, Python 등등 언어를 통해 가상 기계어 = IR(Intermediate Representation)를
//IR은 너무 어렵기 때문에, 개발자간에는 bytecode라고 얘기한다.
//Virtual Machine을 이용하여 변환하여 전달한다.
//즉 이 과정을 compile(컴파일) 한다고 한다.
#진짜 기계어
//위에서는 진짜 기계어는 어려워서 가상기계어를 통해 컴파일한다고 햇으나,
//GraalVM을 통해 진짜 기계어로 컴파일 하기도 한다.
//추가 설명, 원래 C로 만들어진 개발자 코드는 java 개발자가 사용하지 못했지만
//GraalVM에서는 사용 가능하게 개발 된 프로그램으로
//이제 앞으로 대세는 GraalVM이 될 것 같다.
#빌드
//개발에서 실행을 하게끔 도와주는 것을 빌드라고 하는데
//빌드로는 Maven(70%정도 점유), Gradle(30%정도 점유)
#windows PowerShell 명령어(commendLine 커멘드라인)
cd .. //상위폴더 (change directory)
cd 폴더명 // 폴더명 진입
ls // 디렉토리
cp //복사(Copy)
#1. scoop 설치
- 윈도우 패키지 관리자
#2. graalVM 설치
- 유니버셜 가상머신 : JVM, NodeJS 포함
- graalvm.org 사이트에서 java11 버전 다운로드 받는다.
//java에서는 계속 버전이 추가되는데, 기업에서는 LTS 버전을 주로 쓴다.
//LTS 버전은 Long Term Service로 오랫동안 유지보수를 해주는 서비스를 말한다.
//따라서 오랫동안 유지보수를 하고, 안정화된 버전이기 때문에 기업에서는 LTS버전을 주로 사용한다.
//java LTS 버전은 8, 11, 17등이 있다.
- c:\bitcamp\에 압축 푼다
- graalvm의 bin 폴더를 실행 경로(path)에 추가한다.
- 왜? path에 추가해놓으면 아무 디렉토리에서나 해당 폴더의 프로그램을 실행할 수 있다.
- 등록 안하면? 해당 프로그램의 위치를 모르기 때문에 실행할 수 없다.
- 등록방법은?
- "시스템 환경 변수 편집" 검색하여 해당 프로그램 실행
- "고급" 탭 선택 => "환경변수"버튼 클릭
- "시스템 변수" 목록에서 path 변수의 값에 graalvm의 bin 폴더를 추가한다.
- graalvm이 설치된 폴더는 JAVA_HOME 이름으로 환경 변수에 등록한다.
- 자바 프로그램 중에서는 JDK(JRE)를 찾을 때 JAVA_HOME으로 등록된 경로를 찾기 때문이다.
- JDK(자바 개발 도구)를 설치한 후에는 반드시 이 환경 변수에 설치 디렉토리의 경로를 등록하라!
//JDK(java developement kit)
- 어떻게 설정하는 가?
- "시스템 변수" 목록에 "새로 만들기" 버튼을 클릭한다.
- "JAVA_HOME" 이라는 이름을 graalvm을 설치한 디렉토리를 지정한다.
ex) C:\bitcamp\graalvm-ce-java11-19.3.0(설치한 디렉토리 경로)
#3.Visual Studio Code(VSCode) 설치
- 일반 및 개발용 편집기
- 자바스크립트로 만든 프로그램
- 크롬 웹 브라우저를 기반으로 실행된다.(크롬 웹브라우저에 살을 붙여 만든 프로그램)
- 소스코드(.java, .html, .css, .js 등)를 편집하기 위해 설치
- 물론 일반 텍스트(.txt, .md 등)를 편집할 때도 사용한다.
#4. Eclipse 통합 개발 환경
- www.eclipse.org에서 설치를 도와주는 프로그램을 다운로드 받는다.
- 설치 도우미를 실행하여 eclipse를 설치한다.
- 이클립스의 작업 폴더(workspace 디렉토리)를 설정한다.
- 이클립스의 개발 환경을 설정한다.
- eclipse-inst-win64.exe 실행한다.
- update 마크(느낌표) 있으면 일단 해당 도구를 먼저 갱신한다.
- 갱신이 완료되면 이클립스를 재시작시킨다.
- eclipse-enterprise 버전설치
- eclipse 실행
- 워크스페이스(작업폴더) 지정 : c:\Users\사용자아이디\eclipse-workspace
- eclipse 사용 환경 설정
- JDK 경로 확인 및 지정
- window 메뉴 > Preferences 메뉴 클릭
- Java 노드 > installed JREs 클릭 및 JDK 설정 확인
- 자바 소스 코드를 저장할 때 사용할 인코딩 규칙 설정
- General 노드 > Workspace 노드 클릭
- "Text file encoding"의 값을 UTF-8로 설정한다.
- 기본 편집기의 실행 환경 설정
- General 노드 > Editors 노드 > Text Editors 노드 선택
- "Displayed tab width" = 2
- "insert spaces for tabs" = 체크
- "Show Print margin" = 체크, column 크기 100으로 설정
- "Show whitespace characters"의 "confiqure visibility" 링크 클릭
- carrage return과 line feed 는 체크 해제한다.
- 공백을 표시할 때 30% 투명도로 흐리게 출력한다.
- 웹 관련 파일을 저장할 때 사용할 인코딩 규칙을 설정
- Web 노드 > CSS Files 노드 선택 : encoding = UTF-8
- Web 노드 > HTML Files 노드 선택 : encoding = UTF-8
- Web 노드 > JSP Files 노드 선택 : encoding = UTF-8
- 폰트 및 크기 설정
- General 노드 > Appearance 노드 > Colors and Fonts 노드선택
- "Basic" 항목 > Text Font 선택
- 폰트의 종류와 크기를 설정한다.
#App 만드는게 궁극적인 목표이다.
//App을 만드려면 java를 이용해서 만든다.
//DBMS(데이터베이스)를 Oracle/MS-SQL/MySQL/MariaDB 등 이라는 프로그램을 이용해서 사용
//JDBC+SQL
//실무에서 시간을 단축시키기 위해 FrameWork를 사용하는데 주로 Spring/Mabatis 를 많이 사용한다.
//HTML/CSS/JavaScript을 이용해서 화면을 출력하는데,
//JavaScript를 제대로 활용하려면 jQurry+BootStrap이 필요하다.
//XML 사용법
//개발 도구로 git/gradle을 사용
//프로젝트 시 필요한 기술 Use-case/DB모델링이라는 기술이 필요하다.
//위와 같은 기술을 다 익혔을 때, App관련 현업 개발자라고 할 수 있다.
#GitHub
1. 저장소 생성
2. clone(남들이 올린 것을 다운로드 하는 것)
3. commit(변경, 추가, 삭제)
4. push(서버에 올리는 것)
5. pull
#5. Git 준비
- github.com 저장소 준비
- 회원가입
- 회원 인증 메일 확인
- 로그인
- "bitcamp-study" 저장소 생성
- 개발 PC에 github.com의 저장소 복제
- 저장소 복제할 폴더 생성
- C:\Users\user\git 폴더 생성
- $ git init // 실행한 위치를 git 저장소로 초기화 한다.
- $ git clone [깃허브_저장소_주소]
- 로컬 git 사용자 정보 설정
- 사용자 이메일 설정 : git config --global user.email "tema_@naver.com"
- 사용자 이름 설정 : git config --global user.name "TEMA"
- git 사용법
- 파일 추가하기
- bitcamp-study\test1.txt 파일 생성
- 로컬 저장소에 백업 목록 대상 작성 : $ git add test1.txt
- 로컬 저장소에 백업 : $ git commit -m "저장하는 이유"
//백업 목록에 올린걸 스테이징 했다.
//스테이지에 올렸다. 라고 얘기한다.
- 로컬 저장소의 내용을 git 서버에 업로드 : $ git push
- 서버 저장소의 변경 사항 가져오기
- $ git pull
git 태그 다는 방법
- $ git tag v001 // git tag [태그명]
git에 태그 올리는 방법(개별)
- $ git push origin v001 // git push origin [태그명]
git에 태그 올리는 방법(전부)
- $ git push origin --tags
git 태그 삭제하는 방법(내부)
- $ git tag -d v001 // git tag -d [삭제할 태그명]
git에 push된 태그 삭제하는 방법(git)
- $ git push origin :v001 // git push origin :[삭제할 태그명]
git에 branch 목록 확인
- $ git branch // 현재 로컬의 branch 목록 확인
- $ git branch -a // 모든 branch 목록 확인 // local, origin, upstream
- $ git branch 이름 // '이름'을 가진 브랜치(사본작업)를 생성한다.
현재 사용 branch 바꾸기
- $ git checkout develop // git checkout [branch명]
branch 복사하기
- $ git checkout -b develop origin/develop // git checkout -b [복사해오고,branch명] [복사할경로/복사할branch명]
git에 remote 추가
- $ git remote add upstream https://github.com/MadeByTEMA/simple-voting-system.git
// git remote add [가져오고,remote명] [가져올git주소]
현재 작업대에 올라와있는 remote명 확인
- $ git remote -v
upstream의 내용이 추가되어 업데이트
- $ git fetch upstream // git fetch [복사할remote이름]
upstream을 다운 받고 해당 branch를, 다른 branch에 적용
- $ git merge develop upstream/develop // git merge [복사해올branch명] [복사할경로/복사할branch명]
git commit history를 확인하는 방법 // 원격 저장소에 push 하는 것과는 별개이다.
- $ git log
Remote Repository // 외부에서 접속해 사용하는 저장소
Fork // 다른 사람의 저장소를 복사하는 기능
Pull Request // Fork한 저장소를 수정해 다시 원본저장소에 병합해 달라는 요청을 보내는 것
Issue // 저장소 안에서 사용자들 문제를 논의하는 기능
Wiki // 저장소에 관련된 체계적인 기록을 남기는 기능
# 컴퓨터와 소프트웨어
[ ]컴퓨터와 소프트웨어의 관계를 이해한다.
//소프트웨어는 컴퓨터를 이용하는데에 있어,
[ ]시스템 소프트웨어와 응용 소프트웨어를 구분할 수 있다.
# 프로그램의 구동 원리
[ ]컴퓨터에서 프로그램이 실행되는 원리를 이해한다.
//HDD에서 RAM으로 loading을 거친 후, RAM에서 CPU의 cache 메모리에
[ ]CPU 인스트럭션이 무엇인지 이해한다. (ARM CPU 기준) 검색 http://vision.gel.ulaval.ca/~jflalonde/cours/1001/h17/docs/arm-instructionset.pdf
[ ]CPU 인스트럭션과 실행 파일, OS의 관계를 이해한다.
[ ]같은 CPU에 맞춰 작성된 실행 파일이더라도 OS가 다르면 실행되지 않는 이유를 설명할 수 있다.
//CPU가 같더라도 운영체제 별로 기계어를 해석하는 형식과 방식이 다르기 때문에 실행되지않는다.
//Window에서 사용하려면 window 컴파일러를 통해서, Linux에서 사용하려면 그에 맞는 컴파일러를 통해야 한다.
//Window와 Linux에서의 받아들이는 Form이 다르기 때문에 실행이 되지 않는다.
# 중간 언어와 가상 머신
[ ]중간 언어와 가상 머신이 등장한 이유와 이점을 설명할 수 있다.
//원래는 같은 소스더라도, 각 운영체제의 컴파일러로 컴파일 후 해당 운영체제에서만 사용이 가능했다.
//여기서 문제는 각 운영체제에 맞는 명령어만 사용이 되었어야만 하고, 각 운영체제에 맞게끔 컴파일을 했어야 했다.
//따라서 개발자는 소스를 만들더라도 어떤 운용체제였는지 고민을 하여야 했다.
//이에 나온게 java이며, Write Onece Run Anywhere의 슬로건으로 등장하게 되었다.
//java의 경우에는 소스를 java 컴파일러를 통해 가상 기계어(bytecode=중간언어(Intermediate Representation=IR))
//컴파일하며, 각 운용체제에 맞게 bytecode 실행기를 통해 어떠한 운용체제인지 개발자가 고민하지 않아도 됐다.
//각 운용체제에 맞게 bytecode를 실행해주는 것이 JAVA Virtual Machine(JVM=java.exe)이다.
//가상 기계어를 운용체제에 맞게 실행하는 것이 interpreting이라고 한다.
[ ]VM과 인터프리터, 런타임, 플레이어, 엔진의 역할을 이해한다.
//인터프리터 방식은 따로 컴파일이 필요 없이, 실행하는 것을 이야기 한다.
//.java는 java 컴파일러로 번역(컴파일)을 거치고,
//이 번역된 중간언어를 VM에서 진짜 기계코드로 바꿔 실행한다.
//.js의 파일은 V8 엔진에서 실행시 문법 검사를 거치고 실행한다.
//실행시 전까지는 따라서 문법에 문제가 있는지 알 수 없다라는 치명적인 단점이있다.
//기계어와 거리가 멀기 때문에, 해석하려면 시간이 오래 걸린다.
[ ]JIT(Just-in-time)과 AOT(ahead-of-time)이 무엇이고 등장한 이유를 이해한다.
//JIT이란 VM이 매번, 기계어를 번역하고 실행하기에는 너무 느리기 때문에
//자주 사용되는 애들을 진짜 기계어로 번역하고 저장하고 있다.
//JIT의 단점은 실행하는 동안에 일정 부분에서 시간이 오래걸린다
//이유는 자주 사용하는 애들은 번역해놓고 가지고 있어 시간이 단축되는데,
//가지고 있지 않은애들은 번역을 거치고 실행해야 하기때문에 어떤 부분은 빠르고, 어떤 부분은 느리다.
//JIT의 단점으로 인해 AOT가 등장하게 된다.
//AOT는 app을 설치하고 다운로드하고 설치하는 시점에 번역(컴파일)해서 아예 기계어로 바꿔 놓는다.
//따라서 그 다음부터는 실행해도 항상 기계어로 다 번역이 되어있기 때문에 빠르다.
//즉 JIT는 설치는 빠르고, 실행할때 컴파일을 하기 때문에, 실행하고 진행하는 동안에 일부 빨라지고 느려진다.
//AOT는 설치시에 컴파일을 하기 때문에, 설치시에는 느리나, 진행하는 동안에는 다 컴파일을 끝낸 상태기 때문에 진행은 빠르다.
//AOT의 단점은 설치시 시간이 너무 느리다.
//따라서 요새는 JIT와 AOT의 방식을 결합해서 사용한다.
//설치시에는 AOT방식 처럼 주요 코드만 컴파일 해서 사용하지만,
//app이 조금 한가할때, 미리미리 남은 부분들을 컴파일 하는 방식으로
//JIT의 방식을 결합해서 사용한다.
//JIT은 가상 기계어로 바꿔두고, 일부라도 진짜 기계어로 바꾸어 실행속도를 높이기 위해 등장하였다.
//다만 JIT의 방식은 진짜 기계어로 바꿔두지 않은 부분은 가상 기계어를 진짜 기계어로 컴파일 하는 시간이 필요하여
//중간중간 속도가 느려진다.
//AOT는 이러한 단점을 커버하기 위하여, 실행시 모두 컴파일하여 진짜 기계어로 바꿔두지만,
//설치시 시간이 오래 걸린다.
# 자바 바이트코드와 자바 가상 머신
[ ]자바 바이트코드 실행 환경을 준비할 수 있다. OpenJDK 설치, JAVA_HOME 과 PATH 환경 변수 설정, Sublime 편집기 설치
[ ]자바 바이트코드를 이해한다. 검색 https://docs.oracle.com/javase/specs/jvms/se13/jvms13.pdf
[ ]바이트코드와 클래스 파일(.class)의 관계를 이해한다. /HelloWorld.class https://medium.com/@davethomas_9528/writing-hello-world-in-java-byte-code-34f75428e0ad
//.java를 javac 컴파일러를 통해 .class(bytecode, p-code, IR)로 중간언어로 바꿔주게 되고, 이를 JVM으로 실행한다.
[ ]클래스 파일과 JVM의 관계를 이해한다. $ javap HelloWorld.class, $ javap -verbose HelloWorld.class
//JVM은 IR 파일을 실행시키는 인터프리터, 런타임, 플레이어, 엔진
[ ]JVM을 이용하여 클래스 파일을 실행할 수 있다. $ java HelloWorld
//클래스 파일 안에 있는 바이트코드를 JVM으로 해석할 수 있다.
# 프로그래밍 언어와 컴파일
[ ]컴파일 방식 프로그래밍이 등장한 이유를 이해한다.
//인간이 이해하기 좋은 명령어로 작성 한 이후 그것을 컴파일을 통해, 기계어로 변환한다.
[ ]프로그래밍 언어와 컴파일, CPU 인스트럭션의 관계를 이해한다.
//.java라는 프로그래밍 언어로 프로그램을 짰고, 그것을 가상 기계어로 컴파일 하고, JVM을 통해
//실제 기계가 알아 듣게, CPU 인스트럭션으로 바꿔준다.
[ ]컴파일러를 이용하여 소스 코드를 목적 코드(CPU 인스트럭션)로 생성하는 과정을 이해한다. (C 프로그래밍 언어 기준) /module.c, /main.c $ gcc -c 소스파일
[ ]링커를 이용하여 목적 코드가 들어 있는 파일을 하나로 묶어 실행 파일을 만드는 과정을 이해한다. (C 프로그래밍 언어 기준) $ ld -o 실행파일 목적파일 목적파일 … -lSystem -macosx_version_min 10.13
[ ]"소스 파일, 목적파일, 실행 파일"과 "컴파일러, 링커"의 관계를 이해한다. (C 프로그래밍 언어 기준)
//C의 과정에서는 컴파일 한 파일들을 묶는 링킹(linking)이라는 과정을 통해 실행 파일을 만들었다.
//linking을 가능하게 한 것이 링커이며, 자바에서는 위와 같은 링킹의 단계가 없다
# 컴파일러와 인터프리터
[ ]인터프리트 방식 프로그래밍과 실행 과정을 이해한다.
//hello.js 처럼 js파일은 자바스크립트를 이용한 프로그래밍인데,
//이는 node.exe 같은 자바스크립트 엔진(JavaScript Engine) 이 필요하다.
[ ]Node.js 자바스크립트 인터프리터를 준비할 수 있다. https://nodejs.org/en/
[ ]인터프리터를 사용하여 소스 파일을 직접 실행하는 과정을 이해한다. (Node.js 기준) /hello.js $ node hello.js
[ ]컴파일 방식과 인터프리트 방식의 구동 원리를 이해한다.
[ ]컴파일 방식과 인터프리트 방식의 장단점을 비교할 수 있다.
//#Interpreter 방식
//인터프리트 방식은(ex. node js) 실행을 해야만 스크립트의 오류 여부를 알 수 있다.
//오류가 있더라도 실행이되며, 결과값도 오류가 없다면 정상적으로 출력되나.
//결과값에 오류가 생긴다면 그제서야 오류메세지가 실행된다.
//즉 interpreter 방식은 실행할 부분만 문법 검사를 하며, 실행할 때만 문법 검사를 한다.
//실행할 때마다 문법 검사를 하므로, 실행속도가 느리다.
//소스를 읽어서 실행하기 때문에 실행속도가 느리다.
//실행할 부분만 문법 검사를 하기 때문에, 배포할 때 문법 오류가 존재할 수 있다.
//#Compiler의 방식
//C를 예로 들면, Hello.c를 컴파일러로 컴파일 하게 되면,
//hello.o가 생기는데, hello.o에 prontfc(확실치 않음)을 사용하여 stdio.lib 등등을
//링커(linker)를 이용하여 링킹하여 hello.exe가 컴파일의 결과로 나오게 된다.
//hello.exe는 기꼐어이므로, 실행 속도가 빠르다.
//기계어를 직접 실행하기 때문에 Engine/VM이 필요없다.
//단점은 플랫폼(CPU,OS)에 종속된다.
//플랫폼이 다르면 플랫폼에 맞춰 다시 컴파일해야 한다는 단점이 있다.
//#Java 방식(Interpreter+Compiler)
//Hello.java를 실행할때, Compiler(javac)의 도움을 받아
//문법검사를 거치며, 가상기계어로 변환하여 .class파일을 생성한다.
//이후 class 파일을 JVM을 통해 실행하는데, JVM은 인터프린터의 역할을 담당한다.
//문법검사를 컴파일 할때 거치고 실행한다.
//Interpreter 방식보다 속도가 빠르다(가상 기계어기 때문에 빠르다.)
//Compiler 방식보다는 느리다.(진짜 기계어가 아니기 때문에 실행시 마다 JVM의 도움을 받아야 한다.)
//Compiler 방식을 보완하기 위해 JIT/AOT 방식이 등장했다.
# 자바 프로그래밍 절차
[ ]자바의 프로그래밍 방식과 실행 원리를 이해한다.
[ ]자바 코드와 바이트코드, 소스 파일과 클래스 파일의 관계를 이해한다.
//.java가 Source file이며, .class(bytecode, p-code, IR) 파일이 class 파일이 된다.
[ ]자바 컴파일러와 JVM의 역할을 이해한다.
//자바 컴파일러는 .java 파일을 class파일로, JVM은 class 파일을 기계어로 바꾸어 .exe파일로 실행하게 한다.
[ ]CLI 환경에서 컴파일을 수행할 수 있다. /Hello.java $ javac Hello.java
//CLI가 Command Line Interface이다. 이 대표적인 예는 터미널, powershell이다.
[ ]CLI 환경에서 자바 클래스 파일을 실행할 수 있다. /Hello.java $ java Hello
# 소스 파일과 컴파일 결과 파일 분리
[ ]Maven 표준 디렉토리 구조를 만들 수 있다. Maven 표준 디렉토리 구조에 맞춰 폴더를 생성
//src(source)
// -main
// -java(자바소스파일) = ex) .java
// -resources(실행 중에 사용할 기타 파일) = ex).properties, .txt, .xml 등
// -test
// -java(자바소스파일) = ex) .java
// -resources(단위테스트에 사용하고 기타파일) = ex).properties, .txt, .xml 등
[ ]각 디렉토리의 용도를 이해한다.
[ ]프로젝트 디렉토리에서 소스 디렉토리에 있는 자바 소스 파일을 컴파일 할 수 있다. src/main/java/Hello2.java $ javac src/main/java/Hello2.java
//javac src/main/java/Hello2.java
//class 파일을 만들어 달라고 명령어를 얘기 후, 경로 .java 파일 이름을 작성하면 된다.
[ ]컴파일 할 때 컴파일 결과로 생성된 클래스 파일을 별도 디렉토리에 분리할 수 있다. src/main/java/Hello2.java $ javac -d bin/main src/main/java/Hello2.java
//javac -d bin/main src/main/java/Hello2.java
//class파일을 만들어 달라고 명령어를 얘기 후, -d로 만약 새로 생성할 경로(bin/main)가 없다면 생성하라는 명령어,
//src/main/java/Hello2.java의 클래스 파일을 만들어달라고 얘기.
[ ]다른 디렉토리에 있는 클래스 파일을 실행할 수 있다. src/main/java/Hello2.java $ java -classpath bin/main Hello2
//java -cp bin/main Hello2
//JVM 실행시켜달라고 -cp(= -classpath)로 클래스가 있는 경로(bin/main) 선언 후 실행시킬 클래스 이름 작성(Hello2)
# 패키지와 소스 파일
[ ]패키지의 용도를 이해하고 패키지를 생성할 수 있다. com.ohoracs.basic src/main/java/com/ohoracs/basic 디렉토리 생성
//원래 회사에서는 com(도메인)/ohoracs(회사명)/basic(제품명)이라고 폴더명을 설정한다.
//도메인 회사명 제품명 순인 이유는 추후 깃 등등에서 타 코드를 가져올 때, 폴더명이 겹칠 수 있기 때문이다.
//즉 소스파일을 관리하기 편하게 하기 위해서
[ ]소스 파일에 작성한 코드가 패키지에 소속되게 할 수 있다. src/main/java/com/ohoracs/basic/Hello3.java
[ ]패키지에 소속된 소스 파일의 적절한 디렉토리 경로와 왜 그 위치에 놓아야 하는지 이해한다.
[ ]컴파일 한 후 생성된 클래스 파일의 디렉토리 경로와 그 위치에 있어야 하는 이유를 안다.
[ ]패키지에 소속된 클래스 파일을 실행할 수 있다. src/main/java/com/ohoracs/basic/Hello3.java $ java -cp bin/main com.ohoracs.basic.Hello3
[ ]패키지를 적용하지 않은 채로 그 소스 파일을 그냥 패키지 폴더에 둔다면 컴파일 할 때 어떤 문제가 발생하는지 안다. src/main/java/com/ohoracs/basic/Hello4.java
//src/main/java/com/ohoracs/basic까지 컴퓨터 상에서 볼 때에는 다 같은 폴더이지만,
//JVM과 자바컴파일러의 눈에서는 src/main/java까지는 지정 경로로 파악하고,
//그 밑에서부터는 package로 파악한다.
//java -classpath bin/main/com/ohoracs/basic Hello3
//위와 같이 실행하면 클래스파일이 있음에도 오류가 난다.
//따라서 패키지 안의 class를 실행 시킬 때에도, 패키지 구분을 해줘야 한다.
//java -classpath bin/main/ com.ohoracs.basic.Hello
//단, 위와 같은 작업을 하기 전에 .java에 package 선언을 해주어야 한다.
//추가적으로 자바와 코틀린 디렉토리는 src/main/java와 src/main/kotln으로 생성을 하지만,
//bin폴더에는 java와 kotln 폴더가 별도로 생성되지 않는다.
//제작 파일의 이름은 hello3.java ,hello3.kt로 다르지만 각각 컴파일 하면 hello3.class로 결과는 같다.
//이는 kotln은 java의 호환언어라고 하는데 kotln 이외에도 몇가지가 있다.
//bin폴더 안에 별도로 폴더가 생성되지 않고, 나중에 컴파일 된 파일로 덮어씌워진다.
//따라서 패키지의 이름을 다르게 하여 차별성을 준다.
# Gradle 빌드 도구
[ ]Gradle 빌드 도구를 이용하여 작업 폴더를 자바 프로젝트 폴더로 구성할 수 있다. /프로젝트폴더 $ gradle init
//#아키텍처
//빌드 이전의 과정
//1. 요구사항 식별 - 분석 - 설계(설계는 개발자 10년차 이상급의 프로)
//#빌드
//0. 프로젝트 폴더 준비
//1. 명령어 작성(.java/.xml/.html/.css/.js)
//2. 컴파일(실행할 수 있도록 번역=.class)
//3. 단위테스트(JUnit)
//4-1. 배치파일 생성(.jar/.war/.zip)
//4-2. API 문서 생성(*.html)
//5. 업로드(서버에 배치)
//빌드의 도구로는 처음에는 Ant -> Maven -> Gradle 순으로 발전 해왔다.
//Ant의 빌드 파일은 bulid.xml을 띄고 있다.
//Maven은 Ant에 의존라이브러리관리 기능을 추가하여 나왔고 빌드 파일은 pom.xml을 띈다.
//Gradle은 Maven에 복잡한 제어를 하기 위하여 XML 대신 Groovy 언어를 사용하여 설정 스크립트를 작성한다.
//Gradle은 안드로이드 개발 기본 빌드 도우미이다.
[ ]Gradle로 생성된 src 디렉토리의 구조를 이해하고 설명할 수 있다. /src
[ ]src 디렉토리 외에 다른 디렉토리나 파일의 용도를 이해한다.
//빌드도구를 사용하면 자동으로 프로젝트 폴더를 구성해준다.
//개발이 완료되면 사용자에게 배포할 수 있는 zip파일을 생성해준다.
## 자바 기초 문법 - com.ohoracs.basic
#### 클래스 블록과 컴파일, 실행
//Application S/W 처음에는 한줄한줄 코딩을 했는데,
//c언어와 같은 function기능이 도입되었다.
//function (명령어를 관리하기 쉽게 기능단위로 묶는 문법)
//function으로도 부족해서 class가 도입되었다.
//class (function을 관리하기 쉽게 역할에 따라 묶는 문법)
//class로도 부족해서 package가 도입되었다.
//package (class를 관리하기 쉽게 디렉토리로 묶는 문법)
//Data
//리터럴 : Data 표현법
//변수 : Data를 저장할 메모리를 준비하는 방법
//배열 : 같은 유형의 메모리를 여러개 준비시키는 문법
//연산자 : Data를 가공하는 도구
//제어문 : 명령문의 실행 흐름 제어
//메서드(function) : 명령어들을 관리하기 편하게 기능 단위로 묶는 문법
//클래스 : 메서드를 관리하기 편하게 역할(책임)단위로 분류하는 문법
//상속 : 기존 명령에 새 기능을 추가하는 문법
//접근제어(캡슐화) : 메서드나 메모리의 접근제어
//사용자 정의 데이터 타입 : 메모리 구조를 Data에 맞게 커스터마이징하는 문법
//생성자 : 인스턴스를 초기화 시키는 기능
//인스턴스 : 클래스 설계도에 따라 준비한 메모리
//인스턴스 메서드 : 인스턴스 메모리를 다루는 기능
//오버라이딩 : 기존 기능 재정의하는 문법
//오버로딩 : 같은 이름의 유사기능 추가 문법
//다형적 변수 : 같은 유형의 메모리를 가르키는 방법
//다형성 : 오버라이딩, 오버로딩, 다형적 변수를 묶어서 부름.
//OOP문법 : 리터럴부터 다형성까지 적은 모든 것을 묶어서 부름(Object Oriented Programming=객체 지향성 프로그래밍)
//Data를 저장하는데 있어
//File I/O : 개발자가 직접 Data를 저장하는 도구 사용법
//JDBC : DBMS를 사용해서 Data를 저장시키는 도구 사용법
//Mybatis Framework : JDBC도구를 좀 더 쉽게 사용하게 해주는 도구 사용법
//네트워킹 : Data를 송수신
//HTML : Data를 Web을 경유하여 표현하는 언어
//CSS : HTML 모양 제어
//JavaScript : Web을 경유하여 최종사용자의 행동을 제어하는 기술
//Bootstrap , JQuery : CSS/JavaScript 도우미 도구
//Spring WebMVC : 서버관리 도움
//Linked list , Stack , Queue : 데이터를 구조화 시키는 알고리즘
#데이터 저장
//변수 ? 데이터를 저장하기 위해 확보한 메모리 (확보 ; 준비한, 생성한)
#변수 선언
// : 데이터를 저장할 메모리를 준비하는 과정을 변수 선언이라고 한다.
// OS에서 JVM 등 에게 RAM을 할당한다.
// JVM에선 할당받은 RAM을 Method Area / Heap / Stack 부분으로 나누어 구분하는데
// Method Area 부분에는 클래스 코드가 만들어진다.
// heap new를 생성하는 객체가 저장된다. ex) 배열
// Stack 부분에 저장되는 변수를 local 변수라 한다.
// Method Area 에서 만든 클래스에 대한 전체적인 진행이 이루어지고,
// stack에는 선언한 로컬 변수가 들어가 있다. (배열의 '주소'를 가지고 있다고 생각)
// heap에는 new로 인해 생성된 객체를 가지고 있다. (stack에서 선언한 배열의 주소로 접근하여 heap에서 값을 가져감)
// call by reference (ex07 Exam0320)을 들어 설명한다면.
//
int temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
// 위와 같이 되어있다고 했을때, 주소의 값을 스왑할 수 있는 이유는
// 해당 arr[1] 등등은 stack 부분에서 heap에 저장되어있는 배열의 주소만 가지고 있기 때문에,
// 값을 스왑해도 배열의 주소 안의 값을 바꾸는게 아닌, 주소를 바꾸는 것이라 스왑할 수 있는 것이다.
// 즉 heap에는 배열의 주소에 따른 실제 값이 stack에는 배열의 주소가 들어있다.
// [메모리 종류] [메모리 별명] ; = [data type] [varrable] ; = [int] [i] ; = int i ;
// [data type]
// 정수 : byte(1byte) short(2) int(4) long(8)
// 부동소수점 : float(4) double(8)
// 논리 : boolean(4)
// 문자 : char(2)
// 위 8개의 데이터 타입을 primitive data type = 자바 원시 타입 = 자바 기본 타입 이라고 한다.
// 배열 : 같은 data type의 메모리를 여러개 생성할 때 사용
// int[ ] arr = new int[ ];
// arr ; 배열 주소에 주소(offset)를 저장하는 변수 "reference"
// 값을 저장하는 메모리 "instance"
- [ ] 소스 파일(.java)과 클래스 블록(class 클래스명 {…}), 클래스 파일(.class) 관계를 이해한다. `ex01/Exam11.java`
- [ ] 한 소스 파일에 여러 개의 클래스 블록이 있을 때 컴파일하면 어떻게 되는지 안다. `ex01/Exam12.java`
- [ ] 클래스의 사용 범위(공개/비공개)에 따라 소스 파일과 클래스 블록의 이름이 어떤 관계가 있는지 안다. `ex01/Exam21.java, Exam22.java, Exam23.java`
- [ ] 컴파일 할 때 소스 파일의 인코딩을 지정할 수 있다. `ex01/Exam3.java`
- [ ] JVM이 클래스를 실행하는 과정을 이해하고 설명할 수 있다.
- [ ] main() 메서드의 용도를 알고 있으며 작성할 수 있다. `ex01/Exam4.java`
#### 주석
- [ ] 자바 소스 코드에 주석을 달 수 있다. `ex02/Exam1.java`
- [ ] 주석(`//, /* … */`)의 종류와 작성법을 안다. `ex02/Exam1.java`
- [ ] Javadoc 주석(`/** … */`)의 용도를 이해하고 이 주석을 이용하여 HTML 문서를 생성(`javadoc 사용`)할 수 있다. `ex02/Exam2.java`
- [ ] 애노테이션(`@Override`)의 용도와 문법을 이해한다. `ex02/Exam3.java`
#### 데이터 종류에 따른 리터럴 표기법
- [ ] `정수, 부동소수점, 논리, 문자, 문자열` 리터럴 문법의 용도를 이해한다. `ex03/Exam1.java`
- [ ] 정수 리터럴을 10진수, 8진수, 2진수, 16진수로 표현할 수 있다. `ex03/Exam21.java`
- [ ] 문자 '_' 를 사용하여 정수 리터럴의 자릿수를 표현할 수 있고, _ 문자의 적절한 위치를 안다. `ex03/Exam22.java`
- [ ] 메모리에 값을 저장하기 위해 데이터를 2진수로 변환해야 하는 이유를 설명할 수 있다.
- [ ] 메모리 크기에 따라 정수를 저장할 수 있는 범위가 다른 이유를 이해한다.
- [ ] 메모리 크기에 따라 정수 리터럴을 4바이트와 8바이트로 구분하여 표현할 수 있다. `ex03/Exam23.java`
- [ ] 정수 리터럴이 메모리 크기를 벗어날 때 어떤 문제가 발생하는지 안다. `ex03/Exam23.java`
- [ ] 정수 리터럴이 메모리에 어떻게 저장되는지 이해한다. `ex03/Exam24.java`
- [ ] 정수를 2진수로 표현하는 다양한 방법을 이해한다. (Sign-magnitude, 1의 보수, 2의 보수, Excess-K 방식)
- [ ] 부동소수점 리터럴을 다양한 방식으로 표기할 수 있다. `ex03/Exam31.java`
- [ ] 메모리 크기에 따라 부동소수점 리터럴을 4바이트와 8바이트로 구분하여 표현할 수 있다.`ex03/Exam32.java
- [ ] 메모리 크기에 따라 부동소수점의 최소/최대 크기를 알아낼 수 있다. `ex03/Exam33.java`
- [ ] 부동소수점이 메모리에 저장되는 원리를 이해한다. (IEEE 754 규칙에 따라 부동소수점이 2진수로 변환되는 것을 이해한다.) `ex03/Exam34.java`
- [ ] 부동소수점이 때론 완전하게 2진수로 변환되지 못하는 이유를 안다.
- [ ] 자바에서 부동소수점을 IEEE 754 규칙에 따라 2진수로 변환된 것을 확인해 볼 수 있다. `ex03/Exam35.java`
- [ ] 문자 리터럴을 다양한 방식으로 표기할 수 있다. `ex03/Exam41.java`
- [ ] 문자 집합(character set), 유니코드, UCS, UTF, UTF-8, UTF-16의 의미를 이해한다. `ex03/Exam42.java`
- [ ] ASCII, ISO-8859-1, EUC-KR, 조합형, MS949, Unicode의 의미를 이해한다.
- [ ] UCS(ISO 10646)를 UTF-8로 바꾸는 규칙을 이해한다.
- [ ] UCS 대신 UTF-8이 사용되는 이유를 안다.
- [ ] 문자를 다룰 때 작은 따옴표('')의 의미를 이해한다. `ex03/Exam43.java`
- [ ] 논리 리터럴을 표현할 수 있다. `ex03/Exam5.java`
- [ ] 문자열 리터럴을 표현할 수 있다. `ex03/Exam6.java`
- [ ] 문자열과 다른 유형의 데이터를 결합할 때 어떤 결과가 발생하는지 안다. `ex03/Exam6.java`
- [ ] 이스케이스 문자의 역할과 사용법을 안다. `ex03/Exam7.java`
#### 변수
- [ ] 변수를 선언할 수 있다. `ex04/Exam11.java`
- [ ] 변수 선언의 의미를 설명할 수 있다. `ex04/Exam11.java`
- [ ] 여러 개의 변수를 한 문장으로 선언할 수 있다. `ex04/Exam111.java`
- [ ] 변수가 가리키는 메모리에 값을 저장할 수 있다. `ex04/Exam12.java`
- [ ] 변수 선언할 때 값을 저장할 수 있다. `ex04/Exam121.java`
- [ ] 한 문장으로 여러 개의 변수를 선언할 때에도 값을 저장할 수 있다. `ex04/Exam122.java`
- [ ] 한 문장으로 여러 개의 변수를 선언할 때 일부 변수만 값을 저장할 수 있다. `ex04/Exam123.java`
- [ ] 변수가 가리키는 메모리의 값을 변경할 수 있다. `ex04/Exam13.java`
- [ ] 블록 안에서 변수를 선언할 수 있는 위치를 안다. `ex04/Exam14.java`
- [ ] 변수를 먼저 사용하고 그 다음에 변수를 선언할 때 발생하는 문제를 안다. `ex04/Exam141.java`
- [ ] 같은 이름의 변수를 중복해서 선언할 때 발생하는 문제를 안다. `ex04/Exam142.java`
- [ ] 변수의 값을 출력할 수 있다. `ex04/Exam15.java`
- [ ] 변수의 값을 다른 변수에 저장할 수 있다. `ex04/Exam151.java`
- [ ] 변수를 초기화시키지 않은 후 사용하면 어떻게 되는지 안다. `ex04/Exam152.java,Exam153.java`
- [ ] 값의 종류에 따라 변수를 선언할 수 있다. `ex04/Exam16.java`
- [ ] primitive data type을 데이터 유형에 따라 크기에 따라 구분할 수 있다. `ex04/Exam16.java`
- [ ] primitive data type 과 referece type을 구분할 수 있다. `ex04/Exam16.java`
- [ ] 정수 데이터 타입(byte, short, int, long)의 각 변수의 메모리 크기와 이 메모리에 저장할 수 있는 최대, 최소 값을 안다. `ex04/Exam21.java`
- [ ] 4바이트와 8바이트 크기의 정수 리터럴을 각 타입의 변수에 저장할 때 규칙을 이해한다. `ex04/Exam22.java`
- [ ] 작은 메모리에 큰 메모리의 값을 넣을 때 어떤 일이 일어나는지 안다. `ex04/Exam23.java`
- [ ] 4바이트 부동소수점 변수에 넣을 수 있는 값의 최대, 최소 크기를 말할 수 있다. `ex04/Exam31.java`
- [ ] 8바이트 부동소수점 변수에 넣을 수 있는 값의 최대, 최소 크기를 말할 수 있다. `ex04/Exam311.java`
- [ ] 단정도, 배정도의 용어를 이해한다. `ex04/Exam311.java`
- [ ] 부동소수점 리터럴의 크기에 따라 적절할 부동소수점 변수를 선언할 수 있다. `ex04/Exam32.java`
- [ ] 잘못된 부동소수점 리터럴을 변수에 저장할 때 어떤 문제가 발생하는지 이해한다. `ex04/Exam321.java`
- [ ] 부동소수점 변수끼리 연산할 때 결과가 부동소수점의 크기를 벗어날 경우 발생되는 문제를 안다. `ex04/Exam322.java`
- [ ] 작은 부동소수점 메모리에 큰 부동소수점 메모리의 값을 넣을 때 발생되는 문제는 안다. `ex04/Exam33.java`
- [ ] UCS-2에 정의된 문자 코드를 저장할 변수를 선언할 수 있다. `ex04/Exam41.java`
- [ ] char 변수에 저장할 수 있는 최대, 최소 값을 말 할 수 있다. `ex04/Exam41.java`
- [ ] char 변수에 문자의 UCS-2 코드 값을 저장하고 출력할 수 있다. `ex04/Exam42.java`
- [ ] char 변수에 저장된 문자 코드를 화면에 출력할 때 문자로 표현하는 과정을 설명할 수 있다. `ex04/Exam42.java`
- [ ] 따옴표를 활용하여 문자의 UCS-2 코드 값을 알아낼 수 있다. `ex04/Exam43.java`
- [ ] 정수를 UCS-2 문자 코드로 인식하게 하여 문자를 출력할 수 있다. `ex04/Exam44.java`
# 예제
1. 객체지향 프로그래밍 특징 3가지
2. int는 몇 바이트인지
-4 바이트(자바) C는 OS의 비트를 따라간다.
(16비트 OS의 경우 2바이트, 32비트 4바이트, 64비트 8바이트)
3. char의 특징
-2바이트 유니코드 저장
4. 함수의 라이프 싸이클
5. var이 무엇인지? 특징은?
6. 전역변수/지역변수의 차이
7. JVM을 설명해보라
-바이트코드를 실행하는 플레이어이다.
class 파일을 실행하면 메모리에 로딩을 하는데 메소드 에어리어라는 영역에 로딩한 후
로딩된 class의 유효성을 검사한다.
8. ER 스키마 엔티티 애트리뷰트가 무엇인지?
9. 컴파일 언어 인터프리터 언어가 무엇이고 대표적인 언어는?
'IT Developer > Bitcamp' 카테고리의 다른 글
비트캠프 프론트엔드 및 백엔드 개발자 SQL (0) | 2020.02.18 |
---|---|
비트캠프 프론트엔드 및 백엔드 개발자 #Project v26 ~ v42 (0) | 2020.01.21 |
비트캠프 프론트엔드 및 백엔드 개발자 #Project v1 ~ v25 (0) | 2020.01.13 |
비트캠프 프론트엔드 및 벡엔드 개발자 annotation, concurrent, corelib, exception, generic, httpcomponents, io (0) | 2020.01.06 |
비트캠프 프론트엔드 및 벡엔드 개발자 디자인 패턴 & 알고리즘 (0) | 2019.12.30 |
비트캠프 프론트엔드 및 백엔드 개발자 oop Week 04~07 (Day 17 ~ Day 37) #강남학원 (19.12.24.~20.01.21) (0) | 2019.12.24 |
비트캠프 프론트엔드 및 백엔드 개발자 basic Week 03~04 (Day 11 ~ Day 16) #강남학원 (19.12.16.~12.23) (0) | 2019.12.17 |
비트캠프 기초특강 #종로학원 (19.11.18~11.22) (0) | 2019.12.04 |