반응형
SMALL

그동안 소스코드를 작성하고 언어를 배우며 써왔지만 실제로 어떻게 동작하는지에 대해서는 등한시한 경향이 있었다. 일반인도 이해할 수 있게, 가장 많이 쓰이는 자바 프로그램이 어떻게 동작하는지에 대해 정리를 해보고자 한다.

지난 글에서 프로그램이 어떻게 실행되는지 살펴보았다. 저번 글을 기반으로 자바 프로그램이 어떻게 되는지 확인해보자.

▼ 지난글을 확인해보고 싶다면?

 

일반인에게 설명하는 [자바 프로그램의 실행 과정] - 1. 프로그램 실행

그동안 소스코드를 작성하고 언어를 배우며 써왔지만 실제로 어떻게 동작하는지에 대해서는 등한시한 경향이 있었다. 일반인도 이해할 수 있게, 가장 많이 쓰이는 자바 프로그램이 어떻게 동작

heannim-world.tistory.com



[ 자바 프로그램은 어떻게 실행될까? ]

코딩 →  컴파일  런타임  실행


출처 : http://www.tcpschool.com/java/java_intro_programming

자바 프로그램의 실행과정은 다음과 같다.

자바(JAVA)는 대표적인 하이브리드 타입(Hybrid Type)언어로, 소스코드 전체를 중간코드(바이트코드)로 번역한 뒤 가상머신(VM)에서 한줄씩 실행해준다. 바이트코드(byte Code)로 바꾸는 컴파일 타임 환경과 이를 한 줄씩 번역하면서 실행하는 런타임 환경으로 나뉜다.

하나씩 나눠서 살펴보자.

1. JAVA 컴파일 과정

자바가 컴파일 되는 과정을 살펴보자.

자바의 컴파일 과정

먼저 자바의 소스코드, 원시코드(*.java)는 CPU가 인식하지 못하므로 기계어로 컴파일해줘야 한다. 이 때, 바로 CPU에서 인식할 수 있는 기계어로 컴파일하는 것이 아니라 JVM이라는 가상머신을 거쳐서 가기 때문에 자바 컴파일러(Java compiler)는 중간언어인 자바 바이트코드(java bytecode(*.class))로 변환해준다. JVM에서 이 자바 바이트코드(java bytecode)를 해석해주기 때문에 OS와 관계없이 JVM만 설치되어 있다면 어느 디바이스든 Java 파일을 JVM 위에서 실행할 수 있다.

 

[ 실전 지식 ]

 ▶ Java compiler는 JDK를 설치하면 bin에 존재하는 javac.exe 파일이다.(JDK에 java compiler가 포함되어있다는 말임) javac 명령어를 통해 .java를 .class로 컴파일할 수 있다. 또한 JVM 역시 JDK 디렉토리의 bin 폴더 안에 존재하는 java.exe 파일로 java 명령어를 통해 JVM을 구동할 수 있다.

▶JDK는 Java로 소프트웨어를 개발할 수 있도록 여러 기능들을 제공하는 패키지(키트)이다. JDK는 프로그램을 생성, 실행, 컴파일할 수 있다.

▼ JDK 더보기

더보기

JDK 구성

  • apt : 어노테이션 툴
  • appletviewer : 웹브라우저 없이 자바 애플릿을 실행하고 디버깅하기 위한 툴
  • javac : 자바 컴파일러. 자바 소스파일을 바이트코드로 변환
  • java : javac가 만든 클래스 파일을 해석 및 실행
  • jar : 서로 관련있는 클래스 라이브러리들과 리소스를 하나의 파일로 묶어주는 툴
  • jdb : 자바 디버깅 툴
  • JRE(Java Runtime Enviroment) : 자바 런타임 환경으로 JVM + 자바 클래스 라이브러리(Java Class Library) 등 다양한 파일들을 포함한다. 컴파일 된 Java 프로그램을 실행하려면 JRE를 설치해야한다.
  • JVM(Java Virtual Machine) : Java가 실제로 동작하는 가상 환경. 이 JVM덕분에 하나의 Java프로젝트를 개발해도 여러 환경에서 원활하게 실행시킬 수 있다.

기타 등등...

JDK 종류

  1. Java SE : Java Platform , Standard Edition
    표준 자바 플랫폼으로 표준적인 컴퓨팅 환경을 지원하기 위한 자바 가상머신 규격 및 API 집합을 포함한다.
    JavaEE, JavaME는 구체적인 목적에 따라 자바 SE를 기반으로 API를 추가하거나 자바 가상머신 규격 및 API의 일부를 택하여 정의된다.
  2. Java EE : Java Platform , Enterprise Edition
    JavaSE에 웹 어플리케이션 서버에서 동작하는 기능을 추가한 플랫폼
    이 스펙에 따라 제품을 구현한 것을 웹 어플리케이션 서버(WAS)라 한다. ex. tomcat

WAS가 무엇인지 잘 모르겠다면 여기를 들어가보자!
WAS 와 웹서버의 차이점을 이해하기 쉽게 알려준다!
감사합니다 작성자님 ☺️

  1. Java ME : Java Platform , Micro Edition
    제한된 자원을 가진 휴대전화, PDA 등에서 Java 프로그래밍 언어를 지원하기 위해 만든 플랫폼 중 하나이다.

