본문 바로가기
Java

객체지향 프로그래밍, JVM

by BottleCoffin 2022. 5. 22.

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

  절차지향 프로그래밍, 함수형 프로그래밍, 반응형 프로그래밍 등 다양한 프로그래밍 패러다임이 있고 객체지향 프로그래밍은 여러 패러다임 중 하나이다.

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


버스에 대해 간단하게 객체 지향 프로그래밍을 한다고 생각해 보면

각각의 버스는 공통적으로 요금, 주유량, 최대 승객 수 등등 여러가지 버스에 대한 정보(필드,멤버변수)를 갖고 있을 것이고, 

탑승, 운행, 잔돈 돌려주기 주유하기 등등 여러가지 행위(메소드)를 갖고 있을 것이다.

 

이렇게 공통된 부분(상태, 행위)을 갖는 "버스"라는 클래스로 만들어 놓고 필요할때마다 인스턴스(100번 버스, 5147번 버스, 03번 버스, ···)를 생성하고 사용하게 된다.

 

또한 승객이라는 클래스를 만들어 필요한 멤버변수(요금, 나이 등)를 갖고 행위(탑승 등)를 만들어 버스와 상호작용 할 수 있을 것이다.


 

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

장점

1. 코드 재사용 용이

2. 유지보수 쉬움

3. 대형 프로젝트에 적합

 

단점

1. 속도가 상대적으로 느림

2. 객체가 많으면 용량이 커짐

3. 설계에 많은 시간과 노력이 필요

 

아직까지 다른 객체지향에도 익숙하지 못하고 다른 패러다임도 경험해보지 못했기 때문에 장단점이 크게 와닿지는 않지만 어쨌든 이러한 장단점이 있다고 한다. 추후 계속 배우고 하다보면 이해가 될 것이라고 생각한다.

 

 

 

아무튼 이러한 객체 지향 프로그래밍에서 중요한 키워드가 5가지가 있다고 한다.

 

클래스 / 추상화 / 캡슐화 / 상속 / 다형성

클래스

- 위의 버스의 예처럼 객체(클래스 통해 실제로 생성된 것)에 대한 공통적인 속성과 행동을 갖고있는 정보이다.

- 클래스는 정의를 해주고 실제로는 움직이거 동작하는 것들은 클래스를 통해 만들어진 각각의 객체(인스턴스)이다.

 

스마트폰 이라는 클래스가 있다면 아이폰 갤럭시 등이 객체가 될 수 있을 것 같다.

또는 아이폰 이라는 클래스가 있고 아이폰 11, 12, 13 등이 객체가 될 수 있을 것이고

아이폰 13이라는 클래스가 있고 각각의 아이폰 13들이 객체가 될 수도 있을 것이다.

 

추상화

- 컴퓨터 과학에서의 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다. 

- 객체 지향 관점에서의 추상화는 클래스를 정의할 때, 불필요한 부분들을 생략하고 객체의 속성 중 중요한 것에만 중점을 두어 개략화 하는 것, 즉 클래스들의 중요하고 공통된 성질들을 추출하여 슈퍼 클래스를 선정하는 개념이다.

- 설계하기 나름이겠지만 위의 내용은 공통된 속성이나 기능을 묶은 추상화라고 할 수 있다.

캡슐화

- 캡슐화는 연관된 목적을 가지는 변수와 함수를 하나의 클래스로 묶어 외부에서 쉽게 접근하지 못하도록 은닉하는 것이다.
- 캡슐화는 중요한 데이터를 쉽게 바꾸지 못하도록 하고 정보를 은닉하기 위함이다.

- 캡슐화를 통해 외부에서 내부의 정보에 접근하거나 변경할 수 없게 직접적인 접근을 막고 이렇게 접근을 제한함으로써 - 유지보수나 확장 시 오류의 범위를 최소화할 수 있다. 또한 다른 객체에 영향을 주지 않아 독립성이 좋다.

 

캡슐화는 접근제어자를 통해서 이루어진다.

 

- 자바의 접근 제어자
public : 접근 제한 없음
protected: 동일한 패키지 내에 존재하거나 파생 클래스에서만 접근 가능
default : 아무런 접근 제한자를 명시하지 않으면 default 값이 되며, 동일한 패키지 내에서만 접근 가능
private: 자기 자신의 클래스 내에서만 접근 가능

 

