백엔드 부트캠프/TIL

[TIL] DAY-8~10 자바와 3대 핵심 기술 패키지

o_b:us 2022. 5. 10. 14:24

자바란

썬 마이크로시스템즈에서 1995년에 개발한 객체 지향 프로그래밍 언어. 창시자는 제임스 고슬링이다. 2010년에 오라클이 썬 마이크로시스템즈를 인수하면서 Java의 저작권을 소유하였다.


자바의 장점

  1. 운영체제에 독립적이다.


    Q) 그렇다면 왜 운영체제마다 다르게 다운로드해야하는가?
    A) 자바 프로그램과는 달리 자바 가상 머신(JVM)은 운영체제에 종속적이므로, 각 운영체제에 맞는 자바 가상 머신을 설치해야 한다.

  2. 객체 지향 언어(Object Oriented Programming, OOP)
  • 추상화(abstraction) : 객체들의 공통 특징을 도출하는 것
  • 캡슐화(encapsuplation) : 객체가 독립적으로 역할을 할 수 있도록 기능을 묶는다,외부에 드러나지 않도록 은닉할 수 있다. 코드가 묶여 있어서 오류가 적으며, 라이브러리화를 할 수 있다.
  • 다형성(polymorphism) : 오버라이딩(사용자가 원하는 방향으로 재정의할 수 있다.), 오버로딩(여러개의 수를 한번에해결할 수 있다.)
  • 동적 바인딩(Dynamic Binding) : 가상 함수를 호출하는 코드를 컴파일 할 때, 바인딩을 실시간으로 결정한다. 프로그래밍의 유연성을 높여주어 파생 클래스에서 재정의한 함수의 호출을 보장

  1. 함수형 프로그래밍 지원

    JAVA8의 등장으로 병렬처리를 함으로써 많은 요소들을 빠르게 처리할 수 있고, 가독성이 좋아졌다.

  2. 자동 메모리 관리(Garbage Collection)

    자바는 OS 의 메모리 영역에 직접적으로 접근하지 않고 JVM 이라는 가상머신을 이용해서 간접적으로 접근한다. JVM 은 C 로 쓰여진 또 다른 프로그램인데, 오브젝트가 필요해지지 않는 시점에서 알아서 free() 를 수행하여 메모리를 확보한다. 웹 애플리케이션을 만들 때 모든 것을 다 직접 개발하여 쓰기보다 검증된 라이브러리나 프레임워크를 이용하는 것이 더 안전하고 편리한 것 처럼, 메모리 관리라는 까다로운 부분을 자바 가상머신에 모두 맡겨버리는 것이다.




자바의 3대 핵심 기술 패키지 : JDK,JRE,JVM

JDK > JRE > JVM


JDK(Java Development Kit)란

자바 애플리케이션을 구축하기 위한 핵심 플랫폼 구성요소다.
중심에는 자바 컴파일러가 있으며, JDK는 개발자들이 JVM과 JRE에 의해 실행되고 구동될 수 있는 자바 프로그램을 생성할 수 있게 해준다.

자바 컴파일러란 ? 평범한 텍스트인 (Raw).java 파일을 받아서 실행 가능한 .class 파일로 만들어주는 소프트웨어이다.


JVM(Java Virtual Machine)이란

Java Virtual Machine(JVM)은 자바를 실행하기 위한 가상 머신으로써 Java Byte Code를 OS에 맞게 해석 해주는 역할을 한다.

Byte Code 는 기계어가 아니기 때문에 OS에서 바로 실행되지 않는다. 이때 JVM은 OS가 ByteCode를 이해할 수 있도록 해석해준다.
Java 파일 하나만 만들면 어느 OS든 각자의 OS에 맞는 JVM 위에서 실행 할 수 있게 되는 것이다.

자바로 작성된 어플리케이션은 모두 이 가상머신(JVM)위에서만 실행되기 때문에 자바 어플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.

JVM은 크게 Class Loader, Runtime Data Areas, Execution Engine 3가지로 구성되어 있다.
Java 파일 하나만 만들면 어느 OS든 각자의 OS에 맞는 JVM 위에서 실행 할 수 있게 되는 것이다.



JRE(Java Runtime Enovironment)란

소프트웨어 프로그램을 실행하기 위해서는 실행할 환경을 런타임 환경이라고 한다. 말 그대로 자바 런타임 환경에는 자바 클래스 라이브러리(Java class libraries)와 올바르게 클래스를 로드해 코어 자바 클래스 라이브러리에 연결하는 자바 클래스 로더(Java class loader) 그리고 JVM으로 구성된다.




페어실습과 3일간 회고

오랜만에 다시 자바의 기초를 다시 다져보면서 타입,문자열,반복문,제어문 배열 등을 배웠다. 이 부분에 대해선 다시 정리할 필요가 없다느껴 글을 생략했습니다(죄송합니다ㅠ).

처음 프로그래밍을 배웠을 때 생각해보면 그 당시는 정말 어려웠던 개념들이었던 것 같다. 대체 continue와 break는 어떻게 써먹어야하지? 어떤 얘는 타입이라고도 불리고 클래스라도 불리는데 뭔 차이지? 이러한 궁금증을 찾아보면서 그 당시엔 정말 많이 답답했던 것 같다. 그 때의 심정을 알고 있어 다른 동기분들이 도움을 요청하면 아는 지식을 총 동원하여 가르쳐주려고 노력하고 있다. 열심히 하는 사람을 곁에 둬야 나도 뭔가 열심히 하게된다는걸 요즘 좀 느끼고 있다.



