'객체지향'에 해당되는 글 1건

  1. 2010.03.21 자바 필수 상식 (2) - Object-Oriented Programming

자바는 객체 지향(Object-Orient) 언어이다.
객체 지향 언어는 현실 세계와 매우 밀접하다. 나는 객체 지향의 목표도 바로 그것이라 생각한다!
객체 지향에는 여러 특성이 있지만 기존의 절차 지향 언어(C언어 등)와 확연히 구분되는 것을 요약해본다.
아래 내용은 C++/JAVA 가리지 않고 공통되는 내용이니 참고했으면 한다.

(25th May, 2010)
술먹고 순식간에 써내려갔던거라 상속의 내용이 무관한 부분만 얘기하여 수정

① 상속(Inheritence)

- 클래스(Class)란 객체(Object)의 선언과 정의이다. 클래스가 객체를 생성할 수는 있어도 객체는 클래스를 생성할 수 없다. 클래스는 자신의 상태(member fields - 이하 속성)와 행동(member method/function - 이하 기능)을 갖고 있다. 반드시 모두 가질 필요는 없지만 절차지향형 프로그래밍 언어와 구분되는 점이 바로 이런 동시에 속성과 기능을 가지는 것이다. 절차지향의 경우 기능에 초점을 두기 때문에 속성들을 따로 관리한다. 하지만 객체지향에서는 속성과 그 속성을 가지고 할 수 있는 일들을 속성이 포함된 클래스에 함께 정의한다. 속성과 기능이 함께 관리되어질 수 있는 이 개념이 클래스를 가장 쉽게 설명할 수 있을 것 같다. 여러 프로그래밍 언어마다 틀리지만 클래스는 프로그래밍 상에서 메모리 공간에 올라가기 보다는 선언/정의를 참조하여 객체를 생성하는 용도로 쓰인다. 실제로 메모리 공간에 올라가는 내용이 바로 객체라는 말이다. 하나의 클래스로 여러 객체를 만들 수 있다. 객체가 붕어빵이라고 하면 클래스는 붕어빵 틀 정도로 보면 되겠다. 그렇다면! 조금 다른 모양의 붕어빵을 만들고 싶다면 우리는 어떤 작업을 해야할까? 새로운 붕어빵 틀을 구매해도 될 것이고 붕어빵 틀을 열심히 다듬어서 다른 모양으로 바꾸어도 될 것이다. 기존 붕어빵 모양은 이제 더 이상 생산할 필요가 없는 경우가 아니라면 후자보다는 전자가 더 우리에겐 더 좋아보인다. 붕어빵 틀을 개조할 정도의 능력이라면 말이다. 하지만 프로그래밍에서는 전자보다 후자가 더 이득이다. 왜냐하면 우리의 소스코드들은 복사가 가능하기 때문이다! 단순히 복사만 해서는 생산적인 경우가 별로 없을 것이다. 기존 클래스에서 그대로 쓸 내용은 그대로 쓰고 추가만 해야할 경우, 우리는 상속이라는 멋진 개념을 사용할 수 있다. 말 그대로이다. 상속은 붕어빵 틀을 이용해서 두머리 붕어빵, 세머리 붕어빵, 녹색 붕어빵 등 다양하게 사용 가능하게 한다. 추가할 수도 있고, 삭제할 수도 있다. 기능(method/function)을 수정하는 경우에는 오버라이딩(Overriding)한다 라고 말한다.
우리가 프로그래밍 언어에서 상속을 이야기 할 때는
자식이 부모를 상속한다.
부모가 자식에게 상속되어진다.
라고 표현한다.

이 클래스와 객체의 개념은 다형성과 연결된다.

참고 : 부모 클래스는 슈퍼 클래스와 같은 말이며 자식 클래스는 서브클래스와 같은 말이다.

② 다형성(Polymorphism)과 추상화(Abstract)

- 앞서 본 클래스는 객체들의 공통 속성을 가지고 있을 것이다. 사람 클래스를 예로 들자면
남자든 여자든 이름을 가질 것이며, 인종, 태어난 곳, 태어난 시간 등이 생성되는 순간 결정될 것이다.
사람(클래스)의 하나인 똘이(객체)를 프로그램상에 구현한다고 하자.
클래스에서 정의된 내용 외에 생김새라던지 이 객체에 맞도록 추가하거나 변경되는 내용들이 있다.
상속이 불가능하다면 객체 생성마다 매번 새로운 클래스를 정의하고 객체들을 만들어야 할 것이다.
그 객체들마다 앞에서 정의한 이름, 인종, 태어난 곳, 태어난 시간 등을 불필요하게 계속 다시 정의해야할 것이다.
또한 맹구와 영구라는 객체를 생성했을 때 이들이 하는 행동이 모두 같지는 않을 것이다.
이를테면 맹구는 전속력으로 달리면 8m/s의 속도를 내고 영구는 7m/s의 속도를 낸다고 하자.
맹구.전속력달리기() 의 값이 8이고,
영구.전속력달리기() 의 값은 7이다.
전속력달리기() 는 행동이며 사람 클래스의 공통 메서드이다.
(메서드(Method)란 함수(Function)와 동일한 뜻이며 C/C++에서와는 달리 자바에서는 메서드라고 부른다.)
그런데 맹구는 전속력달리기를 하면 보폭이 커지는 반면, 영구는 보폭은 좁아지지만 속도가 빨라진다.
같은 전속력달리기 메서드이지만 영구 객체를 정의할 때 기본적인 속력에 관한 부분은 기정의된 내용을 따르고
추가로 이런 내용을 입력할 것이다.
이것이 바로 다형성이다.
객체 지향언어에서의 다형성은 오버로딩(Overloading)에서 명확해지는데,
매개변수(Parameters)를 다르게 하여 같은 이름의 함수를 계속 정의할 수 있다는 것이다.
(리턴 타입은 다르게 해도 오버로딩되지 않는다.)
공개된 공통 메서드나 공용 콘트롤(추상화-Abstract)은 인터페이스(Interface)를 사용 가능하게 한다.
추상화 되어있는 클래스를 이제는 사람 뿐 아니라 사자, 코끼리 정도로 확대해보자.
이들은 포유류라는 클래스 혹은 생물이라는 클래스에서 파생되었을 것이다.
사람, 사자, 코끼리는 모두 전속력달리기() 메서드를 가질 수 있다.
그렇다면 프로그래머는 포유류 혹은 생물 클래스의 공용 콘트롤을 알게 됨으로써
전속력달리기()라는 메서드를 인터페이스로써 각 객체에 동일하게 사용할 수 있다.

