본문 바로가기

Layer7/동아리 숙제

객체지향 프로그래밍(Object-Oriented Programming)

※ 내가 쓰고도, 너무 추상적인것 같다(두루몽실 쓴것 같다).

솔직히 말해서 나도 잘 이해를 못한 상태로 써내려갔다.

내가 이해한 내용이 틀릴 수도 있고, 틀린내용이 맞을 수도 있다.

아무래도 처음배우는 개념이고, 실습도 못한 상태로 써내려가다보니 이렇게 된 것 같다.

이 글은 내가 정리하고, 공부하기위해서 적은 글이니

만약 당신이 공부할려고 한다면 얌전히 뒤로가기를 누르는게 좋을 것이다.

괜히 개념만꼬이게 될 것이다.

 

들어가기에 앞서
더보기

 해킹을 잘할려면 1순위로 C언어를 잘해야한다.

왜냐하면 C언어를 배우면 기초가 쌓여있어 나머지 언어를 배울때 쉽게 배울 수 있는데

해킹이란, 기본적으로 개발에서 시작되기 때문이다.

해커와 개발자의 차이는 보는 관점이 다르다는 것 밖에 없다.

언어를 배우는 단계까지는 둘이 똑같다.

하지만 개발자는 이를 활용해  프로그램을 만들려고하고,

해커는 이를 활용해 취약점을 찾으려고한다.

기본적으로 해커와 개발자는 같은 무리에 속한다고 생각한다.

 또 C언어를 잘해야하는 이유가 있다.

IDA나 Ghidra같은 정적디버거들은 쉬운 분석을 위해

Assembley어를 C언어로 바꾸어준다.

 그러면 왜 객체 지향 언어를 하는데 C언어 얘기를 하는가?

나는 개인적으로 C언어를 잘하는건 아니지만 '할 줄 안다'고 말할 수준은 된다고 생각한다.

그런데, 대표적인 객체 지향 언어인 JAVA를 공부했을때 멘붕이 왔다.

도대체 객체는 무엇이며, 클래스, 상속, Override ... 등등 알수 없는 단어들이 들려왔다.

C언어는 절차 지향 언어이다.

절차 지향 언어를 한다고 해서 객체 지향 언어를 쉽게 이해할 수 있는것이 아니라는 점을 말해주고 싶었다.

 

객체 지향 언어의 특징
더보기

본격적으로 객체 지향 언어는 무엇인가?

말 그대로 객체를 지향하는 언어이다.

그러면 객체란 무엇인가?

객체는 영어로 Object, 이는 한국어로는 사물이다.

약간 C언어의 구조체같은 느낌이다.

그리고 객체 지향 언어는 모든 것을 객체로 파악하기 때문에 모듈화를 하기가 쉽다.

그래서 새로운 내용이 들어와도 큰 틀을 많이 바꾸지 않아도 수정하기가 편리하다.

절차 지향 언어와 달리 초기 개발에는 시간이 들지만, 유지보수에는 강한 면이 있다.

(그러니까 비슷한 유형의 문제를 내는 학교에서 JAVA도 허용했으면...

매번 똑같은 문법을 매 문제마다 치고 있다.)

 

좀더 구체적으로 들어가면

객체 지향 언어에는 클래스와 상속이란 개념이 존재한다.

이 점이 객체 지향 언어의 가장 큰 특징이라고 생각한다. (가장 먼저 배우기 때문이다.)

그래서 클래스란 뭐고, 상속이란 무엇인가?

---------------------클래스---------------------

클래스는 객체를 만들기 위한 용도로 쓰인다.

예를들어 고양이가 있다고 해보자

그 고양이의 클래스는 아래와 같다.

   고양이 { 고양이 색깔, 고양이 품종, 고양이 사이즈, 고양이 특징 }

   [클래스] { [값1], [값2], [값3] ... }

그러면 도라에몽이라는 객체를 만들때는

   고양이 도라에몽

   도라에몽.파란색

   도라에몽.고양이형 로봇

   도라에몽.Large

   도라에몽.미래에서온 로봇

이러면 도라에몽이라는 객체가 만들어진다.

