Yoon DevLog
article thumbnail

서론

20살 대학교때 배웠던 이 개념을 면접에서 처음 맞닥뜨렸을 때 머리로는 그려졌지만 입으로는 쉽게 뱉어지지 않았다.

내가 사용하는 것이 무엇인지, 어떤 장점이 있는지 확실하게 정리하고 넘어가보자

 


 

자바(Java Programming Language)

 

자바란?

✔︎ 자바는 썬 마이크로시스템즈(Sun Microsystems, Inc.)에서 개발하여 1996년 1월에 공식적으로 발표한 객체지향 프로그래밍 언어이다.

 

자바의 특징?

✔︎ 운영체제에 독립적이다. (Write once, run anywhere.)

   - 자바 응용프로그램은 운영체제나 하드웨어가 아닌 자바가상머신(JVM)하고만 통신하고, JVM이 자바 응용프로그램으로부터 전달받은 명령을 해당 운영체제가 이해할 수 있도록 변환하여 전달한다.

✔︎  객체지향언어이다. 

✔︎  비교적 배우기 쉽다.

✔︎  자동 메모리 관리(Garbage Collection)

   - 자바로 작성된 프로그램이 실행되면 가비지컬렉터가 자동적으로 메모리를 관리해줘서, 프로그래머는 따로 메모리를 관리하지 않아도 된다.

✔︎ 네트워크의 분산처리를 지원한다.

✔︎  멀티쓰레드를 지원한다.

✔︎  동적로딩을 지원한다.

 

 


 

 

JVM(Java Virtual Machine)

JVM이란?

✔︎ OS에 종속받지 않고 CPU가 Java 애플리케이션을 인식하고 실행할 수 있게 하는 가상 컴퓨터이다.

✔︎ 자바로 작성된 애플리케이션은 모두 이 JVM 에서만 실행된다.

Java 애플리케이션       <-->       JVM       <-->       OS(Windows)       <-->       컴퓨터(하드웨어

✔︎ 일반 애플리케이션에 비해 JVM을 한번 더 거치기 때문에 비교적 속도가 느리다는 단점을 가지고있다. 

✔︎ 일반적으로 많이 사용되는 주요 OS용 JVM을 제공하고 있다.

 

JVM 실행과정

 

그림1. JVM의 실행과정

1. 프로그램이 실행되면 JVM은 OS로부터 프로그램이 필요로하는 메모리를 할당받는다. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.

2. 자바 컴파일러 javac가 자바 소스 코드를 읽어들여 자바 바이트 코드 .class로 변환시킨다.
3. Class Loader를 통해 class 파일들을 JVM으로 로딩한다.
4. 로딩된 class 파일들은 Execution Engine을 통해 해석된다.
5. 해석된 바이트코드는 Runtime Data Area에 배치되어 실질적인 수행이 이루어지게 된다. 이 실행과정 속에서 JVM은 필요에 따라 스레드 동기화와 GC같은 관리 작업을 수행한다.

 


✔︎ Method Area - 모든 Thread에 공유 / 클래스, 변수, Method, static변수, 상수 정보 등이 저장되는 영역

✔︎ Heap Area - 모든 Thread에 공유 / new 명령어로 생성된 인스턴스와 객체가 저장되는 구역, 공간이 부족해지면 Garbage Collection이 실행된다.

          ✔︎ Garbage Collection이란? - '더이상 참조되지 않는 메모리'인 가비지를 청소해주는 JVM의 실행 엔진의 한 요소

✔︎ Statck Area - 각 Thread마다 생성 / Method안에서 사용되는 값들(매개변수, 지역변수, 리턴 값 등)이 저장되는 구역, 메서드가 호출될 때 LIFO로 하나씩 생성되고, 메서드 실행이 완료되면 LIFO로 하나씩 지워진다.

✔︎ PC Register - 각 Thread마다 생성 / 현재 수행 중인 JVM명령의 주소 값이 저장된다.

✔︎ Native Method Stack - 각 Thread마다 생성 / 다른 언어의 메서드 호출을 위해 할당되는 구역, JNI라는 표준 규약을 제공


 

 


 

 

객체지향 프로그래밍 (Object Oriented Programming, OOP) 

✔︎ 객체지향의 기본 개념은 '실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다' 이다.

✔︎ 객체지향 프로그래밍이란 '필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고, 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법'이다.

 

객체지향 프로그래밍 장/단점

장점 단점
✔︎ 코드 재사용성이 높다.
-> 상속을 통해 코드의 재사용을 높일 수 있음

✔︎ 코드의 관리가 용이하다.
-> 코드간의 관계를 이용해서 쉽게 코드를 변경할 수 있음

✔︎ 신뢰성이 높은 프로그래밍을 가능하게 한다.
-> 제어자와 메서드를 이용하여 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있음
✔︎ 실행속도가 느린편이다.
-> 객체지향 언어가 실행속도가 느린편

✔︎ 개발속도가 느리다.
-> 객체가 처리하려는 것에 대한 정확한 이해가 필요, 설계단계부터 많은 시간이 소모 됨

✔︎ 코딩 난이도가 상승한다.
-> 다중 상속과 같은 이유로 복잡도가 상승함

 

객체지향프로그래밍의 4가지 특징

캡슐화 데이터와 데이터를 처리하는 로직을 하나로 묶고, 그 로직을 외부로부터 은닉하는 것
추상화 클래스들의 공통적인 특성들을 묶어서 표현하는 것
상속성 부모클래스에 선언된 메소드를 자식클래스에서 상속받아 재사용성을 높이는 것
다형성 하나의 객체에 여러가지 타입을 대입할 수 있다는 것

 

캡슐화란? ->  데이터와, 데이터를 처리하는 행위를 묶고, 외부에는 그 행위를 보여주지 않는 것.

✔︎ 캡슐화 방법 

   1) 멤버 변수 앞에 접근 제어자 private를 붙인다. (접근 제어자는 이 후에 게시글로 자세하게 정리하겠다)

   2) 멤버 변수에 값을 넣고 꺼내올 수 있는 메서드를 만든다.(get/set을 사용)

 

