New World

[JAVA #1]JAVA 란 무엇일까? 본문

Self-Study/Study

[JAVA #1]JAVA 란 무엇일까?

hyeovi 2022. 9. 19. 23:10
728x90
반응형

JAVA

- 네트워크 사에서 쓸 수 있도록 미국의 선 마이크로 시스템즈가 개발한 객체 지향 프로그래밍 언어

 

자바의 구동원리

javac라는 자바 전용컴파일러가 자바코드 [.java]를 컴퓨터가 이해할 수 있도록 프로그래밍 언어를 기계어로 변경하게 되면 [.class]라는 확장자를 가진 파일이 생성되는데 [.class]파일은 JVM을 통해서 실행된다

 

특징

- JVM (자바 가상 머신)만 설치하면 컴퓨터의 운영체제에 상관없이 작동한다 (운영체제에 독립적)

- 기본 자료형을 제외한 모든 요소들이 객체로 표현

- 캡슐화, 상속, 다형성이 잘 적용된 언어

캡슐화 : 하나의 객체에 대해 그 객체가 특정한 목적을 위해 필요한 변수나 메소드를 하나로 묶는 것, 코드의 수정 없이 재활용, 접근 제어자를 통한 정보 은닉

상속 : 기존 상위 클래스에 근거해 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념

다형성 : 상속을 통해 기능을 확자하거나 변경하는 것, 코드의 재사용과 코드 길이가 감소하여 유지보수에 용이 (Overriding, Overloading)

추상화 : 추상적으로 공통적인 요소나 필수적인 요소가 들어간 것

- Garbage Collector를 통한 자동적인 메모리 관리

- 멀티 스레드를 지원

 

JVM

JVM 특징

자바 가상머신, 자바소스로부터 만들어진 바이너리파일 [.class]파일을 실행하기 위해 필요하다. java가 OS에 구애받지 않고 재사용가능하게 해주며 자동메모리관리기법인 Garbage Collection을 수행한다.

JDK : JAVA 개발을 하기위해 필요한 환경, JDK에는 JRE가 포함되어 있다.

JRE : 자바 실행 환경. JVM으로 자바프로그램을 동작시킬 때 필요한 파일들을 가지고 있다.

 

JVM 메모리의 JAVA의 세 가지 변수

Static 영역
Stack 영역 Heap 영역

Static 영역

- 전역 변수와 정적 변수 저장 공간 (어디서든 사용 가능)

- 프로그램의 시작부터 종료까지 메모리에 남아있음

- 클래스 파일의 바이트 코드가 로드되는 곳

 

Stack 영역

- 지역변수(로컬변수)와 매개 변수(파라미터)가 저장되는 공간

- 기본 자료형 (int, double, byte 등) 지역 변수의 데이터 값이 저장되는 공간

- 메소드가 호출될 때 메모리에 할당, 종료되면 메모리가 해제

 

Heap 영역

- 참조형의 데이터 타입을 갖는 객체, 배열 등 저장 공간

- new 명령을 통해 생성된 인스턴스 변수

- 실제 데이터를 갖고 있는 Heap 영역의 참조 값을 Stack 영역의 객체가 갖고 있다

- 메소드 호출이 끝나도 유지되어 가비지 콜렉터에 의해 지위질 때까지 혹은 JVM이 종료될 때 삭제됨

 

JVM 기반 언어의 특징

- 바이트 코드 생성 or 인터프리터를 지원하는 언어

- 여러 다양한 언어로 구현하여도 서로 라이브러리 공유가 가능하며 동일한 데이터 구조에서 작동한다

 

JVM과 GC에 대해 설명 (GC가 동작하는 시기)

GC (Garbage Collector) 란 메모리를 자동으로 관리해준다

 

GC 동작은 아래와 같다

 

1. Heap 영역에 존재하는 객체들에 대해 접근이 가능한가?

2. GC Root 에서부터 시작하여 참조값을 따라가며 접근 가능한 객체들을 찾는 과정을 진행

3. 접근할 수 없는 객체는 제거 대상이 되고 제거한다

 

OOP (객체지향 프로그래밍)

- 데이터를 객체로 취급하여 프로그램에 반영, 객체의 상호작용을 통해 프로그램이 동작


대표적인 특징으로 추상화, 상속, 캡슐화, 다형성이 있습니다.

 

설계 원칙 (SOLID)

SRP : 단일 책임 원칙

OCP : 개방-폐쇄 원칙

LSP : 리스코프 치환 원칙

DIP :  의존 역전 원칙

ISP : 인터페이스 분리 원칙

 

특징

- 객체지향 프로그래밍은 코드의 재사용성이 높다

- 코드의 변경이 용이

- 직관적인 코드 분석

- 개발속도 향상

- 상속을 통한 장점 극대화

 

? OOP가 무엇인가요?

데이터를 객체로 그 상호작용을 통해 프로그래밍이 동작하도록 하는 것

 

? OOP를 썼을 때 어떤 점이 좋았고 안좋았는지?

객체를 사용하여 직관적인 코드 분석이 되지만 객체가 많으면 용량이 커져 처리 속도가 느리다

 

? OOP를 잘하기 위해 어떤 노력을 했는지?

객체를 나누는 방법에 대해 고민을 많이 하였다. 몇번의 시도를 통해 기능으로 제일 크게 나눈 뒤, 필요에 따라 더 나눠주었다.

 

OOP의 한계점과 AOP의 필요

여러 클래스에 로깅이나 보안 및 트랜잭션 등 공통된 기능들이 흩어져 존재하여 어플리케이션 전반에 걸쳐 흩어져있는 공통되는 부가 기능들을 관심사를 분리할 필요가 있다

 

객체지향과 절차지향의 차이점

객체지향

실제세계를 모델링하여 소프트웨어를 개발

코드의 재활용성이 높고 디버깅이 쉬워 처리속도가 절차지향보다 느리고 설계에 많은 시간이 소요된다.

 

절차지향

순차적인 처리가 중요시되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍

컴퓨터의 처리구조와 유사해 실행속도가 빠르지만 유지보수가 어렵고 실행순서가 정해져있어 코드의 순서가 바뀌면 결과값이 달라질 수 있고 디버깅이 어렵다.

직렬화(serialization)

JVM의 메모리에서만 상주되어있는 객체 데이터를 영속화(Persistence)가 필요할 때 사용됩니다. 시스템이 종료되더라도 없어지지 않는 장점을 가지며 영속화된 데이터이기 때문에 네트워크로 전송이 가능합니다.

입출력을 할 때에는 객체는 바이트형이 아니라서 스트림을 통해 파일에 저장하거나 네트워크로 전송할 수 없습니다.

 

직렬화 : 객체를 스트림을 통해 입출력하려면 바이트 배열로 변환하는 것

역질렬화 : 반대로 스트림을 통해 받은 직렬화된 객체를 원래 모양으로 만드는 것

 

AOP(관점지향 프로그래밍)

Aspect Oriented Programming
- 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화

 

Aspect

- 흩어진 관심사를 묶어 모듈화한 하나의 모듈 (Advice + Point Cut)

 

Target

- Aspect가 가지고 있는 Advice가 적용되는 대상 (클래스, 메소드)

 

Advice

- 어떤 일을 해야할 지에 대한 것, 해야할 일들에 대한 정보를 가지고 있다

 

Join Point

- 메소드 실행 시점,

 

Point Cut

- Join Point의 상세한 스펙을 정의, 어디에 적용해야하는지에 대한 정보

 

적용 방법

- 컴파일 타임에 적용

- 로드 타임에 적용

- 런타임에 적용

 

? AOP에 대해 설명해주세요

oop의 흩어져있는 공통된 기능들을 관심사로 나누어 모듈화 시킨 프로그래밍이다

Object

OOP에서 데이터와 그 데이터에 관련되는 동작(절차, 방법, 기능을 모두 포함한 개념)

같은 성질, 같은 구조와 형태를 가지는 객체는 등급으로 정의하고 그 등급에 속하는 객체는 그 등급의 인스턴스라고 한다

 

객체를 나누는 기준이 무엇인가?

객체를 나누다 보면 오히려 코드가 보기 힘들지 않나?

 

 

>> 클래스, 객체, 인스턴스 개념

  클래스 객체 인스턴스
개념 객체를 만들어 내기 위한 설계도 클래스에 선언된 구현할 대상 (실체) 구현된 구체적인 실체 (관계 )
특징   - 클래스의 인스턴스
- 객체는 모든 인스턴스를 대표하는 포괄적인 의미
- 추상적인 개념과 구체적인 객체 사이의 관계에 초점
- 메모리에 할당
- 객체 간의 링크는 클래스 간의 연관 관계의 인스턴스
- 실행 프로세스는 프로그램의 인스턴스
반응형
Comments