결론

  • JavaSE는 Java가 어떠한 문법적인 구성을 가졌는지와 같은 것들을 나타내는 명세표이다. JavaSE를 기반으로 특정 기능을 구현하기 위한 JavaEE, JavaME 플랫폼도 있다.
  • JDK는 JavaSE와 같은 규격을 토대로 만들어진 소프트웨어 패키지이다. 이는 Java를 개발 및 실행하는 데 필요한 툴들을 제공한다.
  • JRE가 Java를 실행하는데 필요한 바로 그 툴이다.

출처 :https://velog.io/@shelly/JAVA-JDK%EB%9E%80 

 

바이트코드와 바이너리 코드는 다르다. Byte Code JVM이 이해할 수 있는 언어로 변환된 자바 소스코드를 의미한다. 자바 컴파일러에 의해 변환된 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불리고 있다. 바이트 코드는 VM이 이해하는 코드이고, CPU가 이해할 수 있으려면 바이너리 코드(=0101 이진코드)로 변환해줘야한다. 모든 기계어는 0과 1로 이루어진 이진코드(바이너리 코드)로 이루어졌을 뿐이다. 바이너리 코드라는 알파벳으로 되어있을 뿐 CPU가 알아들으려면 이해할 수 있게 또다시 번역을 해줘야한다. JVM이 이제 일한다.

 

2. JAVA 런타임 과정

컴파일 과정을 거쳐 .java 파일은 중간 코드인 자바 바이트 코드(.class) 파일로 변환해줬다. 이제 런타임을 통해 자바 바이트 코드(.class)를 컴퓨터가 이해할 수 있는 기계어로 번역해주자.

자바가 런타임 되는 과정을 살펴보기 위해 JVM을 좀 더 까보자.

JVM 구성 요소

JVM에서는 어떤 일이 벌어질까?

1) 클래스 로더(Class Loader)

클래스 로더(Class Loader) JVM 내로 클래스 파일(*.class)를 동적으로 읽어서 메모리에 로드되어 JVM에 링크되게 한다. 컴파일된 .class 파일은 '로딩(Loading)', '링킹(Linking)', '초기화(Initializing)' 단계를 거쳐 JVM에서 사용할 수 있게 된다.

클래스 로더(Class Loader) 더 자세히 보기

더보기
클래스 로더 과정

Loading

우선 클래스 로더는 .class 파일을 읽고, 그 내용에 따라 적절한 바이너리 데이터를 만들고 메소드 영역에 저장하는 동작을 수행한다. 이 과정에서 .class 파일이 JVM 스펙에 맞는지 확인하고, Java Version을 확인한다.

Linking

  1. Verify
    읽은 클래스의 바이너리 데이터가 유효한 것인지 확인해야한다. .class 파일 형식이 유효한지 여러가지 체크를 한 다음 믿을 수 있는 .class 파일 데이터인 경우에 진행한다.
  2. Prepare
    클래스의 static 변수와 기본값에 필요한 메모리 공간을 준비한다.
  3. Resolution
    선택적으로 진행되는 과정으로 사용하는 환경에 따라 동작 유무가 정해진다. 이 과정에서 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 힙 메모리 영역에 있는 인스턴스에 대한 레퍼런스로 교체해준다. Constant Pool의 심볼릭 레퍼런스를 다이렉트 레퍼런스, 즉 실제 메모리 주소 값으로 변경해주는 작업을 한다.

Initializing

링크 단계의 Prepare 단계에서 확보한 메모리 영역에 클래스의 static 값들을 할당한다. 그리고 SuperClass 초기화와 해당 클래스의 초기화를 진행한다.

...일단 그렇다고 한다.

출처 :https://hbase.tistory.com/174

2) 실행 엔진(Execution)

실행 엔진(Execution) 클래스를 실행시킨다. 클래스 로더가 JVM 런타임 데이터 영역(Runtime Data Area)에 바이트 코드를 배치시키면 이것은 실행 엔진에 의해 실행된다. 실행엔진은 바이트코드를 기계어로 변경한다.

바이트 코드는 실시간 번역기(인터프리터) 또는 JIT 컴파일러에 의해 기계가 읽을 수 있는 바이너리 코드로 변환된다.

인터프리터(interpreter)는 한줄씩(명령어 단위로) 읽어서 번역 후 그때그때 실행한다.

만약 여러번 반복되는 소스라면 매번 한줄씩 번역하는건 불필요할 것이다. JIT 컴파일러(just-in-time compliation)는 이 때 사용되어 반복되는 소스를 한번에 변환해준다. 인터프리터 방식의 단점을 보완하기 위해 도입되었다.(VM 가상머신 안에 있음)

JIT 컴파일러(just-in-time compliation) 더 자세히 보기

더보기

JIT 컴파일러(just-in-time compliation)는 한번 바이트 코드 전체를 컴파일해서 기계어(바이너리코드)로 변환하고 나면 그 이후에는 다시 번역하지 않고 이미 번역해놓은 기계어를 직접 실행한다. 이 번역된(컴파일된) 기계어는 캐시에 보관한다. 그래서 한번 컴파일한 코드는 다시 수행하게 되면 빠르게 수행할 수 있게 되는 것이다. 당연히 한줄씩 번역하는것보다는 바이트 코드를 전부 컴파일하는게 느리기 때문에, JVM가 내부적으로 해당 메소드를 얼마나 자주 사용하는지 체크하고 있다가 적절한 시점에 바이트 코드 전체를 컴파일하는 JIT 컴파일러를 수행한다.

 

가비지 콜렉터(Garbage Collerctor) 더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제한다. 불필요한 걸 청소해주는 청소부로 메모리를 관리해준다.

▼ 가비지 콜렉터(Garbage Collerctor) 더 자세히 보기

