[항해99] 2 WIL [객체지향 프로그래밍, JVM]
Intro
항해 99 두 번째 주차를 끝냈다. 이번 주차는 알고리즘 주차였다. 지금 까지 개발 공부를 하면서 기능 위주의 개발을 해왔다. 그래서 항상 응용을 하거나 조금씩 달라지면 그것을 이해하고 쓰는데 오래 걸리고 찾는 키워드를 알아가는 데 오랜 시간이 걸렸다. 그래서 항해 99를 시작했고, 이번 알고리즘 주차를 보내면서 기초 공부를 좀 더 할 수 있어서 좋은 선택이었다고 생각이 들었다.
이번 주에 공부를 하면서 평소에 단순하게 모든 객체가 공유하여 쓰는 static 변수나 메서드가 왜? static을 선언하면 모든 객체가 공유해서 쓸 수 있는지를 알기 위해 공부해본 JVM을 공부해보았고(따로 정리 해보았다, 너무 길어서 ㅠㅠ ), 코딩 테스트 문제를 풀면서, Wrapper 타입의 메서드들과, 최댓값이나 최솟값 구할 때 Math 클래스의 max나 min을 사용하는데 비트 연산 ( | , & )을 사용하면서 비트 연산에 대해 다시 공부해볼 수 있는 좋은 시간이었다.
그리고 항해 99 자바를 사용해 요구사항에 따라 과제를 진행하면서, 자바라는 언어를 어떻게 하면, 더 잘 사용할 수 있을까?, 이 언어를 사용했을 때, 어떤 특징을 가지고 있을 까?, 어떤 장점을 가지고 있을까? 에 대한 공부한 내용을 아래 정리해보았다.
1. 객체 지향 프로그래밍(Object Oriented Programming)
객체 지향 프로그래밍이란 컴퓨터 프로그래밍 패러다임 중 하나로, 프로그래밍에서
필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체를 만들고, 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
2. 객체 지향 프로그래밍의 키워드 및 특징
Intro
객체 지향 프로그래밍을 공부하다 보면 항상 나오는 키워드들이 있다. 클래스, 인스턴스, 객체, 추상화, 캡슐화, 상속, 다형성, 처음 봤을 때는 하나하나 이해하기 쉽지 않았다. 클래스나 인스턴스나 객체 다 똑같은 말 같은데 왜 다르게 쓰지?
추상화는 뭐고, 캡슐화, 상속은 어떻게 이해가 돼도, 다형성? 여기서 생각해 보았던 질문을 정리해보았다.
추상화
- 중요한 정보만을 표현함으로 프로그램을 간단히 만드는 것, 객체의 공통적인 속성과 기능을 추출하여 정의하는 것
ex) 자동차를 추상화한다고 하면, 기아 차 이건, 현대 차 이건 공통적으로 엑셀 기능이 있고, 브레이크 기능이 있는 것처럼 공통적인 특징을 정의하는 것
클래스와 인스턴스(객체)
- 클래스: 추상화를 거쳐 속성, 행위를 변수와, 메서드로 정의한 것, 객체를 만들기 위한 기본 정보
- 인스턴스(객체): 클래스에서 정의한 것을 기반으로 실제 메모리에 할당되어 실제 프로그램에서 사용되는 데이터
캡슐화
목적
1. 코드를 재수정 없이 재활용하는 것.
2. 접근 제어자를 통해 정보 은닉
C언어 등, 절차 지향 프로그래밍에서도 라이브러리를 통해 변수와 함수를 재활용할 수 있지만, 코드의 수정이 일어났을 때, 변수나 메서드를 수정하거나 와 같은 문제가 있을 수 있었다. 하지만 객체 지향 프로그래밍에서는 캡슐화를 통해 객체가 외부에 노출하지 않아야 할 정보를 접근 지정자를 통해 제어권한을 설정할 수 있고, 제어 권한이 있는 객체를 통해 접근할 수 있기 때문에 책임이 있는 객체만 수정하면 되는 이점이 생긴다.
상속
부모 클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게 하고, 일부를 변경해야 할 경우 상속받은 자식 클래스에서 해당 기능만 다시 수정하여 사용할 수 있게 하는 것이다.
※ 다중 상속 불가: 클래스 상속 관계에서 혼란을 줄 수 있기 때문에 상속은 하나만 가능, 하지만 인터페이스를 통해 사용할 수 있도록 했다.
다형성
한 객체가 상속을 통해 기능을 확장하거나 변경하여, 다른 여러 객체로 재구성되는 것, 예를 들면 자동차의 공통 적인 부분을 추상화 한 클래스를 상속받아, 공통적인 기능은 같지만 내부적으로는 다를 수 있는 기아 자동차나, 현대 자동차를 만드는 것과 같다.
여기서 추가적으로 중요한 것은 위에서 말했던 공통적인 기능은 같지만, 내부적으로 다를 수 있게 하는 것이 오버 라이딩이다.
오버 라이딩은 상속 받은 클래스의 메서드를 자신에게 맞게 재정의 하는 것이다.
오버라이딩은 상속받은 클래스에서 기능을 자신에게 맞게 만든 것이라면, 오버 로딩은 자신의 클래스 안에서 같은 이름을 가지고, 각 메서드마다 매개변수의 개수와 매개 변수 타입이 다른 메서드를 사용해 다른 결과물을 만들 수 있게 하는 것이다.
3. 객체 지향 프로그래밍의 장단점
1) 장점
- 코드 재사용이 용이: 외부의 클래스를 가져와서 이용하며, 상속을 통해 기능 확장이 가능하다.
- 유지보수가 쉬움: 수정해야 할 부분이 클래스 내부에 멤버 변수 혹은 메서드로 존재하기 때문에 해당 부분만 수정하면 된다.
- 대형 프로젝트에 적합: 클래스 단위로 모듈화 시켜서 개발할 수 있어, 업무 분담이 상대적으로 편하다.
2) 단점
- 처리 속도가 상대적으로 느리다( ex. 자바는 JVM을 통한 실행으로 절차 지향 언어에 비해 느리다 ).
- 객체가 많으면 용량이 커질 수 있다.
- 설계 시 추상화와, 다양한 디자인 패턴, 고려해야 할 요소가 많아 시간과 노력이 필요하다.
4. 어떻게 하면 객체 지향 언어를 더 잘 사용할 수 있을 까?
제목과 같이 어떻게 하면 객체 지향 언어, 자바를 더 잘 사용할 수 있을 까? 를 고민하면서 찾은 객체 지향 설계 5대 원칙이라는 것을 찾게 되었다.
SRP(단일 책임 원칙), OCP(개방- 폐쇄의 원칙), LSP(리스 코프 치환의 원칙), ISP( 인터페이스 분리 원칙), DIP(의존 역전 원칙)라는 것들이 있었다. 이 내용들은 내용이 많아 추후 정리 후 포스팅을 해야 할 것 같다.
하지만 결과적으로 5대 원칙을 지키면서 객체 지향 언어를 설계하면, 결국 스프링과 같은 형태가 나온다는 것을 알았다.
각각의 클래스는 서로 의존하는 관계를 약화시키면서,
각각의 독립성 있게 사용하고,
그로 인해 수정 시 책임을 가진 클래스만 수정할 수 있도록 ,
역할과 행동을 분리해서 역할에 맞는 행동만 수정할 수 있도록,
의존하는 관계 또한 내부적인 코드를 수정하여 변경하는 것이 아닌, 외부적으로 의존 관계를 설정, 변경해줄 수 있도록,
이러한 것들을 공부하며, 이미 스프링은 이 모든 것이 설정 파일 또는 자동 컴포넌트 스캔을 통한 의존관계 주입을 통해
단일 책임의 원칙, 개방 폐쇄의 원칙, 리스 코프 치환의 원칙, 의존 관계 외부 주입을 통해, 부모 인터페이스 타입으로 구현체를 할당하여, 구현체만 변경하면, 역할에 맞는 행동만 수정할 수 있는 것 등, 이미 모든 원칙이 반영되어 있다는 사실에 놀랐고, 조금 더 스프링의 내용을 이해할 수 있는 시간이었다.
5. 참고
OOP(객체 지향 프로그래밍)
OOP(객체 지향 프로그래밍)이란 문제를 여러 개의 객체 단위로 나눠 작업하는 방식으로, 객체들이 서로 유기적으로 상호작용하는 프로그래밍 이론이다.대표적으로 Java와 C++이 객체 지향 프로그
velog.io
JVM 정리
[JAVA 기초] 메모리 구조
Intro 자바를 공부하고 사용하면서 객체 관리의 중요성에 좀 더 다 가가기 위해서 GC 관리 영역과 메모리 관리에 대한 이해를 위해 작성하였습니다. 전체 적인 흐름에 대한 설명으로 하였고, 디테
biolkj28.tistory.com