Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

forDevLife

[TIL] 9/9 (1일차) 본문

각종 회고

[TIL] 9/9 (1일차)

JH_Lucid 2021. 9. 9. 10:43

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
Comments