추상화란? -> 클래스들의 공통적인 특성들을 묶어서 표현하는 것

✔︎ Ex) 여러 자동차를 프로그램으로 만들 경우 공통점을 하나로 묶어서 제작 ( 시동On/Off, 주행, 멈춤 )

✔︎ 클래스에서 공통된 부분(변수,메서드)등은 뽑아내서 사용하고, 개별적인 부분은 하위 클래스에서 자체 구현하는 것.

 

상속성이란? -> 부모클래스에 선언된 메소드를 자식클래스에서 상속받아 재사용성을 높이는 것

✔︎ 클래스 간의 단일 방향의 데이터 전달을 말함

✔︎ 데이터를 넘겨주는 클래스는 부모클래스, 물려받는 클래스는 자식클래스라고 한다.

✔︎ 자식클래스는 상속 받은 프로퍼티나 메소드를 사용 가능하고, 수정하거나 새롭게 추가할 수 있다.

 

다형성이란? -> 하나의 객체에 여러가지 타입을 대입할 수 있다는 것

✔︎ 오버로딩 : 같은 이름의 메서드 여러개를 가지면서 매개변수가 다르도록 하는 것

✔︎ 오버라이딩 : 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 것 

✔︎ 오버로딩 vs 오버라이딩 같은 경우 면접 단골 질문이다.......!

 

OOP의 5가지 원칙

✔︎  단일 책임 원칙(SRP) : 하나의 클래스는 각각 하나의 책임만 가진다.
✔︎  개방폐쇄의 원칙(OCP) : 소프트웨어의 모든 구성요소(클래스, 모듈, 함수)는 확장에는 열려있고 변경에는 닫혀있어야 한다.
✔︎  리스코브 치환의 원칙(LSP) :  프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야

한다.
✔︎  인터페이스 분리의 원칙(ISP) : 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
✔︎  의존성 역전의 원칙(DIP) : 추상화(역할)에 의존해야지 구체화(구현)에 의존하면 안된다.

 

이 역시 면접 단골질문이다! 단순히 외우기보다는 이해하는 편이 좋다. 늘 머리속에 집어넣고 개발해야한다!

 

 


 

결론

다시 한번 정리하면서 개념을 다시 익히는 과정을 가졌다.. 분명 다 아는거라고 생각했는데 정리하면서 이런 부분도 있었구나 라는걸 느끼고.. 반성한다ㅠㅠ

profile

Yoon DevLog

@usnooy._.

백엔드 개발자 성장일기 -