더보기
프로그램을 개발 하다 보면 유효하지 않은 메모리인 가바지(Garbage)가 발생하게 된다. 예를 들어, C언어를 이용하면 free()라는 함수를 통해 직접 메모리를 해제해주어야 한다. 하지만 Java나 Kotlin을 이용해 개발을 하다 보면 개발자가 메모리를 직접 해제해주는 일이 없다. 그 이유는 JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해주기 때문이다.

가비지 컬렉션은 영어로 Garbeage Collection으로 줄여서 GC라고도 부른다. 가비지 컬렉션은 자바의 메모리 관리 방법 중의 하나로 JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 영역을 주기적으로 삭제하는 프로세스를 말한다.

JVM에 탑재되어 있는 가비지 컬렉터가 메모리 관리를 대행해주기 때문에 개발자 입장에서 메모리 관리, 메모리 누수(Memory Leak) 문제에서 대해 완벽하게 관리하지 않아도 되어 오롯이 개발에만 집중할 수 있다는 장점이 있다.

단점은 개발자가 메모리가 언제 해제되는지 정확하게 알 수 없고, 가비지 컬렉션(GC)이 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생한다.

출처 :https://mangkyu.tistory.com/118
https://coding-factory.tistory.com/829 

3) 런타임 데이터 영역(Runtime Data Area)

런타임 데이터 영역(Runtime Data Area)  JVM이 프로그램을 수행하기 위해 OS에서 할당받은 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다. 한마디로 자바의 메모리 구조.

런타임 데이터 영역(Runtime Data Area)

▼ 내가 기초적인 컴퓨터 구조도 모른다면? 메모리도 잘 모르겠는데?

 

보통 WAS의 성능에 문제가 생겼을 때 런타임 데이터 영역(Runtime Data Area)이 원인이 된다.(메모리 누수나 GC 이슈)

PC Register  JVM stack   Native Method stack  Heap  Method Area

좌측 3개의 영역은 Thread별로 생성되고 우측 2개의 영역은 모든 Thread가 공유(=JVM이 시작할 때 단 하나만 생성)한다.

▼ 스레드(Thread)가 뭐여?

더보기

프로그램은 하드디스크 등의 보조기억장치에 저장된 실행코드를 뜻하고, 프로세스(process)프로그램을 구동하여 메모리 상에 실행되는 작업단위이다. 하나의 프로그램을 여러번 구동하면 여러개의 프로세스가 메모리(RAM) 상에서 실행되는 것. 이 프로세스(process)도 뜯어보면 데이터와 메모리 등의 자원, 그리고 스레드로 구성된다.

 

스레드(Thread)프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미한다. 프로세스 내부에 있는 CPU 수행 단위로, 모든 프로세스는 한 개 이상의 스레드가 존재하여 작업을 수행한다. 프로세스 내부에 여러개의 스레드가 구성된다면 자기들끼리 할당된 메모리와 자원을 공유한다.

프로세스와 같이 실행, 준비, 대기 등의 실행상태를 가지며, 실행상태가 변할때마다 스레드 문맥교환(context switching)을 수행한다. 각각의 스레드별로 자신만의 스택과 레지스터를 가지고 있다.

각각의 스레드별로 자신만의 스택과 레지스터를 가지고 있다.

CPU는 한개의 프로세스만을 실행할 수 있다. 하지만 멀티스레딩(Multi Thread)을 거친다면 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것이 가능하다. 한 프로세스 내에서 프로세스 내의 주소공간이나 자원 공유가 가능하기 때문에 독립적인 작업 수행을 가능하게 하며, 아주 짧은 시간동안 여러 작업을 번갈아가면서 수행할 수 있게 해주니 동시에 여러 작업이 수행되는 것처럼 보인다. 이 손발을 스레드(Thread)가 가능하게 해준다.

 

JVM 단위에서의 런타임 데이터 영역

JVM단위는 JVM이 시작될 때 단 하나만 생성되며, 모든 스레드들이 공유한다.

Heap

힙 영역은 모든 클래스 인스턴스와 Array객체같이 긴 생명주기를 가진 데이터들이 저장되는 공간이다.
Heap의 메모리 해제는 오직 Garbage Collector 의해 수행된다.
또한 모든 스레드들이 공유하는 영역이라 Race Condition을 유발할 수 있다.

Method Area

메서드 영역은 클래스 로더에 의해 로드 된 클래스 정보를 맨 처음 메모리 공간에 올릴 때, 초기화 되는 대상을 저장하는 공간이다. 런타임 상수 풀 그리고 그림에는 안나와 있지만 필드, 메서드, 생성자, 데이터 등의 코드 내용으로 이루어져 있다.

Runtime Constant Pool

런타임 상수풀은 메서드 영역에 클래스가 정보가 로드될 때 생성된다.
런타임 상수 풀에는 런타임에 해석되는 메서드와 필드의 참조 등 여러 종류의 상수가 저장되어있다.

Thread 단위에서의 런타임 데이터 영역

PC Register

PC Register는 스레드가 생성될 때마다 생기는 공간으로 스레드가 현재 실행중인 명령을 저장하는 역할을 한다.

JVM Stack

JVM Stack은 JVM Frame을 저장하는 역할을 한다.
Stack의 메모리 크기는 고정크기와 가변크기가 있다.

JVM Frame

JVM Frame은 메소드가 호출될 때마다 생성되며, 메소드의 상태정보를 저장한다.
Frame읜 구성요소는 총 3가지로 다음과 같다.

  • Local Variables
  • Operand Stack
  • Constant Pool Reference

Local Variables

