[Java] 1. JVM, Memory, Class

Nam_JU·2022년 7월 11일
0

KaKao Cloud School

목록 보기
6/19


지난시간

JavaScript를 끝내면서 프로그래밍의 발전 과정을 배웠다

구조적 프로그램(절차적)

  1. 프로그램을 기능적으로 세분화 시킴
  2. 각각의 기능을 모듈화 시킴 → function 함수
  • 장점 : 설계가 쉽다, 구현이 빠르다
  • 단점 : 비슷한 기능의 모듈들을 가져다 써서 복잡하게 얽히게 됨 , 유지보수가 힘들다
    객체지향 개념들이 생기고 그방식으로 프로그램을 할 수 있는 프로그래밍 언어들이 등장
    → 객체지향 개념을 가장 잘 대변하고 있는 프로그래밍 언어 : Java

구조적/절차적 언어는 기능으로 프로그램을 세분화 하였고,
빠르게 프로그램을 작성할 수 있었지만 유지보수성이 최악이었다.
(만드는 비용보다 유지보수 비용이 더 많이들었음)

객체지향 프로그램

  • 프로그램을 기능으로 세분화하지 않는다
  • 모델링: 현실세계에서 일어나는 문제를 프로그램적으로 해결하는 방법
  • 문제를 구성하는 구성요소를 파악 → 그 구성요소간의 어떤 정보들이 오고가는지 파악해서 프로그램으로 묘사
  • 추상화(단순화): 현실세계의 문제들을 필요한 부분만 단순화 시킨다
    • 변수: 객체의 상태 - (java: 필드)
    • 함수: 객체의 행위 - (java: 메소드)
  • 클래스
    • 객체를 모델링하는 수단
    • 실제 데이터를 뽑아낼 수 있는 인스턴스를 만들 수 있는 도구
    • 기존의 데이터타입을 여러개 이용해서 새로운 데이터타입을 만드는 개념으로 사용 ADT : Abstarct Data Type (추상데이터 타입을 만든다)
  • 장점: 유지보수성이 높다

이를 해결하기위해 나온 것이 객체지향 언어였다.
해결해야 하는 문제의 구성 요소를 파악하고 단순화 시켜서 해결 했다.
설계하는데 시간이 오래걸리지만 유지보수성에 강점을 가지고 있다.




Java

Java 언어의 특징

  • 객체지향을 가장 잘 표현하고 있는 언어이다
  • 하드웨어, OS에 독립적이다. JVM(Java Virtual Merchine)이 이를 도와준다
  • 속도가 상대적으로 느리다
  • Java는 운영체제(플랫폼)에 독립적이지만 JVM은 운영체제에 종속적이다
    • JVM은 C로 만든다!
  • 하드웨어나 메모리에 대한 직접적인 제어를 할 수 없다
    • 운영체제 위에 jvm이 올라간 상태이기 때문
    • garbage collection에 의해서 메모리가 자동으로 관리가 된다
  • Network와 분산처리(Thread)가 잘되어있다
  • 동적로딩 (Dynamic Loading)을 제공한다
    • 클래스들의 로딩이 동적으로 일어난다
    • 실행시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩한다
  • JAVA 8, 11 부터는 함수형 언어가 들어오고있다(람다, 스트림, var)


컴파일언어 VS 인터프리티언어

  • 컴파일 언어: 컴퓨터가 알아먹을 수 있는 기계어로 변역한뒤 코드를 실행하는것
    • C언어는 대표적인 컴파일 언어이다
  • 인터프리티언어: 기계어로 번역과 실행을 동시에 시작
    • JavaScript
  • JAVA는 컴파일언어 + 인터프리티언어이다
    1. 내가 작성한 코드(SourceCode)는 .java이다
    2. 이것을 자바 컴파일러(javac)가 ByteCode로 바꿔준다. 이것이 .class 파일
    3. JVM이 코드를 실행한다