또 나비라는 객체를 만들때는

   고양이 나비

   나비.하얀색

   나비.페르시안 고양이 (뇌피셜)

   나비.Small

   나비.도라에몽의 짝사랑

이러면 나비라는 객체가 만들어진다.

이러한 점이 C언어의 구조체와 비슷하다는 것이다.

여기까지만 있으면 구조체와 별로 다른 점이 없어 보인다.

---------------------상속---------------------

하지만, 상속이라는 개념이 이를 다르게 만든다.

상속이란, 말 그대로 부모 클래스로부터 그 특징을 이어받는 것을 말한다.

고양이라는 클래스가 있다.

고양이 { 야옹거리기, 길거리 돌아다니기, 누워서 낮잠자기 }

그리고 나비라는 클래스도 있다.

나비 { 야옹거리기, 길거리 돌아다니기, 누워서 낮잠자기 }

이러면 굳이 불필요하게 2번씩이나 반복을 해주게 된다.

이때 나비가 고양이 클래스를 상속받게끔 해주면

나비 { 고양이 }

간단하게 끝난다.

 - 메소드라는건 야옹거리기, 길거리 돌아다니기, 누워서 나잠자기 같은 '행동'을 뜻한다.

하지만 도라에몽의 경우에는

도라에몽 { 길거리 돌아다니기, 누워서 낮잠자기, 21세기 도구 주문하기, 진구의 투정 받아주기 }

이렇게 상위클래스(고양이)랑 다른점이 있다.

이럴때는 Override해주면 된다.

이렇게 말이다. 도라에몽 { 고양이{ 21세기 도구 주문하기, 진구의 투정 받아주기 } }

---------------------결론---------------------

이로써 객체지향언어의 가장 큰 특징인 객채, 클래스. 메소드, 상속, Override를 배워보았다.

다시한번 정리하지면

객체는 모든 것

클래스는 객체를 만들어 내기 위한 도구

메소드는 클래스 안에 들어있는 기능

상속은 하위클래스가 상위클래스의 기능을 이어받는 것

Override는 하위클래스가 상위클래스를 상속받을때 메소드를 수정해서 받는 것

이다.

 

객체 지향 언어의 장단점
더보기

객체 지향 언어는 아무래도 모듈화가 쉽고, 잘되어있다보니

1) 코드의 재사용이 용이하다.

상속의 개념으로 인해, A코드가 B코드 C코드에서 쓰이곤 한다.

2) 유지보수가 편리하다.

3) 이식성이 뛰어나다.

JVM이라는 개념으로 리눅스, 윈도우, MAC등 다양한 환경에서 사용이 가능하다.

 

하지만 단점으로는 

1) 초기 개발 시간이 오래 걸린다.

절차 지향 언어와 달리 처음부터 체계적으로 모듈화를 진행해야하니

이것 저것 생각해야하는게 많고, 그만큼 시간도 오래걸린다.

2) 느린 실행속도

3) 높은 코딩 난이도

모듈화를 해야한다는 점이나, C++처럼 다중 상속개념이 들어가면 더욱 치밀하게 코딩을 해야하니

상대적으로 코딩이 어려워진다.

 

객체 지향 언어의 종류
더보기

대표적인 객체 지향 언어로는 JAVA, C++이 있다.

그밖에 Simula 67, 펄, 루비 등등 다양한 언어들이 있지만, 

실제로 많이 쓰는 언어 위 언어 밖에 없다.

(Python은 스크립트언어라고 한다.)

 

객체 지향 언어에서 발생하는 취약점
더보기

Java Object Deserialization 취약점 - Object Deserialization를 처리하는 과정에서는 취약한 Class를 공격

   1) Spring 원격코드실행 취약점 (CVE-2011-2894)

   2) IBM Congnos BI 원격코드실행 (CVE-2012-4858)

   3) Adobe Experience Manager 취약점 (CVE-2016-0958)

   4) JMX 원격코드실행 취약점 (CVE-2016-3427)

   5) 그외 (CVE-2015-4852, CVE-2015-7450, CVE-2015-7501, CVE-2015-8103, CVE-2015-8765 ... )

 

Reference