20211201 java 기초개념01
JAVA 프로젝트 : 웹이 아닌 JAVA 응용 프로그램 만들때 사용
tomcat 을 실행하면 메인메서드가 실행된다.(메인메서드에 톰캣이 들어있다?)
url을 호출하면 tomcat이 계속 실행된다. 서블릿 컨테이너에서 서블릿을 검색해준다.
jsp 파일을 띄우면 class 파일로 변환. 다시 서블릿으로 변횐된다.
1.
new를 하지않아도 main이 실행되는 이유는 무엇일까..
static | 힙메모리 |
항상 올라가 있는 메모리. new를 붙이지 않아도 올라가 있다. 초기화가 일어나지 않는다. |
new를 썼을 때 저장되는 메모리 계속 초기화가 일어난다. |
2.
JVM
JAVA Virtual Machine
일반 프로그램 : 기계언어로 번역해서 바로 읽을 수 있다.
- JAVA로 개발하면 OS에 관계없이 개발할 수 있다. 이전에 일반 프로그램처럼 설치는 되어야한다.
- CLASS 파일로 컴파일 -> CLASS 파일을 JVM에서 읽는다 -> JVM에서 기계언어로 번역 -> 하드웨어에서 읽는다.
JVM :
- JAVA와 OS간 중계자 역할
- OS에 독립적
- 메모리 관리
JVM의 구조와 과정
- JAVA 소스 -> JAVA 컴파일러 -> CLASS 파일로 변환
method area
고정적인 정보를 가지고 있는 영역.
static을 붙이면 이미 메모리에 올라가 있기 때문에 new를 붙이지 않아도 된다.
힙 영역
주소가 저장되는 공간 | 값이 저장되는 공간 |
Heap 영역은 프로그램 상에서 데이터를 저장하기 위해서 동적(실행시간)으로 할당하여 사용하는 영역입니다.
new 연산자로 생성된 객체와 배열을 저장하는 공간입니다.
단, 그 객체와 배열은 메서드 영역에서 로드된 클래스만 생성 가능합니다. 주로 실행시간에 생성되는 객체를 저장합니다.
heap영역은 개발자가 메모리해제를 따로 해주지 않아도 Garbage Collector가 알아서 메모리해제를 하는 영역입니다.
이 말은, 개발자가 메모리해제를 할 수 없다는 뜻이기도 합니다.
( null은 메모리 해제가 아니다. 주소연결만 해제. )
heap 영역은 크게 Permanent Generation 영역, new 영역, Old영역으로 나뉩니다.
객체를 생성할 때 필요한 정보를 저장하는 공간인 permanent 영역, 객체가 생성되는 new영역, 생성된 객체를 오랫동안 참조할 가능성이 있는 객체들을 저장하는 공간이 old영역입니다.
New영역
- 객체는 eden에서 생성되며, eden이 full이 될 때 survivor1영역으로 이동하고 survivor1영역 또한 full이 되면 survivor2 영역으로 이동
스택 영역
스택에는 메서드가 호출 될 때마다 스택프레임이라는 데이터 영역이 생성됩니다.
이 스택프레임에는 매개변수나 지역변수 , 리턴 값 및 연산 시 일어나는 값들을 임시로 저장할 수 있는 공간이 할당됩니다.
이후 메서드의 수행이 끝나게 되면 메모리가 반환됩니다.
스택프레임 공간에는 지역변수 공간, 연산스택 공간, 프레임데이터공간이 있습니다.
실제 데이터의 연산이 이루어지는 공간은 연산스택 공간이고,
프레임데이터 공간은 상수풀, 리턴값 저장 공간(method를 호출한 스택프레임으로 돌아가기 위해서 반환 값이 있는 경우 pc레지스터에 operand stack에 push) , 예외구문을 처리하는 공간이 있습니다.
실행순서
컴파일러 :
인터프리터 : jvm
1. 메모장으로 소스코드 작성해보기.
2.
java -version
javac : 컴파일러 실행시키는 명령어
javac -version 을 불러올 수 없다.
java path 잡아주기
내컴퓨터 -> 속성 -> 고급시스템설정 -> 환경변수
3. 리눅스, 유닉스 모든 os는 계정을 가지고 있다. 모든 계정에서 사용이 가능.
4. java 경로 확인하기
5. 시스템변수 -> 새로만들기
6. path 편집
%% <- 변수실행
7. java_home이 실행되면서 변수를 실행한다.
8. javac- version 실행 - 컴파일러 경로를 잡은 것?
9. dir : 폴더의 목록 확인하기
javac Sample.java -> Class 파일로 변환되었다.
10. class 파일을 실행했을 때 화면.
인터프리터 : java????
11.
12.
java 인터프리터 = JVM
1. 클래스 주석 방법
/** + enter
2.
멤버 : 해당 클래스가 가지고 있는 속성. 요소
JavaBasic 01 하위부분은 멤버.
아래 선언부분을 부르는 명칭 : 속성, 프로퍼티, 멤버변수, 필드
3.
리터럴 : 특정 문자나 숫자.
일정 값을 나타나는 데 이용되는 java 의 단어 같은 것들
4. 이스케이프 시퀀스
java에서 표현할 수 없는 문자를 표현하기 위해 사용.
file을 다룰때(출력, 저장 등) 사용한다.
html 을 제외하고 개행 등을 하고싶다면 이스케이프 시퀀스를 사용.
html에서는 <br>
유니코드
변수 : 값을 기억시켜 두는 기능
메모리 ; 값을 기억하고 유지하기 위한 장치
식별자 : 변수의 이름으로 사용할 수 있는 문자와 숫자의 조합
식별자의 조건 :
- 키워드를 사용할 수 없다, (return class 등)
- 숫자로 시작할 수 없다.
- 대소문자 구분
- 특수문자는 _ , $ 만 사용가능
변수를 초기화 시킨다 = 변수를 선언했을 때, 동시에 변수에 값을 저장한다.
자바 변수 선언
값의 유형 : 데이터 형 or 형(type)
형 식별자
- 값의 유형을 데이터 형으로 지정한다.
- java의 기본적인 형(기본형)
1) 같은 형끼리 연산
- 다른 형과 연산이 될 경우 큰 형으로 변환된다.
2) 다른 형 끼리 연산
- 다른형과 연산이 될 경우 큰 형으로 변환된다.
3) 같은 크기의 다른 형끼리 연산
4) 형변환
1) 큰형에서 작은형 변환 (명시적 캐스팅 = 다운 캐스팅)
- 캐스팅 연산자를 사용하여 형변환 한다.
다운캐스팅 예시) ( session은 object로 저장된다. object -> String)
String name = (String) session.getAttribute("name");
- 연관성 있는 클래스끼리 캐스팅이 가능하다.
2) 작은 형에서 큰형으로 변환 (묵시적 캐스팅 = 업캐스팅)
- 캐스팅 연산자를 사용하지 않아도 변환이 된다.
5) 다른 형끼리 연산 후 캐스팅
실습1. 아래 배열의 원소를 합하여 평균을 구하도록 하여라.
int[] inArray = {3, 4, 3};
double sum = 0;
for(int i=0; i<inArray.length; i++) {
//System.out.println(inArray[i]);
sum += inArray[i];
}
System.out.println(sum/inArray.length); //3.3333333333333335
배열
배열 선언 - 기본형 및 클래스형을 배열로 선언 가능하다.
배열의 크기를 지정
int[] arr = new int[10];
배열의 값을 가지고 배열 객체 생성
int[] arr01 = {10,20,30};
index - 배열의 요소(원소)의 주소
배열 원소를 인덱스로 접근 할 수 있다.
System.out.println(arr01[0]); //10
클래스 배열. string 은 클래스
String[] strArray = new String[10];
strArray[0] = "홍길동"; //new String("홍길동");
strArray[1] = "이순신"; //new String("이순신");
User[] userArray = new User[10];
userArray[0] = new User();
userArray[1] = new User();
클래스
클래스는 사물(주체)에 관련된 특성, 상태를 저장할 수 있는 필드와 기능을 담당하는 메서드를 멤버로 가진다.
클래스 선언 - 구조를 만든다.
package kr.or.ksmart;
/**
*
* 클래스는 사물(주체)에 관련된 특성, 상태를 저장할 수 있는 필드와
* 기능을 담당하는 메서드를 멤버로 가진다.
*
* 클래스 선언 - 구조를 만든다.
*
*/
class Member{
//필드 - 형과 필드(변수, 식별자)명
String memberName;
//생성자 메서드 - 생략이 되어있다.
Member(){
//객체화(인스턴스)될 때 1번 실행
//초깃값 설정, 초기 작업
System.out.println("생성자메서드 실행");
}
//리턴 타입, 메서드명
//필드에 담긴 데이타를 다루는 기능
void print() {
System.out.println("memberName > : "+ this.memberName);
}
Member getMember() {
//객체화된 나 자신
return this;
}
}
public class JavaBasic05 {
public static void main(String[] args) {
//구조(클래스 선언)를 만들고 그 구조에 데이타를 저장할 수 있는 공간을 만드는 것을 객체 생성이라 한다.
//객체(인스턴스) 생성
/*
* static 이 붙지 않은 필드 및 메서드는
* 인스턴스 변수, 인스턴스 메서드라고 불린다.
* 인스턴스 변수와 인스턴스 메서드는 객체화를 해야 사용할 수 있다.
* */
//참조타입 식별자 = new 연산자를 활용하여 구조를 메모리에 생성하기();
Member member = new Member();
// ** 객체화가 되어야 멤버에 접근이 가능하다.(인스턴스변수, 인스턴스 메서드)
//필드에 접근
member.memberName = "홍길동";
//메서드에 접근
member.print();
//객체화된 나 자신을 리턴하였으므로 위에 정의된 객체이다.
Member member2 = member.getMember();
System.out.println(member2.memberName + " : 자신을 받은 후");
}
}