Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[WIL]20240623 객체지향프로그래밍/JVM 본문

개발Article

[WIL]20240623 객체지향프로그래밍/JVM

최밤빵 2024. 6. 23. 23:37

 3주차 강의가 너무 어려워서 또 고비를 겪고있지만, 구글링도하고 오랜만에 1주차 강의자료도보고,

내가 이해할 수 있게 기억하고싶어서 정리해봤다! 

 

객체지향프로그래밍이란? 

객체지향프로그래밍(Object-Oriented Programming, OOP)은, 이름에서 알 수 있듯이 객체를 지향하는 프로그래망 방식이다. 컴퓨터 프로그래밍의 패러다임 중 하나로, 컴퓨터 프로그램의 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 쉽게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 

 

▶객체지향프로그램의 장점

 

→ 코드의 재사용성이 높다.

새로운 코드를 작성할 떄 기존의 코드를 이용하여 쉽게 작성할 수 있다.

→  코드의 관리가 용이하다.

코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다. 

→ 신뢰성이 높은 프로그래밍을 가능하게 한다. 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다. 

 

▶단점

 

→ 처리 속도가 상대적으로 느리다.

→ 객체가 많으면 용량이 커질 수 있다.

→ 설계 시 많은 시간과 노력이 필요하다. 

 

▶ 객체지향프로그래밍의 키워드 5가지 

1) 클래스와 객체

2) 캡슐화

3) 상속

4) 다형성

5) 추상화 

 

→ 클래스와 객체

 클래스는 클래스란 객체를 정의해 놓은 것이고, 객체의 모든 속성과 기능이 정의되어있다. 클래스로부터 객체를 생성하면, 클래스에 정의된 속성과 기능을 가진 객체가 만들어지는 것이다. 실체는 없으며 설계도로 실제로 필드의 데이터를 가지고 있는 건 객체이다. 클래스에 필드를 정의하여 선언했다고해서 바로 사용할수는 없다. 인스턴스화 해야 사용이 가능하고, 따라서 객체를 생성한 후에 필드를 사용할 수 있다. 

 

 객체는 실제로 존재하는 것, 사물 또는 개념. 속성과 기능의 집합이라고 할 수 있다. 그리고 객체가 가지고있는 속성과 기능을 그 객체의 멤버라고 한다. 용도는 객체가 가지고있는 기능과 속성에 따라서 다르다. 객체지향이론에서는 사물과 같은 유형적인 것 뿐만 아니라, 개념이나 논리와 같은 무형적인 것들도 객체로 간주한다. 프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다. 

 

클래스와 객체의 예 

클래스가 종이접기 책이라면, 그 책을 보고 접은 종이학들이 객체이다.

클래스가 붕어빵기계라면, 그 기계에서 구워진 붕어빵들이 객체이다.

( 붕어빵 → 속성 : 반죽, 팥, 슈크림 등/ 행위: 굽기 등 ) 

 

" 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 하며,

어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다." 

 

→ 캡슐화 

 속성(필드) + 행위(메서드) = 객체 로 만들어준 후 실제 내부구현은 외부에서 알 수 없게 감춰준다. 캡슐화 된 객체의 필드와 메서드를 노출시킬지 감출지 결정하기 위해 접근제어자를 사용한다. 내부구조를 알 수 없고, 노출시켜준 필드와 메서드를 통해 접근할 수 있다. 보관적인 부분이 좋다. 

 

"캡슐화하여 숨기는 이유?

외부 객체에서 해당 필드와 메서드를 잘못 사용하여 객체가 변화하지 않게 하는 데 있다. "

 

→ 상속 

 부모, 자식의 객체가 존재한다. 부모의 필드와 메서드를 자식객체에 물려준다. 오버라이딩을 통해 그대로 물려받거나 가공해서 쓴다. 상속은 적은양의 코드로 새로운 클래스를 작성할 수 있고, 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다. 이러한 특징은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다. 상속을 구현하는 방법은 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 'extends'와 함께 써 주기만 하면 된다. 

 

1) 부모클래스에 새로운 필드와 메서드가 추가되면 자식클래스는 이를 상속받아 사용할 수 있다. 

2) 자식글래스에 새로운 필드와 메서드가 추가되어도 부모클래스는 어떠한 영향도 받지않는다. 

3) 따라서 자식클래스의 멤버 개수는 부모클래스보다 항상 같거나 많다. 

 

→ 다형성 

 여러가지 형태를 가질 수 있는 능력을 의미하며, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현한다. 부모클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 한 것이다. 만약 두 개의 같은타입의 인스턴스여도 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다. 

 

"부모 타입의 참조 변수로 자손타입의 인스턴스를 참조할 수 있다. 

반대로 자손타입의 참조변수로 부모타입의 인스턴스를 참조할 수는 없다."

 

→ 추상화

 객체에서 공통된 부분들을 모아서 상위개념으로 새롭게 선언하는 것. 구체화를 시켜나가는 과정을 '모델링'이라고 한다. 

abstract는 '미완성'의 의미를 가지고있다. 메서드의 선언부만 작성하고 실제 수행내용은 구현하지않은 추상메서드를 선언하는데 사용된다. 그리고 클래스 에 사용되어 클래스 내에 추상메서드가 존재한다는 것을 쉽게 알 수 있게 한다. 

예시) 자동차의 가속, 브레이크, 속도 등을 모아 자동차라는 객체를 모델링.

 

"abstract → 클래스 : 클래스내에 추상 메서드가 선언되어있음을 의미한다.

