컴퓨터 공부/☕ Java

[JAVA] 자바에 대해서 알아보자!

letzgorats 2023. 11. 14. 07:29

 

1. 자바의 중요성과 발전

 - 자바가 유명해진 이유는 다양한 운영체제(OS)에서 동일한 코드를 실행할 수 있게 만든 것이다. 자바가 나오기 전에는 각 OS에 맞게 코드를 다르게 작성해야 했지만, 자바는 이런 문제를 JVM을 통해 해결했다.

 

2. 자바 가상 머신(JVM) 

 - JVM은 자바 코드를 OS와 독립적으로 실행시키는 역할을 한다. 이는 자바 프로그램이 OS에 구애받지 않고 실행될 수 있도록 해준다. 바이트코드는 플랫폼 독립적이며, 컴파일된 자바 코드(바이트코드)는 JVM을 통해 실행된다.

(※ 바이트코드라고 해서 010011...로 이루어진 코드가 아니라 단순히 컴파일된 자바 코드를 바이트코드라고 한다.)

 

3. 자바의 실행 과정 

 - 소스코드는 컴파일 과정을 거쳐 .class파일(바이트 코드)로 변환된다. 이 바이트코드는 JVM에서 해석되어 실행된다. 이 과정은 자바가 "한 번 작성하면 어디서든 실행된다(Write Once, Run Anywhere)'는 특징을 갖게 한다.

 

4. 자바 메모리 관리

 - 자바는 메모리를 여러 영역으로 나누어 관리한다. 이에는 PC레지스터, 스택, 네이티브 메소드 스택, 힙, 메소드 영역 등이 포함된다.

  • PC레지스터 : jvm이 바이트코드에서 가져온 현재 실행중인 명렁어를 가지고 있다. 
  • Stack : 함수에 대한 정보를 가지고 있다. 함수의 매개변수, 지역변수, 리턴 정보들이 저장되어 있다.
  • Native Method Stack: 자바 외부 언어로 작성된 코드들이 들어가 있다.(system.out.println가 전부 자바소스로만 이루어져 있지 않고 내부로 들어가보면 c, c++ 등에서도 메소드 가져와서 사용하고 그런다.)
  • Heap: 사용자가 사용하면서 생긴 데이터가 저장된 공간이다. 데이터가 런타임 중에 동적으로 할당된 곳이라고 할 수 있다.
  • Method: 각 클래스 별로 전역변수, 정적변수, 메소드 등이 저장된 공간이다.

 

5. 가비지 컬렉션(GC)

 - 자바는 JVM이 메모리 관리를 자동으로 수행한다. 가비지 컬렉션은 더 이상 참조되지 않는 객체를 메모리에서 자동으로 제거하여 메모리를 효율적으로 관리한다. 잠깐 멈춘다음에, 사용되지 않는 객체를 찾는 과정을 "Mark and Sweep"이라고 한다.

이 과정은 개발자가 직접 메모리 관리를 신경 쓸 필요를 줄여준다. 

 

6. 객체지향 프로그래밍

  - 객체지향 프로그래밍은 현실 세계의 사물을 객체로 모델링하는 프로그래밍 방식이다. 이는 코드의 재사용, 유지보수, 확장성 향상에 기여한다. 주요 특징으로는 추상화(공통 특성을 모델링)(ex.콜라랑 물은 마시는 것 공통), 캡슐화(데이터 은닉과 인터페이스 제공)(외부와의 결합도가 많이 되면 안 좋음,독립적인게 좋다), 상속(기존 클래스의 기능을 확장)(재사용성과 디버깅에 용이), 다형성(하나의 인터페이스로 다양한 구현 제공)(다양한 형태의 객체가 요청될 수 있으니 똑같은 메소드여도 각각 정의를 다르게 한다)이 있다.

 

