2월 21일 Challenge Task List
Title
💡 JAVA의 언어적 특성을 찾아보고 정리하기

✏️ Java 언어의 특성
1. 이식성이 높은 언어
💡 Java는 JVM을 이용하여 서로 다른 운영체제 및 실행 환경에서도 프로그램을 옮겨서 실행할 수 있음
⁉️ JVM이 뭐길래 서로 다른 운영체제에서도 돌릴 수 있을까?
- 먼저 자바의 실행 과정을 이해하면 서로 다른 운영체제에서 왜 돌릴 수 있는지 이해할 수 있다.
✏️3. 자바의 실행 과정
컴파일
💡 자바의 Javac, 컴퓨터가 이해할 수 있는 코드로 변환하는 과정 컴파일을 하고 나면 실행할 수 있는 파일인 “~.class(바이트 코드)”가 생성된다.
- 바이트 코드 = 컴퓨터가 이해할 수 있는 2진수(0과 1)
실행
💡 자바의 java, 컴파일된 파일을 실행할 수 있는 런처(lanuncher)를 이용하여 실행하여야 한다.
런처는 “~.class”파일을 실행하도록 하며 최종적으로 JVM을 통해 동작하게 된다.

참고자료: https://opentutorials.org/module/516/5559
결론: JVM이 컴파일 된 자바의 코드인 바이트 코드(~.class)를 인식하여 실행하기 때문에 서로 다른 운영체제에 상관 없이 실행할 수 있다.

2. 객체 지향 언어 이다.
⏰객체 지향 언어란?
💡 객체 = 주변의 사물이나 생명체 등

우리 주위의 객체 예시
ex) 자동차, 옷, 콘센트 등
💡 객체 지향 언어 = 프로그램 언어로 다수의 객체를 만들고 사용하는 언어
- 프로그램을 다수의 “객체”로 만들고, 이들이 서로 상호작용을 통해 만들어지는 방식
장점:
- 각 부품들의 역할이 나누어져 있고 사용하는 각 부품들이 작동하게 되므로 고장이 나면 해당 부품만 수리 및 교체하여 간단하게 해결할 수 있다.
- 이로 인해 유지보수가 쉽고 편해진다.
특징
- 객체 지향 언어는 “하나의 조립 PC와 같다”라고 생각하면 된다.
1. 캡슐화
💡 데이터와 코드의 형태를 외부로부터 알 수 없게 하고, 데이터의 구조와 역할, 기능을 하나의 캡슐 형태로 만드는 방법

2. 상속
💡 상위 클래스의 모든걸 하위 클래스가 모두 이어 받는것
ex) 부모가 자식에게 유전자를 물려주듯이 부모의 특징을 자식이 모두 물려받게 된다.

3. 다형성
💡 상속과 연관되는 개념으로 한 객체가 다른 여러 형태(객체)로 재구성 되는 것을 의미 ex) 한 부모의 밑에서 태어난 자식이 똑같지 않는 것과 같은 것이 있다.

4. 추상화
💡 **객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 의미** ex) 실제로 존재하는 객체들을 프로그램으로 만들기 위한 공통적인 특성을 파악하여 필요없는 특성을 제거하는 과정

객체 지향 언어의 장점
- 재사용성
- 상속을 통해 프로그램 시 코드의 재사용을 높일 수 잇음
- 생산성 향상
- 잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상
- 자연적인 모델링
- 우리 일상의 모습의 구조가 객체에 자연스럽게 녹아들어 있기 때문에 생각하고 있는 것을 그대로 자연스럽게 구현할 수 있음
- 유지 보수의 우수성
- 프로그램 수정 시 추가, 수정을 하더라도 캡슐화를 통해 주변 영향이 적기에 유지보수가 쉽다.
객체 지향 언어의 단점
- 개발 속도가 느림
- 객체가 처리하려는 것에 대한 정확한 이해가 필요하기 때문에 설계 단계부터 많은 시간이 소모됨
- 실행 속도가 느림
- 객체 지향 언어는 대체적으로 실행 속도가 느림
- 코딩 난이도의 상승
- 자바는 단일 상속, C++의 경우에는 다중 상속을 지원하여 코딩의 난이도가 상승된다.
참고자료: https://radait.tistory.com/4
3. 함수적 스타일 코딩을 지원한다.

람다란?
💡 람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)를 지칭하는 용어
예시

4. 메모리를 자동으로 관리한다.
💡 자바는 C 또는 C++과 다르게 메모리를 직접 관리하는 것이 아닌 자동적으로 관리한다. ex)객체 생성 시 자동적으로 메모리 영역을 찾아 할당하고 사용이 완료되면 쓰레기 수집기(가비지 컬렉션)를 실행하여 사용하지 않는 객체를 제거한다.
5. 다양한 어플리케이션을 개발할 수 있다.
💡 자바는 서버용 웹 어플리케이션, 모바일 용 어플리케이션 등 여러가지 어플리케이션 개발에 사용된다.


6. 멀티쓰레드를 쉽게 구현 가능하다
💡 자바는 쓰레드 생성 및 제어와 관련된 라이브러리 API를 제공하고있기 때문에 실행되는 운영체제에 관계없이 멀티 쓰레드를 쉽게 구현 가능하다.
⁉️쓰레드란?

💡 하나의 독립된 실행 라인이라고 할 수 있다. 대개 프로그램의 경우 하나의 쓰레드를 가지고 있어서 동시에 하나의 함수만 실행 할 수 있지만, 여러개의 쓰레드를 사용하면 동시에 여러개의 함수를 실행 할 수 있다
참고자료: https://gusdnd852.tistory.com/208
7. 동적로딩(Dynamic Loading)을 지원한다.
💡 애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적로딩해서 객체를 생성한다.또한 개발완료후 유지보수가 발생하더라도 해당 클래스만 수정하면 되므로 전체 애플리케이션을 다시 컴파일 할 필요가 없습니다. 따라서 유지보수를 쉽고 빠르게 진행할 수 있다.
8. 오픈 소스 라이브러리가 풍부하다.
💡 자바는 오픈소스언어이므로 자바 프로그램에서 사용하는 라이브러리 또한 오픈소스가 많다. 따라서 검증된 오픈소스 라이브러리를 이용하면 개발기간을 단축하며 안전성이 높은 애플리케이션을 쉽게 개발할 수 있다.
참고자료: https://radait.tistory.com/4
https://jwprogramming.tistory.com/117
https://khj93.tistory.com/entry/JAVA-람다식Rambda란-무엇이고-사용법