메서드: 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다." 

 

 추상 클래스는 '미완성 설계도'에 비유할 수 있다. 미완성이라는 것은, 맴버의 개수에 관계된 것이아니라 단지 미완성 메서드 (추상 메서드)를 포함하고 있다는 의미이다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상 클래스로 인스턴스는 생성 할 수 없다. 추상 클래스는 상속을 통한 자식클래스에 의해서만 완성될 수 있다.

 

 클래스로서의 역할은 다 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이되는 부모클래스로서 중요한 의미를 갖는다. 예를들어 서로 다른 세 개의 설계도를 따로 그리는 것 보다는 이들의 공통부분만을 그린 미완성 설계도를 만들어 놓고, 이 미완성 설계도를 이용해서 각각의 설계도를 완성하는 것이 훨씬 효율적이다. 

 

▶ 인터페이스 

 일종의 추상클래스이다. 추상클래스처럼 추상메서드를 갖지만, 추상클래스보다 추상화 정도가 높아서 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. 추상클래스를 부분적으로만 완성된 미완성 설계도라고 한다면, 인터페이스는 구현된 것은 아무 것도 없고 밑그림만 그려져 있는 '기본 설계도'라 할 수 있다. 인터페이스도 추상클래스처럼 완성되지 않은 불완전한 것이기 때문에 그 자체만으로 사용되기 보다는 다른 클래스를 작성하는데 도움 줄 목적으로 작성된다. 

 

" 모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다. 

모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.

(단, static 메서드와 default 메서드는 예외)  "

 

JVM : Java virtual machine (공동실행환경)

 자바를 실행하기위한 가상컴퓨터. 가상컴퓨터는 실제 컴퓨터(하드웨어)가 아닌 소프트웨어로 구현된 컴퓨터라는 뜻으로 컴퓨터 속의 컴퓨터라고 생각하면 된다. 자바로 작성된 애플리케이션은 모두 이 가상 컴퓨터(JVM)에서만 실행되기 때문에, 자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다. 

 

 일반 애플리케이션의 코드는 OS만 거치고 하드웨어로 전달되는데 java애플리케이션은 JVM을 한 번 더 거치기 때문에, 그리고 하드웨어에 맞게 완전히 컴파일 된 상태가 아니고 실행 시에 해석되기 때문에 속도가 느리다는 단점을 가지고있다. 

그러나 요즘엔 바이트코드(컴파일된 자바코드)를 하드웨어의 기계어로 바로 변환해주는 JIT컴파일러와 향상된 최적화 기술이 적용되어서 속도의 격차를 많이 줄였다. 

 

 java애플리케이션은 JVM하고만 상호작용을 하기 떄문에 OS와 하드웨어에 독립적이라 다른 OS에서도 프로그램의 변경없이 실행이 가능한 것. 

 

byte code(바이트코드) :

java프로그램 변환 코드. 운영체제가 읽을 수 있는 코드이고, java컴파일러가 변환한 코드이다.

java컴파일러 :

java( 사람이 읽을 수 있는. 컴퓨터는 못 읽어용) → class (컴퓨터가 읽을 수 있는) 

( 내가 작성한 자바코드들 (.java 파일)을 운영체제가 읽을 수 있는 바이트 코드(.class파일)로 변환하는 변환기)

인터프리터 :

java.class코드 해석기. 운영체제가 읽은 바이트코드를 기기(기계)가 실행할 수 기계어로 번역.

JIT컴파일러 :

빠른 java.class 코드 해석기. 인터프리터의 효율을 높여주는 서포터 해석기. 

메모리영역 :

java데이터를 저장하는 영역. JVM(windows, mac etc..)이 운영체제로부터 할당받은 메모리 영역. 

클래스로더 : 

java, class 바이트코드를 메모리영역에 담는 운반기. JVM으로 class(바이트코드)를 불러와서 메모리에 저장. 

가비지컬렉터 :

java 쓰레기 청소기. 메모리영역에서 안쓰는 데이터를 주기적으로 흡수해가는 청소기. 

 

 

🫨 이번 주 회고 

 계속 좋은 조원들을 만나면서 나의 잘못된 공부 방법에 대해서 많이 고치게 되고, 어려운 강의에 멘탈만 흔들리다 혼자서만 끙끙앓던 습관도 조원분들께 자연스럽게 질문하고 정보를 공유하면서 여태까지보다 많은 좋은 변화가 있었다. 강의만 돌려보면서도 타자연습(?) 느낌이던 공부가 지금은 문제도 시간이 아주많이 걸리고 틀리고, 대부분은 코드 시작도 하지못하는 경우가 많지만 답안을 보더라도 코드를 해석하고 이해하지못하면 외우는 식으로 뭔가 달라진 공부를 하고있는 것 같아서, 조금은 뿌듯한 시기를 보내고있다(지금은 이런 사소한 기쁨이 즐겁다!). 프로그래밍공부를 시작하면서 뭔가를 해보기보다 걱정만 하던 나는 조금이나마 작게작게 도전을 하고있기때문에 지금은 그 작은 변화로 프로그래밍 공부에 많은 동기부여가 되고있다! 아직 이해하지못한것 투성이지만, 마음가짐이 많이 달라졌음을 느낀다. 계속 조급해하는 중이지만 그래도 내 속도를 이어가려고 신경안쓰고 최대한 내 공부에 집중하고있다. 완주를 목표로, 다음 주의 나도 화이팅!! 다시 공부하러 갑니다... 아직도 3주차를 공부하고있지만, 내일은 조금이라도 이해하길!!