여러 언어에서 null 안전성을 주요 마케팅 쟁점으로 내세우면서 null 안전성이 관심을 많이 받고 있습니다.
자바에서도 null을 잘 다루어야 소프트웨어 결함을 줄이고 견고하게 만들 수 있는데 null의 위협에서 코드를 안전하게 지키는 설계 지침을 정리하고 안전하다고 확인하는데 도움이 되는 도구를 소개합니다.
여러 언어에서 null 안전성을 주요 마케팅 쟁점으로 내세우면서 null 안전성이 관심을 많이 받고 있습니다.
자바에서도 null을 잘 다루어야 소프트웨어 결함을 줄이고 견고하게 만들 수 있는데 null의 위협에서 코드를 안전하게 지키는 설계 지침을 정리하고 안전하다고 확인하는데 도움이 되는 도구를 소개합니다.
SLiPP(https://slipp.net) 서비스를 Java에서 Scala로 전환하는 과정에 대해 살펴본다. Scala를 선택한 이유, Java와 Scala를 동시에 서비스하면서 점진적으로 리팩토링하는 과정, Scala + Spring 기반으로 개발할 때 고려사항, Java에서 Scala로 전환하는 과정에 대한 경험담을 공유한다.
Java Memory 구조와 내용에 대해서 정리한 PPT 입니다.
회사에서, 서버가 메모리 누수가 발생하여 뻗는 사건이 생겨서 팀원들이 전부 공부를 해서 발표를 했습니다.
GC는 Heap 영역에서 일어납니다.
메서드 영역 : 클래스 놀이터 입니다.
힙 영역 : 생성된 객체 및 배열 놀이터 입니다.
스택 영역 : 메서드 놀이터 입니다.
SLiPP(https://slipp.net) 서비스를 Java에서 Scala로 전환하는 과정에 대해 살펴본다. Scala를 선택한 이유, Java와 Scala를 동시에 서비스하면서 점진적으로 리팩토링하는 과정, Scala + Spring 기반으로 개발할 때 고려사항, Java에서 Scala로 전환하는 과정에 대한 경험담을 공유한다.
Java Memory 구조와 내용에 대해서 정리한 PPT 입니다.
회사에서, 서버가 메모리 누수가 발생하여 뻗는 사건이 생겨서 팀원들이 전부 공부를 해서 발표를 했습니다.
GC는 Heap 영역에서 일어납니다.
메서드 영역 : 클래스 놀이터 입니다.
힙 영역 : 생성된 객체 및 배열 놀이터 입니다.
스택 영역 : 메서드 놀이터 입니다.
스프링 컨테이너는 base-package의 클래스를 검색해서 자동으로 자바빈으로 등록하는데 이에 해당하는것이 @Component, @Repository, @Service, @Contoroller, @RestController 어노테이션이다.
자동스캔을 위해서는 <context:component-scan /> 과 같이 base-package를 기술하며, 패키지가 여럿인 경우, 콤마로 구분하여
기술한다.
3. 1. 프로그램이란
1. 프로그램 기초
• 목록, 순서,예정계획이란뜻
• Rapp&Poertner(1992) -특정목표를달성하기위한활동의집합체
• Y
ork(1983) - 목표를달성하기위한일련의상호의존적인활동
• Smith(1989)–특정목표를달성하기위해서만들어진조직적인활동
• 어떤작업을하기위한일련의순서를컴퓨터에게알려주기위한파일
• 일련의순서를컴퓨터가이해할수있는명령어들의모음
• 컴퓨터가이해할수있는명령어는0,1로되어있는데사람이이해할
수있는언어를프로그램언어라한다.
• 두산백과사전:컴퓨터를실행시키기위해차례대로작성된명령어모음
“ 어떤 목적을 달성 하기 위해서 프로그램 언어로 진행 순서를 작성 한 것 “
1-1. 프로그램 이란
• 어떤목적을수행하기위해만든파일
프로그램 실행
입력 ( 마우스, 키보드 등 )
처리 ( 계산, 화면 출력 등 )
프로그램 종료
처리하기위한명령어
을프로그램언어로작성
• 시스템프로그램
-컴퓨터시스템과하드웨어들을제어및관리하는프로그램
-예) 윈도우,리눅스,장치드라이버,컴파일러등
• 응용프로그램
-사용자가원하는기능을제공하는프로그램
-엑셀,게임,워드등…..
사전적의미 컴퓨터프로그램
프로그램파일(.exe) 프로그램종류
프로그램과소프트웨어
• 프로그램
-컴파일된결과물뿐만아니라,프로그래머가작성한소스코드까지도포함.
• 소프트웨어
-프로그램뿐만아니라CD,설명서,제품포장등패키지전체.
4. 2. 프로그램 언어
1. 프로그램 기초
• 컴퓨터시스템을구동시키는소프트웨어를작성하기위한형식언어
• 컴퓨터를이용하여특정문제를해결하기위한프로그램을작성하기
위해사용되는언어
• 저급 언어
-기계어
● 컴퓨터가직접이해할수있는언어
● 0과1의2진수형태로표현되며수행시간이빠르다.
● CPU에내장된명령들을직접사용하는것으로,프로그램을작성하고이해하기가
어렵다.
● 기종마다기계어가다르므로언어의호환성이없다.
-어셈블리어
● 기계어와1:1로대응되는기호로이루어진언어로,니모닉(Mnemonic)언어
● 하드웨어제어에주로사용되며,언어의호환성이없다.
• ● 컴퓨터가직접이해할수없으므로어셈블리어로작성된프로그램은어셈블러를
사용하여기계어로번역해주어야한다.
• 고급 언어
● 컴파일러언어라고도하며,인간이실생활에서사용하는자연어와비슷한형태및
구조를가지고있다.
● 하드웨어에대한깊은지식이없어도프로그램작성과수정이용이
● 컴퓨터가이해할수있는기계어로번역하기위해컴파일러나인터프리터가사용
● 기계어와어셈블리어를제외한C,JAVA,Python등의 언어가고급언어
“ 사람이 이해 할 수 있는 표현법을 사용 하여 프로그램밍 할 수 있는 언어 “
1-1. 프로그램 이란
의미 언어종류
5. 2. 프로그램 언어
1. 프로그램 기초
• 컴파일러는고급언어로작성된프로그램전체를목적프로그램으로
번역한후,링킹작업을통해컴퓨터에서실행가능한실행프로그램을
생성
• 번역실행과정을거쳐야하기때문에번역과정이번거롭고번역시간
이오래걸리지만,한번번역한후에는다시번역하지않으므로실행속
도가빠르다.
• 컴파일러를사용하는언어에는C언어Java등
• 인터프리터는 고급 언어로 작성된 프로그램을 한 줄 단위로
받아들여 번역하고, 번역과 동시에 프로그램을 한 줄 단위로
즉시 실행시키는 프로그램.
• 프로그램이 직접 실행되므로 목적 프로그램은 생성되지 않음
• 줄 단위로 번역, 실행되기 때문에 시분할 시스템에 유용하며
원시 프로그램의 변화에 대한 반응이 빠르다
• 번역 속도는 빠르지만 프로그램 실행 시 매번 번역해야 하므
로 실행 속도는 느리다.
• CPU의 사용시간의 낭비가 크다.
• 인터프리터를 사용하는 언어에는 Python, BASIC, SNOBOL,
LISP
, APL등
“ 사람이 이해 할 수 있는 표현법을 사용 하여 프로그램밍 할 수 있는 언어 “
1-1. 프로그램 이란
컴파일러 인터프리터
컴파일러와인터프린터차이점
6. 1. 자바
1. 프로그램 기초
• 썬마이크로시스템즈의제임스고슬링(JamesGosling)과 다른연구원들이개발한객체지향적프로그래밍언어
• 컴파일된코드가플랫폼독립적
• 자바로개발된프로그램은CPU나운영체제의종류에관계없이JVM(JavaVirtualMachine)을 설치할수있는시스템에서는어디서나실행
“ 한 번 적성하면 어느 플랫폼에서나 실행 ( 플랫폼 독립성 )“
1-2. JAVA
JAVA
• 객체지향방법론을사용해야한다.
• 같은프로그램(바이트코드)이여러운영체제(마이크로프로세서)에서실행될수있어야한다.
• 컴퓨터네트워크접근기능이기본으로탑재되어있어야한다.
• 원격코드를안전하게실행할수있어야한다.
• 다른객체지향언어들의좋은부분만가지고와서사용하기편해야한다.
철학 ( 자바 언어의 5가지 핵심 목표 )
JVM
Windows
JVM
Mac
JVM
Linux
.class
( 자바 실행 파일 )
.java
( 자바 소스 파일 )
컴파일
바이트 코드
7. 2. JDK & JRE
1. 프로그램 기초
• Java환경에서돌아가는프로그램을개발하는데필요한툴들을모아놓은소프트웨어패키지
• JRE(JavaRuntimeEnvironment)와 Java바이트코드컴파일러,Java디버거등을포함하는개발도구를포함하고있다.
• Oracle JDK는상업적이용을할경우유료
• 무료로이용하고자할경우
- Oracle의 OpenJDK빌드,ZuluJDK,AdoptOpenJDK 등의OpenJDK기반빌드를이용
- OpenJDK는GPL라이선스이지만classpath exception이적용되므로
Oracle의 지원이메이저버전이올라가는6개월마다끊기는점외에는자유롭게사용
“ 자바 개발 도구와 개발 실행 환경 “
1-2. JAVA
JDK(Java Development Kit)
• 컴퓨터의운영체제소프트웨어상에서실행되고클래스라이브러리및특정Java프로그램이
실행해야하는기타리소스를제공하는소프트웨어계층
• JDK를사용하여작성된Java코드를JVM에서이의실행에필요한필수라이브러리와결합한
후결과프로그램을실행하는JVM의인스턴스를작성
-수정없이도어떤운영체제에서든Java프로그램을실행
JRE(Java Runtime Environment)
• 자바바이트코드를실행하는실행기
• 개발자가 이해하는 자바 언어를 JVM이 이해하는 자바 바이트코드로 번역
JVM(Java Virtual Machine)
JDK
JRE
JVM
컴파일러, 디버거
클래스 로더, 자바 API
런타임 라이브러리
• JDK, JRE, JVM 관계
8. 1. 자바 설치
1. 프로그램 기초
1-3. JAVA 설치
JAVA 설치
1. OPENJDK다운로드
* 다운로드 : http://jdk.java.net/java-se-ri/11
➢ 설치 폴더 : D:JAVA_202202download
① Windows/64 java Development 클릭
② D:JAVA_202202download 선택
- 폴더가 없으면 생성
③ 저장 버튼 클릭
①
②
③
9. 1. 자바 설치
1. 프로그램 기초
1-3. JAVA 설치
JAVA 설치
2. 다운로드받은파일압축풀기
① 다운 받은 폴더를 탐색기로 연다.
② 압축 해제를 한다.
10. 1. 자바 설치
1. 프로그램 기초
1-3. JAVA 설치
JAVA 설치
3. JAVA 설치
① D:JAVA_202202jdk-11 로 copy 한다.
• 디렉토리를 선택 후 오른쪽 마우스 클릭
• 복사 클릭
• 설치 폴더 이동
• 마우스 오른쪽 클릭
• 붙여넣기
* 최종 모습
11. 1. 자바 설치
1. 프로그램 기초
1-3. JAVA 설치
JAVA 설치
4. Windows 환경설정
① 윈도우 + R 클릭 후 실행 창에서
sysdm.cpl 입력 후 확인 클릭
② 시스템 속성 창 에서 고급 탭 클릭 ③ 환경 변수 버튼 클릭
12. 1. 자바 설치
1. 프로그램 기초
1-3. JAVA 설치
JAVA 설치
4. Windows 환경설정
④ 환경 변수 창 에서 시스템 변수 새로 만들기 클릭 ⑤ 시스템 변수 창에서 JAVA_HOME path 설정
변수 이름 : JAVA_HOME
변수 값 : D:JAVA_202202jdk-11bin
환경 변수 창 > 시스템 변수
JAVA_HOME 설정 확인
13. 1. 자바 설치
1. 프로그램 기초
1-3. JAVA 설치
JAVA 설치
4. Windows 환경설정
⑥ 시스템 변수 영역 에서 Path 선택 후 편집 클릭 ⑤ 환경 변수 편집 창에서 새로 만들기 선택
14. 1. 자바 설치
1. 프로그램 기초
1-3. JAVA 설치
JAVA 설치
4. Windows 환경설정
⑥ 아래 부분에 행이 추가 됨 , 찾아보기 클릭 ⑦ 폴더 찾아보기 창에서 java 설치 폴더 선택
D:JAVA_202202jdk-11bin
%JAVA_HOME%bin 입력 후 확인 버튼 클릭
-> 다음 페이지 로 이동 (8)번 이동
%JAVA_HOME%bin 입력 하지 않은 경우만 실행
15. 1. 자바 설치
1. 프로그램 기초
1-3. JAVA 설치
JAVA 설치
4. Windows 환경설정
⑧ 환경 변수 추가 된 것 확인 ⑨ 환경 변수 창에서 확인 클릭
16. 1. 자바 설치
1. 프로그램 기초
1-3. JAVA 설치
JAVA 설치
4. Windows 환경설정
⑪ 시스템 속성 창에서 확인 버튼 클릭 ⑫ 설치 확인
- 윈도우 + R 클릭 후 실행 창에서 cmd 입력 후 확인 클릭
- Java –version 입력 후 엔터
17. 1. 개발 Tool 설치
1. 프로그램 기초
1-4. 개발 Tool 설치
개발 Tool 설치
1. Eclipse 설치
• 다운로드 : https://www.eclipse.org/downloads/packages/release/kepler/sr1/eclipse-ide-java-developers
18. 1. 개발 Tool 설치
1. 프로그램 기초
1-4. 개발 Tool 설치
개발 Tool 설치
1. STS 설치
• 다운로드 : https://spring.io/tools
19. 1. 개발 Tool 설치
1. 프로그램 기초
1-4. 개발 Tool 설치
개발 Tool 설치
1. STS 설치
• 다운로드 : https://www.jetbrains.com/idea/download/#section=windows
다운로드 : D:JAVA_202202download
Install 폴더 : D:JAVA_202202toolintellj
21. 1. 자바 프로그램 구조
1. 프로그램 기초
1-6. 자바 프로그램 구조
자바 실행 과정
자바소스
(.java)
자바소스
(.class)
JVM
메모리 할당
프로그램실행
( main() )
Method 영역 Stack 영역 Heap 영역
JAVA File 구조
▪ 자바소스파일의확장자는,java
▪ 자바파일명은접근지정자가public인Top Level Class가있다면Class Name으로되어야함,없다면아무이름으로사용할수있음
▪ public Class 가main Method를가진다.
▪ package 가있다면,해당자바파일은반드시패키지명의폴더에존재해야한다.
Class 영역 Static 영역 Final 영역
package 선언 : 소스 파일의 위치
/** ~ */ : 여러 줄 주석
public : 다른 패키지에서도 사용 ( 공개 )
class : 클래스르 가리키는 자바 키워드, 파일명과 동일
- 내부 구성 요소 : field, method, constructor, inner class
자바로 만든 Application의 시작점
- Application에 하나 존재 해야 함 , 여러 개 존재 시 실행 시 지정 해 주어야 한다.
22. 1. JVM
▪ StrackOverflowError
: Stack Frame에 Method를 추가 할 공간이 없을 때 발생
: JVM –Xss 옵션울 사용 하여 크기 조정
▪ OutOfMemoryError
: 실행 중인 Thread가 많아서 JVM Stack를 할당 할 수 없을 때 발생
▪ JRE(Java Runtime Enviroment)는 크게 API, JVM으로 구성 됨
▪ JVM(자바 가상 머신, Java Virtual Machine)은 클래스 로더를 통해 자바 클래스를 메모리로 로드하여 자바API를 이용하여 실행한다.
▪ Method안에서 선언한 로컬 데이터는 Thread로 부터 안전 하다는 의미는 JVM Stack에 저장 된 데이터는 해당 Thread에서만 사용 할 수 있기 깨문 이다,
▪ 객체는 new연산자에 의해 메모리 heap에 생성 되고 JVM의 GC(Garbage Collector)에 의해 자동으로 Heap 메모리에서 해제 됨.
Class
- main()
2. Main용 JVM stack ( Thread Stack )
3. Main용 Stack Frame 생성 ( push )
: main 함수 실행 전
4. 호출 되는 Method 별로 Stack Frame 생성 ( push )
5. Method가 종료 되면 Stack Frame 소멸 ( pop )
6. 최종적으로 main이 종료 되면 마지막으로 main용 Stack Frame 소멸 ( pop )
7. Main용 JVM Stack 해제
1. Main thread 실행
기본 자료형 4Byte -> 플랫폼 독립성 보장
1. 프로그램 기초
1-7. JVM
23. 1. JVM
자바프로그램을 실행하면 JVM의 클래스 로더가 컴파일 된 자바 바이트코드(.class 파일)을 런타임 데이터 영역(Runtime Data Area)의 Method Area에 로드
하고 실행 엔진(Execution Engine)이 이를 기계어로 변역 하면서 실행.
1. 프로그램 기초
1-7. JVM
24. 1. JVM
운영체계로 부터 부여 받은 메모리 영역
• Method Area
: 모든 쓰레드가 공유 하는 영역, JVM이 시작 할 때 생성, 클래스와 인터페이스 Method에 대
한 바이트 코드, 전역변수, 런타임 상수 등이 저장됨
-> Main Method가 컴파일 된 Byte Code가 있음
• Heap Area
: 객체를 저장 할 떄 사용 하는 영역 => 성능 고려 필요
• JVM Stack ( 임시 메모리 )
: 실행 시 Stack Frame이라는 각 쓰레드 마다 하나씩 할당
: 실행되는 메소드의 Stack Frame에는 지역변수, 메소드의 인자, 메소드의 리턴 값, 리턴 번
지 등이 저장되고 Stack Frame은 메소드가 끝나면 사라짐
• Program Counter Register
: 쓰레드마다 하나씩 존재 : JVM의 명령어 주소
• Runtime Constant Pool
: Method Area에 할당, 상수, 메소드, 필드를 저장
: 자바 프로그램이 참조 할 경우 메모리 주소를 찾아서 참조함
- Native Method Stack
: 자바 이외의 언어로 작성된 코드를 위한 Stack ( C, C++ 등 )
Thread
PC Register
JVM STACK
Native Method
STACK
Heap
- 객체 저장
Method Area
- Byte Code
: Static 변수
Runtime
Constant
Pool
생성/제거 관리
B Method 실행
Stack Frame
main
A
Method
B
Method
B Method 종료
생성
제거
Stack Frame
main
A
Method
1. 프로그램 기초
1-7. JVM
- 메소드 내에서 객체 참조 하면 선언한 변수는 지역변수로 Stack에 위치 하여 Heap에 저장
된 객체에 대한 참조 값을 가짐
- New 연산자는 Heap 메모리에 객체를 만들고 그 객체의 참조 값을 반환 함
User user = new User()
Stack
- user
- user1
Heap
- User()
참조
User user2 = user
참조
25. 2. JVM
Method Area
- main()
- sum()
- counter : 0
Stack
total : args :
main()
1. 메인 실행
Heap Area
- NULL
Stack
total :, args :
i : 10, j : 30, sum : 40
Stack
total : 40, args :
2. SUM 실행 3. SUM 종료
* MAIN 종료 후 모두 사라짐
1. ClassMain Class가 시작 할 때 할당 됨
Method Area
- main()
- sum()
- counter : 1
class ClassMain {
static int counter;
public static void main(String[] args) {
int total = sum(10, 30);
}
static int sum(int i, int j) {
int sum = i + j;
counter = counter + 1;
return sum
}
}
1. 프로그램 기초
1-7. JVM
26. 1. 콘솔에 출력
1. 프로그램 기초
1-8. 기본 입출력
콘솔에 문자열 출력
System.out.print()
▪ public void print(String s)
▪ 자료형 별로 Method가 선언 되어 있음 - Overloading
▪ 모든 출력을 한 줄로 출력
System:java.lang.System
Out : System.out :
- public static final PrintStream out = null
print:java.io.print()
-public void print(String s)
System.out.printf()
▪ printf(String format, Object ... args)
▪ format : 출력 포맷, …args : 가변 인자
▪ 출력 포맷을 지정 하여 문자 출력 – Overloading
▪ 가변 인자 개수 만큼 출력 포맷 지정
Overloading : 동일한 이름에 매개변수 자료형이 틀린 것
27. 1. 콘솔에 출력
1. 프로그램 기초
1-8. 기본 입출력
콘솔에 문자열 출력
System.out.println()
▪ public void println(String x)
▪ 자료형 별로 Method가 선언 되어 있음 - Overloading
▪ 출력 후 자동 개행
28. 2. 콘솔 입력
1. 프로그램 기초
1-8. 기본 입출력
콘솔 입력
()
▪ public Scanner(InputStream source ) : java.util
▪ source : 입력 장치
▪ 지정된 입력 스트림에서 입력(스캔)된 값을 scanner 객체를 구성
➢ 자료향에 따라서 사용 하는 Method가 틀림