자바 코드의 메모리 영역(스택&힙)
·
💻 Dev/Java & OOP
자바 프로그램에서 코드가 컴파일되어 JVM에서 실행되기까지 과정에서 JVM은 필요한 데이터들을 용도에 따라 나누어 관리한다. JVM의 메모리 공간은 크게 Method 영역, Stack 영역, Heap 영역으로 구분되고 데이터 타입(자료형)에 따라 각 영역에 나눠서 할당된다.   메서드 영역(Method Area)메서드 영역은 JVM이 시작될 때 생성되는 곳으로 클래스 변수(Static 변수), 생성자(constructor)와 메서드(method) 등이 저장되는 공간이다.Static 영역이라고도 불리며 어느 곳에서나 접근이 가능하다.모든 스레드에서 공유되어 멀티 스레드 환경에서 동기화에 주의해야 한다.메서드 영역의 데이터는 프로그램이 종료될 때까지 메모리에 남아있다.그래서 프로그램이 종료될 때 까지 어디서..
JVM 구조와 동작 과정
·
💻 Dev/Java & OOP
자바를 공부하다 보면 Write once, run anywhere (한 번 작성하면, 어디서나 실행된다.) 라는 말을 볼 수 있다. 컴퓨터가 어떤 프로그램을 실행하려면, 컴퓨터가 읽을 수 있는 언어(기계어)로 작성되어야 한다.자바 프로그램에서는 JVM(Java Virtual Machine)이라는 가상머신이 우리가 작성한 java코드를 기계어로 변환해 주고, 어떤 운영체제에서도 이 코드가 실행될 수 있도록 도와주는 역할을 한다.즉, JVM 덕분에 OS에 독립적인 특징을 가지고 있는 것이다. JVM 작동 원리우리가 작성한 코드가 JVM에 전달되어 실행되기까지 과정은 아래와 같다. 개발자가 자바 소스코드(.java)를 작성한다.자바 컴파일러(javac)가 자바 소스코드를 자바 바이트코드(.class)로 컴파일..
예외(Checked Exception, Unchecked Exception)
·
💻 Dev/Java & OOP
예외란?자바에서 예외란 "우리가 예상한, 혹은 예상치 못한 일이 발생하는 것을 미리 예견하고 안전장치를 하는 것"을 말한다. 예외의 종류는 3가지다.checked exceptionerrorruntime exception 또는 unchecked exception2, 3번째를 제외한 모든 예외는 1번 checked exception이다. 우선 오류와 예외를 구분할 필요가 있다.오류(error)는 자바 프로그램 밖에서 발생한 예외를 말하고 시스템이 종료되어야 할 수준의 심각한 문제를 의미한다.개발자가 미리 예측하여 방지할 수 없다. ex)- StackOverflowError : 호출의 깊이가 깊어지거나 재귀가 지속되어 stack overflow 발생 시 던져지는 오류- OutOfMemoryError : JVM..
interface와 abstract(추상) 클래스
·
💻 Dev/Java & OOP
인터페이스와 abstract를 사용하는 이유인터페이스와 abstract 클래스에 대해서 제대로 이해하려면 시스템을 만드는 절차를 알아야 한다.어떤 시스템을 개발하든 간에 “방법론”이라는 것을 사용하여 개발한다. 방법론: 시스템을 어떻게 만들 것인지에 대한 절차를 설명하고 어떤 산출물을 작성해야 하는지를 정리해 놓은 공동 절차 방법론의 일반적인 절차는 아래와 같다.분석 - 요구사항 분석설계 - 어떤 메서드를 만들 것인지, 데이터는 어떻게 저장할지개발 및 테스트시스템 릴리즈 이게 인터페이스와 abstract랑 뭔 상관인데?설계 단계의 산출물을 문서에만 정리하면 나중에 메서드 관련 내용들이 변경되면 문서도 수정해야 하므로 2중 3중의 일이 된다. 이 설계 단계에서 인터페이스라는 것을 만들어 두면 개발할 때 메..
동등성과 동일성&String.equals()
·
💻 Dev/Java & OOP
동일성, ==동일성은 동일하다는 뜻으로 두 개의 객체가 완전히 같은 경우를 의미한다. 여기서 완전히 같다는 것은 두 객체의 주소값이 같아 동일하다고 봐도 무방하다는 말이다. ==와 != 연산자는 기본 자료형에서만 값 비교를 위해 사용할 수 있다.참조 자료형에서 사용해도 되지만 참조 자료형에서 사용하면 값을 비교하는 게 아니라 주소값을 비교한다.Parent parent1 = new Parent("hyun");Parent parent2 = new Parent("hyun");System.out.println(parent1 == parent2); //falseParent 객체 안에 String name 이라는 변수에 같은 값을 넣고 비교해도 결과는 false다. 두 객체는 각자의 생성자를 사용하여 만들었기 때문..