각각의 접근 제어자는 접근 가능 범위를 갖고 있고 필요한 접근 제어자를 명시한다.


보통은 클래스 내의 변수에 접근하기 위해서 getter/setter 라는 메소드를 많이 사용한다.

 

상속

- 부모가 자식에게 재산을 물려주는 것처럼 자식(클래스)에 상속받고 싶은 부모(클래스)를 선택하면 부모의 모든 필드와 메소드를 물려받아 사용 가능하다.

 

상속받는 클래스 : 자식 클래스, 하위 클래스 또는 서브 클래스

상속 해주는 클래스 : 부모 클래스, 상위 클래스 또는 슈퍼 클래스

 

 

다형성

-다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것.

-다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나이다.

-같은 자료형에 여러가지 객체를 대입하여 다양한 결과를 얻어내는 성질이다.

-하나의 타입으로 다양한 실행 결과를 얻을 수 있어 유지 보수를 용이하게 한다.

다형성 구현 방법

 클래스의 상속이나 인터페이스를 구현하는 자식 클래스에서 메서드를 재정의(오버라이딩) 하고 자식 클래스를 부모 타입으로 업캐스팅한다. 그리고 부모 타입의 객체에서 자식 멤버를 참조하여 다형성을 구현한다. 

오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는것.

오버로딩 : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것.

 


JVM (Java Virtual Machine, JVM)

기술적 정의 : JVM은 코드를 실행하고 해당 코드에 대해 런타임 환경을 제공하는 소프트웨어 프로그램에 대한 사양(Specification)이다.
일반적 정의 : JVM은 자바 프로그램을 실행하는 방법이다. JVM의 설정을 구성한 다음 설정사항에 따라 실행 중에 프로그램 리소스를 관리한다.

 

프로그램을 실행하기 위해 물리적 머신(즉, 컴퓨터)와 유사한 머신을 소프트웨어로 구현한 것을 말한다고 할 수 있다.

자바는 원래 WORA(Write Once Run Anywhere)를 구현하기 위해 물리적인 머신과 별개의 가상 머신을 기반으로 동작하도록 설계되었다.

그래서 *자바 바이트코드를 실행하고자 하는 모든 하드웨어에 JVM을 동작시킴으로써 자바 실행 코드를 변경하지 않고도 모든 종류의 하드웨어에서 동작되게 한 것이다.

 

  1. 컴파일러가 소스코드를 자바 바이트코드로 변환 (xxx.java -> xxx.class)
  2. JVM(JIT 컴파일러)이 바이트코드를 기계어로 변환

 

예를 들어 C, C++, Java와 같은 컴파일 언어들은 어플리케이션이 OS와 바로 주고 받기 때문에 OS가 바뀌면 새로 컴파일을 해줘야 하는데 Java는 어플리케이션과 OS사이에 JVM이 존재하기 때문에 OS 종속받지 않는다.

하지만 한 단계를 더 거치기 때문에 다른 언어에 비해 속도가 느리다는 단점이 있지만 최근에는 *JIT컴파일러와 최적화 기술이 향상되며 속도 차이가 많이 줄었다고 한다.

 

JIT컴파일러 - JIT(Just-in-Time) 컴파일러는 바이트코드를 컴퓨터 프로세서(CPU)로 직접 보낼 수 있는 명령어로 바꾸는 프로그램이다.

일반적으로 컴파일러는 개발자와 최종 사용자를 위한 애플리케이션의 속도를 결정하는 데 있어 핵심이다.

 

자바 바이트코드 - WORA를 구현하기 위해 JVM은 사용자 언어인 자바와 기계어 사이의 중간 언어인 자바 바이트코드를 사용한다. 이 자바 바이트코드가 자바 코드를 배포하는 가장 작은 단위이다.

 

 

개략적으로 이해는 했지만 아직까지 깜깜한 것 같고 꾸준한 공부의 필요성을 다시 한번 느꼈다.

계속해서 접하고 코딩하면서 많이 배워야 할 것 같다

 

 

'Java' 카테고리의 다른 글

String literal과 new  (0) 2022.06.09
예외처리  (0) 2022.05.30
Java 파일 기본구조  (0) 2022.05.17
Package  (0) 2022.05.17
접근 제어자  (0) 2022.05.17

댓글