자바는 닥(치고)클(래스) 입니다? = 공부 습관화 프로젝트 2 =

라고하면 오바지~ 아하하하하하하.... =_=;(오바가 아닐수도....)
하지만 자바에선 뭘 하던간에 클래스를 통해서 이루어지는 만큼 그 중요성이나 차지하는 비중은 매우 크다. 물론 초! 간단 하게 main method 하나만으로 구성할수도 있기는 하지만... 그 녀석도 이미 클래스에 포함되어있다.

그럼 클래스라는 녀석은 뭐냐? 한마디로 오브젝트를 만드는 틀 혹은 설계도 정도가 되겠다. 자바가 OOP(Object Oriented programming) 언어라는건 굳이 언급 안해도 워낙 유명한 얘기고 그 기반이 되는 오브젝트를 찍어내는 녀석이 클래스라는 것. 지난 포스팅에서 혹은 다른 몇몇 강좌에서도 클래스는 또다른 데이터형이다. 라는 얘기를 하기도 하는데 밀리네스님의 친절한 리플덕에 그건 좀 미묘하게 틀린 얘기란걸 알게 되었다.
클래스 라고 하면 오브젝트를 만들어내는 틀(설계도 라는 표현도 쓴다.) 정도로 이해해 두는편이 좋을것 같다.

그럼 클래스는 어떤 형태로 되어있고 어떻게 만들건가?? 그럼 일단 예제부터...

1 : class MyDate {
2 :
3 : private int year;
4 :
5 : private int month;
6 :
7 : private int day;
8 :
9 : public int getYear() {
10 :
11 : return year;
12 :
13 : }
14 :
15 : public void setYear(int y) {
16 :
17 : year = y;
18 :
19 : }
20 :
21 : }

이렇게 생긴 녀석이 클래스다. 3~7 라인의 변수선언 부분에서 private라는 녀석이 보이는데 접근제어자라는 놈중에 하나다. 일단은 무시 =_=/ 그리고 9~19 라인에서는 메서드를 선언하고 있다. 일단 이렇게 클래스 내부에 선언된 변수는 멤버변수, 메서드는 멤버메소드 라고 불려진다. 일단 클래스는 대부분 이렇게 생겨먹었다.
그럼 클래스는 어떤식으로 만드는가? 대충 이름 짓고 멤버변수 메서드 집어넣으면 땡?? 일리가 없다. =_=
이런 경우에 종종 사용하는 말이 추상화(abstract) 되겠다. 추상화가 뭐냐고? 어떤 클래스를 만드는데에 있어 멤버변수와 메서드를 구분짓는 것. 이라고 얘기 할 수 있겠다. 요부분을 설명할 땐 꼭 일상생활(?)을 얘로 들더라... 그러니까 나도 흉내내기...

우리는 자동차(object)를 만들고 싶어한다. 그럼 우선 설계도(class)를 그려보자! 자동차를 만드는데 필요한 것들이 뭐가 있을까? 바퀴, 핸들, 문짝...등등이 있겠다.(member variable) 그럼 자동차에 필요한 기능은 뭐가 있지?? 일단은 굴러가야겠고, 방향도 바꿀수 있어야 할테고, 달리다가 멈출수도 있어야 겠네...(member method) 이런식으로 구분을 짓는것이 추상화다.
물론 위에서의 괄호는 자바에서의 얘기 그럼 위의 클래스를 한번 작성해보면...

class Car
{
바퀴;
핸들;
문짝;

public void 달리기()
{
}

public void 회전()
{
}

public void 멈추기()
{
}
}

뭐... 대충 이런식으로 가능 하겠다.
어떤 기능을 수행하는 클래스를 만드는데 있어서 필요한 멤버변수와 멤버메서드를 구분짓고 설계화 하는것 그것이 추상화이고 클래스를 만드는 가장 기본적이고도 중요한 작업이 되겠다.

-----------------------------------------------

플스1.
클래스라는거 어찌 보면 함수와도 매우 햇갈리는 부분인데 일반적인 함수하고는 전~혀 다른 개념이지요. 사용법을 본다면 참 비슷해 보이기도 합니다만... 다음번에는 클래스를 이용해서 오브젝트를 만들어서 사용하는 부분을 다뤄볼까 합니다.