Local Variables의 크기는 컴파일 타임에 결정되며, 자바 바이트 코드에서 Code속성에 locals로 표현된다.

long, double은 2개의 슬롯을 차지하지만,
boolean, byte, char, short, int float, reference, retrunAddress는 1개의 슬롯을 차지한다.
메서드가 호출될 때 해당 메서드의 파라미터 값은 Local Variables를 통해 넘겨진다.

만약 호출되는 메서드가 클래스 메서드일 경우에는 메서드의 첫번째 파라미터는 Local Variables의 0번째 index에 저장되면 이후 차례대로 저장된다.

반대로 메서드가 인스턴스 메서드일 경우에는 this가 Local Variables의 0번째 index에 저장되고 이후 메서드의 파라미터가 차례대로 저장된다.

Operand Stack

Operand Stack의 크기 또한 Local Variables처럼 컴파일 타임에 결정되며, 자바 바이트 코드에서 Code속성에 stack으로 표현된다.

Operand Stack은 프레임이 생성될 당시에는 비어있으며, 메소드 내 계산 과정 등 모든 과정에서 이용된다.

Constant Pool Reference

Constant Pool Reference 영역은 해당 프레임과 대응되는 메소드가 속한 클래스 단위의 런타임 상수풀에 대한 참조를 의미한다.

Native Method Stack

Native Method Stack은 자바가 아닌 다른 언어로 작성된 네이티브 메서드를 지원하기 위한 스택이다.

 

▼ JVM 구조 요약

 

JVM 구조

JVM 구조 JVM : 자바가상머신. 자바 바이트코드를 실행시키는 주체. 운영체제 종류와 무관하게 가능 즉, 운영체제 위에서 동작하는 프로세스로 자바를 컴파일해서 얻은 바이트코드를 기계

heannim-world.tistory.com

 

반응형
LIST
반응형
SMALL

지금까지도 영어는 단어가 제일 어렵다.

그건 이해 없이 붙여진 이름을 단순하게 외워야해서일 것이다.

자바도 컴퓨터의 언어이고, 인간의 언어로 해석하려고 하기엔 자기들만의 문화(?)가 팽배하니 오늘은 간단하게 기본적인 단어 정리를 하고 정의만 생각해 보기로 하자.

 

자바 문법 구성요소

이름
식별자(identifiers) 사용자가 임의로 Java 프로그램의 구성요소에 붙이는 이름
키워드(keyword) 자바 문법상의 영단어
자바 언어 자체에서 미리 정해놓은 식별자

 

자료형

이름
자료형 프로그램에서 사용되는 데이터 유형(data type)
기본형 이미 정해져있는 유형
참조형 기본형 이외의 자료형의 종류
(= 객체의 메모리 위치 주소값)
null 참조형 자료형의 종류.
변수의 메모리 위치 주소값이 안들어가서 대신 넣어놓는 더미데이터.(나중에 넣으려고 비워두는것) 
오라클에서는 데이터를 입력하지 않을 경우 대신 넣어주는 데이터.
객체의 메모리 위치 주소값 접근지정자가 허용한다면 객체의 속성변수와 메소드를 호출할 수 있음.
호출 함수 형식) 메위주.속성변수; 또는 메위주.메소드;

 

변수

이름
변수 데이터가 저장되는 메모리의 기억장소에 붙인 이름.
변수 안의 데이터 값은 수시로 변경(갱신) 가능
속성변수(멤버변수) 기본형 데이터 또는 참조형 데이터가 저장되는 변수.
클래스의 고유 멤버로 클래스 내부에 있음.
지역변수 메소드 안에서 선언되어 메소드 안에서만 사용되는 변수.
보통 중괄호 안에서 사용.
매개변수 데이터를 전달하면서 메소드를 호출할 때 전달 데이터를 저장할 변수.
(메소드,생성자 안에 있는 둥근괄호) 0개 이상 가능.
형식)메소드명/생성자명(자료형 매개변수){실행구문}
변수선언 데이터 저장을 위한 메모리 공간을 확보해달라고 가상머신에게 부탁하는 행위
할당 변수에 데이터를 저장하는 행위
초기화 변수 선언 이후 처음으로 데이터를 저장하는 행위

속성변수는 선언 후 수동초기화 하지 않으면 디폴트 값으로 자동 초기화된다. -> final이 붙었을 때 제외

지역변수는 선언 후 자동초기화 불가능!-> 선언시에는 에러가 발생하지 않지만 사용시 에러 발생.

매개변수는 메소드 안에서만 사용되는 지역변수.

 

제어문

: 위에서 아래로 처리되는 명령어의 처리 순서를 변경시키는 문장

<조건문> : 조건에 따라 지정한 실행구문 수행.
if문   조건문이 true일때만 실행
else if : if가 false면 다음꺼. 다되면 거기서 멈춤.
else : 모든경우의 마지막. 앞계산이 다 아니면 실행
switch문   변수값이 설정한 데이터가 같을때 실행
<반복문> : 설정한 조건식이 true면 실행구문을 반복수행함.
for문   true면 다음, false면 반복문 탈출
초기값, 조건식, 증감식 생략가능
while문   조건식이 true면 실행, false면 반복문 탈출
do while문   일단 실행구문 수행하고 조건식 true면 반복, false면 탈출
향상된 for문   배열객체참조변수 안에 데이터를 저장하고 실행구문 반복
변수 자료형과 배열변수 자료형이 같아야함.
<분기문> : 반복문 안에서 강제로 명령어의 처리 순서를 바꿈.
break   왼쪽 조건식이 false면 반복진행, true면 실행구문 실행하지 않고 반복문 탈출
continue   강제로 다음 반복 구문으로 건너뜀.
왼쪽 조건식이 false면 반복실행, true면 실행구문 실행하지 않고 바로 올라가서 증감식으로 이동.
(continue -> 증감식 -> 조건식)

 

