자바 바이트코드 (Java bytecode)란 자바 가상 머신(JVM)이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다. 즉 .java 파일을 javac이 .class 파일로 변환해준다. javac(자바 컴파일러)에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불린다. 이런 자바 바이트 코드는 JVM만 설치되어 있으면 어떤 OS에서도 실행이 가능하다.
같은 클래스 내에서 메서드를 확장하는 것, 메서드 명은 같지만 매개변수, 반환 형 등을 다르게 하여 코드의 재사용성을 높여준다. 아래는 오버로딩이 되기 위한 조건이다.
부모 클래스의 매서드를 자식 클래스에서 매서드를 '재정의' 하는 것이다.
즉 상속 받은 부모 클래스의 매서드를 재정의 하는 것이며, 다른 클래스의 매서드를 재정의 하는 것이 아니다.
기존의 언어들로 짜여진 프로그램 (ex. .java파일)을 실행시키기 위해서는 소스 코드 컴파일러(javac)를 통해서 어셈블리어로 변환하고(.class), 변환된 어셈블리어를 다시 어셈블러를 통해 기계가 해석할 수 있는 기계어로 변환해야 한다.
하지만, 문제는 여기서 생긴다. 하드웨어 마다 그리고 제조사마다 기계어의 설계가 다른 것이다.
예로 Intel 64bit, CPU와 AMD 64bit CPU의 기계어의 설계는 다르다. 기존의 언어들은 OS에 종속 되어서 프로그램을 다른 OS에 적용하기 위해 많은 시간과 노력이 들지만, 자바는 JVM을 통해 OS나 HW가 아닌, JVM과 통신을 하고 JVM이 자바 응용프로그램으로 전달받은 명령을 변환하여 OS와 통신한다.
이 때문에 자바는 OS를 신경쓸 필요가 없으며, JVM만 각 OS에 호환되는 버젼으로 설치만 해주면 된다. 즉 플랫폼의 독립성이란 하드웨어 또는 운영체제 와 같은 플랫폼에 종속되지 않으며, 독립적으로 실행이 가능한 것을 말한다.
자바의 경우 플랫폼에 독립적으로 프로그래밍 할 수 있도록 설계되었다. 'Write Onece, Run Anywhere(WORA)' 원칙에 따라 어떤 플랫폼에도 실행이 될 수 있다.
또한 자바는 객체지향 프로그래밍 언어(OOP)로서, 4가지의 큰 특징으로 상속, 다형성, 캡슐화, 추상화를 가지고 있으며 이는 코드의 재사용성과 유지 보수성을 높이며, 대규모 개발에 적합하다는 장점을 가지고 있다. 또한 강력한 메모리 관리와 예외처리 기능을 제공하여, 안정적인 애플리케이션 개발이 가능하다.
JDK는 자바 개발 도구로서 소프트웨어 개발 키트이다. JDK는 플랫폼에 따라 다르며, Java코드를 개발하기 위한 디버깅과 모니터링을 하기 위한 도구가 포함되어 있으며 JRE의 상위 집합체이다. .java 파일을 바이트 코드로 변환하는 javac가 여기에 포함되어 있다.
Java 코드를 실행하는데 필요한 구성 요소를 Java 클래스 라이브러리에 제공하는 소프트웨어 번들이다. JRE는 플랫폼에 따라 다르며 JVM이 실행하는데 필요한 클래스와 라이브러리 그리고 기타 지원파일이 포함되어 있다.JRE는 JVM을 생성하는 Java의 일부이다. JRE는 소스코드를 실행하는 환경만 포함되어 있다.
JVM은 바이트 코드로 이루어진 .class 파일을 실행하고 실행하기 위한 환경을 제공한다. JVM은 플랫폼 의존도가 높다. .class 바이트 코드는 JIT(Just-In-Time) 컴파일러에 의해 바이너리 코드로 변환된다.
.java(소스코드) -> JDK의 javac를 통해 .class(바이너리 코드) 변환 -> JVM을 통해 .class 코드를 JIT와 같은 컴파일러를 통해 바이너리 코드로 변환
결론부터 말하자면 다중상속은 불가능하다. 다중 상속을 할 수 있게 되면, 하나의 클래스가 어러개의 상위 클래스를 상속받을 수 있다. 이 경우 '다이아몬드 문제'가 발생하게 된다.
이처럼 최상위 클래스의 GrandFather가 있고
그 아래 FatherA
FatherB가 있으며
Son은 FatherA와 FatherB를 상속받고 있다. 하지만 벌써부터 Intellij에 다중 상속이 안되는 것을 볼수 있다. 또한, super.method()를 확인해보면 다음과 같이 어떤 메서드를 정의 할 것인지 정해지지 않았다. 애초에 Java는 다중 상속을 받으면 컴파일 자체를 하지 못하게 하고 있다.
하지만 이럼에도 인터페이스는 다중 상속이 가능하다. 인터페이스는 다중상속이 되는 것이고, 클래스의 경우 다중상속이 불가능 하다.
그 이유는 인터페이스는 "매서드가 정의되지 않았기 때문" 이다. 즉 선언된 형태의 매서드만 가지는 인터페이스는, 동일 시그니처의 매서드를 얼마든지 상속 받아도 아무 문제가 발생하지 않는다. 아직 구현되지 않았기 때문에 자손 클래스에서 새롭게 정의되어야 하기 때문이다.
결론적으로 인터페이스는 구현된 매서드가 없기 때문에, 다중 상속이 가능하다. 하지만, 클래스나 추상클래스는 이미 구현된 매서드가 존재하기 때문에 다중 상속이 불가능하다.