JAVA는 클래스단위의 모임이다

  • java에서 전역(global)이라는 개념이 없다
  • xxx.java →클래스 정의 (파일하나에 클래스하나)
    • 재사용성과 유지보수를 위해서

프로그램을 실행시키기위해 필요한 것

  • 코드를 실행시키기 위해 JVM은 API(javaClassLibrary)를 사용

  • JVM + JAVA Classs Library = JRE(Java Runtime Enviroment) 자바실행환경

  • JRE를 포함하여 Utility(개발도구)를 합친것 = JDK(Java Development Kit)



객체지향

  • 현실세계로 구성하는 구성요소를 파악

    추상화 Abstraction

    객체를 상태와 행위로 나눈다 구현하고자 하는 것들을 간추리고 묶는다

    모델링 Modeling

    현실세계에 있는 학생이라는 객체를 프로그래밍적으로 추상화시키기위해 사용 class를 이용해서 modeling을 한다 class는 객체 모델링의 수단이다
    • 상태 ⇒ 변수 ⇒ 필드 field

      • 전역변수라는 개념이 없음 모두 클래스 내부에 있기 때문이다
    • 행위 ⇒ 함수 ⇒ 메소드 method
      - 자바에서는 함수가 없다
      - 클래스의 집합이 자바이기 때문이다.


사용법

  1. Source code의 이름을 class의 이름과 같아야 한다

  2. 퍼블릭 public 클래스가 없는 경우에는 일반 클래스의 이름을 사용한다

  3. 하나의 JavaFile안에 클래스는 여러개 나올 수 있다

    단, public 클래스는 하나의 파일에 두개이상 존재할수 없다 (없어도 된다)

  4. 프로그램의 시작 포인트(entry point)는 public static void main(String args[]){}


Garbuage spec

  • javaScript와 거의 유사
  • 변수를 만들때 식별자 사용
  • 식별자의 naming rule도 동일하다
  • 정적타입 언어라서 값 뿐만아니라 변수에도 data type이 붙는다
    • 값에는 타입이 잇는덷 변수에도 할당되기 전에 명시해줘야함

Java Data Type

자바는 자료형 검사가 엄격한 언어임으로 모든 변수는 자료형을 갖는다.
자료형에따라 할당하는 메모리 크기가 달라진다

  • Primitive Type(원시/기본 타입): byte. short, int , long, float, double, char, boolean
  • Reference Type(참조타입): class - 객체모델링의 수단이면서 , 변수를 만들기위해 새롭게 데이터타입을 지정하기도 한다. ADT



  • 정수가 int인 이유 : 메모리효율이 더 좋기때문에 가장 많이 사용한다
  • boolean: 다른값으로 변환이 안된다
  • 상수: 값이 재할당이 안되는 것 final
    • 선언과 동시에 초기화가 되야함
    • 상수는 모두 대문자 사용 snake case
      final int My_SCORE = ;
  • 문자열 String stuName;
    • class → reference type → 문자열
  • 참조자료형 변수는 4byte의 크기를 갖으며 인스턴스 객체에 접근할 수 있는 정보를 갖는다

형변환

  • 묵시적 형변환
  • 명시적 형변환 (Type Casting) ⇒ “()” 괄호를 사용하여 형변환

클래스

  • field, constructors, methods가 있다 ⇒ 인스턴스를 생성
public class Student2 {

    1. filed 변수들 (객체의 속성)

    2. Constructor 생성자들
    
    3. methods 메소드들 (객체의 행위)
   
}

JVM이 관리하는 메모리구조

  1. register: 프로그램의 실행 포인터를 관리하는 영역(JVM에 의해서만 관리가 된다)
  2. Runtime construct pool: 정해져 있는 상수값들이 여기서 관리
  3. Method Area(Static): 클래스 자체에 대한 정보, 클래스를 처음 사용하는 시점에 memory가 올라간다
  4. Heap: 어떤 클래스가 되었건 new keyword로 생성되는 모든 인스턴스가 저장
  5. Stack: 메서드가 호출되면 무조건 stack 구조로 저장

