와이고수에 토익 재능기부를 한 지 벌써 거의 반년이 된거같습니다.
이번에는 자바를 알려드리고자 다시 돌아왔습니다.
사실 C강좌는 많은데 제대로 된 Java강의는 좀 찾기가 힘들더라구요.
이 강좌의 목표는 Java8 ~ Java9를 제대로 배우고 Spring까지 하는 방식으로 가고자 합니다.
많은 협업자분들이나 갓고수님들께서도 피드백을 해주셨으면 좋겠습니다.
저는 수업에 들어가기 이전에 객체지향프로그래밍(Object-Oriented Programming 이하, OOP)에 대해서 말씀드리고 가려고합니다.
사실 가장 많은 Java 입문자들이 헷갈리는 부분입니다.
도대체 객체지향이라는게 무엇일까요?
핵심은 실세계를 모델링하기 위한 추상화를 활용하는 프로그래밍 패러다임입니다.
말이 무척 어렵게 생각될지도 모르겠지만 단순하게 복잡한 실세계를 단순화 시켜서 소스코드로 녹여내는 기법 중에 하나라고 생각하시면 편할거같습니다.
또한, 많은 분들이 착각하시는게 OOP는 Language를 타지않습니다. 즉, Class 키워드를 지원하지않는 C로도 OOP를 구현가능합니다.
C는 절자지향언어, C++/Java는 객체지향언어는 매우 잘못된 상식이라고 말씀드리고 싶습니다.
절차지향도 패러다임 / 객체지향도 패러다임일뿐입니다.
랭귀지는 그 방법을 사용하는 도구에 불과합니다. 단지, C와 같이 Class 키워드를 지원않는 언어에서는 OOP 구현이 가시성이 떨어지기때문에 선호되지않을뿐입니다.
일단 OOP는 말 그대로 객체를 관점으로 보고 프로그래밍하는 패러다임입니다.
여기서 객체(Object)란 무엇일까요?
다음 사전을 찾아보면
라고 나옵니다.
사실 객체보다는 한글로는 개체에 적합하겠죠.
개체를 다음 사전에 검색을 해보면
라고 나옵니다.
좀 더 저는 설명을 덧붙여서 '이 세상에 존재하는 유일무이한 사물' 로 말씀드리고 싶습니다.
또한, 이러한 객체들은 무생물이건 생물이건 속성들과 기능을 갖게됩니다.
이에 대비되는 클래스의 특징을 설명드리자면
클래스는 집합(즉, 같은 속성들과 개념들을 가진 객체들을 총칭하는 개념)이라고 설명 드리고 싶습니다.
아직까지 "ㅆㅂ 뭔 개소리야?"라고 생각하신다면 당연하다고 말씀드리고 싶습니다.
예를 들면, 사람이라는 클래스가 있으면 고붕이라는 객체가 있을겁니다.
그리고 각 사람마다 주민번호도 다르고, 생김새도 다르고 키도 다르고 몸무게도 다를겁니다.
즉, 88년생, 고붕이, 키 173, 몸무게 69, 눈의 크기는 어느정도... 등등.. 입니다.
전세계에 이러한 속성과 100% 일치하는 사물이 있을까요? 다른 값이 다 같다고 한들 주민등록번호(나중에 따로 설명드릴겁니다.)가 똑같은 사람은 존재하지않죠.
그래서 그 객체는 세계에서 유일무이한 것이 되는겁니다.
하지만 키나 몸무게 주민번호, 눈의 개수, 코의 개수, 손의 개수 등등.. 정확한 값이 들어간건 아니지만 사람이라면 꼭 가져야할 속성들이 있습니다.
그러한 속성들만 뽑아놓아서 추상화해 놓은 것이 클래스라고 말씀드릴 수 있을거 같습니다. (즉, 객체의 추상화를 통해서 공통집합을 뽑아낸것 = 클래스!)
정리해보자면, 이 세계에 유일무이한 사물은 객체, 그것의 공통부분을 집합으로 만든 것은 클래스로 설명드리고 싶습니다.
그렇다면? 여기서 설명하는 추상화(Abstaction)이 무엇을 뜻할까요?
추상화(abstraction) - http://kin.naver.com/openkr/detail.nhn?docId=7554
주어진 문제나 시스템을 중요하고 관계 있는 부분만 분리해 내어 간결하고 이해하기 쉽게 만드는 작업. 이러한 과정은 원래의 문제에서 구체적인 사항은 되도록 생략하고 핵심이 되는 원리만을 따지기 때문에 원래의 문제와는 전혀 관계가 없어 보이는 수학적인 모델이 나오기도 한다. 이 기법은 복잡한 문제나 시스템을 이해하거나 설계하는 데 없어서는 안될 중요한 요소이다.
즉, 추상화란 구체적인 것을 분해해서 관심영역의 특성만을 가지고 재조합한 것으로 볼 수 있을거같습니다.
자 제가 삼신할매가 되었다는 가정하에 이제 Java를 이용하여 사람들을 만들어보겠습니다.
사람 홍길동 = new 사람();
사람 희동이 = new 사람();
나중에 java문법을 말씀드릴테니 위의 예시는 참고만 해주세요.
위의 두 줄은 사람이라는 클래스에 홍길동이라는 객체와 희동이라는 객체를 만든겁니다.
좀 더 세부적으로 말씀드리면, 사람이라는 클래스를 이용하여 새로운 유일무이한 객체(홍길동, 희동이)를 만들어 홍길동, 희동이(객체참조변수)라는 이름을 지어준 겁니다.
앞으로 자주 나올 표현을 미리 정리해드리자면, 자바에서는 Class를 활용하여 Object를 만들때 Instance라는 표현을 씁니다.
객체 = object = class's instance라고 생각하시면 됩니다.
인간은 객체를 먼저 인식한 뒤에 클래스를 인식하게 됩니다.
하지만 전지전능하신 하느님께서는 클래스를 먼저 인식하셔서 그 뒤로 아담과 이브라는 객체를 찍어내게 되셨죠.
개발자도 또한 한 어플리케이션에 대해서는 창조자(하느님)과 같은 존재입니다.
그러니 우리도 클래스를 먼저 인식하는게 최우선이 되는겁니다.
그러면 OOP가 어떤점이 좋냐라고 말씀하시는 분이 계실겁니다.
사람이라는 클래스를 만든다고 가정하에 생각해봅시다.
클래스에는 속성과 행위가 필요합니다.
속성은 키, 몸무게, 나이, 직업, 취미, 혈액형등등.. 이 포함됩니다. (주로 명사나 형용사가 포함됩니다.)
행위는 자다, 먹다, 싸다, 공부하다, 가다등.. 이 포함됩니다. (주로 동사가 포함됩니다.)
이것을 이용하여 UML Class Diagram을 설계해보면
로 표현할 수 있을겁니다.
하지만 사람의 속성과 행위는 이것보다 더 방대합니다.
그래서 필요한게 어플리케이션의 경계입니다.
내가 만드는 어플리케이션은 어디에서 사용될 것인가? 입니다.
내가 만약 만들고자하는 어플리케이션이 백화점 어플리케이션인지 수강신청 어플리케이션인지가 중요한겁니다.
백화점 어플리케이션이다. -> 사람은 곧 고객이다.
수강신청 어플리케이션이다. -> 사람은 곧 학생이다.
백화점 어플리케이션을 만드는데 고객 클래스에 굳이 주민등록번호며, 키, 몸무게, 혈액형이 필요할까요? 마케팅을 위한 직업, 연봉, 나이정도의 속성만 있으면 되지않을까요?
수강신청 어플리케이션을 만드는데 학생 클래스에 키, 몸무게, 혈액형, 연봉, 직업이 필요할까요? 수강신청을 위한 이름, 학력정도의 속성만 있으면 되지않을까요?
행위도 마찬가지의 관점으로 보시면 됩니다.
추상화를 여기서 더 구체적으로 말하자면, 추상화란 구체적인 것을 분해해서 관심 영역(어플리케이션 경계, Application Boundary)에 있는 특성만을 가지고 재조합하는 것
즉, 컴퓨터 영역에서의 모델링이라고 볼 수 있습니다.
따라서 OOP와 절차지향의 차이는 모델링의 관점에서의 차이라고 생각하시면 됩니다.
제가 서두에서 복잡한 실세계를 간단히하는 것이 OOP라고 말씀드렸습니다.
즉, 절차지향으로 해결이 어려운 거대한 실세계의 문제를 모델링을 할 경우에 빛을 발한다고 생각하시면 편하실거같습니다.
또한, 여기서는 추상화에 대해서만 다뤘지만 2편에는 상속, 캡슐화(정보은닉), 다형성을 설명드리면서 OOP가 갖는 특징에 대해서 더 심도깊게 다뤄볼 예정입니다.
이 글을 쓰게 된 계기는 저는 잘못된 책의 예제들을 많이 봤습니다.
편입을 한 후에 같은 과 학우들이 잘못된 생각으로 OOP를 접근하고 어려워하는 것을 많이봤고 또한 저도 실무에서 그런 경험을 해왔습니다.
특히 제가 어렵게 생각했던 이유는 이러한 예시를 든 책이 많았습니다.
클래스는 객체를 찍어내기 위한 틀이다. 따라서 붕어빵 틀은 클래스이고, 객체는 붕어빵이다.
이건 사실 잘못된 예시라고 말씀드리고 싶습니다.
붕어빵틀도 클래스고, 붕어빵도 클래스입니다.
단순하게 생각해보시면 됩니다.
다수의 붕어빵틀을 찍어내는 기계가 있다는 가정하에 그러면 붕어빵틀을 찍는 기계가 클래스고, 붕어빵틀이 객체인가요?
아주 간단하게 코드로 옮겨내면 틀린얘기인 것을 알 수가 있습니다.
Class Obj_name = new Class();라는 Java문법을 활용하면
기계 붕어빵틀_1 = new 기계();
붕어빵틀 붕어빵_1 = new 붕어빵틀();
위 두개의 예시가 저희가 생각한 방식이랑 같다고 생각하나요?
그래서
붕어빵틀 붕어빵틀_1 = new 붕어빵틀();
붕어빵 붕어빵_1 = new 붕어빵();
이 맞다는 겁니다.
제가 위에서 설명드린 객체와 클래스의 개념을 잘 생각해보세요.
제가 지금 보고 먹고 있는 붕어빵은 '전 세계에서 유일무이한 한 객체'개념의 붕어빵이지만, 붕어빵도 당연히 클래스로 볼 수 있지않나요?
또한 붕어빵틀도 제가 지금 붕어빵을 먹기위해서 서서 지켜보고 있는 그 시점의 붕어빵틀은 '객체'개념인겁니다.
꼭 이 차이점을 숙지하시면 객체지향프로그래밍 개념은 어느정도 잡힌거라고 볼 수 있습니다.
![]() |
![]() |
초반부에 C언어로도 객체지향프로그래밍이 가능한데, 가시성이 떨어져서 선호되지 않는다고 하셨는데요. 이건 매우 잘못된 정보라고 생각이드네요. 애초에 C언어는 객체지향이라는 개념이 아에 없던 시기에 생겨난 언어입니다. C언어로는 그저 객체지향을 흉내만 낼 수 있는 수준으로 프로그래밍이 가능할 뿐입니다. 객체지향의 개념인 상속, 추상화, 인터페이스, 클래스, 캡슐화 등은 c언어에서는 존재하지 않는 개념과 문법이죠.
그리고 c언어는 절차를 지향하는 언어가 맞고, 자바는 객체를 지향하는 언어가 맞는데. 이게 잘못된 상식이라니 조금 어이가없네요. 물론 자바로 c언어처럼 객체개념없이 절자지향적으로 프로그래밍이 가능 하고, c언어로 객체지향을 흉내내는 프로그래밍이 가능하다고는 하지만, 결론적으로는 자바는 객체 프로그래밍을 위해 생겨난 언어로 객체지향 언어가 맞습니다. C언어는 절차지향언어가 맞습니다.
// 인서울 컴공 학부4년, sky 대학원2년 후 현재 중견기업
전문연구요원으로 spring 서버 개발자로 복무중입니다.
베스트 댓글