본문 바로가기

TIL

TIL11 자바의 특징

자바의 특징

1. 플랫폼의 독립성

더보기

JDK (Java Development Kit)  ← Java 개발에 필요한 모든 것 포함
 ├── JRE (Java Runtime Environment)  ← Java 실행 환경
 │   ├── JVM (Java Virtual Machine)  ← 바이트코드 실행
 │   ├── Java 라이브러리 (rt.jar 등)  ← 필수 API 제공 (java.lang, java.util 등)
 │   ├── 클래스 로더 (Class Loader)  ← .class 파일 로드
 │
 ├── Javac (Java Compiler)  ← .java → .class 변환
 ├── 기타 개발 도구 (디버거, Javadoc 생성기, JAR 도구 등)

 

※ Javac :자바 컴파일러 (자바코드 →  바이트 코드)

※ JVM :자바가상머신 (바이트코드 →  해석&실행 )

위에 두개로 인하여 운영체계(window,mac,linux 등)가 중요하지 않음

2. 객체지향 - 모든 것이 클래스

더보기

자바의 세계는 모두 객체(클래스)로 이루어져 있습니다.

객체와 클래스는 개념적으로 다르지만 실무에선 혼용해서 많이 사용된다고 합니다.

자바에서 코드를 작성할 때 서로 관련있는 기능을 묶어 하나의 클래스로 관리합니다.

그냥 간단히 자바는 파일로 구성되어 있다고 생각하면 된다.

 

3. 거대한 생태계

더보기

Java는 오랜 시간동안 선호되어 온 프로그래밍 언어입니다.

그렇다보니 방대한 생태계를 가지고 있으며 다양한 오픈소스 라이브러리, 프레임워크 등을 가지고 있으며 관련 학습 자료(공식문서, 기술블로그, 참고서적)도 쉽게 주변에서 찾을 수 있습니다.

검색이 답이다.

4.JVM 메모리 구조

JVM 메모리 구조

더보기
  • Method Area(도서관 비유) : 자바 데이터가 저장
    • 프로그램 시작 시 정보가 저장됩니다.
    • 클래스 정보(.class 파일) 가 올라가는 곳.
    • 클래스의 메서드 정보, static 변수 등이 저장됩니다.
    • 모든 객체가 공유하는 공용 공간

 

  • Stack Area(접시 쌓기 비유) Ex) main -> introduce->introduce(제거)->main
    • 가장 위에 있는 접시를 먼저 꺼내듯 비슷한 구조로 생각하시면 됩니다.
    • 선입후출(LIFO) 구조 입니다. 먼저 들어온 것이 가장 늦게 나간다는 뜻입니다.
    • 메서드가 호출될 때마다 새로운 접시한장(스택프레임)이 쌓입니다.
    • 가장 위의 접시(최근 호출된 메서드)가 먼저 실행됩니다.
    • 메서드 실행이 끝나면 스택에서 제거됩니다.

 

  • Heap Area(풍선 비유) : object(객체)가 저장
    • new 키워드로 생성된 객체가 저장되는 곳입니다.
    • 객체의 실제 데이터가 저장되고 데이터의 주소는 stack 영역에 저장됩니다.

https://cscircles.cemc.uwaterloo.ca/java_visualize/

위 주소에 아래코드를 넣어서 한번 체크하는 게 좋습니다!!!!

 

Java Visualizer

Write your Java code here: args: +command-line argument stdin (also visualizes consumption of StdIn) x <!-- Execute code using Python 2.7 Python 3.3 , --> <!-- these two make sense, but are not implemented yet hide frames of exited functions show frames of

cscircles.cemc.uwaterloo.ca

더보기

public class Main {
    static class Person {

        // 1. 속성
        String name;
        int age;
        String address;

        // 2. 생성자
        Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        // 3-1. 소개 기능(이름 나이 출력 기능)
        void introduce() {
            System.out.println("나의 이름은");
            System.out.println(this.name + "입니다.");
            System.out.println("나의 나이는");
            System.out.println(this.age + "입니다.");
        }

        // 3-2. 더하기 기능(소개를 하고 더하기 연산 수행)
        int sum(int value1, int value2) {
            introduce();
            int result = value1 + value2;
            return result;
        }
    }

    public static void main(String[] args) {
        String name = "Steve";
        int age = 20;
        Person personA = new Person(name, age);
        personA.introduce();

        int value1 = 1;
        int value2 = 2;

        int ret = personA.sum(value1, value2);
        System.out.println(ret);
    }
}