Chapter 03] Java (Main Reference : 점프 투 자바)

MH·2023년 12월 16일
0

JAVA Study

목록 보기
3/6

1) public class 클래스명 { } : 클래스 블록

  • 클래스명은 명사
  • 대문자로 시작하기에 파스칼 작명을 주로 사용

1-1) public static void main(String [ ] args){ } : 메소드 블록

  • 메소드명은 동사

  • 소문자로 시작하기에 카멜 케이스를 주로 사용

  • 메소드 제어자중 한개는 반드시 필요, 주로 main 이 자동 생성됨

    • static : 객체 생성없이 사용 가능, 메서드에 static 키워드가 붙으면 클래스 메서드가 되어 객체를 만들지 않아도 ‘클래스명.메소드명’ 형태로 호출할 수 있다.
    • void : 메서드의 리턴 자료형으로, void는 리턴값이 없음을 의미
  • main : 현재의 오브젝트 이름

    • main( ) : ( ) 는 파라미터
    • String [ ] : 문자를 배열로 받겠다.
    • args : 메서드의 매개변수, 인수를 의미하나 첫줄에서는 무의미한 편, 다른 이름 가능
    • { } : Method block, 실행할 명령어를 적을 공간
  • 메소드 접근자, 제어자

    • public : 내가 만든 클래스 이외에 다른 곳에서 호출할 수 있도록
      퍼블릭으로 시작하는 것이 객체지향
      객체지향 : 내가 만든 곳에서 사용 및 다른 곳에서 동일하게 적용
    • private : 현재의 클래스 안에서만 사용
    • protected :

1-2) Variable : 값을 넣을 수 있는 빈 상자

  • 규칙 : 변수명은 숫자 불가, 특수문자는 _ 와 $ 만 가능, 내장함수 불가(int, class, return)
  • 권장 : 짧지만 의미 있는 것, for 문에 주로 사용하는 i,j,k등은 비권장, 문자는 c,d,e 주로 사용
    내장함수라 변수명 사용 불가

1-3) 세부 설명

  • Static

    • 메모리에 고정적으로 할당
      • Static이 붙지 않은 메서드나 변수의 경우 객체가 생성될 때마다 호출되어 서로 다른 값을 가지고 있을 수 있습니다. 그렇기 때문에 각 객체들에서 공통적으로 하나의 값이 유지되어야 할 경우 static을 유용하게 사용
    • 객체 생성없이 사용 가능
      • static 키워드를 붙이면 객체 생성 없이도 메서드나 변수를 사용 가능
    • 프로그램이 시작되면 메모리의 static 영역에 적재되고, 프로그램이 종료될 때 해제
      • 프로그램이 시작되어 클래스가 메모리에 올라가게 되면 static이 붙은 변수나 메서드는 클래스와 함께 자동으로 메모리의 static 영역에 생성
      • 일반적인 메서드는 객체를 생성하면 메모리의 Heap 영역에 올라가게 됩니다. 메모리의 이 Heap 영역은 Garbage Collector에 의해 자동으로 관리되게 됩니다. 즉 사용하지 않는 객체의 경우 알아서 삭제시킴으로써 메모리를 관리해주나 static 메서드는 static 영역에 존재하기 때문에 이러한 관리를 받지 못함
      • 프로그램이 종료될 때 메모리를 해제하게 되는데, 이 때문에 과도하게 많은 static을 선언할 경우 메모리에 과부하가 올 수 있음
  • String[] args 존재 이유 / public static void main(String[] args)는 무슨 뜻인가요?

    • String [ ] args 는 현재 main( ) 안에서의 파라미터
    • 자바의 String [ ] args 는 자바스크립트의 let args = [ ] 와 동일한 형태
    • 첫 클래스가 시행되고 첫 오브젝트(main)는 무리 없이 실행됨
  • import java.util.*; : 외부 파일 호출

1-4) 자동 생성 단축키

  • psvm

    • 관련된 예약어 plugin 에서 추가 권장
  • sout