플스2.
아... 다시한번 강조하지만.. 이건 강좌가 아니라 그냥 공부하면서 중얼 거리는 포스팅입니다. 설마 오해하시는 분들이 있는건 아니지요??? 그런 의미에선 상당히 쪽팔리는 포스팅...OTL(고수분들도 볼 가능성이 있다라는건 지난 포스팅에서 증명이 됐습니다....)

by 마왕라하르 | 2006/12/19 11:16 | 트랙백 | 덧글(12)

트랙백 주소 : http://darkson666.egloos.com/tb/2883109
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 밀리네스 at 2006/12/19 12:23
class는 사실 번역이 제대로 않되는 말입니다만, 설계도보다는 "급"으로 생각하시면 좋습니다. (자바나 c++같은 STATIC TYPING 언어에서는 설계도라는 말이 그나마 적절하지만 스몰토크나 파이썬등 DYNAMIC TYPING 언어에서는 잘 않맞습니다)

영어가 모국어인 사람들이 CLASS라는 단어를 어떤 의미로 사용하고, 왜 oop에서 CLASS라는 용어를 차용했는가를 생각해 보는게 도움이 됩니다.

예를 들자면 니미츠급 항공모함은 Nimitz class carrier 이죠. 이 니미츠급은 대략 10대 정도 건조된 항공모함의 급이죠. 니미츠라는 공통의 구조를 가지지만 조금씩은 다른 그런 항공모함들이죠.

oop에서의 class도 마찬가지입니다.
OOP의 핵심은 메시지이고, class는 일련의 메시지를 받을수 있는 공통의 구조를 가진 객체를 의미하는 "급"(이래서 사실 번역이 않되는 용어인거죠^^) 인 것입니다.

oop의 핵심이 메시징이라는 것을 잘 새겨두면 나중에 도움이 되실 겁니다.
Commented by 밀리네스 at 2006/12/19 12:30
참고로 메시징과 함수호출의 차이점은
런타임시에 호출함 메소드가 바꿀수 있다는 차이입니다.

C에서 calcA(); 하면 컴파일 된 이후에는 무조건 calcA()라는 함수만 호출됩니다.
하지만 자바에서는 obj.calcA();를 라는 형식으로 obj에 calcA 라는 메시지를 보내게 됩니다. 이렇게 되면 obj가 누구냐에 따라 실행되는 메소드가 달라집니다.

class A { int calcA() { return 10;} }
class B extends A{ int calcA() { return 20;} }

A obj = new A();
// A obj = new B();

obj.calcA();

이렇게 런타임시에 메시지를 보낼 객체를 바꿀수 있다는 것이 프로그램의 확장성과 유연성을 크게 늘려주게 됩니다. 뭐 이건 실제로 체험해 보기전까지는 애매하실겁니다.
Commented by 밀리네스 at 2006/12/19 12:42
간단히 메시징의 장점이 될만한 코드를 적어 보자면

interface Output { void print(String msg)};

class Display implements Output {
public void print(String msg) { System.out.println(msg);}
}

