두둔! 11월의 마지막 날이다. 이 말은 내가 스파르타에 한 달 동안 열심히?? 무언가를 했다는 말!!! 끼약
시간이 왜 이렇게 빠른지 모르겠다. 거기다 오늘은 정들었던 우리 조원들을 보내고 새로운 조원들이랑 으쌰 으쌰 하는 첫날!!!!
암튼 P스러운 잡소리는 그만하고,,!
JVM 구조
내가 만든 .java 파일을 자바컴파일러(인텔리제이나 이클립스)가 바이트코드인 .class 로 변경해줌! 이 바이트 코드를 Java Virtual Machine이 읽어서 해석해서 OS에 맞게 뿌려주는!!!!! 거라고 이해했다. 맞나? 맞을거야 자바 컴파일러가 아직 잘 모르겠지만 대충 구조는 맞을거야 호호
이때 쓰이는 게 JDK 구조
→ JDK : Java Development Tool + JRE
→ JRE : Java Runtime Environment + JVM
but 오라클은 자바 11부터 JDK만 제공
그래서 큰 덩어리로 보자면 JDK 안에 JRE 안에 JVM이 있는 구조!
메모리와 코드의 흐름
JVM이 사용하는 메모리 영역 2가지
▶️ JDK 구조일 때
▶️ JVM 구조일 때
🚨 좀 더 집중해서 봐야 할 부분은 JVM 구조이다.
여기서 제일 탑 헤드인 Class Loader Subsystem은 .class 에서 바이트 코드를 읽고 메모리에 저장한다.
Runtime Data Area에서는 메소드들이 담겨있는 Method Area와 객체를 저장하는 Heap 영역, 스레드마다 런타임 스택을 만들고 스택 프레임이라는 블록을 쌓는 Stack 영역이 있다.
Execution Engine에서는 반복되는 코드를 재사용해서 속도를 높여주는 JIT Compiler, 더이상 참조되지 않는 객체를 모아서 정리하는 일종의 쓰레기통? 보관함?같은 느낌의 GC로 구성되어있다.
JNI(Java Native Interface)는 C, C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법을 제공하면서, 자바에서 기본적으로 제공되는 메서드에 native 키워드가 붙은 모든 것들을 말한다.
Native Method Libraries는 JNI랑 다르게 어셈블리가 없이 C, C++로만 작성된 라이브러리이다.
자바_접근제어자
멤버 변수/함수 혹은 클래스에 사용되며 외부에서의 접근을 제한하는 역할
private : 같은 클래스 내에서만 접근 가능
protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능
public : 접근 제한이 전혀 없다
default(nothing) : 같은 패키지 내에서만 접근 가능
[pkg 생성하고 ModifierTest.java 생성]
private, public, protected, default 비교
package pkg;
public class ModifierTest {
// Main2랑 연결
private void messageInside() {
System.out.println("This is private Modifier");
}
public void messageOutside() {
System.out.println("This is public Modifier");
messageInside();
}
protected void messageProtected() {
System.out.println("This is protected Modifier");
}
void messagePackagePrivate(){
System.out.println("This is package private modifier");
}
}
[Main2.java]
Child : ModifierTest를 상속받는 자식 클래스
import pkg.ModifierTest;
class Child extends ModifierTest {
void callParentProtected() {
System.out.println("call my parent's protected method.");
super.messageProtected();
// super 는 상속받은 부모 키워드 전부를 가르키는 키워드
}
}
public class Main2 {
public static void main(String[] args){
ModifierTest modifierTest = new ModifierTest();
modifierTest.messageOutside();
// This is public Modifier
// This is private Modifier
// modifierTest.messagInside(); ModifierTest에서 private으로 선언되어있어서 컴파일 에러난다.
// modifierTest.messageProtected(); ModifierTest에서 protected으로 선언되어있어서 컴파일 에러난다.
// messageProtected() 함수를 쓰기 위해서 인스턴스 함수를 만들어준다.
Child child = new Child();
child.callParentProtected();
// This is public Modifier
// This is private Modifier
// call my parent's protected method.
// This is protected Modifier
// modifierTest.messagePackagePrivate(); 마찬가지로 public 선언이 되어있지 않아 컴파일 에러난다.
}
}
자바_추상 클래스
추상 메서드를 선언할 수 있는 클래스 의미.
일반 클래스와는 다르게 상속받는 클래스 없이 그 자체로 인스턴스를 생성 불가.
추상 메서드 :
설계만 되어있으며 수행되는 코드에 대해서는 작성이 안된 메서드. 미완성으로 남겨두는 이유는 상속받는 클래스마다 동작이 달라지는 경우에 대해 상속받는 클래스의 작성자가 작성하도록 하기 위함
추상 메서드 형식 : abstract 리턴 타입 메서드 이름();
추상 클래스 특징 :
1) 일반 클래스랑 같지만 객체를 자체적으로 생산 불가능
2) 클래스 상속과 마찬가지로 extend 키워드를 이용하기 때문에 다중 상속이 불가능
3) 추상 메서드에 관해서만 자식 클래스에서 무조건 구현해야만 함
abstract class Bird {
private int x, y, z;
void fly(int x, int y, int z) {
printLocation();
System.out.println("Move.");
this.x = x;
this.y = y;
if (flyable(z)){
this.z = z;
}else{
System.out.println("Doesn't Fly.");
}
printLocation();
}
abstract boolean flyable(int z);
// 날 수 있는 새인지 아닌지
// 추상 클래스는 그 자체로 인스턴스를 만들 수 없다.
public void printLocation() {
System.out.println("Now location (" + x + ", " + y + ", " + z + ")");
}
}
class Pigeon extends Bird{
@Override
boolean flyable(int z) {
return z < 10000;
}
}
class Peacock extends Bird{
@Override
boolean flyable(int z) {
return false;
}
}
public class Main {
public static void main(String[] args) {
// Bird bird = new Bird();
// Bird는 abstract라 인스턴스화 할 수 없음 그래서 자식 클래스(Peigon, Peacock)를 생성해 줘야 한다
Bird pigeon = new Pigeon();
Bird peacock = new Peacock();
System.out.println("----- pigeon -----");
pigeon.fly(1,1,3);
System.out.println("----- peacock -----");
peacock.fly(1,1,3);
System.out.println("----- pigeon -----");
pigeon.fly(1,1,30000);
}
}
[결과]
----- pigeon -----
Now location (0, 0, 0)
Move.
Now location (1, 1, 3)
----- peacock -----
Now location (0, 0, 0)
Move.
Doesn't Fly.
Now location (1, 1, 0)
----- pigeon -----
Now location (1, 1, 3)
Move.
Doesn't Fly.
Now location (1, 1, 3)
▶️ flyable 함수는 구현체가 없음에도 불구하고 abstract class 안의 진짜 함수처럼 사용되었지만 구현은 자식 객체에서만 됨을 볼 수 있다.
자바_인터페이스
객체의 특정 행동의 특징을 정의하는 간단한 문법
인터페이스는 함수의 특징(method signature)인 접근 제어자, 리턴 타입, 메서드 이름만을 정의하며 함수의 내용은 없다.
인터페이스를 구현하는 클래스는 인터페이스에 존재하는 함수의 내용({} 중괄호 안의 내용)을 반드시 구현해야 한다.
인터페이스 형식 : interface 인터페이스명{ public abstract void 추상 메서드명(); }
→ 인터페이스의 메서드는 추상 메서드는 static 메서드, default 메서드 모두 허용된다. (JDK 1.8부터)
인터페이스 특징
1) 구현하는 객체의 동작에 명세
2) 다중 상속 가능
3) implement 라는 키워드를 이용해서 구현
4) 메서드 시그니처만 선언 가
interface Flyable{
void fly(int x, int y, int z);
}
class Pigeon implements Flyable{
private int x, y, z;
@Override
public void fly(int x, int y, int z) {
printlocation();
System.out.println("Fly");
this.x = x;
this.y=y;
this.z=z;
printlocation();
}
private void printlocation() {
System.out.println("Now location is ("+ x + "," + y + "," + z + ")");
}
}
public class Main {
public static void main(String[] args) {
Flyable pigeon = new Pigeon();
pigeon.fly(2,3,3);
}
}