JAVA에 들어가면서 OOP에 대해 흔히들어봤다. Object Oriented Programing으로 객체지향 프로그래밍이라고 이해하면되겠다.
OOP는 객체, 클래스를 크게 나눌수 있겠는데 먼저 객체는 말그대로 사람이나 물체를 지칭하는 뜻이다. baek이라는 사람을 하나의 객체라고 생각하면 되겠다. 그리고 클래스는 객체가 가지고 있는 특징이나 상속이라고 생각하면 되겠다. 예시로 baek의 눈,코,입등을 그사람의 클래스라고 생각하면 되겠다.
플라스틱과 같은 물건을 만들땐 보통 틀을 만들고 그 틀에 플라스틱 액을 넣어 틀에맞게 굳히면 하나의 제품이 된다. 이때 틀을 객체라고 생각하면되고 이 틀을 이용해서 찍어내는걸 클래스라고 표현하면 되겠다.
그렇다면 이러한 부분을 어떻게 코딩으로 나타내는냐? 큰 결과물을 잘게 쪼개어 완성하는것이 아니라 작은 문제들을 하나씩 만들어 조합해 객체를 만들고 큰 결과물을 만들어 나가는것이다.
표1) OOP - JAVA
OOP | JAVA |
---|---|
객체 | 클래스 |
상태 | 멤버 변수 |
동작 | 메소드 |
객체지향 | 절차지향 |
---|---|
코드 재사용성이 뛰어나다 | 코드 재사용성이 좋지 않다 |
개발기간이 길게 잡힌다 | 빠른 개발속도를 가진다. |
개발 난이도가 복잡하고 높다 | 상대적으로 개발난이도가 낮다 |
대형프로젝트에 적합하다 | 중소규모 프로젝트에 적합하다 |
유지보수성이 높다 | 유지보수성이 낮다 |
위의 표는 100% 정답이 아닐수 있다. 왜냐하면 년차에 따라 절차지향도 충분히 재사용성이 좋고 유지보수성을 높게 설계할 수 있을것이다. 하지만 사회적으로 흔히 나타내는 특징은 다음고 같다고 위와 같다고 할 수 있다.
- S (SRP : Single Responsibility Principle) : 한 클래스는 하나의 책임만 가져야 한다.
- O (OCP : Open/Closed Principle) : 확장에는 열려있으나, 변경에는 닫혀 있다.
- L (LSP : Liskov’s Substitution Principle) : 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
- I (ISP : Interface Segregation Principle) : 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- D (DIP : Dependency Inversion Principle) : 추상화에 의존한다. 구체화에 의존하면 안된다.
위 5가지를 합쳐 OOP의 5원칙은 SOLID로 생각하며 되겠다. 특히 저는 제일 처음에 나오는 S규칙이 생각보다 절차지향에서 객체지향으로 넘어가는 입장에서 적용하기 어려웠던 부분이다.
캡슐화란?
- 데이터와 코드의 형태를 외부로부터 알수 없도록 하는것이고 데이터의 구조와 역할 기능을 하나의 캡슐록 압축되도록 설계하는것이다.
- 이를위해 Spring에서 Getter,Setter을 많이 사용했다. Or 접근제어자에 private를 붙여 캡슐화를 시킬 수도 있다.
public class Company() { private String companyName; //private를 붙이면 Company클래스에서만 접근이 가능하다. }
상속이란?
- 상속이란 부모클래스에서 정의된 변수 및 메소드를 자식클래스에서 사용할 수 있는것이다.
- 부모의 기능을 가지고 와서 자식이 변경을할 수 도있다.
- 상속을 하면 캡슐화를 좀 더 효과적으로 이룰 수 있도록 한다.(클래스 안에 메서드를 별도의 작업없이 자식이 받아서 사용하는것)
public class Company() { private String companyName; public void getCompany() { System.out.println("Get Company"); } } public class Department() extends Company { // extends를 통해 Company를 부모로 두고 메서드에 접근 할 수 있다. public static void main(String[] args) { Department department1 = new Department(); department1.Company(); } }
- 인터페이스로 클래스들의 공통적인 특성(변수, 메서드)들을 묶는것이다.
- 예시로 도마뱀, 사자, 독수리, 코끼리를 하나의 객체라고 생각했을때 이 객체들을 하나로 묶으려하면 동물이라는 추상적객체로 전체를 묶을수 있고 혹은 포유류등 일부분을 묶을수도 있는데 이를 추상화라고 하는것이다.
- 메시지에 의해 객체가 연산을 수행하게 될 때, 하나의 메시지에 대해 각 객체가 가지고 있는 고유한 방법으로 응답할 수 있는 능력
- 다형화 지원방법으론 오버로딩과 오버라이딩을 예시로 들 수 있겠다.
- 오버로딩(OverLoading)
1) 하나의 클래스에서 메소드의 이름이 같지만, 파라메터가 다른 것 (매개변수의 갯수,타입을 다르게 사용)public String Company(String country) { return "삼성전자"; } public int Company(String country ,int countryNum) { // 같은 이름이지만 파라미터에 들어가는 갯수와 들어가는값의 타입도 바뀌는 경우 return 3; }
- 오버라이디(OverRiding)
1) 부모 클래스로부터 상속받은 메서드 내용을 변경하여 사용하는 것public class Company() { private String companyName; public void getCompany() { System.out.println("Get Company"); } } public class Department() extends Company { // extends를 통해 Company를 부모로 두고 메서드에 접근 할 수 있다. @Override public void getCompany(){ System.out.println("GET Department Company"); } }
참고