1-5) External Libraries : 자바는 오브젝트화된 라이브러리가 풍부한 편

  • C : class
  • I : interface , 연결 및 접속하기 위한

2) Java의 장점 : C 언어의 개선된 기능으로 등장한 것이 JAVA

  • Garbage Collection : 불필요해진 메모리가 발생시 자동으로 정리
    • 프로그램을 개발 하다 보면 유효하지 않은 메모리인 가비지(Garbage)가 발생
    • JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리, 반응속도가 다소 느려짐
    • 대신 Java에서 명시적으로 불필요한 데이터를 표현하기 위해서 일반적으로 null 선언
  • JIT(just in time) : 해당하는 파일들을 미리 상주하다가 호출시 즉시 사용

    • Java 코드는 JavaCompiler를 통해 ByteCode로 변환이 된다. 그리고 ByteCode는 다시 기계어로 번역이 된다. 이 과정이 있기 때문에 Java는 속도면에서 느린 편
    • JIT 방식은 실행 시점에 자주 쓸만한 코드들을 기계어로 변환 시켜놓고 저장해 뒀다가, 재사용 할 때 이미 변환된 기계어 코드를 재 사용 하는 방식을 말한다.
    • 물론 이 과정을 하기 위해 초반에 메모리를 잡아두거나 하는 선행 작업들이 있어서 초기 실행 속도는 다소 느릴 수도 있다.
      하지만 그 이후로는 ByteCode를 사용 할 때마다 네이티브 코드로 변환하는 작업이 들어 실행속도가 많이 향상된다. 코드가 재사용될 일이 없거나 규모가 작은 프로그램에서는 배 보다 배꼽이 더 클 수도 있지만 일반적으로 빠른 속도를 자랑한다.
  • WORA(Write Once, Read Anywhere) :

    • Java 는 JVM 으로 인해 OS에 종속적이지 않다는 특징, 컴파일러가 운영체제마다 의존적이었던 문제를 해결하고자 JAVA(JVM)가 등장한 것이며, JAVA 언어로 작성한 소스파일은 직접 운영체제로 가서 실행하는 것이 아닌, JVM을 거쳐서 운영체제와 상호작용을 하게 된다.
    • 이러한 장점 때문에 자바가 아닌 다른 언어도 클래스 파일만 있다면 JVM을 사용할 수 있게 개발되고 있다. 실제로 Java 외 다른 언어(클로저, 그루비, 코틀린 등)에서도 이 JVM 사용
  • 구글 v8 엔진 , 2012년도부터 자바기반의 자바스크립트가 활성, 익스플로러보다 3~4배 증가,

3) Java의 (구조적) 단점

  • 자바 프로그램은 일반 프로그램보다 자바 가상 머신이라는 한 단계를 더 거쳐야 하므로, 결국은 상대적으로 실행 속도가 느리다는 단점을 가지고 내포하고 있다.
  • 즉, JAVA는 C언어와 달리 두번의 컴파일로 인한 속도의 문제가 발생하는데, 이를 보완하기 위해 JIT 컴파일러 라는내부 프로그램을 사용해서 필요한 부분만을 기계어로 바꾸어 줌으로써 성능 향상을 가져오도록 했지만 그럼에도 C언어의 실행 속도를 따라잡지는 못했다
  • JVM을 사용함으로써 얻는 가장 큰 이점은 JVM을 사용하면 자바 프로그램을 모든 플랫폼에서 제약 없이 동작하도록 할 수 있다는 장점이 있으나, 단, 간과하지 말아야 할 점은 자바 프로그램과는 달리 자바 가상 머신(JVM)은 운영체제에 종속적이므로, 각 운영체제에 맞는 자바 가상 머신을 설치해야 한다는 점