클래스(Class)

: 속성변수와 메소드와 생성자를 정의해놓은 일종의 틀.

파일 형태로 저장되어 있다. 클래스는 객체화가 되기 전에 외부데이터가 주입되어있지 않음.

이름
멤버 클래스의 멤버 : 속성변수와 메소드와 생성자.
각각 0개 이상 나올 수 있음.
속성변수 행동자.
메소드 내부의 실행구문 실행 과정 중에 필요한 데이터 저장하는 곳.
기본형 데이터 또는 참조형 데이터(객체의 메모리 위치 주소값)를 저장함.
생성자 패시브.
클래스가 객체화가 되어야 속성변수가 메소드가 호출한 실행구문이 이루어짐.
메소드 행동.
실행구문을 대표하는 방법 이름!

코드의 실행 방법과 실행 과정을 정의한 것.
(변수의 조작, 데이터의 조작, 다른메소드의 호출, 객체 생성 등)
-> 객체가 소유한 메소드를 호출하면 코드 몰라도 방법 그대로 사용할 수 있음.
객체 클래스를 실행하면 메모리 공간(Heap)으로 올라간다. 이때부터 클래스를 객체라고 부른다.
같은말로 인스턴스.
리턴(return) 메소드가 실행 된 후에 내놓은 반환 데이터의 자료 유형 설정
목적)메소드 중단.
-> 메소드 실행을 중지하고 오른쪽 데이터를 호출한 곳으로 반환하라.
ㄴ기본 자료형 꼭 내부에 return 기본자료형데이터; 가 있어야함.
ㄴ클래스명 메소드 실행 후 1)클래스 객체화한 객체 메위주 2)클래스의 후손 클래스를 객체화한 객체메위주 3)null값 중 하나의 데이터를 리턴해야함. 꼭 return 객체메위주;이 있어야함.
ㄴ인터페이스명 메소드 실행 후 1)인터페이스명에 해당하는 인터페이스를 구현한 클래스를 객체화한 객체의 메위주 2)null값 중 하나의 데이터를 리턴함. 꼭 return 객체메위주;이 있어야함.
ㄴvoid 메소드 실행 후에 아무런 값도 반환하지 않는다. return 데이터;가 있으면 안됨. 단, return;은 가능.(=메소드 종료의 의미)

 

상속(Inheritance)

:클래스(부모)가 소유한 멤버(속성변수, 메소드 등)를 다른 클래스(자식)에게 그대로 물려주는 것.

이름
super 예약어 자식 내부에서 부모의 멤버(속성변수, 메소드, 생성자)를 호출하기 위해 사용함.
반드시 자식의 생성자 첫줄에 부모 생성자를 호출하는 super(~)가 있어야함.(없으면 자바가 자동 삽입)
super(~)는 무조건 생성자 안에서만 나오는 것. 메소드 안에서 나올 수는 없음.
this 예약어 클래스가 소유한 고유멤버(속성변수, 메소드, 생성자)를 지칭하거나 클래스가 객체화 될 때 객체 메모리 위치 주소값을 말한다.
사용목적) 1. 메소드의 매개변수명과 속성변수 명이 같을경우 구별하기 위해 this.속성변수명 형식으로 사용.
2. 부모클래스와 자식클래스의 속성변수/메소드/생성자 이름이 같을경우 구별하기 위해 사용
형식) this.(자식클래스 관련 이름)
this(~)는 생성자 안에서만 나옴. 메소드 안에서 나올 수 없음.
추상클래스 바디가 없는 메소드를 한개 이상 소유하고 있거나 조상 클래스가 바디없는 메소드를 한개 이상 소유하고 있는 클래스.
단, 조상클래스부터 자기클래스 사이에 이 메소드를 재정의 하지 않았을 경우에만 해당.
용도) 자식이 추상클래스가 소유한 추상메소드를 재정의해서 사용하므로써, 메소드의 명세표 역할을 하고, 공통된 작업의 규격을 만듬.
특징) 1. 추상클래스 이름 앞에 final이 붙을 수 없음.(final이 붙으면 상속자체가 불가능)
2. 추상클래스의 추상메소드 앞에 private, static, final이 붙을 수 없음.(접근불가, 또는 호출불가)
3. 추상클래스는 객체화 할 수없다. 메소드 호출이 불가능하기 때문.
4. 추상클래스의 메소드를 자식이 전부 재정의하면 일반클래스가 되어 객체화 가능해짐.
5. 모두 재정의하지 않으면 자식도 추상클래스가 됨.(따라서 일반클래스가 되려면 모두 정의해야함.)
<주의>일반클래스에 abstract를 붙일 수 있음.
객체화 금지 목적이거나 추후 실행구문{}이 없는 메소드를 추가하여 추상클래스를 만들 예정일 경우에 붙임.
종단클래스 다른 클래스에게 상속할 수 없는 클래스
형식) [public] final class 클래스명{~}
이름 앞에 abstract가 올 수 없음(=상속불가능의 의미이기 때문)
용도)상속을 불가능하게 해서 이 클래스가 소유한 멤버를 재정의해서 사용할 수 없게 함.(보안)

 

인터페이스(Interface)

