항해99 2주차는 알고리즘 주차이다. 내가 선택한 주특기 Spring의 기반이 되는 Java로 알고리즘 문제를 28문제 풀었고 Velog에 정리 후 깃허브에도 올렸다. 3~5주차에는 Spring을 학습하는 주차인데 Spring이 익숙해질 때쯤 알고리즘도 같이 공부해야겠다. 안하면 또 까먹는다...
Java에서 가장 중요한 개념이자 특징인 객체지향 프로그래밍과 JVM에 대해 포스팅을 해보려고 한다.
JVM
JVM( Java Virtual Machine ) : 자바 바이트코드를 실행할 수 있는 주체.
자바 바이트코드는 플랫폼에 독립적이며 모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다.
따라서표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서는 이론적으로 모든 자바 프로그램은CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.
객체지향프로그래밍( Object Oriented Programming, OOP ) : 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법
OOP 원칙
단일 책임 원칙(Single Responsibility Principle, SRP)
객체는 오직 하나의 책임을 가져야 한다.(객체는 오직 하나의 변경의 이유만을 가져야 한다.)
개방-폐쇄 원칙(Open-Closed Principle, OPC)
객체는 확장에 대해서는 개방적이고 수정에 대해서는 폐쇄적이어야 한다.
리스코프 치환 원칙(Liskov Substitution Principle, LSP)
자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다는 원칙.
인터페이스 분리 원칙(Interface Segregation Principle, ISP)
클라이언트에서 사용하지 않는 메서드는 사용해선 안 된다. 그러므로 인터페이스를 다시 작게 나누어 만든다. OCP와 비슷한 느낌도 들지만 엄연히 다른 원칙이다. 하지만 ISP를 잘 지키면 OCP도 잘 지키게 될 확률이 비약적으로 증가한다. 정확히 말하자면 인터페이스의 SRP라고 할 수 있다.
의존성 역전 원칙(Dependency Inversion Principle, DIP)
추상성이 높고 안정적인 고수준의 클래스는 구체적이고 불안정한 저수준의 클래스에 의존해서는 안 된다는 원칙으로서, 일반적으로 객체지향의 인터페이스를 통해서 이 원칙을 준수할 수 있게 된다. (상대적으로 고수준인) 클라이언트는 저수준의 클래스에서 추상화한 인터페이스만을 바라보기 때문에, 이 인터페이스를 구현한 클래스는 클라이언트에 어떤 변경도 없이 얼마든지 나중에 교체될 수 있다. (디자인 패턴 중 전략 패턴을 떠올리면 된다)
OOP 장점
코드재사용성이 높다.
유지보수가 쉽다.
대형 프로젝트에 적합하다.
OOP 단점
실행 속도가 상대적으로 느리다.
설계시 많은 시간과 노력이 필요하다.
OOP관련 키워드
클래스, 인스턴스, 추상화, 캡슐화, 상속, 다형성
위의 키워드들은 현재 Java 클래스 관련 포스팅을 진행중인데 포스팅이 완료되면 아래에 URL을 남길 계획.