class Printer implements Output {
public void print(String msg) { // 프린터로 인쇄하는 코드...}
}

...
Output o = null;
if (userSelect == DISPLAY) {
o = new Display();
}
else if (userSelect == PRINTER) {
o = new Printer();
}

...

o.print(name);
o.print(address);
o.print(sex);


이런식으로 객체를 생성하는 부분을 제외하고 나머지 비지니스 로직 부분은 그래도 사용할수 있으며 추후에 FileOutput이나 SocketOutput 등을 얼마든지 추가할수 있게 되는 겁니다. 즉, 변화에 보다 빠르게 대응할수 있게 되는 것입니다.
Commented by 밀리네스 at 2006/12/19 12:55
OOP의 창시자인 앨런 캐이가 현재의 OOP에서 딱 하나만 남기라면 무엇을 선택하겠냐고 했을때 메시징이야 말로 OOP의 근원이다라고 했었죠.

OOP가 만들어진 이유도 "런타임에 조건이 바뀌면 실행되는 코드도 바뀌었으면 좋겠다"라는 바람때문에 만들어 진것이고, 메시징을 위해서 클래스라던가 하는 부가적인 것들이 만들어 진것이죠.
Commented by 마왕라하르 at 2006/12/19 13:31
밀리네스님//흐음... 급이라는 개념이라... 오버라이딩이나 오버로딩의 개념을 포함 시켜본다면 되면 설계도 라는 말은 좀 미묘해지는 듯 합니다.
메시징이라...^^ 아직 저의 실력으로서는 딱 와닿는 느낌은 없군요.(용어가 생소해서 일까요? ^^) 언급하신 그 둘의 차이점은 잘 알겠습니다.
지난번에 이어서 이번에도 이렇게 예제까지 들어 자세한 설명을 해주셔서 정말 감사합니다. 이거 일반적인 책이나 웹상의 강좌에서는 볼수없는 정보들이라 더욱 큰 도움이 되는군요...ㅠ_ㅠ 상세한 설명 다시한번 감사드립니다.
Commented by 밀리네스 at 2006/12/19 22:18
class는 급이나 자격, 능력이라고 해석이 됩니다만, 역시 영영사전이 이럴때는 최고입니다.

A class of things is a group of them with similar characteristics.

바꿔서 말하자만 프로그래밍에서 클래스를 작성한다라는 것은 어떤 객체가 이러이러한 특성을 가진다는 것을 기술하는 겁니다.
동작의 특성은 메소드로, 상태의 특성은 Attribute(자바에서는 Field)로, 구조의 특성은 필드나 파라메터를 통한 위임(Delegation)으로 기술하는 것이죠

static typing 언어는 기술된 모든 특성이 언제나 일치해야 한다라고 요구하는 언어이고 dynamic typing 언어는 그때 그때 필요한 메소드나 어트리뷰트만 있으면 만족하는 언어이죠.
Commented by 쿠헐 at 2006/12/19 23:05
......뭔가 끼어들 엄두가 안나는 대화들...-_-;
Commented by 마왕라하르 at 2006/12/20 14:32
밀리네스님//확실히... 이바닥에서 구를려면 영어는 필수인데... 이거 어릴적부터 알수없는 거부감이 생겨버려 필요성을 느끼면서도 공부를 하지않는...ㅠ_ㅠ 이거 고쳐야 할텐데...ㅠ_ㅠ 여튼!! 열심히 해서 개념을 바로 잡아야겠습니다.
쿠헐님//.... 사실 그렇게 심도있는 내용은 아닙니다. 꽤나 기본에 해당하는 거죠...하긴 그렇다고 쉬운건 아니지만요.^^ 꽤 중요한 내용이기도 하고~ 다만 이바닥에 입문할 생각이 없는 사람은 그냥 무시해도 될 얘기...
Commented by 비즈킹 at 2006/12/20 14:40
오랜만에 들렀는데.. 포스팅보자마자 @@ ㅋㅋ
건강하시죠? ^^ 눈도 많이오고 연말이라 맘이 들뜨기도 하고 가라앉기도 하고 싱숭생숭하지 말입니다..
Commented by 마왕라하르 at 2006/12/20 15:45
비즈킹님//아하하... 저야 항상 건강하게 즐겁게 살아하고 있습니다~ 최근 포스팅이...좀 쪽팔리는 것들이에요... 그냥 공부하는 티내는 겁니다 -_-;;
이번연말에 사모님과 멋진 계획 준비하셨는지 모르겠군요~ 특히 이번주의 3일 황금연휴!! 멋지게 보내시기를...
Commented by 나그네 at 2006/12/21 01:45
클래스를 굳이 번역하려 하지마.. 용어 그대로를 받아들여라.
Commented by 마왕라하르 at 2006/12/21 09:02
나그네// 굳이 번역하려고 한건 아니야 ^^; 다만 대충 아~ 이런거구나~ 보다는 좀더 확실히 해두고 싶었어.

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