: public,static,final 성격을 가진 속성변수와 public, abstract 성격을 가진 메소드만으로 구성된 단위프로그램 (안붙여도 자동으로 붙여짐)

이름
인터페이스 인터페이스에 정의한 추상 메소드를 다른클래스에서 재정의해서 사용함(클래스의 메소드 제작 명세표 역할)-> 이름만 가져다가 실행구문 만들면 계획된대로 만들 수 있음.
인터페이스 속성변수 호출 형식) 인터페이스명. 속성변수

인터페이스 속성변수는 반드시 선언과 동시에 초기화 해야함.
여러개의 인터페이스가 하나의 인터페이스에게 상속해줄 수 있다.(다중상속가능)
여러개의 인터페이스가 하나의 클래스에게 구현해줄 수 있다(다중구현가능/클래스의 단일상속 문제점 해결(확장성, 재사용성 한계 보완))
인터페이스는 new에 의해 객체화 될 수 없으나, 익명 클래스처럼 객체화하면서 메소드를 재정의하면 가능하다.
오버로딩(overloading) 생성자 오버로딩) 같은 이름의 생성자를 2개 이상 정의하는 것으로, [생성자명]은 같더라도 [매개변수의 갯수]나 [매개변수의 자료형]은 달라야하는 규칙이 있다.
오버라이딩(overrriding) 부모의 메소드를 자식이 같은 이름으로 재정의하는 것.
인터페이스에 계획된 메소드명을 만들고 클래스가 이 메소드 이름만 그대로 가져다 실행구문을 설정하는 것으로 계획된 메소드로 구성된 클래스를 만들 수 있다.
단, 메소드 앞에 final이 있으면 불가.
(인터페이스의)상속(inheritance) 부모-자식관계
인터페이스가 다른 인터페이스에게 멤버를 물려주는 것.

장점) 반복되는 코드 줄일 수 있고, 클래스 간의 관계를 명확히 할 수 있다. 계층적인 구조로 효율성이 뛰어남
단, 메소드의 경우 final이 없을 때, 자식은 부모의 것을 재정의(overrriding)해서 사용해야한다.
구현(implement) 인터페이스가 다른 클래스에게 멤버를 물려주는 것.
단, 클래스는 인터페이스에게 받은 추상메소드를 조상까지 전부 재정의 해야 한다. 그래야 객체화 할 수 있다.

메소드를 재정의할 때에는 public을 붙여야 한다.
단, 인터페이스는 final 성격을 가지고 있어서 클래스가 인터페이스의 속성변수를 가져올수는 있는데, 갱신은 못한다.

 

배열(Array)

: 같은 유형의 자료들은 순차적으로 저장할 수 있는 구조. 일종의 객체이므로 메소드와 속성을 가지고 있음.

이름
배열 목적) 같은 자료형의 변수를 원하는 갯수만큼 쉽게 생성할 수 있다. 반복문을 사용하여 배열 변수에 쉽게 데이터를 저장하고 호출할 수 있음.
단점) 변수의 갯수를 미리 정확하게 알고 있어야함.
-> 게임 프로그램에서 캐릭터가 움직일 때에 배열을 많이 사용함
기본 자료형도 저장 가능(컬렉션과의 차이점)
getter/setter 메소드 클래스의 특성 중 정보 은닉을 가장 잘 보여주는 메소드.
보통 클래스의 멤버변수는 private러 접근제한자를 설정한다. 따라서getter/setter를 통해 멤버변수의 값을 변경, 호출함.
단축키)alt+shift+s

 

컬렉션(collection)

: 같은 또는 다른 유형의 다수의 객체를 저장할 수 있는 자료구조.

꺼낼 때 몇번째 데이터가 무슨자료형인지 알수가 없어서 일반적으로 거의 하나로 통일해서 사용(다 문자로 통일)

객체의 메모리 위치 주소값 저장

기본 자료형 데이터는 저장불가(때문에 Wrapper 클래스 계열의 객체로 바꾸어 저장함)

이름
제네릭스(generics) 형변환하기 싫을 때. 객체 생성시 그 객체안에 사용할 자료형을 지정해주는 것.
ex) HashMap<String,String> map = new HashMap <String, String>();
이러면 쓸때랑 꺼낼때 전부 문자형으로 꺼내줌.
제네릭스를 안쓰면, 서로다른 객체가 마구 저장되어서 자료형을 다 기억해야함. 때문에 절대적으로 사용함.
DTO : data transfer object(객체) xxx 이름의 속성변수가 있으면 꼭 set과 get라는 이름의 메소드가 있음. 세개가 한쌍. 이게 한 쌍이 되어서 n개가 들어있는 클래스를 DTO 클래스라고 함. 가끔 VO(value object)라고 부르기도 함. (예를 들면 Family DTO)
데이터를 조작하는 것이 아닌 담는 역할만 함. 오라클 한 행의 데이터를 담는 역할. 오라클의 table과 맞닿음.
DAO : data access object 오라클을 비롯한 데이터베이스에 접근해서 db 연동하는 클래스.
오라클에게 명령하고 삭제명령을 내리는 것. DTO는 그러한 상황에서 데이터를 저장하는 묶음 클래스 같은 것.
해쉬맵(HashMap) Hashmap 클래스의 특징)
<1> 다량,다종의 객체를 저장하고 꺼낼 수 있는 기능을 가지고 있다.
실무적으로는 같은 종류의 객체만 저장한다. 꺼낼때 자료형이 다르면 형변환이 불가능하기 때문.
<2> 기본형 데이터는 저장불가
기본형을 굳이 저장하고 싶다면 기본형을 관리하는 객체를 생성하여 그 객체를 저장한다.
[Integer 객체]를 사용하면 정수, [Double 객체]를 사용하면 실수를 저장할 수 있음.
예) Integer num = new Integer(3); Double num = Double(3.3);  //여기서 더블은 자료형이 아님. 앞글자 대문자.
<3> 저장시 저장 순서가 일정하지 않다. 즉, 저장 순서를 알 수 없다.
<4> 저장된 데이터를 꺼낼 때 키값을 사용한다.
즉 키값은 저장된 객체를 꺼내기 위해 붙인 것. -> 저장 순서가 있으면 키값 필요 없다. 키값 객체(=데이터) 중복저장시 저장객체는 덮어씀.
<5> 웹 개발시 HashMap 객체는 오라클 안의 n행 n열의 데이터를 자바 영역으로 가져올 경우 한 행의 데이터를 저장할 때 많이 사용한다.
웹 개발시 키값=저장객체메위주 는 아래 형태로 많이 사용된다.(키값 = 태그)
"컬러명"-"오라클테이블데이터"
<주의> 오라클 한 행의 HashMap 객체에 저장시 저장객체는 String 형으로 통일하여 저장하므로 오라클에 있는 자료형을 그대로 가져올 수 없다. 즉, 오라클 자료형을 살릴 수 없다.
어레이리스트(ArrayList) ArrayList 클래스의 특징)
<1> Hashmap 특징과 동일. 다량, 다종의 데이터 저장하고 꺼내는 기능. 하지만 대부분 같은 종류의 객체로 저장