클래스 메서드는 여러 인스턴스가 공유

public class Student3 {
    /** filed 변수들 **/
    static int a = staticCall("1번");
    int b = staticCall("2번"); //공간이 먼저 만들어지고

    /** Constructor 생성자들*/
    public Student3(){
        this.b = staticCall("3번"); //초기화된다
    }

    /** methods 메소드들*/
   public static int staticCall(String msg){
       System.out.println(msg);
       return 100;
   }
    public static void main(String[] args) {
        System.out.println("4번");
        int c = staticCall("5번");
        Student3 s = new Student3();
    }

    // 1-> 4-> 5-> 2-> 3
}


1. 클래스를 전부 훑고 a의 static 변수/메서드는 곧바로 공간이 할당되고 초기화가 되어있음으로 먼저 출력된다
4. main 메서드가 호출되면서 4번이 출력된다
5. main 메서드 내에서 staticCall 메서드가 호출되어 출력된다
2. Student3 인스턴스를 생성하면서 s인스턴스가 생성되었다. b공간이 먼저 할당되어 staticCall 2번이 호출되었다
3. Student3 인스턴스가 생성된 후 초기화되어 마지막으로 3번이 호출되었다


Constructor 생성자

  • constructor는 메소드가 아니다 (return이 없기 때문)
  • 생성자는 클래스 구성요소중 하나로 객체를 인스턴스화 할때 가장 먼저 호출된다.
  • JAVA에서는 생성자가 여러개 만들어질 수 있다
  • 생성자의 역할은 객체가 갖는 필드를 초기화한다
  • JAVA의 모든 class는 constructor를 1개 이상 가진다.
    만약 constructor를 작성하지 않으면 default constructor가 자동 삽입(Javac)
  • 이름이 클래스명과 동일하다

Method Overloading 오버로딩

  • 메소드이름을 동일하게 사용할 수 있다
    (파라미터갯수, 파리미터타입이 다르다면!! )
  • 이름이 같아도 다른 메소드로 구분

⇒ 생성자에게도 적용이된다 : 생성자 오버로딩 Constructor Overloading

  • Static binding : 프로그램이 시작해 메서드가 고정이되는 것 (C언어)
  • Dynamic binding : 프로그램이 시작되다가 호출되는 시점에 연결되는 것

기본적인 Class의 형태

  • 많은 클래스를 만들어낼 수 있다
  • 이렇게 많은 클래스를 관리하고 재사용할 수 있어야 한다
  • 가장 원시적인 방법은 클래스 파일이나 소스파일을 프로젝트의 같은 폴더내에 위치시킨다겨
  • 여러개의 copy본을 유지하게되어서 결국은유지보수 관리가안된다
  • package라는 논리적인 단위로 관련있는 클래스들을 묶어서 사용하면 좋다
  • pacakge = 논리적인 단위 → 물리적으로는 folder로 표현한다 → 코드로 표현
    • import라는 구문을사용해서 축약해서 사용가능 or 전부 적어야함

접근 제어자Access Modifier

  1. public : 제약 없이 사용이 가능하다 (패키지에 상관없이)
  2. protected:
  3. pacakge(default) : 키워드를 안쓰면 같은 패키지 내에서만 사용 가능하다
  4. private: 같은 클래스 안에서만 사용하도록 접근제어자를 붙인것
  • 개별적으로 접근제어자를 줘야한다.
  • 메소드는 행위를 하는 직업이기 때문에 특별한 이유가 없는 한 외부에서 사용할 수 있도록 public으로 설정한다
  • 결론적으로 field는 특별한 이유가 없는한 전부 private



참고자료
https://iinomad.com/2
https://jooona.tistory.com/156

profile
개발기록

0개의 댓글