4) JDK / JRE / JVM 개념 & 구성 원리

  • JDK(Java Development Kit) : JDK안에는 자바를 개발 시 필요한 라이브러리들과 javac, javadoc 등의 개발 도구들을 포함되어 있고, 개발을 하려면 자바 프로그램을 실행도 시켜줘야 하기 때문에 뒤에서 배울 JRE(Java Runtime Environment)도 함께 포함되어 있다.

  • JRE(Java Runtime Environment) : 컴파일된 Java 프로그램을 실행

    • JVM과 자바 프로그램을 실행(동작)시킬 때 필요한 라이브러리 API를 함께 묶어서 배포되는 패키지
  • JVM (Java Virtual Machine) : 자바를 구동하는 프로그램

    • 자바로 작성된 모든 프로그램은 JVM(자바 가상 머신)에서만 실행될 수 있으므로, 자바 프로그램을 실행하기 위해서는 반드시 자바 가상 머신이 설치되어 있어야 한다.
    • 이러한 장점 때문에 자바가 아닌 다른 언어도 클래스 파일만 있다면 JVM을 사용할 수 있게 개발되고 있다. 실제로 Java 외 다른 언어(클로저, 그루비, 코틀린 등)에서도 이 JVM 사용

5) 자바 프로그램의 실행 과정

  • JVM이라는 특성 때문에 자바로 작성한 파일을 실행하기 위해 두 번의 단계가 필요
    • MyProgram.java 파일을 MyProgram.class 파일로 바꾸어 생성해주는 컴파일 단계
    • MyProgram.class 파일을 바이너리 코드(0100101...)로 변환하고 실행하는 단계

6) 리터럴(literal) : 소스 코드의 고정된 값으로 가독성이 좋고 컴파일할 때 최적화에 도움

  • 상수(constant) : 변수가 고정된 것, 선언으로 인해 변수가 변하지 않는 것

    • 상수에 넣는 데이터로는 숫자, 클래스, 구조체 같은 객체도 올 수 있다.
    • 참조변수를 상수로 지정할 때, 참조변수 안의 속성의 데이터까지도 변하지 않는다고 생각할 수 있지만, 참조변수 메모리의 주소값이 변하지 않는다는 의미일 뿐, 그 주소가 가리키는 데이터들은 변할 수 있다.
    • 즉, (메모리 위치, 주소값) 메모리 값을 변경할 수 없다.
  • 리터럴 : 변수의 값이 변하지 않는 데이터(메모리 위치안의 값)를 의미

    • Const age = 40; 의 경우 age 가 상수이고, 40이 리터럴
    • 리터럴은 소스코드의 고정된 값

7) new 연산자

  • String 생성 방식! 리터럴방식(상수풀) vs new 연산자 방식 /
    • new 연산자는 객체를 Heap이라는 메모리 영역에 메모리 공간을 할당해주고 메모리주소를 반환한 후 생성자를 실행시켜준다.
    • 리터럴과는 달리 new 연산자로 생성된 객체는 똑같은 값을 가진(?) 객체가 있어도 서로 다른 메모리를 할당하기 때문에 서로 다른 객체로 분류된다. (=참조)

Java 의 메모리 상황

  • 일단 변수는 Stack 영역에 할당 될것이고, new String으로 생성된 문자열값이 Heap영역의 메모리 공간을 할당받아 str이라는 변수가 그 메모리주소를 가르키고 있을것이다. 이를 다른 말로 참조라고도 한다.

  • 리터럴 방식은 주소가 동일

  • new 연산자 방식은 주소가 다르게 배정

  • new 연산자의 사용처 : 재사용할 수 있는 객체 생성 코드를 구현하는 것

  • new 생성자 풀이 : String a 를 객체 형태로 집어넣겠다

    • 리터럴 방식 : String a = “Happy Java”
      • 단순한 변수, Happy Java 를 문자열로 a 로 담음
      • 다시말해 a는 문자열로 담는 것
    • New 연산자 방식 : String a = New String(“Happy Java”)
      • Happy Java” 는 String 으로 담기고, 해당 String은 a 로 담기지만 Java 는 String 을 찾는 것
      • New 를 쓰면서 String 이라는 하나의 객체로써 저장
      • 앞서 넣은 것은 변수지만, 클래스등으로도 가능
      • 이렇게 넣음으로써 더 많은 것을 저장 가능

0개의 댓글