OOP(객체 지향 언어 프로그래밍)
oop는 코드의 재사용성을 증가하고 유지보수를 용이하게 만듭니다.
객체 지향 프로그래밍의 대표적 특징
- 상속 (Inheritance) : 부모 클래스의 변수와 메서드를 자식 클래스가 전부 물려받는 것입니다.
- 캡슐화 (Encapsulation, Information Hiding) : 객체의 변수 및 메서드를 외부 객체가 함부로 건드리지 못하게 감싸는 개념입니다 . 클래스의 getter/setter 등을 통해 은닉합니다.
- 다형성(Polymorphism)
- Poly(다양한) + morphism(변형,변신) 의 합성어입니다.
- 하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미합니다.
- 자바에서는 한 레퍼런스 변수가 다른 형태의 객체를 참조할 수 있음을 말합니다.
- 오버로딩, 오버라이딩, 업캐스팅, 다운캐스팅 등의 방법이 있습니다.
- 추상화 (Abstraction)
- 자바에서 공통의 속성, 기능을 묶어 이름을 붙이는 것을 의미합니다.
- 자바에서 추상화는 추상클래스, 인터페이스를 통해 구현됩니다.
- 추상클래스 : 추상메서드를 하나 이상 포함한 추상 클래스
- 인터페이스 : 추상메서드만을 포함한 추상 클래스, 다중 상속 가능
JAVA 8부터는 인터페이스 안에 default 선언을 하면 바디가 있는 메서드도 선언이 가능합니다.
운영체제에 독립적
"Write once, run anywhere"
자바는 os에 독립적입니다. JVM(java virtual machine)이 os와 프로그램의 사이에서 기계어로 해석해주는 역할을 하기 때문에 개발환경과 배포 환경이 다를 경우, 프로그램을 다시 컴파일 할 필요 없이 실행 가능합니다. 따라서 모든 자바 프로그램은 이론적으로 CPU나 운영체제의 종류와 무관하게 동일하게 작동합니다.
자동 메모리 관리
자바로 작성된 프로그램이 실행되면, 가비지컬렉터(Garbage Collector)가 자동적으로 메모리를 관리해주기 때문에 따로 메모리를 관리해주지 않아도 된다.
GC가 없는 C++과 같은 경우 프로그래머가 사용하지 않는 메모리를 체크하고 반환하는 일을 수동적으로 처리해야하고 만약 메모리 동적 할당 후 해제를 하지 않은 경우에는 메모리 누수(memory leak)가 일어날 수 있기 때문에 자바에서는 이런 메모리 관리를 자동적으로 해준다.
자동으로 메모리를 관리한다는 것이 다소 비효율적인 면도 있지만 프로그래머가 보다 프로그래밍에 집중할 수 있도록 도와준다.
멀티쓰레드 프로그래밍 가능
자바는 하나의 프로그램에서 여러개의 쓰레드가 동시에 실행할 수 있는 환경을 지원합니다.
멀티 쓰레드란? 여러 쓰레드(프로그램의 실행단위, 프로세스 내 주소공간 및 자원을 공유함)을 동시에 실행시키는 응용프로그램을 작성하는 기법입니다.
장점은 프로세스 내 메모리 공유를 통해 시스템 자원 소모가 줄어든다는 점이지만, 반면에 자원을 공유하기 때문에 충돌이 일어날 수 있습니다.
멀티 쓰레드 구현방법
- Thread 클래스
: 스레드를 만들기 위해 Thread class를 상속하여 생성할 수 있습니다. - Runnable 인터페이스
: Thread class와 같이 자바에서 스레드를 실행시키는 인터페이스 입니다.
: 다중 상속이 지원되기 때문에 재사용성이 높고 코드의 일관성을 유지할 수 있기 떄문에 객체지향적인 방법으로 Thread class보다 많이 쓰입니다.
- 자바에서 개발되는 멀티 쓰레드 프로그램은 시스템과는 관계없이 구현 가능하며, 관련된 라이브러리(Java Api)가 제공되므로 구현이 쉽다. 그리고 여러 쓰레드에 대한 스케줄링(Scheduling)을 자바 인터프리터가 담당하게 된다.
동적로딩(Dynamic loading)을 지원
자바는 애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적 로딩하여 생성합니다. 자바의 클래스 로더가 이런 역할을 수행하는데 클래스 로더란 '.class'바이트 코드를 읽어들여 class 객체를 생성하는 역할을 담당합니다.
동적로딩(Dynamic Loading)
: 클래스 일부 변경 시 다시 컴파일하지 않아도 되는 이점이 있다.
또한, 비교적 적은 작업으로 처리할 수 있는 유연성을 동적로딩이 제공합니다. 반면에 그때 그때 메모리에서 불러오기 때문에 프로그램 실행 속도가 정적로딩에 비해 느립니다. (느린 속도를 해결하기 위해 static 키워드를 사용합니다)정적 로딩(Static Loading)
: 정적 로딩은 프로그램 실행 시 모든 실행파일이 메모리에 적재되어 실행되는 로딩방법입니다. 대표적으로 C언어가 있습니다. 정적로딩은 모든 파일이 메모리에 적재되어 메모리를 많이 차지하지만, 빠르게 가져와 사용할 수 있다는 장단점이 있습니다.
자바의 단점으로는 속도문제가 가장 대표적인 것인데, 바이트코드(byte code)를 하드웨어의 기계어로 바로 변환해주는 JIT와 Hotspot과 같은 신기술의 도입으로 JVM의 기능이 향상됨으로써 속도 문제가 개선되었다.
'etc.' 카테고리의 다른 글
정보처리기사 이론 정리 (0) | 2023.05.24 |
---|---|
[java] Linkedlist와 Arraylist의 차이는 무엇일까? (0) | 2022.01.23 |
[java]자바 컴파일 과정 (0) | 2022.01.22 |
ch7 분할정복 (0) | 2022.01.21 |