<2> 기본형 데이터 저장 불가
<3> Hashmap과 차이점) 저장 시 저장순서를 유지한다. 즉, 저장순서를 알 수 있다.(=순차적 저장)
<4> 저장된 데이터를 꺼낼 때 인덱스 번호(0부터 시작)를 사용한다.(키값 필요x)
<5> 웹 개발시 ArrayList 객체는 오라클 안의 n행 n열의 데이터를 자바 영역으로 가져올 경우 n 행의 데이터를 저장한 다량의 Hashmap 객체들을 저장할 때 사용한다.

 

예외(Exception)

: 자바 가상머신이 감지할 수 있는 오류.(에러는 감지 못하는 오류)

예외가 발생하면 예외 종류에 따라 예외를 관리하는 클래스가 자동으로 객체화됨

사용 목적) 예외가 발생할 경우 멈추지 않고 내가 설정한 코딩을 실행시키기 위함.

이름
try 구문 예외가 발생할 것 같은 구문 넣기
catch 구문 예외발생시 실행할 코드
catch 구문 하나만 실행되어도 멈춤.
finally 구문 예외가 발생하던 안하던 반드시 실행할 코드.(생략가능)
finally를 쓰는 이유) 꼭 실행시켜야만 하는 실행문을 finally가 안으면 리턴 후에 중단하고 바로 데이터 출력하지 않고, finally를 먼저 실행하고 리턴값 내놓음. 즉, 빼먹지 않고 해야하는 메소드를 리턴이 있던 없던 실행하기 위해(리턴을 이기기 위해)
Exception 모든 예외를 관리하는 객체들의 부모클래스
else처럼 마지막에 두면 대부분 예외를 걸러줌
단, 얘는 중간에 들어가면 에러. 중간에 들어가면 그 아래의 것은 계산이 안됨. 따라서 맨 아래로 가야함
ArithmeticException 0으로 나누는 행위가 발생되면 관리하는 객체
NumberFormatException 진짜 문자를 숫자로 바꾸는 예외를 관리하는 객체

 

String 객체

: 자바에서 String(문자열)은 " "로 감싸면 된다.

String은 바로 여러 메서드를 사용할 수 있어 객체로 취급된다.

String str1 = new String("Beatles");
String str2 = new String("Beatles");

이 둘의 경우 서로 다른 String 객체를 비교하는 것.

new로 서로 다른 메모리 위치 주소값을 생성하였기 때문에 문자가 같아도 다른 것.

String str3 = "Beatles";
String str4 = "Beatles";
String str5 = "BSEATLES";

이경우 3-4는 서로 같은 문자열이기 때문에 같은 메위주를 비교.

[new를 사용하지 않고 2개 이상의 String 객체를 생성할 때 소유한 문자 데이터가 같으면 String 객체를 생성하지 않고 기존의 String 객체의 메위주를 생성한다.]

 


자바 클래스 형식

1. package 패키지명;

클래스의 소속 묶음명. 클래스들을 담는 폴더. 보통 3단계 이상으로 만든다.(ex. com.naver.java)

 

2. import 수입클래스패키지명.수입클래스명;

무조건 다 import 할 수 있는 것은 아니다.

수입클래스명 : (생략가능)타 패키지 소속 클래스를 객체화해서 사용할 경우, 그 이름들을 지정하는 것.

 

3. [public]

<클래스 수입 지정자>
왜수입?)객체화해서 메소드 호출하려고.
있으면)같은 또는 다른 패키지의 타 클래스에서 수입 가능.
없으면(=default))같은 패키지의 타 글래스에서만 수입 가능.

 

4. [abstract/final]

<클래스 성격 지정자>

abstract : 상속하고 싶다! 실행구문(body)이 없기 때문에 객체화가 불가능. 빨리 자식이 와서 body 없는 메소드를 채워줬으면 좋겠다.

1) 실행구문(body)이 없는(호출할 수 없는) 메소드를 하나 이상 가지고 있을 때(자유도가 높은편)