참고: 자바에서는 interface와 abstract라는 키워드를 제공하지만 C++에서는 순수 가상 함수 등을 이용해 추상화 클래스를 만들어 사용한다.

참고: 오버로딩과 오버라이딩, 둘의 공통점이라면 이름이 같은 메서드를 사용한다는 것이고, 오버로딩은 매개변수의 타입이나 갯수가 다를 때 각기 다른 메서드로 인식하게끔 한다는 것이다. 오버라이딩은 재정의다. 기존 메서드를 재정의함으로써 덮어버리고(ride) 내 것을 쓴다는 개념이다.

③ 캡슐화(Encapsulation)

- 캡슐화는 정보 은닉(Inform hiding)을 말한다. 생성한 각 객체들은 변수와 메서드로 이루어져 있을 것이다.
이 변수와 메서드는 클래스를 정의한 곳을 보면 각 값들에 대한 접근 권한을 알 수 있는데
public, protected, private이 권한에 대한 키워드이다.
public는 외부에서 어느 객체든지 접근할 수 있다.
protected는 외부에서 객체 자신만이 접근할 수 있다.
private는 외부에서 접근이 불가능하다.
캡슐화로 인해 굳이 외부에 노출되지 않아도 되는 정보나
사용자가 굳이 알 필요가 없는 정보를 private나 protected 등으로 감춤으로써 보안의 정도가 상승된다.

보통 API에 캡슐화가 많이 적용된다.
굳이 로우레벨의(시스템의 깊숙한 작동 원리 등) 동작을 몰라도 우리가 사용할 수 있게 하는 것,
캡슐화가 잘 되어있을 수록 우리는 모르는게 많아지겠지만 그만큼 편리해진다고도 생각해볼 수 있다.

참고 : 아무것도 안적으면 자바는 default(같은 패키지 내에서만 접근 가능, 상속 여부 무관)로 선언이 되며, C++에서는 private으로, Objective-C에서는 protected로 선언 된다.

자바의 퍼포먼스

자바는 흔히 퍼포먼스가 좋지 않다는 말을 많이 한다.
자바는 컴파일을 하면 Bytecode로 된 .class 파일을 생성하는데 class 파일은 앞 장에서
말한 JVM을 이용해서 실행 가능하다.
JVM은 OS나 Platform에 대해 굉장히 유연하다. JVM만 설치된다면 어디서든 실행이 가능하다는 말이다.
이 VM의 요소 중 퍼포먼스를 떨어뜨리는 요인은 GC(Garbage Collection)에 있다. GC는 프로그램 종료 시 사용하지 않는 메모리를 시스템에 반환해주는 역할을 한다. 기존의 C나 C++은 malloc()/free() 나 new/delete 로 메모리 공간을 프로그래머가 확보한 경우 프로그래머가 삭제를 해야만 정확히 반환이 된다. 이 말은 프로그래머가 OS에게 메모리를 내놓으라고 했으면 마무리도 프로그래머에게 책임이 있다는 뜻이다. 자바는 이런 오류가 발생할 확률을 줄이고자 GC를 내놓았다. GC는 자동이며 억지로 호출은 가능하나 JVM에서 정의된 내용대로 행동하기 때문에 콘트롤은 불가능하다. JVM을 뜯어고친다면 모를까..
쨌든! 자바를 공부하기 시작했다면 이 정도는 알고 있기를 바라며 마무리~

참고 : 안드로이드 플랫폼에서 주로 자바로 개발한다는 말을 많이 들었을 것이다.
당연히(?) 안드로이드 플랫폼에도 VM(Virtual-Machine)이 있다.
하지만 PC용 JVM을 사용하기에는 덩치가 너무 커서 간소화(?) 버전인 Dalvik Virtual Machine 이 사용된다.
역시 JDK가 아닌 Android SDK가 사용된다.
실행 파일 역시 .class가 아닌 .dex (Dalvik EXcutable) 파일이 사용된다.
자바 문법이 대충 끝날 때 쯤 안드로이드도 시작해볼까 한다. ㅎㅎ
아마도 JavaFX도 같이 시작되지 싶다.

'Programming Languages > Java' 카테고리의 다른 글

변수(2)  (0) 2010.04.27
변수(1)  (0) 2010.04.27
자바 필수 상식 (1) - Some questions  (0) 2010.03.13
Hello World!  (0) 2010.03.13
EditPlus에서 Java 컴파일, 실행하기  (0) 2010.03.09
Posted by 독뽀
,