2020. 6. 13. 21:22ㆍcomputer science/java
1. OOP(Object Oriented Programming) : 객체지향 프로그래밍
OOP란?
캡슐화, 다형성, 상속성, 추상화 4가지 특징을 이용해 코드의 재사용을 증가시키고 유지보수 빈도를 감소시키는 장점을 얻기 위해 객체들을 연결시켜 프로그래밍하는 것입니다.
캡슐화(Encapsulation) : 객체의 필드, 메서드를 하나로 묶고 실제 구현 내용을 감추는 것
다형성(Polymorphism) : 같은 이름으로 실행 결과가 다양한 객체를 이용하는 것
ex) 오버로딩(Overloading) : 이름은 같지만 다른 매개변수와 다른 리턴 타입을 갖는 것
오버라이딩(Overriding) : 부모의 함수를 상속받아 메서드를 재정의하는 것
상속성(Inheritance) : 상위 개념의 특징을 하위 개념이 물려받는 것
추상화(Abstraction) : 공통의 속성이나 기능을 묶어 이름을 붙이는 것
2. SOLID : 객체지향 설계 5대 원칙
SOLID란?
클래스 안에 응집도(Cohension)는 내부적으로 높이고, 타 클래스들 간 결합도(Coupling)는 낮추는 High Cohension - Loose Coupling 원칙을 객체 지향의 관점에서 도입한 것입니다.
즉, 소프트웨어는 재사용이 많아지고, 수정이 최소화되기 때문에 결국 유지보수가 용이해집니다.
SRP(Single Responsibility Principle) : 단일 책임 원칙
클래스를 설계할 때 애플리케이션의 경계를 정하고, 추상화를 통해 애플리케이션 경계 안에서 필요한 속성과 메서드를 선택하여 설계해야 합니다.
즉, 하나의 클래스는 하나의 책임/기능만 가집니다.
OCP(Open Closed Principle) : 개방 폐쇄 원칙
자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 합니다. ex) @Override
상위 클래스 또는 인터페이스를 중간에 두어 직접적인 연동을 피하게 설계합니다.
LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
Upcasting 된 객체 참조 변수가 논리적으로 그 역할에 문제가 없어야 합니다.
부모 클래스의 인스턴스 대신 자식 클래스의 인스턴스를 사용해도 문제가 없어야 한다는 것을 의미합니다.
ex) List<String> list = new ArrayList<>();
ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
해당 클래스를 보존하는 상태에서 인터페이스 최소주의 원칙에 따라 각 상황에 맞는 기능만 제공하도록 필터링합니다.
DIP(Dependency Inversion Principle) : 의존 역전 원칙
자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운 것의 변화에 영향받지 않게 의존 방향을 역전합니다.
객체지향적인 관점에서 보자면 변화하기 쉬운 것이란 구체화된 클래스를 의미하고, 변화하기 어려운 것은 추상 클래스나 인터페이스를 의미합니다. 따라서 구체적인 클래스 대신 인터페이스나 추상 클래스와 의존관계를 맺어 DIP를 만족시킬 수 있습니다.
3. 결합도(Coupling) vs 응집도(Cohension)
모듈의 독립성을 판단하는 두 가지 지표입니다.
결합도는 낮고, 응집도는 높을수록 이상적인 모듈화입니다(High Cohension - Loose Coupling).
결합도 : 모듈과 모듈 간의 상호 의존 정도
응집도 : 모듈 내부의 기능적인 집중 정도
4. JVM(Java Virtual Machine) 메모리 구조
JVM이란?
JVM은 C언어로 쓰인 자바 가상 머신으로 자바와 운영체제 사이의 중계자 역할을 합니다.
메모리 관리(가비지 컬렉션)를 자동으로 해주는 기능이 있습니다.
★ 운영체제와 플랫폼 종류에 의존적이지 않고 독립적으로 JAVA 프로그램이 실행됩니다.
Java Compiler : Java source(.java) 파일이 Byte code로 변환됩니다.
Class Loader : 변환된 Byte code(.class) 파일을 JVM으로 로드하고 Link작업을 통해 배치 등 일련의 작업을 합니다. 또한, 런타임 시 class를 load 합니다.
Execution Engine : Class Loader를 통해 JVM 내부로 넘어와 Runtime Data Area(JVM 메모리)에 배치된
Byte code들을 명령어 단위로 실행시킵니다.
Garbage Collector : 이미 할당된 메모리에서 더 이상 사용하지 않는 메모리를 해제합니다.
1) 메모리를 할당합니다.
2) 사용 중인 메모리를 인식합니다.
3) 참조되지 않은 객체들을 탐색 후 삭제합니다.
4) 삭제된 객체의 메모리를 반환합니다.
5) Heap 메모리를 재사용합니다.
Runtime Data Areas : Java 애플리케이션이 실행되면서 할당받은 JVM 메모리 영역입니다.
PC Registers
스레드가 생성될 때마다 생기는 공간으로 어떤 명령을 실행하는지 기록합니다.
JVM은 Stack-base 방식으로 작동하기 때문에 CPU에 직접 instruction을 수행하지 않고, Stack에서 Operand를
가져와 저장합니다.
Method
프로그램 실행 중 클래스를 불러와 인스턴스 변수, 메서드 코드 등을 저장합니다.
- Type Information : 클래스와 인터페이스의 정보
- Runtime Constant Pool : 모든 상수
- Field Information : 인스턴스 변수의 정보
- Method Information : 생성자를 포함한 모든 메서드의 정보
- Class Variable : static 키워드로 선언된 정적 변수
Stack
Last In First Out(LIFO) 방식으로 메서드를 호출할 때마다 스택 프레임(해당 메서드만을 위한 공간)이 생성됩니다.
메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값, 연산 시 일어나는 값을
임시로 저장합니다.
메서드 수행이 끝나면 스택 프레임을 삭제합니다.
Heap
new 연산자로 생성된 객체와 배열을 저장하는 공간으로 클래스 영역에 로드된 클래스만 생성이 가능합니다.
Garbage Collection을 통해 메모리를 반환합니다.
5. Java와 C++의 차이점
C++ | JAVA | |
컴파일 | 각 머신에 맞는 기계어로 컴파일 | JVM에서 컴파일 |
구성 단위 | .cpp(source), .h(header) 등의 파일 단위 | .class 등의 클래스 단위 |
메모리 접근 방식 | pointer | reference |
전처리기 | 사용 | 미사용 |
다중 상속 | 지원 | 비지원, but 다중 Interface 지원 |
friend 키워드 (명명된 클래스와 함수가 해당 class의 private, protected area에 접근 가능) |
지원, but 은닉성의 이슈로 사용 자제 | 비지원 |
실행 속도 | 빠름 | 느림 |
추가적으로 Java는 몇 가지 보안 메커니즘을 구현되어 잘못된 프로그램으로 인해 생기는 피해로부터 막아주기 때문에 보안성이 더 뛰어날 수 있습니다.
'computer science > java' 카테고리의 다른 글
가비지 컬렉션(GC) 알고리즘과 여러 방법::자바 (2) | 2020.07.07 |
---|---|
String, StringBuffer, StringBuilder::자바 (0) | 2020.07.03 |
Vector와 ArrayList 비교::자바 (2) | 2020.07.03 |