2) 부모클래스가 실행구문(body)이 없는 메소드를 가지고 있는데 자신이 한번도 재정의하지 않았을 때.(즉, 재정의하면 abstract가 사라진다.)

 

final : 상속금지. 자식쪽에서 상속관계를 요청할 경우 받아들이지 않겠다.

 

5. class 클래스명

class 상속 이유 : 자식이 부모의 메소드를 마음껏 가져다 쓰기 위해. 자식이 부모를 고르고 자식만 부모꺼를 가져다 쓸 수 있다.

 

6. public /protected /defalt /private

<접근지정자(호출가능범위 설정)>

public : 모든 곳에서

protected : 타패키지에 있어도 자식클래스라면 호출가능

default(생략가능) : 같은 패키지 내에서만

private : 현재 클래스 내에서만

 

7. [static]

붙으면)클래스변수, 공유변수라 부른다. 객체 생성 없이도 호출이 가능해진다. static이 붙은 변수를 객체화한 다른 객체끼리 공유한다.(이 속성변수를 소유한 모든 동일 객체가 공유하게 된다. ) 객체 간에 통신, 누적이 가능해진다.
 호출할 때 형식)
1. 객체참조변수.속성변수명
2. 클래스명.속성변수명
없으면) 객체참조변수.속성변수명 형식으로만 호출 가능
=> 클래스를 객체화해서 메모리에 올라오기 전에  static을 붙이면 먼저 그 메소드가 올라가 있을 수 있다. 

 

8. final

붙으면) 종단변수라 부른다.

처음에 저장된 데이터는 초기화 후 갱신 금지

final이 속성변수 앞에 붙으면 예외적으로 자동초기화가 되지 않으니 반드시 1. 변수 선언과 동시에 수동초기화 또는 2. 생성자 안에서 수동초기화 해야한다.

 

9. 기본자료형/ 클래스명 / 인터페이스명 속성변수명

<기본자료형>
기본형 데이터를 저장할 속성변수에 붙인다. 기본형으로 속성변수를 선언하고 수동초기화하지 않으면, 디폴트값으로 자동초기화된다.

<클래스명>
다음 중 하나의 데이터를 저장할 속성변수에 붙인다.
1. 클래스명에 해당하는 클래스를 객체화한 객체 메위주
2. 클래스의 후손 클래스를 객체화한 객체 메위주
3. null값
-> 속성변수 앞에 클래스명을 붙이고 수동초기화를 하지 않을경우.

**객체의 메모리 위치 주소값을 저장할 변수를 참조형 변수라고 함.

<인터페이스명>
다음 중 하나의 데이터를 저장할 속성변수에 붙임.
1. 인터페이스명에 해당하는 인터페이스를 구현한 클래스를 객체화한 객체 메위주
2. null값
-> 속성변수 앞에 인터페이스명을 붙이고 수동초기화를 하지 않을경우.

여기서 속성변수명은 클래스를 객체화했을 때 메모리 위치 주소값을 의미한다.

속성변수 특징)
속성변수 선언 후 수동 초기화하지 않으면 디폴트값으로 자동 초기화된다.(지역변수는 자동초기화x)

final이  있으면 꼭 수동초기화!!!!!!
지역변수도 수동초기화 해야함!

 

10.  public /protected /defalt /private

<객체생성가능여부(=생성자 호출여부)>

 

11. 생성자명

클래스를 객체화한 후 자동으로 한번만 호출되는 실행구문 영역.
클래스 이름과 동일. 단, 왼쪽에 자료형 없음.
생성자 오버로딩) 같은 이름의 생성자를 2개 이상 정의하는 것.
생성자 오버로딩 규칙 - 생성자명은 같더라도 매개변수의 갯수나 자료형은 달라야한다.

생성자가 0개일 때는 가상머신이 컴파일 시 기본 생성자 1개를 만들어준다.

 

생성자 호출 방법

1. new 생성자명(~)  //객체생성과정 2. this(~)   //동료생성자 안 3. super(~)   //자식생성자 안

<주의> 동료 메소드 안에서 동료 생성자르 호출할 수 없다.

 

생성자에는 return 데이터; 가 올 수 없음 이유) 리턴형을 표시하지 않음.

 

12. ([자료형 매개변수, ~])

자료형은 기본형/클래스명/인터페이스명이 있다. 0개 이상 나올 수 있음. 2개 이상은 ,로 나열.

 

13. public /protected /defalt /private

<호출가능여부>

 

14. [static]

객체 생성없이 메소드 호출 가능, 동료속성변수도 static이 붙어있어야한다.

 

15.[synchronized]

 

16. [abstract/final]

final : 자식클래스가 자신의 메소드를 가져다 쓸 때, 이 메소드를 재정의(overriding) 하지 못하게 하는 것

abstract : body가 없음

 

17. 기본자료형/ 클래스명 / 인터페이스명 void 메소드명

이 메소드를 호출하면 ~를 받을 것이다.

void : 호출 시 아무것도 받을 수 없다.

클래스명이 메소드명 옆에 있을 때 호출받을 수 있는 데이터는 메모리 위치 주소값 뿐만 아니라 null도 있다.

 

18. ([자료형 매개변수

각 메소드 안에 지역변수가 있음.

메소드 안에 선언된 지역변수 자료형 앞에 final 붙으면 갱신불가 ex)final int a = 3;

 

 public static void main(String[] args) { ~ } 이 포함된 클래스만 클래스명(=파일명) 앞에 public이 붙을 수 있다.

반응형
LIST
반응형
SMALL

+ Recent posts

반응형
LIST