JAVA

2-2 OOP의 특징 (추상화, 캡슐화, 상속, 다형성)

쩨비 2021. 8. 25. 10:55
728x90

2-1 OOP란? 에서 우리는 OOP에 대한 기본적인 개념을 익혔다.

이제 OOP에 대해 심도 있게 알아 볼 필요가 있다. 단, 필자는 이러한 개념을 인식하고 개발해본 경험이 많지 않다.

"어? 이러한 java class에서는 캡슐화를 해서 정보를 은닉하고 다른 class에서 상속을 받게 해서 중복된 코드를 없애서 개발해야겠어!" 라고 개발한적이 없다고 말씀드리는 것이다. 단지 중복된 코드가 발생할것 같은 경우 따로 모듈화를 하고 공통으로 사용하는 변수(파라미터)가 있다면 DAO를 따로 만들었다.

 

이부분에 대해서는 다시한번 같이 정리를 하면서 반성을 해야할지 잘 하고있던건지 마지막에 결정해야겠다.

 

그러므로 필자는 

 

https://victorydntmd.tistory.com/117

 

객체 지향 프로그래밍( OOP ) 개념

1. 객체 지향 프로그래밍 ( Object Oriented Programing ) 1) 객체 객체란 말 그대로 대상을 나타내는 단어입니다. 예를 들어, 사람 개인 한 명 한 명을 모두 객체라 할 수 있고, 책 한 권 한 권을 객체라

victorydntmd.tistory.com

https://limkydev.tistory.com/30

 

[Java] 객체지향프로그래밍 (OOP)란?

자바프로그래밍하면 객체지향프로그래밍 OOP(Object Oriented Programming)이라 해도 무방하다. 객체지향프로그래밍의 특성은으로 크게 캡슐화, 추상화, 다형성, 상속성,정도는 명확하게 알고있어야한

limkydev.tistory.com

위의 개시물을 보며 생각을 정리하고자 한다. 프로젝트를 하며 개발했던 부분의 경험된 내용이 추가되니 틀린 부분이 있으면 꼭 피드백을 부탁드리겠다.

 

1. 캡슐화

캡슐화란 특정한 목적을 위해 필요한 메소드나 변수를 묶는것,

정보의 은닉화(Private 메소드, 변수)를 통해 현재 동작 하고 있는 메소드 외에 다른 메소드에서 변경 할 수 없도록 하기 위함 

 

- 프로젝트에서 많이 사용하는 Private 메소드, 변수는 보통 DAO에서 많이 보인다. 전달 받은 Value값들을 getter와 setter로 컨트롤 하여 사용한다.

- 한번 받은 값들은 변하지가 않음으로 다른곳에서 변경을 한다고 해도 영향이 없다.

EX) dog의 이름 = "강쥐" 이다. 그런데 다른 사람이 dog의 이름을 "레옹" 으로 바꾸었다. 하지만 현재 하고있는 작업이 끝나기 전까지 나에게 dog의 이름은 "강쥐" 이다.

 

 

2. 추상화

목적과 관련 없는 부분은 제외하고 필요한 부분만을 표현, 공통된 특징들만 모아 정의한 설계

포유류는 얼굴이 있고 눈이 있고 귀가 있고 울음소리가 있고 자식을 낳는다.

 

이런 포유류의 특성을 꼭 있을것이라고 가정(추상)하고 이러한 변수 혹은 메소드가 없을 경우 에러를 표시해주고 동작하지 않는다. (포유류가 머리가 없으면 당연히 움직이지 못하는것과 마찬가지 이다.)

 

실무에서는 이러한 추상화 기능을 언제 쓸까?

프로그램의 설계를 해주는 개발자분께서 mammalInterface class 파일에 head,eyes,ears,howl 라는 기능(메소드 혹은 변수) 을 만든다. 개린이는 이 interface를 가지고 포유류에 대한 프로그래밍을 한다.

 

- mammalService에서  mammalInterface를 상속받는다.

- mammalService는 head, eyes, ears, howl 이라는 메소드를 무조건 만들어야 한다.

- mammalController에서는 head, eyes, ears, howl 이라는 정보를 얻을 수 있다.

 

3. 상속성

 부모 class에서 자식 class에게 형태를 물려주기 위함

 포유류 class -> 강아지 class   포유류 class에서 강아지 class를 상속할때 강아지 class는 포유류임을 바꿀 수 없다

                  -> 고양이 class

 

- mammalService에서 mammalServiceImpl.howl()을 String으로 상속

- mammalService에서 mammalServiceImpl.howl(cat)은 String으로 return

- mammalService에서 mammalServiceImpl.howl(dog)도 String으로 return

 

4. 다형성

형태는 같으나 다르게 표현 될 수 있는 경우

강아지 class "왈왈" -> 포유류 class

고양이 class "야옹" -> 포유류 class

 

- mammalServiceImpl.howl(dog)에서 mammalService에게 Stirng으로 리턴을 해줄때 리턴되는 내용은 "왈왈"이다.

- mammalServiceImpl.howl(cat)에서 mammalService에게 Stirng으로 리턴을 해줄때 리턴되는 내용은 "야옹"이다.

- 형태는 String으로 같으나 내용은 달라질 수 있다.

 

 

결론(내 생각)

오늘 OOP에 대해 좀 더 심도있게 알아보았다. 그런데 이런 내용들을 책으로만 보고 배우는 개린이들이 정말 100% 이해 할 수 있을까?? 물론 이해력이 좋고 활용능력이 좋은 사람은 가능 할 수 있겠다. 하지만 나같은 개린이는 책만보고는 절대 100% 이해 할 수 없다. 상속을 왜 받아야 되고 캡슐화를 왜 해서 왜 은닉해야 하고 상속을 받으면 왜 부모클레스로 부터 정의된 리턴 타입이라 던지 메소드, 변수들이 꼭 있어야 하는건지 알 수 없다.

 

내 생각에는 OOP에 저런 4가지 설계 방법에 대해서는 아 이런게 있구나 정도만 알고 우선 MVC 패턴에 대해 먼저 공부 하고 사용하고 실무에 적용해 본 후 욕심이 생기면 그때 다시 도전하자. 그때는 저 위의 4가지 설계 방법에 대해 조금은 이해가 될것이다.

 

그리고 이런 것들을 공부를 하고 이해를 한다면 확실히 JAVA class를 프로그래밍 할때 설계하는 관점이 달라질것 같긴 하다.