forDevLife
[TIL] 9/9 (1일차) 본문
Java - 기본
- 자바 응용프로그램은 OS, H/W가 아닌 JVM하고만 통신하고, JVM이 자바 응용 프로그램으로부터 전달받은 명령을 해당 운영체제가 이해할 수 있도록 변환해서 전달한다.
- 따라서 자바로 작성된 프로그램은 운영체제 독립적이다.
- 하지만 JVM은 운영체제에 종속이다. 따라서 Oracle에서는 여러 운영체제에 설치할 수 있는 다른 버전의 JVM을 제공한다.
- 동적 로딩(Dynamic Loading) 지원한다.
-> 자바 애플리케이션은 여러 클래스로 구성되어 있다. 동적 로딩으로 인해 실행 시에 모든 클래스가 로딩되지 않고, 필요한 시점에 클래스를 로딩하여 사용할 수 있다는 장점이 있다. 그 외에도 일부 클래스 변경되어도 전체 애플리케이션을 다시 컴파일 할 필요 없다.
-> 따라서 유연한 애플리케이션을 작성할 수 있다.
- 단점으로는 속도문제가 있었다. 실행 시에 해석되기 때문.
-> 바이트코드를 하드웨어 기계어로 바로 변환해주는 JIT 컴파일러와 같은 신기술의 도입으로 JVM 기능이 향상되어 속도도 개선되었다.
* 바이트 코드 : JVM이 이해할 수 있는 기계어. JVM은 바이트 코드를 해당 OS의 기계어로 변경
- 가상 기계(Virtual Machine) : 소프트웨어로 구현된 하드웨어를 뜻하는 넓은 의미
- JDK(Java Development Kit) : JVM + Java API(라이브러리) + 각종 개발 프로그램 (즉, JRE + 각종 개발 프로그램)
* JRE(Java Runtime Environment) : 자바 실행 환경. 자바로 작성된 응용프로그램이 실행되기 위한 최소 환경
(JVM + Java API), 즉 JDK 안에 JRE가 포함되어 있다.
- JDK 1.5 부터 JDK5.0이라고 부르기 시작(JDK 1.8 = JDK 8.0)
- bin에 있는 주요 실행 파일은 다음과 같다.
-. javac.exe : 자바 컴파일러. 자바 소스코드를 바이트 코드로 컴파일 한다.
-. java.exe : 자바 인터프리터. 바이트 코드를 해석하고 실행한다.
-. javap.exe : 역 어셈블러. 컴파일 된 클래스 파일(바이트 코드)을 원래 소스로 변환한다.(Hello.class -> Hello.java) 선언부만 저장!
-. javadoc.exe : 자동 문서 생성기. 소스 파일에 있는 주석(/** */)을 이용하여 Java API 문서와 같은 형식의 문서를 자동으로 생성한다.
-. jar.exe : 압축 프로그램. 클래스파일과 프로그램의 실행에 관련된 파일을 하나의 .jar로 압축(jar cvf) / 해제(jar xvf) 한다.
- 소스 파일 내에 public class가 없다면, 소스파일의 이름은 소스파일 내의 어떤 클래스 이름으로 해도 상관없다.
- 참조형 변수(reference Type)는 null 또는 객체의 주소(4 byte - 32bit JVM / 8 byte - 64bit JVM)를 값으로 갖는다.
- 상수(final keyword) : 값을 저장할 수 있는 공간이지만, 값 한번 저장 시 다른 값으로 변경 불가. 선언과 동시에 초기화. 대문자가 관례
- 리터럴(literal) : 그 자체가 값을 의미하는 것. 변수 또는 상수에 대입되는 대상
- 문자 리터럴 : ' '로 감쌀 수 있음(문자 하나)
- 문자열 리터럴 : " "로 감쌀 수 있음(문자 두 개 이상)
- 7과 같은 기본형 타입을 문자열로 변환 시 7 + "" -> 빈 문자열 더해줌
- 배열의 복사 : 배열은 한번 생성하면 그 길이를 변경할 수 없기 때문에, 더 많은 저장공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로 부터 복사해야 한다.
- for 문을 사용해서 더 큰 사이즈의 배열로 값을 모두 복사한 후, 원래의 참조변수가 큰 사이즈 배열을 가리키도록 변경하는 방법이 있다.
- 배열 복사는 for 보다 System.arraycopy()를 사용하는 것이 효율적이다.
- String class는 char 배열에 여러 기능(메서드)을 추가한 것이다.
- main의 String[] args 파라미터는 java 실행 시 전달되는 인수이다. JVM은 입력된 매개변수 없을 때, null 대신 크기가 0인 배열을 생성해서 args로 전달해준다.
Java - 객체 지향
- 객체지향의 기본 개념은 '실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다'
- 특징은 다음과 같다.
1. 코드의 재사용성이 높다 : 새로운 코드 작성 시 기존의 코드 이용해서 쉽게 작성할 수 있다.
2. 코드의 관리가 용의하다 : 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
3. 신뢰성이 높은 프로그래밍을 가능하게 한다 : 제어자 / 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며 중복 제거
- 클래스의 정의 : 클래스란 객체를 정의해 놓은 것이다. 객체의 설계도 또는 틀이라고 정의할 수 있다.
- 클래스의 용도 : 클래스는 객체를 생성하는데 사용된다.
- JDK에서는 프로그래밍을 위한 유용한 클래스(Java API)를 기본으로 제공하여, 우리는 이를 활용해서 프로그래밍을 쉽게 할 수 있다.
- 인스턴스 : 어떤 클래스로부터 만들어진 객체(보다 구체적인 의미)
- 객체는 속성과 기능으로 구성되어 있다. 속성과 기능을 그 객체의 멤버(구성원)라고 한다.
-. 속성(property) : 멤버 변수, attribute, field, state
-. 기능(function) : method, function, behavior
- 연산자 new에 의해 클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 이 때 멤버변수는 각 자료형에 해당하는 기본값으로 초기화 된다.
그 다음에는 대입연산자에 의해서 생성된 객체의 주소값이 참조변수에 저장된다.
Tv t = new Tv();
연산자 new에 의해 Tv 클래스의 인스턴스가 메모리의 빈 공간(예를 들어 0x100)에 생성되고 초기화 된다. 대입 연산에 의해 0x100이라는 주소 값이 참조변수 t로 저장된다.
인스턴스는 참조 변수를 통해서 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.
- 자신을 참조하고 있는 참조변수가 하나도 없는 인스턴스는 더 이상 사용될 수 없으므로 '가비지 컬렉터'에 의해 메모리에서 제거된다.
- 프로그래밍적 관점에서. 클래스는 데이터와 함수의 결합이라고 할 수 있다. 구조체는 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간이며, 클래스는 이 구조체에 함수를 더했다고 볼 수 있다.
- 변수는 다음과 같은 종류로 구분할 수 있다. 종류를 결정짓는 중요 요소는 '변수의 선언된 영역'이다.
1. 클래스 변수 : 선언 위치는 클래스이며, 클래스가 메모리에 올라갈 때 생성된다.(static)
-> 클래스 변수는 클래스이름.변수이름으로 사용하자. 참조변수를 이용해서 사용도 가능하지만, 인스턴스 변수로 오해받기 쉽다.
2. 인스턴스 변수 : 선언 위치는 클래스이며, 인스턴스가 생성되었을 때 생성된다.
3. 지역 변수 : 선언 위치는 메서드 / 생성자 / 초기화 블록 내부이며, 변수 선언문이 수행되었을 때 생성된다.
class Variable
{
// 클래스 영역 시작
int iv; // 인스턴스 변수
static int cv; // 클래스 변수(static 변수, 공유 변수)
// 메서드 영역
void method()
{
int lv = 0; // 지역 변수
} //
// 클래스 영역 끝
}
- 메서드의 매개변수도 메서드 내에 선언된 것으로 간주되므로(메서드 내에서 사용되므로) 지역 변수이다.
- 큰 자료형(long)에는 작은 자료형(int)의 대입이 가능하다.
- 반환 타입이 void일 경우, 컴파일러가 메서드 마지막에 return;을 자동으로 추가해주므로 생략 가능하다.
- 메서드에서는 매개 변수의 유효성 검사를 하는게 좋다. divide일 경우 분모로 오는 매개변수에 0이 오지 않도록 조건을 거는 방식으로 가능한 모든 경우의 수에 고민하고 그에 대비한 코드를 작성해야 한다.
- 응용프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. 그 중 3가지 주요 영역을 알아본다.
1. Method Area : 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스 파일(*.class)을 읽어 분석하여 클래스에 대한 정보를 이곳에 저장한다. 클래스의 클래스 변수(class variable - cv)도 이 영역에 함께 생성된다.
2. Heap : 인스턴스가 생성되는 공간이다. 즉 인스턴스 변수(instance variable - iv)들이 생성되는 공간이다.
3. Call Stack(호출 스택) : 메서드 작업에 필요한 메모리 공간을 제공한다. 메서드 호출 시, call stack에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간 결과 등을 저장하는데 사용된다. 메서드가 작업을 마치면 할당된 메모리 공간은 반환되어 비워진다.
-> 호출 스택의 제일 위에 있는 메서드가 현재 실행중인 메서드
-> 그 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.
-> 따라서 맨 아래에는 main 메서드가 존재한다.
-> 호출 스택이 완전히 비워지게 되면 프로그램이 종료된다. (main 메서드의 끝)
--------- chapter 6 - 3.7장까지 완료 ---------
'각종 회고' 카테고리의 다른 글
[TIL]9/15 - AOP (0) | 2021.09.29 |
---|---|
[TIL]9/15(5일차) - WEB2 : OAuth 2.0 (0) | 2021.09.15 |
[TIL]9/14(4일차) - Spring Boot Security + OAuth (0) | 2021.09.14 |
[TIL]9/13(3일차) (0) | 2021.09.13 |
[TIL] 9/10 (2일차) (0) | 2021.09.10 |