[Java] 2. 자바 언어 소개

2023. 9. 3. 13:55Java언어 공부

자바의 개발 목표 : TV와 같은 가정용 가전 제품의 임베디드 소프트웨어를 개발할 때 사용할 수 있는 고급 프로그래밍 언어

- 그 당시, 가전 제품은 개발 기업에 따라 다양한 CPU를 사용했다.

=> CPU가 다르면 기계어가 다름 

=> 프로그램을 실행하려면 번역해서 CPU가 이해할 수 있는 기계어로 바꾸어주어야 함

 

-----------------------------------------------------------------------------------------------------

 

소스 코드를 실행하는 방식

 

(1) 컴파일

소스코드가 있으면, 그 소스코드를 기계어로 번역함.

기계어로 된 코드가 나오면 결합하여 exe파일을 만듦.

실행하는 것은 운영체제가 관장함.

다양한 Cpu들 혹은 시스템이 달라지면 컴파일러들을 3개 만들어야 함. (맥, 윈도우 안드로이드)

 

(2) 인터프리트

 

컴파일러가 우리가 만든 자바 소스로 작성한 코드를 번역하면 기계어로 번역하지 않는다.

JVM이라는 소프트웨어가 이해할 수 있는 중간 코드(=바이트 코드)로 먼저 바꾼다.

그리고 이 코드를 한번 더 기계어로 번역한다.

이때 한 번에 다 번역하는 것이 아닌 한 줄 한 줄씩 번역하게 된다.

 

=> 인베디드 소프트웨어를 만들기 위해서 자바를 개발했는데, cpu가 다양했다.

cpu가 바뀌어도 똑같이 작동하기를 바라는 언어를 만들고 싶어했음.

자바는 인터프리트 방식이다.

 

-----------------------------------------------------------------------------------------------------

 

자바는 해석기반이고 강건성이 중요한 객체지향 프로그래밍 언어

자바의 바이트 코드(=중간 코드)는 JVM만 있으면 실행 가능하며, 결과는 항상 동일하다.

 

강건성?

인베디드를 목표로 했기 때문에 오류가 없어야 한다 => 오류에 더 민감하다.

 

객체지향?

그 당시 많이 쓰였던 언어가 C++이였음. 그래서 C++에서 중요하다고 생각했던 요소들만 가져왔음.

 

ex) int의 크기가 컴퓨터의 환경에 따라 달라져 오버플로우가 발생할 수 있으나, 자바는 그럴 걱정 없음

      C언어에서는 int형 변수에 10.5 같은 것을 넣어도 오류가 발생하지 않으나, 자바는 오류가 발생함

 

-----------------------------------------------------------------------------------------------------

 

Java가 인기를 얻게 된  계기

 

1994년도에 HotJava라고 하는 웹 브라우저를 개발함.

좋은 브라우저는 아니였는데, 그 당시 없던 새로운 기능이 있었음.

 

HTML 파일에다가 팩으로 자바 소스를 연결하였음.

 

웹 서버에 동적 컨테츠가 많이 없었는데,

 .java 파일을 번역하여 .class의 중간 코드를 웹서버에 올려놓고 html 문서에 연결해 놓았다.

브라우저에서 다운 받아서 실행하였음.

 

그 당시에는 획기적이였으면서 인기를 얻게 되었다.

 

-----------------------------------------------------------------------------------------------------

Java의 버전에 대하여 

 

자바는 6개월마다 버전이 새로 출시되고 있으며, 3월과 9월에 나오고 있다.

 

버전들이 새로 나올 때 기능들이 추가된다고 생각할 수도 있다.

틀린 얘기는 아니지만, 대부분은 그렇지 않다.

 

주로 라이브러리들이 개선이 되거나 JVM이 개선이 된다.

(Ex. JVM의 속도가 빨라졌다.)

 

LTS란?

Long Term Support의 약자이다.

계속 보안 패치나 업데이트 등 지원을 계속 해준다는 뜻이다.

그래서 예로 들어서 자바로 소프트웨어를 개발하여 판매를 할 경우에는 LTS 버전을 쓰는 것이 좋다.

 

-----------------------------------------------------------------------------------------------------

Java의 라이브러리의 중요성

 

본인이 직접 작성한 클래스나 메소드를 사용하면 비용이 들어가거나 위험할 수 있다.

 

그러나, 라이브러리에 있는 것들은, 테스트가 되어있어 안전하고 비용이 적게 들것이다.

또한, 다른 개발자들이 읽을 때 이해하는데 도움이 된다.

 

-----------------------------------------------------------------------------------------------------

 

Java와 C++의 일반적인 차이점 

 

- 타입에 대하여 엄격하다

- 동적 할당 공간을 직접 반납하지 않는다 ( 왜? JVM이 실행하기 때문에 알아서 해준다 )

- 주소를 유지하는 타입이 있지만 포인터 연산이 가능하지 않다.

- 조건문, 반복문의 조건식이 반드시 boolean으로 평가되어야 한다.

   ( Ex. if(5)는  C언어에서 가능하나 Java에선 허락하지 않는다. => 강건성을 중요시한 것 )

