자바란 무엇인가?
위키백과에서 제공해주는 Java의 간략한 설명이다.
자바(Java)는 자바로 기술된 프로그램 개발 및 실행을 할 수 있는 소프트웨어 모임의 총칭이다. 자바 프로그램은 운영체제나 하드웨어에 의존하지 않는 바이트 코드(중간 언어)인 추상적인 코드로 구현된다. 따라서, 자바 프로그램을 실행하기 위해서는 자바 가상 머신(JVM)과 개발에 필요한 표준 라이브러리 세트와 컴파일러의 환경만 맞추면 자바 프로그램은 모든 환경에서 동일하게 동작한다. 이러한 실행환경과 개발환경을 제공하는 것이 자바 플랫폼이다.
자바의 장점
- 플랫폼 독립성 (Platform Independence): 자바는 "Write Once, Run Anywhere(WORA)"라는 철학을 가지고 있어서, 한 번 작성한 코드를 여러 플랫폼에서 실행할 수 있다. 이는 자바 프로그램이 자바 가상 머신(JVM)에서 실행되기 때문이다. JVM은 각 플랫폼에 맞게 구현되어 있어서, 동일한 자바 코드를 Windows, macOS, Linux 등 다양한 운영체제에서 실행할 수 있다.
- 객체 지향 프로그래밍 (Object-Oriented Programming): 자바는 객체 지향 프로그래밍의 개념을 지원하며, 클래스와 객체를 사용하여 모듈화, 재사용성, 유지보수성을 향상시킨다.
- 멀티스레딩 (Multithreading): 자바는 멀티스레딩을 지원하여 여러 작업을 동시에 처리할 수 있다. 이는 병렬 프로그래밍을 통해 성능을 향상시키는 데 도움을 준다.
https://velog.io/@sezzzini/Java-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C - 풍부한 표준 라이브러리 (Standard Library): 자바에는 다양한 기능을 제공하는 표준 라이브러리(API)가 포함되어 있다. 이를 사용하여 네트워킹, 파일 처리, 데이터베이스 연동, 그래픽 처리 등의 작업을 더 편리하게 수행할 수 있다.
https://docs.oracle.com/javase/8/docs/api/ - 자동 메모리 관리 (Automatic Memory Management): 자바는 가비지 컬렉션(Garbage Collection)을 통해 메모리를 자동으로 관리한다. 이로써 개발자가 명시적으로 메모리를 할당하거나 해제할 필요가 없다.
https://mangkyu.tistory.com/118 - 동적 로딩 (Dynamic Loading): 자바는 클래스 파일을 런타임에 동적으로 로딩할 수 있\다. 이는 애플리케이션의 유연성과 확장성을 높인다.
https://velog.io/@mincho920/Java%EC%9D%98-%EB%8F%99%EC%A0%81%EB%A1%9C%EB%94%A9 - 자바 리플렉션 (Reflection): 자바는 리플렉션을 통해 클래스의 정보를 검사하고 조작할 수 있는 능력을 제공한다. 이는 런타임 환경에서 유용하게 사용된다.
https://hudi.blog/java-reflection/ - 자바 엔터프라이즈 에디션 (Java EE): 자바는 엔터프라이즈 애플리케이션 개발을 위한 Java EE 플랫폼을 제공한다. 이를 사용하여 대규모, 안정적인 서버 애플리케이션을 개발할 수 있다. JSP, Servlet, JDBC, JNDI, JTA등 웹 프로그래밍에 필요한 기능을 다수 포함한다. 또한 대규모, 다계층, 확장성, 신뢰성, 보안 네트워킹 API등을 제공한다.
자바의 단점
- 성능 제약: 자바는 컴파일 언어에 비해 상대적으로 느릴 수 있다. 이는 자바 바이트코드를 실행하기 위해 JVM(Java Virtual Machine)을 사용하고, JIT(Just-In-Time) 컴파일러를 통해 실시간으로 기계어로 변환하기 때문이다. 이로 인해 시작 시간이 길어질 수 있고, 메모리 사용량이 많을 수 있다. 그러나 최신의 JVM과 JIT 컴파일러는 이러한 성능 문제를 상당히 개선하고 있다.
- 메모리 사용량: 자바 프로그램은 가비지 컬렉션(Garbage Collection)으로 메모리를 관리하며, 이로 인해 메모리 오버헤드가 발생할 수 있다. 가끔 가비지 컬렉션 작업이 프로그램 실행을 지연시킬 수 있다. 이에 대한 최적화 및 튜닝이 필요할 수 있다.
- 스레드 관리 어려움: 멀티스레딩을 다룰 때 자바는 높은 수준의 추상화를 제공하지만, 잘못 사용하면 스레드 관련 문제(예: 경쟁 상태, 데드락)가 발생할 수 있다. 스레드 관리에 주의가 필요하다.
- 리소스 사용: 자바 프로그램은 보통 다른 언어에 비해 더 많은 리소스(메모리, CPU)를 사용한다. 이는 특히 모바일 기기나 임베디드 시스템에서 중요한 문제가 될 수 있다.
- 불편한 예외 처리 (Cumbersome Exception Handling): 자바는 예외 처리에 대한 엄격한 규칙을 가지고 있으며, 모든 예외를 반드시 처리하도록 요구한다. 이로 인해 코드가 장황해지고 가독성이 떨어질 수 있다. Java 8 이후부터는 람다식과 스트림 API 등이 도입되어 예외 처리를 간소화하고 함수형 스타일로 작성할 수 있도록 도움을 주었지만, 여전히 어려움을 겪는 경우도 있다.
- 하드웨어 접근 제한 (Hardware Access Limitation): 자바는 일반적으로 하드웨어에 직접 접근하기 어렵다. 이는 특정 하드웨어 기능을 사용하는데 제한을 가할 수 있으며, 하드웨어에 대한 접근을 위해 네이티브 코드(C, C++)를 사용해야 하는 경우가 있다. 이로 인해 일부 하드웨어 관련 애플리케이션 개발에서는 자바보다는 다른 언어가 선호될 수 있다.
객체지향이란?
객체 지향(Object-Oriented)이란 소프트웨어 개발과 설계 방법론 중 하나로, 프로그램을 데이터와 처리방법으로 나누지 않고, 객체를 만들고 조작하며 객체끼리 관계를 맺음으로써 다수의 객체가 서로 상호작용할 수 있게 하는 것이다. 다시 말해, 객체를 조립해서 전체의 프로그램을 만드는 조립식 프로그래밍이다.
객체(Object)란?
물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신과 다른 것을 식별가능한 것을 말한다. 예를 들어, 물리적으로 존재하는 학생, 회원 등과 추상적으로 생각할 수 있는 생산, 주문, 배송 등이 모두 객체가 될 수 있다. 자바에서는 객체는 클래스를 기반으로 실제로 생성된 인스턴스를 의미한다. 클래스는 객체를 생성하기 위한 틀을 제공하며, 객체는 이 틀을 기반으로 실제 데이터와 동작을 가지게 된다. 예를 들어, "빨간 자동차"는 "자동차" 클래스의 인스턴스로 볼 수 있다.
클래스(Class)란?
객체라는 추상적인 개념을 코드화 한 것을 클래스라고 한다. 클래스는 객체를 생성하기 위한 틀 또는 설계도이다. 클래스는 객체의 속성(멤버 변수)과 동작(메서드)을 정의한다. 예를 들어, "자동차" 클래스에는 "색상"과 "속도"와 같은 속성, 그리고 "주행"과 "정지"와 같은 동작이 정의될 수 있다.
객체지향의 4가지 특징
- 캡슐화(Encapsulation):
캡슐화는 데이터와 해당 데이터를 다루는 메서드를 하나의 단위로 묶는 개념이다. 클래스 내부의 상세 구현은 숨겨지고, 외부에서는 클래스의 인터페이스만 접근할 수 있다. 이로써 데이터의 무결성을 유지하고, 변경에 대한 영향을 제어할 수 있다.
객체지향 프로그래밍에서는 객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성이 깨질 수 있기 때문에 일반적으로 외부의 접근을 막는 경우가 많다. JAVA의 접근 제한자 public, private, default, proected 로 캡슐화의 구조를 이해할 수 있다. - 상속(Inheritance):
상속은 클래스 간의 관계를 나타내는 개념으로, 한 클래스가 다른 클래스의 속성과 메서드를 상속받을 수 있다. 이것은 코드의 재사용성을 높이고, 유지보수의 편리성을 제공하며, 클래스 간의 계층 구조를 형성할 수 있게 한다. - 다형성(Polymorphism):
다형성은 객체가 다양한 형태로 동작할 수 있는 능력을 나타낸다. 즉, 하나의 인터페이스나 메서드를 다양한 방식으로 구현할 수 있게 한다. 이로써 코드의 유연성과 확장성이 향상된다.
오버로드(Overload)와 오버라이드(Override)가 다형성의 대표적인 예시이다. - 추상화(Abstraction):
추상화는 복잡한 시스템을 간결하게 모델링하고 필요한 부분에만 초점을 맞추는 개념이다. 예를 들어, 자동차 클래스에서 "주행" 메서드는 자세한 내용을 숨기고, 사용자에게는 단순한 "주행" 동작만 제공할 수 있다.
추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 말한다. 사과, 딸기, 배라는 각각의 객체가 있고 이 객체를 하나를 묶기 위해 과일이라는 추상적인 객체로 정의한다고 하면, 이 행위를 추상화라고 할 수 있다.
객체지향의 5원칙 (SOLID)
- 단일책임원칙(SRP Single Responsibility Principle):
이 원칙은 클래스나 모듈은 하나의 단일 책임만 가져야 한다는 것을 의미한다. 클래스가 여러 책임을 가지게 되면 코드가 복잡해지고 유지보수가 어려워질 수 있다. 따라서 클래스는 한 가지 변경 이유만을 가져야 한다. - 개방 폐쇄 원칙(OCP Open-Closed Principle):
이 원칙은 소프트웨어 개체(클래스, 모듈)는 확장에는 열려 있어야 하지만 수정에는 닫혀 있어야 한다는 것을 의미한다. 즉, 새로운 기능을 추가할 때 기존 코드를 수정하지 않고 확장할 수 있어야 한다. 이를 인터페이스와 다형성을 활용하여 달성할 수 있다. - 리스코프 치환 원칙(LIP The Liskov Subsitution Principle):
이 원칙은 자식 클래스(subclass)는 부모 클래스(superclass)의 자리에 항상 대체될 수 있어야 한다는 것을 의미한다. 즉, 서브클래스는 슈퍼클래스의 모든 동작을 보장해야 한다. 이것은 다형성의 핵심 원칙 중 하나이다. - 인터페이스 분리 원칙(ISP Interface Segregation Principle):
이 원칙은 클라이언트가 사용하지 않는 메서드에 의존하지 않아야 한다는 것을 의미한다. 큰 인터페이스를 여러 개의 작은 인터페이스로 분리하여 클라이언트가 필요한 인터페이스만 구현하도록 하는 것이 중요하다. - 의존성 역전의 원칙(DIP Dependency Inversion Principle):
이 원칙은 상위 수준 모듈은 하위 수준 모듈에 의존해서는 안되며, 추상화는 구체적인 것에 의존해서도 안 된다는 것을 의미한다. 즉, 고수준 모듈은 인터페이스나 추상 클래스와 같은 추상화에 의존해야 하며, 이를 구체적인 구현체에 대한 의존으로부터 자유롭게 해야 한다.
Java의 구조
JDK (Java Development Kit)
- JDK는 자바 개발 환경을 구축하는 데 사용되는 도구와 라이브러리의 모음이다.
- JDK는 자바 프로그램을 작성, 컴파일(소스 코드를 바이트 코드로 변환), 디버깅, 실행하는 데 필요한 모든 도구와 라이브러리를 포함하고 있다.
- 주요 구성 요소로는 자바 컴파일러(javac), 디버거(jdb), 라이브러리 클래스, 개발 도구(예: javap), 개발에 필요한 헤더 파일 및 개발 문서가 포함된다.
- JDK를 사용하면 자바 애플리케이션을 개발할 수 있다.
JRE (Java Runtime Environment)
- JRE는 자바 애플리케이션을 실행하기 위한 환경을 제공한다.
- JRE는 JDK의 일부이며, 자바 애플리케이션을 실행하는 데 필요한 모든 런타임 컴포넌트와 라이브러리를 포함한다.
- JDK에는 개발 도구와 라이브러리가 포함되어 있지만, JRE에는 이러한 개발 도구가 빠져있고 실행만을 위한 라이브러리와 실행 환경이 포함되어 있다.
- 사용자가 자바 애플리케이션을 실행하려면 컴퓨터에 JRE가 설치되어 있어야 한다.
JVM (Java Virtual Machine)
- JVM은 자바 애플리케이션을 실행하는 가상 머신이다.
- 자바 소스 코드는 컴파일러를 통해 바이트 코드로 변환됩니다. 그리고 이 바이트 코드는 JVM에서 실행된다.
- JVM은 플랫폼 독립성을 제공하며, 서로 다른 운영 체제와 하드웨어에서 동일한 바이트 코드를 실행할 수 있게 한다.
- JVM은 바이트 코드를 실행하는 데 필요한 메모리 관리, 스레드 관리, 예외 처리 및 기타 런타임 작업을 수행한다.
Java 실행과정
- 프로그램 Runtime시 JVM은 OS로부터 프로그램이 필요로 하는 메로리를 할당받음
- 자바 컴파일러(javac)가 java 소스코드를 통해 jvm이 이해할 수 있는 바이트코드(.class)로 변환
- 클래스로더(Class Loader)를 통해 Class파일들을 JVM으로 로딩
- 로딩된 Class파일들은 실행엔진(Execution Engine)을 통해 해석됨
- 해석된 바이트코드는 메모리(Runtime Data Areas)에 배치되어 실질적인 수행이 이루어짐 + 이런 실행과정 동안 JVM은 필요에 따라 GC같은 관리 작업 수행
https://velog.io/@alicesykim95/Java%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
다룰 내용이 정말 너무 너무 많아서 간략히 정리한 뒤 도움이 될만한 다른 분들의 학습 내용을 너무 많이 링크로 대체했다. 보면서 꾸준히 공부해야겠다.
'개발자' 카테고리의 다른 글
SSAFY를 마무리하며 (4) | 2024.10.28 |
---|---|
Backend Developer Roadmap (3) - Git & GitHub (0) | 2023.09.04 |
Backend Developer Roadmap (2) - Learn a language [Prologue] (0) | 2023.08.31 |
Backend Developer Roadmap (1) - Internet (0) | 2023.08.30 |
SSAFY 중간 점검 및 백엔드 개발자 로드맵 걸어보기 (1) | 2023.08.27 |