Java 강의 -객체 지향 문법 1 [즐거운 자바 강좌]

·2023년 7월 16일

java 공부

목록 보기
2/13
post-thumbnail

객체지향문법

  • 설계도면=class
  • 책상=instance 또는 object
  • instance 생성
    • Book b = new Book();
      -> new Book() : 메모리(heap)에 Book 클래스의 instance를 만든다.
      -> Book() : 생성자
      -> b는 Book 클래스의 instance를 참조한다
      -> b 앞의 Book : 레퍼런스 즉 타입을 적은 것

🏁클래스

  • 클래스는 필드와 메소드르 가진다.
  • 필드는 클래스의 속성이라고 말할 수 있다.
  • 메소드는 클래스의 기능이라고 말할 수 있습니다.
  • 형태
    • 접근제한자 class 클래스이름 {
      필드들;
      생성자들;
      메소드들;
      }
  • 클래스 간단 표현 (UML표기법)

🏁 +✔static이 붙은 메소드는 클래스 메소드 ex. main

  • 클래스 메소드는 인스턴스를 생성하지 않아도 사용 가능!=인스턴스 생성 안해도 메모리에 올라가있다.

  • 대부분의 static한 메소드 형태 : 클래스명.메소드명(); but 객체.메소드명();도 가능 🚨static이 아니면, 객체.메소드명();
    ex.메인 메소드 : VendingMachine.printVersion();

    VendingMachine 클래스 메소드
    public static void printVersion(){
    System.out.println("v1.0");
    }

🏁 +✔메소드에서 사용하는 건 각각에 의존한다는 의미

+✔ 메소드 그림 표현

🏁 ✔ 인스턴스를 만드는 3가지 방법

1. new 연산자와 생성자를 이용하여 인스턴스를 만드는 방법
2. 클래스 로더를 이용하는 방법(프레임워크사용)
3. 메모리에 있는 인스턴스를 복제하여 만드는 바법

메소드가 실행될 때 어떤 일이 벌어지는가?

면접 : JYM 은 클래스를 어디서 찾습니까?
A. 현재 경로에서 찾는다.

이해하기
javac Hello.java 는 Hello를 컴파일
-> Hello.java랑 Hello.class 파일 생성됨
-> java Hello 하면 Hello 클래스 실행
- 틀린답) 현재 폴더에서 찾는다.
- 정답) CLASSPATH 경로에서 Hello 클래스를 찾아서 실행한다. CLASSPATH=.이라고 잡혀있다고 생각

🏁 메소드가 실행될 때 어떤 일이 벌어지는가?

VendingMachine클래스와 VendingMachineMain 클래스

  1. java VendingMachineMain을 실행하면 CLASSPATH에서 VendingMAchineMAin클래스를 찾는다.

  2. VendingMachineMain클래스를 JVM은 읽어 들이고 읽어들인 클래스 정보를 PERM이라는 메모리 영역에 저장 ( 인스턴스가 아닌 클래스 정보를 저장!)

  3. 클래스 정보가 PERM영역에 올라가면, JVM은 해당 클래스가 어떤 static메소드를 가지고 있는지 인스턴스 메소드를 가지고 있는지 모두 알게 됨

  4. JVM은 프로그램 시작점인 main 메소드를 먼저 찾고, 실행함

  5. Java Stack이라고 불리는 메모리 영역에 실행된 메소드 정보를 넣어줌

  • (stack은 FILO자료구조다. 즉 먼저 들어간 자료가 가장 나중에 나온다는 의미)
  • 스택 엔트리 : Java Stack에 저장된 메소드 실행 정보 하나
    • 스택엔트리에는 프로그램 카운트라고 해서 몇번 째 줄을 실행하고 있는지 정보도 기억하고 있다. 다음줄을 실행할 때마다 프로그램 카운트는 +1 증가 (JVM이 몇번 째 줄 실행중인지 알기 위해서)
      그래서 main메소드가 실행되었으니 main 스택 엔트리에 선언된 변수들이 저장됨
  1. main 메소드가 실행되면 Heap 메모리에 String 배열 인스턴스가 만들어지고 이 인스턴스를 args변수가 참조한다.

  2. JVM은 main의 3번째 줄 [ VendingMachine.printVetsion(); ] 을 만나면(main스택 카운트 3) printVersion()메소드는 static메소드이기 때문에 실행 가능 판단하고 실행함

    • (printVersion()메소드가 실행되면 Java Stack에 스택 엔트리가 하나 더 추가된다.
      printVersion()메소드 안에서 선언된 변수들은 해당 스택엔트리에 생성됨.)

    printVersion()메소드가 실행 후 종료되면 해당 스택 엔트리는 자바 스택에서 제거됨.

  3. main 스택 엔트리 4번 째 줄을 만나면 그 줄 실행 -> java Stack에서 main 스택 엔트리로 돌아오고 (main스택 카운트4) VendingMachine 인스턴스도 Heap 메모리에 생성되고, 메인 스택 엔트리에 vm1 생성되고 vm1변수가 해당 Heap을 참조

이런식으로 main 끝까지 가면

  1. main()메소드가 종료되면서 man()메소드의 실행 정보를 가지고 있는 스택 엔트리가 자바 스택에서 제거된다.

+메소드안에 선언된 변수를 지역 변수라 하고, 지역 변수는 해당 메소드가 실행될 때 생성되고 종료될 때 사라진다.

🚨 지역변수와 스레드

  • 메소드안에 선언된 변수를 지역 변수라 하고, 지역 변수는 해당 메소드가 실행될 때 생성되고 종료될 때 사라진다.

  • 같은 메소드를 동시에 열 번 호출한다면 그 메소드 안의 지역 변수는 각각 다른 영역에 저장되어 사용된다. 동시에라는 개념은 뒤의 스레드에 나오는 개념

  • 하나의 서버는 여러 개의 요청을 동시에 받아들여 실행할 수 있어야한다.

    • 자바에선 스레드를 이용해 이런 처리를 할 수 있다.
  • 같은 메소드도 동시에 여러 번 호출될 수 있는데 이 경우, 메소드 안에서 선언된 변수들은 각각 다른 영역에 저장된다는 것 기억

줄여서
메소드안에 선언된 변수를 지역 변수라 하고, 지역 변수는 해당 메소드가 실행될 때 생성되고 종료될 때 사라진다.
동시에 메소드가 호출되도 문제 없다

profile
기회를 잡기 위해 준비하자 !

0개의 댓글