• 자바(JAVA)란 무엇인가?

    2022. 4. 26.

    by. 순일

    자바란

    자바(JAVA)는 1995년 미국의 '썬마이크로시스템즈'라는 회사에서 개발한 객체지향 언어입니다. 현재는 '썬마이크로시스템즈'가 엔터프라이즈용 DB로 유명한 회사 '오라클'에 인수가 되었고, 그 이후 자바는 '오라클' 사에 의해 배포되고 있습니다.

     

    자바 컴파일 과정

    1. 컴파일러가 소스코드를 자바 바이트 코드(.class)로 변환 

    2. 클래스 로더를 통해 클래스 파일을 JVM으로 로딩

    3. JVM이 바이트코드를 기계어로 변환

    4. 인터프리터 방식으로 애플리케이션 실행

     

    - 인터프리터

     인터프리터는 고급 언어로 작성된 프로그램을 한 줄 단위로 받아들여 번역하고, 번역과 동시에 프로그램을 한 줄 단위로 즉시 실행시키는 프로그램입니다.

     

    - 컴파일러

     컴파일러는 고급 언어로 작성된 프로그램 전체를 목적 프로그램으로 번역한 후, 링킹 작업을 통해 컴퓨터에서 실행 가능한 실행 프로그램을 생성합니다.

     

    자바의 특징

    1. 객체지향 언어

     객체지향 언어는 프로그램을 객체 단위로 나누어서 객체를 중심으로 프로그램을 구성하는 언어를 의미한다. 객체지향 언어를 사용하면 코드의 재사용성이 높고 코드의 관리가 용이하며 신뢰성이 높은 프로그래밍(제어자와 메서드를 이용한 데이터 보호)을 가능하게 한다는 장점이 있다. 객체는 데이터나 데이터와 관련된 동작을 모두 포함하는 개념이다. 

     

    객체지향 언어 특징

    - 추상화 (Abstraction)

    • 현실의 객체를 추상화 해서 클래스를 구성한다.

     

    - 캡슐화 (Encapsulation)

    • 하나의 클래스 안에 데이터, 기능을 담아 정의하고(속성), 중요한 데이터나 복잡한 기능 등은 숨기고(private/protected), 외부에서 사용에 필요한 기능만을 공개한다.

     

    - 상속 (Inheritance)

    • 객체 정의 시 기존에 존재하는 객체의 속성과 기능을 상속받아 정의한다.
    • 특정 Class를 상속받아 그 Class의 변수와 기능을 재사용한다. Java에서는 다중 상속이 불가능하다.
    • sub객체 생성 시 super도 함께 생성된다.
    • Generalization : 추출된 class의 공통적인 특성을 모아 super class로 정의.
    • Specialization : 비슷한 속성과 기능을 가지고 있는 다른 class를 상속받아 새로운 class를 정의할 수 있음.

     

    - 다항성 (Polymorphism)

    • 상속이 전제가 되어야 한다. 같은 타입 또는 같은 기능의 호출로 다양한 효과를 가져오는 것.
    • 같은 타입의 변수가 다양한 형태의 객체를 참조하는 것.
    • , super타입의 변수가 다양한 sub타입을 참조하는 것을 의미한다.

     

    - 절차지향 언어

     절차지향 프로그래밍이란 물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법입니다. 

     

    2. 플랫폼이 독립적 (Write Once, Run Anywhere) 

    ​ JVM(Java Virtual Machine) 위에서 동작하므로 컴파일 시 코드를 JVM이 번역한다. 따라서 OS에 상관없이 어떠한 환경에서도 동작할 수 있다. (JVM 있다는 가정하에)

     

    3. 가비지 콜렉션 (Garbage Collectior)

     자바에서는 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않기 때문에 가비지 컬렉터(Garbage Collector)가 더 이상 필요 없는 (쓰레기) 객체를 찾아 지우는 작업을 한다. JVM에 의해 자동으로 실행된다. (CPU가 한가하거나 메모리 부족시 실행)

     가비지 콜렉션을 수행하는 동안 가비지 콜렉션을 수행하기 위한 쓰레드 이외의 모든 쓰레드 작업이 멈추기 때문에 시스템에 큰 영향을 미치게 된다.

     직접 메모리를 해제하고 싶은 경우 System.gc();로 Garbage Collector를 호출하여 해제할 수 있습니다. 

     

    4. 멀티 쓰레드

     하나의 프로그램에서 여러 개의 쓰레드가 동시에 실행할 수 있는 환경을 지원합니다. 

    멀티쓰레드란? 여러 쓰레드(프로그램의 실행 단위, 프로세스 내 주소공간 및 자원 공유함)을 동시에 실행시키는 응용프로그램을 작성하는 기법이며, 자바는 쓰레드 생성 및 제어와 관련된 라이브러리 API를 제공하고 있기 때문에 실행되는 운영체제에 관계없이 멀티 스레드를 쉽게 구현 가능합니다.


    멀티쓰레드 장, 단점

    장점 : 프로세스 내 메모리 공유를 통해 시스템 자원 소모가 줄어든다.

    단점 : 자원을 공유하기 때문에 충돌이 일어날 수 있다.

     

    5. 동적 로딩 (Dynamic Loading)

     자바는 애플리케이션이 실행될 때 모든 객체가 생성되지 않고,  객체가 필요한 시점에 클래스를 동적 로딩하여 생성합니다.

     동적 로딩(Dynamic Loading)은 클래스 일부 변경 시 다시 컴파일하지 않아도 되는 이점이 있습니다. 또한, 비교적 적은 작업으로 처리할 수 있는 유연성을 동적 로딩이 제공합니다. 반면에 그때그때 메모리에서 불러오기 때문에 프로그램 실행 속도가 정적 로딩에 비해 느립니다. (느린 속도를 해결하기 위해 static 키워드를 사용합니다)


    - 정적 로딩(Static Loading)

     정적 로딩은 프로그램 실행 시 모든 실행파일이 메모리에 적재되어 실행되는 로딩 방법입니다. 대표적으로 C언어가 있습니다. 정적 로딩은 모든 파일이 메모리에 적재되어 메모리를 많이 차지하지만, 빠르게 가져와 사용할 수 있다는 장단점이 있습니다.

     

    자바 자료형 Primitive Type / Reference Type

    - 기본형 (Primitive Data Type)

    • 기본적인 값을 기억하는 변수 타입.
    • byte, short, int, float, double, char, boolean
    • Implicit Type Casting(암시적 형 변환) : 작은 크기의 타입은 큰 크기의 타입으로 자동 형 변환된다.
    • Explicit Type Casting(명시적 형 변환) : 큰 크기의 타입을 작은 크기의 타입으로 변경할 경우

     

    - 참조형 (Reference Data Type)

    • 객체의 참조값을 기억하는 변수.
    • class, interface, 배열

     

    자바 메모리 구조 Stack / Heap

     

    - Class Area(=Method Area)

    • JVM이 실행되면서 생기는 공간이다.
    • Class 정보, 전역 변수 정보, Static 변수 정보가 저장되는 공간이다.
    • Runtime Constant Pool 에는 말 그대로 '상수' 정보가 저장되는 공간이다.
    • 모든 스레드에서 정보가 공유된다.

     

    - Heap

    • new 연산자로 생성된 객체, Array와 같은 동적으로 생성된 데이터가 저장되는 공간
    • Heap에 저장된 데이터는 Garbage Collector 가 처리하지 않는 한 소멸되지 않는다.
    • Reference Type의 데이터가 저장되는 공간
    • 모든 스레드에서 정보가 공유된다.

     

    - Stack 

    • 지역변수, 메소드의 매개변수와 같이 잠시 사용되고 필요가 없어지는 데이터가 저장되는 공간
    • Last In First Out, 나중에 들어온 데이터가 먼저 나간다
    • 만약, 지역변수이지만 Reference Type일 경우에는 Heap에 저장된 데이터의 주소 값을 Stack에 저장해서 사용하게 된다.
    • 스레드마다 하나씩 존재한다.

     

    오버 라이딩(Overriding) vs 오버 로딩(Overloading)

    - 오버 라이딩(Overriding) 

     상위 클래스의 메소드를 하위 클래스에서 재정의하여 사용하는 것 (다형성)

    • 상속이 전제가 되어야 한다.
    • 상속받은 메소드와 전체적인 기능은 동일하지만 상세 구현이 조금 다를 경우 기존의 상속 받은 메소드로 사용할 수 없으므로 새로운 메소드를 추가로 선언해야 한다.
    • 메소드명, 인자, 리턴 타입을 동일하게 선언한다.
    • 접근 제한자 부모와 같거나 보다 넓은 범위로 정의해야 한다.
    •  부모 메소드와 같은 예외를 던지거나 예외를 안 던진다.

     

    - 오버 로딩(Overloading)

     메소드의 이름은 같지만 서로 다른 매개변수 형식을 가고 있는 메소드를 여러 개 정의하는 것 (프로그램의 가독성)

    • 상속이 아니어도 사용이 가능하다. 단, 인자가 달라야 함.
    • 같은 기능을 하는 메소드를 다양한 타입의 인자로 사용하고 싶을 경우.
    • 자바의 대표적인 overloading 함수는 println이 있다.
    • 파라미터의 개수를 다르게 선언.
    • 파라미터의 타입을 다르게 선언.
    728x90

    'CS' 카테고리의 다른 글

    REST란 무엇인가?  (0) 2022.06.10
    스프링(Spring)이란 무엇인가?  (0) 2022.06.09

    댓글