반응형

#필요 프로그램

1. git/svn/cvs

//github.com에서 프로그램 소스를 다운로드하기 위하여 설치해야 한다.

//

//Scoop

//매번 설치시 마다, 사이트 찾아가서 다운로드 하는 방법은 개발자에게 너무나도 귀찮고 피곤하다.

//따라서 중간매니저(Scoop 프로그램)을 이용해서 통해 설치를 해야한다.

//https://scoop.sh/

//윈도우에서 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. 컴파일 언어 인터프리터 언어가 무엇이고 대표적인 언어는?

 

반응형

+ Recent posts