- 함수의 인자 전달은 값 전달 방식만 가능하다

- 연산자 다중 정의가 가능하지 않다.

 

-----------------------------------------------------------------------------------------------------

 

OOP의 기본 개념

 

원래는 절차 위주의 프로그래밍 기법을 사용함

프로그램을 구성할 함수를 결정하는 것이 설계의 핵심 => 구조화 프로그래밍

 

하지만, 프로그램이 복잡해짐에 따라 새로운 형태의 프로그래밍 패러다임이 필요

=> 나온 것이 객체지향 프로그래밍

 

객체지향은 절차보다 데이터를 중심으로 생각하며, 데이터와 그것을 처리하는 절차를 객체라는 하나의 단위로 묶어 사용

 

캡슐화 : 데이터와 그 데이터를 처리하는 절차를 하나의 틀로 결합

              우리의 사고를 그대로 프로그래밍 언어로 쉽게 표현할 수 있게 해주는 장점이 있다.

 

Ex. 문

 

상태 : 크기 , 위치. 색, 열려 있는지 여부

행위 : 열기, 닫기, 잠그기

 

프로그램에는 다양한 종류의 객체가 존재한다.

홀로 동작하지 않고 다른 객체와 상호작용한다.

객체 간 관계는 사용과 포함 관계가 있다.

사용 관계 예시 : 무기와 캐릭터의 관계

포함 관계 예시 : PC를 모델링 한다하면 PC는 CPU를 갖고 있음

 

클래스 : 어떤 상태를 가지고 있고, 어떤 행위를 할 수 있는지 알려주기 위해 정의하는 것

              행위, 상태, 식별자를 가진다.

 

클래스의 특징 

- 클래스는 이름을 가진다.

- 멤버 변수와 메소드(멤버 변수)로 구성이 된다.

- 멤버 변수는 객체의 상태를, 메소드는 객체의 행위 (상태를 나타낼 수도 있음) 를 모델링한다.

 

클래스를 만들어 놓고서 아무것도 안에 무언가 정의하지 않으면 의미가 없음.

 

클래스 간 관계 : 상속구체화 

 

-----------------------------------------------------------------------------------------------------

자바 소스 파일의 구조

 

- 확장자 : ".java"

 

소스파일의 구조

- package 문

- import 문

 

자바 파일은 헤더파일과 소스파일이 있지 않다. .java파일 하나만 있으며, 거기에다가 완성시켜야 한다.

.java 파일에 패키지문이 들어갈 수 있다. 들어가면 맨 처음에 나와야 한다.

import문이 있는데, #include와 같은 역할을 한다. 쓰는 요소들이 어디서 나온지 알려주는 역할을 한다.

#include와 다른 점은 ;으로 끝나는 점이다. import는 ;으로 끝나는 일반문이라는 뜻이다. (전처리 문장이 아니다)

다음으로 class, interface, 열거형 3가지를 정의할 수 있다. 보통은 한 파일에 하나만 정의한다. 

자바는 함수만 독립적으로 정의할 수 없으며 앞에 언급한 3가지 안에 들어가야 한다.

앞에 정의한 3가지 중에 public으로 정의를 하고 싶다면 오로지 하나만 (한 종류가 아님) public으로 정의할 수 있다.

public으로 정의한 것의 이름은 파일의 이름과 같아야 한다.

 

-----------------------------------------------------------------------------------------------------

 

컴파일 과정

 

소스코드를 작성할 때 메인 함수가 있어야 한다.

메인 함수라는 것은 프로그램의 시작위치이다.

 

C나 C++에서는 한 프로젝트에 메인 함수가 하나일 것이다.

자바는 프로젝트의 여러 자바 소스의 메인을 여러 개 만들어도 된다.

 

왜?

C는 프로젝트 전체에 있는 것들을 합쳐서 exe파일을 만들지만,

자바는 다 개별적으로 바이트 코드로 바꾸어서 실행하기 때문에 서로 간섭하지 않기 때문이다.

 

=> 개별적으로 실행할 수 있는 것도 있고 아닌 것도 있다.

 

java 명령어에 의해 JVM을 실행하고, 3가지 세부 과정을 통해 프로그램을 실행

- 메모리 관련 .class 파일들을 적재한다.

- 바이트 코드를 검사한다.

- JIT 등 다양한 실행 속도 향상 기술을 사용함.

 

JIT(Just-In-Time) 란?

 

어떤 함수를 실행하고 또 실행해야 되는 경우가 있다.

이미 한 번 번역한 것을 또 번역할 필요가 없다.

함수 호출 속도의 올리기 위해 인라인 방식을 사용한다.

인라인을 하게 되면 한 번 기계어로 번역한 것을 다시 활용하게 된다.

자바 9에서부터는 ahead-of-time 컴파일러까지 등장한다.

이것은 Exe파일을 만들어주는 것이다. ( => 속도가 빨라진다)

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

질문

javac 컴파일러와 JVMdmf 어디서 볼 수 있나?