7. 추상 클래스와 인터페이스

 - 추상 클래스와 인터페이스는 객체지향 프로그래밍에서 중요한 역할을 한다. 추상 클래스는 abstarct로 정의되고 상속을 위해 사용되며 하나 이상의 추상 메소드를 포함할 수 있다. 인터페이스는 interface로 정의되고 구현을 강제하는 방식으로 다형성을 지원한다.

- 자바 8부터 인터페이스에도 추상메소드가 아닌 기본 메소드를 정의할 수 있게 되었다.

- 경계가 모호해지는데, 그래서 본질(목적)을 잘 알아야 한다. 추상 클래스는 상속을 위한 것이고, 인터페이스는 보장을 위한 것이다.


Q. Java가 어떻게 실행되나요?

A. 컴파일러가 자바 소스를 바이트코드로 변환합니다. 그 다음에 JVM에 있는 클래스 로더가 바이트 코드를 런타임 데이터 영역에 로드시키고 로딩된 바이트 코드가 실행엔진에 의해서 실행되게 됩니다.

 

Q. 자바 메모리 구조가 어떻게 되어있나요?

A. 자바 메모리 구조는 크게 5가지 영역으로 구분되는데요, 우선 쓰레드마다 PC 레지스터, JVM stack, Native Method Stack 이 있구요, 쓰레드 공통으로는 Heap과 Method Area가 있습니다. 

PC 레지스터는 현재 수행중인 JVM 명령어가 들어가 있고, JVM stack은 호출된 매개변수, 지역변수, 리턴정보 등이 들어가 있으며, Native Method Stack은 자바 이외의 언어인 C나 C++ 와 같은 것들을 수행하기 위한 영역입니다. Method 영역은 클래스 별로 전역변수, 정적 변수, 메소드 정보들이 저장되게 됩니다. 마지막으로 Heap영역은 런타임중에 생성되는 객체들이 동적으로 할당되는 곳입니다.

 

Q. 가비지 콜렉션(GC)이 뭔가요?

A. GC는 JVM에서 메모리를 관리해주는 모듈입니다. Heap 메모리를 재활용하기 위해서 더 이상 참조되지 않는 객체들을 메모리에서 제거하는 모듈입니다. 개발자가 직접 메모리를 정리하지 않아도 되어서 개발자가 직접 메모리를 정리하지 않아도 되니까 개발 속도가 향상되는 장점이 있습니다. 하지만, Mark and Sweep 이라는 과정에서 참조되지 않는 객체를 찾는 과정이 있는데, 이 때 쓰레드가 잠깐 중단되어서 성능이 떨어진다는 단점이 있습니다.

 

Q. 객체지향 프로그래밍이 뭔가요?

A. 현실세계의 사물과 같은 객체를 만들고 그 객체에서 필요한 특징을 뽑아서 프로그래밍을 수행하는 것이다. 총 4가지의 특징이 있는데요, 추상화, 캡슐화, 상속성, 다형성 입니다. 추상화는 공통 특성을 모델링하는 것이고, 캡슐화는 외부로부터의 결합도를 줄이기 위해 데이터 은닉과 인터페이스를 제공하는 것입니다. 상속성은 재사용성과 디버깅을 용이하기 위해 기존 클래스의 기능을 확장하는 것이고, 다형성은 하나의 인터페이스로 다양한 구현을 제공하는 것입니다.

 

Q. 추상클래스와 인터페이스의 차이가 뭔가요?

A. 자바 8부터는 인터페이스에서도 일반 메소드를 정의할 수 있게 됐지만, 본질은 추상클래스는 상속을 목적으로 하고, 인터페이스는 보장을 목적으로 합니다. 즉, 추상 클래스는 abstract로 정의하며 추상메소드가 하나 이상 포함되는 클래스로, 부모 클래스의 기능을 재사용하기 위해서 사용합니다. 반면, 인터페이스는 interface로 정의하며 함수의 구현을 강제해서 구현한 객체들이 같은 동작을 하는 것을 보장하는 것에 목적이 있습니다.

반응형