자바가 실행되는 과정은?
1. 컴파일러가 자바 소스를 바이트코드로 변환한다.
2. Class Loader가 바이트 코드를 런타임 데이터 영역에 로드시킨다.
3. 로딩된 바이트 코드가 실행엔진에 의해서 실행되게 된다.
스레드별 : PC Register, JVM Stack, Native Method Stack
공통 : Method Area, Heap
( 스레드별 )
( 공통 )
자바 메모리 구조는?
스레드별 PC Register, JVM Stack, Native Method Stack이 있고, 공통 스레드는 Method Area, Heap이 있다.
프로그램을 개발 하다 보면 유효하지 않은 메모리인 가바지(Garbage)가 발생하게 된다. C언어를 이용하면 free()라는 함수를 통해 직접 메모리를 해제해주어야 하지만, Java나 Kotlin을 이용해 개발을 하다 보면 개발자가 메모리를 직접 해제해주는 일이 없다. 그 이유는 JVM의 가비지 컬렉션이 불필요한 메모리를 알아서 정리해주기 때문이다.
가비지 컬렉션(GC)이 동작하는 동안에는 JVM의 다른 동작들은 잠깐 멈추기 때문에 오버헤드가 발생한다. 이로 인해 가비지 컬렉션이 너무 자주 실행되면 소프트웨어 성능 하락의 문제가 되기도 한다. 이러한 특성으로 인해 실시간으로 계속 동작해주어야 하는 시스템들은 가비지 컬렉션의 사용이 적합하지 않을 수 있다.
가비지 컬렉션이란?
JVM에서 메모리를 관리해주며, Heap 메모리를 재활용하기 위해서 더 이상 참조되지 않는 객체들을 메모리에서 제거하는 모듈이다. 개발자가 직접 메모리를 정리하지 않아도 되어서 개발속도가 향상되는 장점이 있지만 Mark and Sweep이라는 과정에서 참조되지 않는 객체를 찾는 과정이 있는데, 이때 스레드가 잠깐 중단되어서 성능이 떨어진다는 단점이 있다.
프로세스 중심이 아닌 객체중심으로 프로그래밍으로 구현하는 것이다. 순서, 과정이 중요하지 않다. 이해하기 쉽고 모듈화가 쉬우며, 재사용이 가능하다. 현실 세계의 사물같은 객체를 만들고, 객체에서 필요한 특징을 뽑아 프로그래밍을 수행한다. 대표적으로 Java, Python, C++ 등이 있다.
클래스들의 공통적인 특성(변수, 메소드)들을 묶어 표현하는 것이다.
데이터와 코드의 형태를 외부로부터 알 수 없게 하고(정보은닉), 데이터의 구조와 역할, 기능을 하나의 캡슐 형태로 만드는 방법이다. 즉, 정보은닉을 통해서 내부적으로 높은 응집도를 가지고 외부에서는 낮은 응집도를 가진다.
부모 클래스에 정의된 변수 및 메서드를 자식 클래스에서 상속받아 사용하는 것이다.
다양한 객체를 동일한 인터페이스 또는 부모 클래스로 다룰 수 있도록 하는 개념이다. 실행 시에 객체의 실제 타입에 따라 동작이 결정된다.
오버로딩(Overloadding)
메서드명을 하나로 통합할 때 매개변수 갯수와 자료형을 가지고 서로 다른 메서드 처럼 사용할 수 있게 만드는 기법이다.
생성자 오버로딩
다양한 방법으로 멤버변수의 값을 초기화 및 저장시킬 수가 있다. 생성자 내부에서는 자기 클래스의 객체명을 사용할 수 없고, 다른 클래스의 객체명은 사용할 수 있다. 객체명.일반메서드명(~)
메서드 오버로딩
메서드의 이름은 같아야 한다. 메서드의 매개변수를 다르게 설정하더라도 서로 자료형이 달라야된다. 메서드의 자료형을 다르게 설정해야 한다.
오버라이딩 (Overriding)
부모의 물려받은 메서드를 자식클래스 내부에 맞게 재정의하는 기법이다. 매개변수와 리턴 타입이 같아야 한다.
객체지향 프로그래밍은?
객체지향 프로그래밍은 프로세스 중심이 아닌 객체중심으로 프로그래밍으로 구현하는것이다. (재사용 가능)객체지향 프로그래밍의 4가지 특징은 추상화, 캡슐화, 다향성, 상속성이 있다.
- 추상화는 클래스들의 공통적인 특성들을 묶어 표현하는 것이다.
- 캡슐화는 데이터를 보호, 은닉하는 목적으로 사용한다.
- 상속성은 부모 클래스에 정의된 변수 및 메서드를 자식 클래스에서 상속받아 사용하는 것이다.
- 다형성은 하나의 타입에 여러 객체를 대입할 수 있는 성질이다.
일을 처리하는 순서, 과정을 프로그래밍으로 구현한 것이다. 대표적으로 C언어가 해당된다. 절차에 맞게 차례대로 진행되다 보니 속도가 빠르다는 장점이 있지만 유지보수가 어렵다는 단점이 있다.
절차지향 프로그래밍은?
절차지향 프로그래밍은 일을 처리하는 순서, 과정을 프로그래밍으로 구현하는것이다. (재사용 불가)
추상 클래스와 인터페이스는 객체 지향 프로그래밍(OOP)에서 다형성(Polymorphism)을 구현하기 위한 두 가지 주요 방법 중에 하나를 선택하는 데 사용되는 요소이다.
추상클래스는 하위 클래스들의 공통점들을 모아 추상화하여 만든 클래스이다. 추상 메서드를 선언하여 상속을 통해서 자식 클래스에서 완성하도록 유도하는 클래스이다. 상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없다. class 앞에 "abstract" 예약어를 사용하여 상속을 통해서 구현해야한다는 것을 알려주고 선언부만 작성하는 추상메서드를 선언할 수 있다. 다중 상속이 불가능하여 단일 상속만 허용하며, 같은 추상화인 인터페이스와 다른점은 클래스간의 연관 관계를 구축하는 것에 초점을 둔다.
추상클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성하고 클래스와 다르게 다중상속(구현)이 가능하다. 내부의 모든 메서드는 public abstract 로 정의(default 메소드 제외)한다. 클래스에 다중 구현을 지원하며, 인터페이스 끼리는 다중 상속을 지원한다. 인터페이스는 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용하는 것에 초점을 두었다.
추상클래스와 인터페이스란?
추상클래스는 abstract 지시자로 정의되며 추상메소드가 하나 이상 포함된다. 인터페이스는 interface 지시자로 정의하며 모든 메소드가 추상메소드로 정의한다.추상클래스와 인터페이스의 차이점은?
추상클래스와 인터페이스의 차이는 그 존재의 목적에 있다. 추상클래스는 상속받아서 기능을 재활용하고 확장시키는데 목적이 있다면, 인터페이스는 함수의 구현을 강제해서 구현한 객체들이 같은 동작을 하는것을 보장하는 것에 그 목적이 있다.