[프로그래밍] Java

[Java]Java ? ja, va!

JHVan 2024. 3. 27. 12:59

#1 Java가 뭔데.

Write Once, Run Anywhere! WORA!

객체 지향 프로그래밍 언어. 

객체(Object) 가 뭔지 시원명확하게 설명할 말이 있다면 참 좋을텐데, 상당히 추상적인 표현이라 뭐라 딱 꼬집어 말하기 어렵다.

그래도 '공통된 무언가를 가진 덩어리' 라고 생각하면 편하다.

 

예를들어 "김자바", "010-1234-5678", "자바시 스프링구 어렵동" 들은 각각을 보면 그냥 문자열(String) 이지만, 한 명함에 담기면 그들은 "자바시 스프링구 어렵동에 사는 전화번호가 010-1234-5678 이신 김자바씨의 정보"의 객체가 된다.

 

프로그래밍 관점에서 생각하면, 이번엔 역순으로 "쓰레기"를 "나무" 로 바꾸는 힘! 이라는 클래스(Class)인 객체 가 있다고 하면, "쓰레기, "나무" 라는 객체들, 그리고 "쓰레기를 좋은 비료로 발효시기키", "튼튼하게 자라는 나무 씨앗 찾기", "나무가 쑥쑥 자라는 토양 찾기", "씨앗 심기" ... 등의 메소드(Method) 들이 모여야 한다.

 

객체 지향 프로그래밍

object-oriented programming(OOP) 프로그램 설계방법론의 일종으로, 명령형 프로그래밍

namu.wiki

그래서 자바는

특이 이 객체들에 포커스를 맞추는 프로그래밍에 특화된 언어이다.

 

#2 Java 의 다른 특징들?

플랫폼 독립성

Java는 OS와 맞는 JVM 만 설치하면 코드의 변경 없이 실행될 수 있다. 이게 이 글 첫 마디인 "한 번 작성하면 어디서나 실행(WORA, Write Once, Run Anywhere)"인데, 웬만한 프로그램들은 각 OS, 심지어 버전에 따라서도 호환이 되나 안되나를 따져봐야 하지만, 자바는 상대적으로 OS 나 버전 호환성에서 자유롭고, 사용자 측에서 실행 환경에 맞는 JVM 을 선택해 설치하기 때문에 "(내 컴퓨터에선) 잘 작동해요!" 같은 상황이 잘 발생하지 않는다.

it works on my machine ! (^오^)

Java 가상 머신(JVM)

JVM은 Java 애플리케이션을 실제 하드웨어에서 실행되는 기계어로 변환하는 역할을 한다. 각 운영 체제 맞는 JVM 이 있으며, 알맞은 JVM이 있다면 Java 프로그램은 해당 운영 체제 위에서 동작한다.

 

바이트코드

Java 코드는 컴파일 과정을 거쳐 바이트코드로 변환된다.

바이트코드는 JVM이 이해할 수 있는 중간 형태의 코드이며, 특정 플랫폼에 종속되지 않는다.

개발자가 작성한 소스 코드(.java 파일)는 Java 컴파일러에 의해 이 바이트코드(.class 파일)로 변환되며, 이후 JVM이 이 바이트코드를 실행시키는 방식으로 작동한다.

JVM은 바이트코드를 실시간으로 혹은 JIT(Just-In-Time) 컴파일러를 통해 해당 플랫폼의 기계어로 변환하고 실행한다.

 

바이트코드의 장점

  • 이식성: Java 애플리케이션은 다양한 환경에서 수정 없이 실행될 수 있음.
  • 보안: 바이트코드는 실행 전에 JVM에 의해 검증되므로, 보안 위협으로부터 상대적으로 안전함.
  • 유지보수성: 다양한 플랫폼에서 동일한 Java 애플리케이션을 사용할 수 있기 때문에, 소프트웨어의 배포 및 관리가 용이함.

이러한 Java의 플랫폼 독립성은 소프트웨어 개발자가 다양한 환경에서의 호환성 문제에 대해 걱정하지 않고 애플리케이션을 개발할 수 있게 해주므로 개발 효율이 높아진다.

#3 자바의 메모리 관리법

일해라! 가비지 컬렉터

프로그램 시작시 JVM 이 OS 로부터 메모리를 할당받고, 이를 용도에 따라 영역을 나눠서 관리한다.

Java의 메모리 영역이라 하면 힙(Heap), 스택(Stack), 메소드 (Method) 영역으로 알면 된다.

 

   힙(Heap)

  • 동적으로 할당된 객체와 배열이 저장되는 곳.
  • Java 애플리케이션은 실행 시점에 하나의 힙 공간을 공유함.
  • 가비지 컬렉터의 주요 작업 영역이며 더 이상 참조되지 않는 객체들을 정리하여 메모리를 회수함.

   스택(Stack)

  • 각 스레드별로 실행되는 메소드의 호출 정보와 지역 변수 등을 저장.
  • 메소드 호출 시마다 해당 메소드에 대한 스택 프레임이 생성되며, 메소드 실행이 완료되면 프레임이 스택에서 제거.
  • 한마디로 메소드의 호출과 실행 과정에서의 데이터를 관리.

   메소드 영역(Method Area)

  • 메소드 영역은 클래스 정보, 상수, 정적 변수 등 클래스 수준의 데이터를 저장.
  • 모든 스레드가 공유하는 영역으로, 한 번 로드된 클래스 정보는 프로그램이 종료될 때까지 유지됨.

 

메모리 관리는 가비지 컬렉션(Garbage Collection, GC) 이 한다. 가비지 컬렉션은 개발자가 직접 메모리를 관리할 필요 없이, 사용되지 않는 객체를 자동으로 감지하고 메모리에서 치우는 역할을 한다. 

 

가비지 컬렉션(Garbage Collection)

  • Heap 영역에서 동적으로 할당했던 메모리에서 사용 뒤 더 이상 프로그램에서 사용되지 않는 객체를 자동으로 검출하고 제거하여, 사용 가능한 메모리 공간을 확보하는 프로세스.
  • Java에서는 개발자가 객체를 명시적으로 삭제할 필요가 없어 중요한 로직 개발에 집중할 수 있음.
  • 또한 메모리 누수와 같은 문제를 방지해 메모리를 보다 효율적으로 사용할 수 있음.

Java에서의 메모리 관리는 이러한 메커니즘을 통해 자동화되며, 이는 개발자가 메모리 관리에 대한 부담을 덜고 더 안정적이고 효율적인 프로그램을 개발할 수 있게 해준다.

'[프로그래밍] Java' 카테고리의 다른 글

[Java]Java 의 Type  (0) 2024.04.08