아래는 이번 페어 실습 과제로 계산기 만들기에 사용된 코드이다.
도라에몽이 좀 귀여운듯 ㅎ

//java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) {
        System.out.println("===Java Calculator===");
        System.out.println(" ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣤⣴⣶⣶⣶⣶⣶⠶⣶⣤⣤⣀⠀⠀⠀⠀⠀⠀");
        System.out.println("⠀⠀⠀⠀⠀⠀⠀⢀⣤⣾⣿⣿⣿⠁⠀⢀⠈⢿⢀⣀⠀⠹⣿⣿⣿⣦⣄⠀⠀⠀");
        System.out.println("⠀⠀⠀⠀⠀⠀⣴⣿⣿⣿⣿⣿⠿⠀⠀⣟⡇⢘⣾⣽⠀⠀⡏⠉⠙⢛⣿⣷⡖⠀");
        System.out.println("⠀⠀⠀⠀⠀⣾⣿⣿⡿⠿⠷⠶⠤⠙⠒⠀⠒⢻⣿⣿⡷⠋⠀⠴⠞⠋⠁⢙⣿⣄");
        System.out.println("⠀⠀⠀⠀⢸⣿⣿⣯⣤⣤⣤⣤⣤⡄⠀⠀⠀⠀⠉⢹⡄⠀⠀⠀⠛⠛⠋⠉⠹⡇");
        System.out.println("⠀⠀⠀⠀⢸⣿⣿⠀⠀⠀⣀⣠⣤⣤⣤⣤⣤⣤⣤⣼⣇⣀⣀⣀⣛⣛⣒⣲⢾⡷");
        System.out.println("⢀⠤⠒⠒⢼⣿⣿⠶⠞⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⣼⠃");
        System.out.println("⢮⠀⠀⠀⠀⣿⣿⣆⠀⠀⠻⣿⡿⠛⠉⠉⠁⠀⠉⠉⠛⠿⣿⣿⠟⠁⠀⣼⠃⠀");
        System.out.println("⠈⠓⠶⣶⣾⣿⣿⣿⣧⡀⠀⠈⠒⢤⣀⣀⡀⠀⠀⣀⣀⡠⠚⠁⠀⢀⡼⠃⠀⠀");
        System.out.println("⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⣷⣤⣤⣤⣤⣭⣭⣭⣭⣭⣥⣤⣤⣤⣴⣟⠁");
        System.out.println();
        System.out.println("===도라에몽 Calculator===");
        System.out.println("숫자 연산자 숫자 순으로 넣어주세요.");

        /*
            요구 사항에 따라 간단한 계산기를 만들어주세요.
            1. 사용자의 입력으로 첫 번째 숫자, 연산자, 두 번째 숫자를 받아야 합니다.
@@ -14,5 +28,96 @@ public static void main(String[] args) {
            4. 연산 결과를 콘솔에 출력합니다.
        */
        // TODO...
        boolean flag = true;
        while (flag) {
            try {
                Scanner input = new Scanner();
                // 1. 입력받기 (숫자1, 연산자, 숫자2)
                double numA = input.nextDouble();
                String oper = input.next();
                double numB = input.nextDouble();
                boolean check = false;

                // 2. 연산자 종류에 따라 동작 나누기
                double ans = 0;
                if (oper.equals("+")) {
                    ans = numA + numB;
                } else if (oper.equals("-")) {
                    ans = numA - numB;
                } else if (oper.equals("*")) {
                    ans = numA * numB;
                } else if (oper.equals("/")) {
                    ans = numA / numB;
                } else {
                    System.out.println("잘못된 입력입니다.");
                    check = true;
                }

                // 3. 콘솔에 출력
                int intAns = 0;
                if (!check) {
                    if (ans % 1.0 == 0) {
                        intAns = (int) ans;
                        System.out.println(intAns);
                    } else System.out.println(ans);
                }

                // 4. 잠시 대기 후 종료 의사를 묻는 메시지 출력
                try {
                    Thread.sleep(1200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println("종료하시겠습니까? (yes/no)");
                String f = input.next().toLowerCase();

                // 5. 종료 선택시 프로그램 끝내기
                if (f.equals("yes")) {
                    flag = false;
                    System.out.println("고생하셨어요 ⌒⌒✌️");
                }
            } catch (NumberFormatException e) {
                System.out.println("공백을 넣으라고 했잖아요!! ୧(๑•̀ᗝ•́)૭");
            }
        }
    }

    public static class Scanner {
        BufferedReader br;
        StringTokenizer st;

        public Scanner() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() {
            while (st == null || !st.hasMoreTokens()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        double nextDouble() {
            return Double.parseDouble(next());
        }

        String nextLine() {
            String str = "";
            try {
                str = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return str;
        }
    }
}

출처 : https://bit.ly/39BLhZy, https://www.itworld.co.kr/news/110817, https://bit.ly/3yrrwhY , http://www.incodom.kr/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5